Kaynağa Gözat

Merge branch 'product' into noveltySearch2

zhuliu 7 ay önce
ebeveyn
işleme
6988931091
60 değiştirilmiş dosya ile 2089 ekleme ve 566 silme
  1. 3 1
      src/api/index.js
  2. 31 0
      src/api/newApi/IPREmail.js
  3. 10 1
      src/api/newApi/importAndExport.js
  4. 73 10
      src/api/newApi/patent.js
  5. 7 0
      src/assets/css/main.scss
  6. BIN
      src/assets/img/404.jpg
  7. 2 2
      src/main.js
  8. 142 61
      src/router/index.js
  9. 58 34
      src/utils/axios.js
  10. 41 0
      src/utils/common.js
  11. 3 2
      src/utils/direct/index.js
  12. 41 0
      src/utils/direct/tableInfiniteScroll.js
  13. 1 1
      src/utils/model/upload/index.vue
  14. 27 22
      src/utils/permissions.js
  15. 7 2
      src/views/components/drawer/Field.vue
  16. 63 0
      src/views/components/errorPage/404.vue
  17. 1 1
      src/views/components/errorPage/components/ErrorPageLayout.vue
  18. 5 2
      src/views/components/import/conditionImport/customSearch.vue
  19. 19 6
      src/views/components/import/conditionImport/search.vue
  20. 65 7
      src/views/components/import/conditionImport/searchResult.vue
  21. 4 1
      src/views/components/import/conditionImport/searchResultIndex.vue
  22. 6 6
      src/views/login/index.vue
  23. 18 2
      src/views/noveltySearch/components/dialog/inventionPoint/inventionPoint.vue
  24. 28 1
      src/views/noveltySearch/components/noveltySearchCard.vue
  25. 35 42
      src/views/patentMining/components/dialog/addAndEditProject.vue
  26. 1 1
      src/views/patentMining/components/viewIndex.vue
  27. 41 186
      src/views/product/components/jsMind/components/mind.vue
  28. 1 1
      src/views/project/components/view/table.vue
  29. 10 5
      src/views/project/patentCollection/components/drawer/merge.vue
  30. 1 0
      src/views/project/patentCollection/components/drawer/mergeTableDialog.vue
  31. 12 6
      src/views/project/patentCollection/components/mixins/index.js
  32. 6 1
      src/views/project/patentCollection/components/views/Abstract.vue
  33. 5 2
      src/views/project/patentCollection/components/views/Picture.vue
  34. 6 4
      src/views/project/patentCollection/components/views/Table.vue
  35. 69 6
      src/views/project/patentCollection/index.vue
  36. 7 3
      src/views/project/patentDetails/components/PatentLeft.vue
  37. 168 83
      src/views/project/patentDetails/components/menu.vue
  38. 5 2
      src/views/project/patentDetails/components/patentMessage/PatentInstruction.vue
  39. 1 1
      src/views/project/patentDetails/components/patentMessage/PatentRight.vue
  40. 1 1
      src/views/project/patentDetails/components/patentMessage/mixins/index.js
  41. 6 2
      src/views/project/patentDetails/components/patentMessage/mixins/translate.js
  42. 34 19
      src/views/project/patentDetails/index.vue
  43. 187 0
      src/views/report/InvalidResponse/components/IPREmail/IPREmail.vue
  44. 86 0
      src/views/report/InvalidResponse/components/IPREmail/components/dialog/addEmail.vue
  45. 141 0
      src/views/report/InvalidResponse/components/IPREmail/components/dialog/addOrEditIPREmail.vue
  46. 0 0
      src/views/report/InvalidResponse/components/IPREmail/index.vue
  47. 38 0
      src/views/report/InvalidResponse/components/dialog/IPREmail.vue
  48. 135 2
      src/views/report/InvalidResponse/components/dialog/editFlowPath.vue
  49. 89 0
      src/views/report/InvalidResponse/components/table/IPREmail.vue
  50. 2 2
      src/views/report/components/checkPatent/checkPatent.vue
  51. 3 3
      src/views/report/components/dialog/cronConclusion.vue
  52. 267 0
      src/views/report/components/dialog/handlePerson.vue
  53. 24 0
      src/views/report/components/handlePerson/handlePerson.vue
  54. 0 0
      src/views/report/components/handlePerson/index.vue
  55. 27 21
      src/views/report/components/index.vue
  56. 1 1
      src/views/report/components/matter/addMatters.vue
  57. 18 5
      src/views/report/components/patentList/components/customFields/index.vue
  58. 4 4
      src/views/report/components/productResult/productResult.vue
  59. 2 1
      src/views/report/components/view/card.vue
  60. 1 0
      src/views/report/components/view/table.vue

+ 3 - 1
src/api/index.js

@@ -22,6 +22,7 @@ import otherPatentInformation from "./newApi/otherPatentInformation";
 import translate from "./newApi/translate";
 import noveltySearch from "./newApi/noveltySearch";
 import examine from "./newApi/examine";
+import IPREmail from "./newApi/IPREmail";
 
 export default {
   ...client,
@@ -44,5 +45,6 @@ export default {
   ...otherPatentInformation,
   ...translate,
   ...noveltySearch,
-  ...examine
+  ...examine,
+  ...IPREmail
 }

+ 31 - 0
src/api/newApi/IPREmail.js

@@ -0,0 +1,31 @@
+import axios from "@/utils/axios";
+// 新系统文件新接口
+export default {
+    //添加或修改ipr人员
+    iprPersonUpdate(data){
+        return axios.post('/xiaoshi/report/iprPerson/update', data)
+    },
+    //删除ipr人员
+    iprPersonDelete(data){
+        return axios.post('/xiaoshi/report/iprPerson/delete', data)
+    },
+    //查询ipr人员
+    iprPersonQuery(data){
+        return axios.post('/xiaoshi/report/iprPerson/query', data)
+    },
+
+
+    //添加或更新配案人员
+    matchCasePersonUpdate(data){
+        return axios.post('/xiaoshi/report/matchCasePerson/update', data)
+    },
+    //删除配案人员
+    matchCasePersonDelete(data){
+        return axios.post('/xiaoshi/report/matchCasePerson/delete', data)
+    },
+    //查询配案人员
+    matchCasePersonQuery(data){
+        return axios.post('/xiaoshi/report/matchCasePerson/query', data)
+    },
+    
+};

+ 10 - 1
src/api/newApi/importAndExport.js

@@ -31,7 +31,16 @@ export default {
     * 检索专利
     */
     patentSelect(data) {
-        return axios.post('/xiaoshi/patentStar/select', data)
+        // return axios.post('/xiaoshi/patentStar/select', data)
+        return axios(
+            {
+              url: '/xiaoshi/patentStar/select',
+              method: 'post',
+              data: data,
+              retry:true,
+              
+            }
+          )
     },
 
     /**

+ 73 - 10
src/api/newApi/patent.js

@@ -148,7 +148,14 @@ export default {
    * @returns 
    */
   queryExternalFamily(data) {
-    return axios.post("/xiaoshi/patentStar/queryExternalFamily", data);
+    // return axios.post("/xiaoshi/patentStar/queryExternalFamily", data);
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/queryExternalFamily',
+        method: 'post',
+        data: data,
+      }
+    )
   },
   /**
    * 专利详情内部查询权利要求
@@ -164,15 +171,30 @@ export default {
    * @returns 
    */
   queryExternalClaim(params) {
-    return axios.get("/xiaoshi/patentStar/queryExternalClaim", {params});
+    // return axios.get("/xiaoshi/patentStar/queryExternalClaim", {params});
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/queryExternalClaim',
+        method: 'get',
+        params: params,
+      }
+    )
   },
   /**
-   * 专利详情外部(检索)查询权利要求
+   * 专利详情外部(检索)著录信息
    * @param {*} data 
    * @returns 
    */
   queryExternalDetail(data) {
-    return axios.post("/xiaoshi/patentStar/queryExternalDetail", data);
+    // return axios.post("/xiaoshi/patentStar/queryExternalDetail", data);
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/queryExternalDetail',
+        method: 'post',
+        data: data,
+        retry:true
+      }
+    )
   },
   /**
    * 专利详情外部(检索)获得中国专利pdf
@@ -180,7 +202,14 @@ export default {
    * @returns 
    */
   getCnPdf(params) {
-    return axios.get("/xiaoshi/patentStar/getExternalTextPdf", {params});
+    // return axios.get("/xiaoshi/patentStar/getExternalTextPdf", {params});
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/getExternalTextPdf',
+        method: 'get',
+        params: params,
+      }
+    )
   },
   /**
    * 专利详情外部(检索)获得中国专利pdf全文文本
@@ -188,7 +217,14 @@ export default {
    * @returns 
    */
   getCnFullText(params) {
-    return axios.get("/xiaoshi/patentStar/getCnFullText", {params});
+    // return axios.get("/xiaoshi/patentStar/getCnFullText", {params});
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/getCnFullText',
+        method: 'get',
+        params: params,
+      }
+    )
   },
   /**
    * 专利详情内部获得中国专利pdf
@@ -204,7 +240,14 @@ export default {
    * @returns 
    */
   getExternalFigure(params) {
-    return axios.get("/xiaoshi/patentStar/getExternalFigure", {params});
+    // return axios.get("/xiaoshi/patentStar/getExternalFigure", {params});
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/getExternalFigure',
+        method: 'get',
+        params: params,
+      }
+    )
   },
   /**
    * 专利详情内部获得专利附图
@@ -220,7 +263,14 @@ export default {
    * @returns 
    */
   getLegalStatus(params) {
-    return axios.get("/xiaoshi/patentStar/getLegalStatus", {params});
+    // return axios.get("/xiaoshi/patentStar/getLegalStatus", {params});
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/getLegalStatus',
+        method: 'get',
+        params: params,
+      }
+    )
   },
   /**
    * 专利详情外部获得摘要附图
@@ -228,7 +278,14 @@ export default {
    * @returns 
    */
   getPictureGuid(params) {
-    return axios.get("/xiaoshi/patentStar/getPictureGuid", {params});
+    // return axios.get("/xiaoshi/patentStar/getPictureGuid", {params});
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/getPictureGuid',
+        method: 'get',
+        params: params,
+      }
+    )
   },
   /**
    * 专利列表导出PDF首页
@@ -367,6 +424,12 @@ export default {
    * @returns 
    */
   getPatentSimilarMess(data) {
-    return axios.post("/xiaoshi/patentStar/getPatentSimilarMess", data);
+    return axios(
+      {
+        url: '/xiaoshi/patentStar/getPatentSimilarMess',
+        method: 'post',
+        data: data,
+      }
+    )
   },
 }

+ 7 - 0
src/assets/css/main.scss

@@ -1,3 +1,10 @@
+.el-loading-parent--relative{
+  overflow: hidden !important;
+}
+.el-progress-bar__innerText{
+  color: black;
+}
+
 .MessageBoxClass{
   color: red;
 }

BIN
src/assets/img/404.jpg


+ 2 - 2
src/main.js

@@ -58,8 +58,8 @@ import vmFunction from './utils/window'
 Vue.use(vmFunction)
 
 //el-table滚动加载
-import elTableInfiniteScroll from 'el-table-infinite-scroll'
-Vue.use(elTableInfiniteScroll)
+// import elTableInfiniteScroll from 'el-table-infinite-scroll'
+// Vue.use(elTableInfiniteScroll)
 
 
 Vue.config.productionTip = false

+ 142 - 61
src/router/index.js

@@ -684,10 +684,22 @@ const routes = [
             meta: {
               title: '无权限',
               sign: '403',
-              belong: 'errorPage'
+              belong: 'errorPage',
+              notReturn:true
             },
             component: () => import('@/views/components/errorPage/403.vue'),
           },
+          {
+            path: '/404',
+            name:'/404',
+            meta: {
+              title: '页面不存在',
+              sign: '404',
+              belong: 'errorPage',
+              notReturn:true
+            },
+            component: () => import('@/views/components/errorPage/404.vue'),
+          },
         ],
       },
       //onlyoffice在线编辑
@@ -721,6 +733,8 @@ const router = new VueRouter({
   routes
 })
 
+
+
 function savePreviousRoute(to){
   if(to.meta.notReturn || to.path == '/login' || to.path == '/' || to.path == '/onlyOffice'){
     return
@@ -733,77 +747,144 @@ function savePreviousRoute(to){
   }
   localStorage.setItem('redirectUrl',JSON.stringify(redirectUrl))
 }
-router.beforeEach((to, from, next) => {
-  savePreviousRoute(to)
-  if(to.path == '/login'){
-    Cookies.remove("token")
-    localStorage.removeItem('vuex')
-  }
-  if(from.path.indexOf('/patentDetails/')!=-1 && to.path.indexOf('/patentDetails/')==-1){
-    sessionStorage.setItem('search', JSON.stringify({}))
-  }
-  if (to.path === '/login' || to.path === '/' || to.path == '/agreeConceal') {
-    if (to.meta.title) {
-      document.title = to.meta.title;
+
+let lastRoute = null
+
+function setLastRoute(to,from){
+  if(to.name == 'patentDetails'){
+    lastRoute = {
+      path:from.path,
+      query:from.query,
+      params:from.params
     }
-    next()
   }
-  else if(to.meta.permission && !Permission.FunPermissions(to.meta.permission)){
-    next({ path: '/403' })
+}
+
+export function getLastRoute(){
+  return lastRoute
+}
+
+
+router.beforeEach(async (to, from, next) => {
+  setLastRoute(to,from)
+  savePreviousRoute(to)
+  // if(to.path == '/login'){
+  //   Cookies.remove("token")
+  //   localStorage.removeItem('vuex')
+  // }
+  // if(from.path.indexOf('/patentDetails/')!=-1 && to.path.indexOf('/patentDetails/')==-1){
+  //   sessionStorage.setItem('search', JSON.stringify({}))
+  // }
+  const tokenStr = Cookies.get('token')
+  if (to.meta.title) {
+    document.title = to.meta.title;
   }
-  else if (to.meta.allowPath) {
-    if (to.meta.title) {
-      document.title = to.meta.title;
+  if(to.path === '/login' || to.path === '/' || to.path == '/agreeConceal' || to.meta.allowPath){
+    if(to.path === '/login'){
+      if(to.query.url){
+        if(tokenStr){
+          var url = to.query.url
+            if(url){
+              next({
+                path: url
+              })
+              return
+            }
+        }
+      }else{
+        Cookies.remove("token")
+        localStorage.removeItem('vuex')
+      }
     }
     next()
-  }
-  else {
-    const tokenStr = Cookies.get('token')
+  }else{
+    if(tokenStr === undefined){
+      if (to.meta.title) {
+        document.title = to.meta.title;
+      }
+      next({ name: 'Login' })
+      return
+    }
+    if(to.meta.permission && !Permission.FunPermissions(to.meta.permission)){
+      next({ path: '/403' })
+      return
+    }
 
-    switch (tokenStr) {
-      case undefined:
-        if (to.meta.title) {
-          document.title = to.meta.title;
-        }
-        // if(to.matched && to.matched.length>0){
-        //   var path = to.path
-          // var redirectUrl = null
-          // for(var i = to.matched.length-1;i>=0;i--){
-          //   var item = to.matched[i]
-          //   if(item.meta.notReturn){
-          //     continue
-          //   }
-          //   redirectUrl = {
-          //     userName:localStorage.getItem('username'),
-          //     path:to.path,
-          //     query:to.query,
-          //     params:to.params
-          //   }
-          //   break;
-          // }
-          // if(to.matched.findIndex(item=>{ return item.path == path}) !=-1){
-          //   var redirectUrl = {
-          //     userName:localStorage.getItem('username'),
-          //     path:to.path,
-          //     query:to.query,
-          //     params:to.params
-          //   }
-          //   localStorage.setItem('redirectUrl',JSON.stringify(redirectUrl))
-          // }
-        // }
-        next({ name: 'Login' })
-        break
-      default:
-        if (to.meta.title) {
-          document.title = to.meta.title;
-        }
-        next()
-        break;
+    if((to.path=='/403' || to.path=='/404') && from.path=='/login'){
+      next({ path:'/home'})
+      return
+    }
+
+    //单个页面设置权限
+    if(to.path=='/project/patentCollection' || to.path=='/reportDetails'){
+      var projectId = to.query.id || to.query.projectId
+      if(!projectId){
+        next({ path: '/404' })
+        return
+      }
+      var sign = await Permission.projectPermission(projectId)
+      if(sign === 0){
+        next({ path: '/403' })
+        return
+      }
+      next()
+      return
     }
+    next()
   }
+
+
+  // if (to.path === '/login' || to.path === '/' || to.path == '/agreeConceal') {
+  //   if(to.path === '/login'){
+  //     if(to.query.url){
+  //       if(tokenStr){
+  //         var url = to.query.url
+  //           if(url){
+  //             next({
+  //               path: url
+  //             })
+  //             return
+  //           }
+  //       }
+  //     }else{
+  //       Cookies.remove("token")
+  //       localStorage.removeItem('vuex')
+  //     }
+  //   }
+  //   if (to.meta.title) {
+  //     document.title = to.meta.title;
+  //   }
+  //   next()
+  // }
+  // else if(to.meta.permission && !Permission.FunPermissions(to.meta.permission)){
+  //   next({ path: '/403' })
+  // }
+  // else if (to.meta.allowPath) {
+  //   if (to.meta.title) {
+  //     document.title = to.meta.title;
+  //   }
+  //   next()
+  // }
+  // else {
+  //   switch (tokenStr) {
+  //     case undefined:
+  //       if (to.meta.title) {
+  //         document.title = to.meta.title;
+  //       }
+  //       next({ name: 'Login' })
+  //       break
+  //     default:
+  //       if (to.meta.title) {
+  //         document.title = to.meta.title;
+  //       }
+  //       next()
+  //       break;
+  //   }
+  // }
 })
 
 router.afterEach((to, from) => {
+
 });
 
 export default router

+ 58 - 34
src/utils/axios.js

@@ -21,26 +21,14 @@ let isRefreshing = false
 let retryRequests = []
 let loadingInstance = {}
 let config = {
-  baseURL: Config.baseURL
+  baseURL: Config.baseURL,
   // timeout: 60 * 1000, // Timeout
   // withCredentials: true, // Check cross-site Access-Control
+  retries:3
 };
 
 const _axios = axios.create(config);
 
-async function getLocalIPAddress() {
-  try {
-    var data = storage.getCookie('X-Forwarded-For')
-    if(data){
-      return data
-    }
-    const response = await axios.get('https://api.ipify.org');
-    storage.setCookie('X-Forwarded-For',response.data)
-    return response.data; // 提取并返回 IP 地址
-  } catch (error) {
-    return null; // 如果获取失败,返回null或其他错误处理
-  }
-}
 
 _axios.interceptors.request.use(
   async function (config) {
@@ -50,11 +38,14 @@ _axios.interceptors.request.use(
       // config.headers[constants.tokenHeader] = token
     }
     config.headers['x-project-id'] = Store.getters.projectId || ''
-    // config.headers['X-Forwarded-For'] = await getLocalIPAddress()
     if (config.loading) {
       loadingInstance = Loading.service({})
     }
-    // console.log(config)
+
+    //重试
+    if(config.retry){
+      config.timeout = 5000
+    }
     return config;
   },
   function (error) {
@@ -76,30 +67,20 @@ _axios.interceptors.response.use(
       return response.data
     }
     if (code === 401) {
-      // var redirectUrl = Router.app._route
-      // if(redirectUrl.path!='/login'){
-      //   var route1 = {
-      //     userName:localStorage.getItem('username'),
-      //     path:redirectUrl.path,
-      //     query:redirectUrl.query,
-      //     params:redirectUrl.params
-      //   }
-      //   storage.setObj('redirectUrl',route1)
-      // }
       Router.push({
         path: `/login`
       }).then(r => {})
       return Promise.reject(response.data)
     }
     if (code === 402  || code===201) {
-      Notification.error({
+      Notification_error({
         title: '权限不足',
         message: message
       })
       return Promise.reject(response.data)
     }
     if(code == 806){
-      Notification.error({
+      Notification_error({
         title: '账号未启用',
         message: message
       })
@@ -112,30 +93,61 @@ _axios.interceptors.response.use(
           path: `/login`
         }).then(r => {})
       }
+      Notification_error({
+        title: '请求错误',
+        message: message
+      })
       return Promise.reject(response.data)
-    } else if (code === 0) {
+    } else if (code === 708) {//系统错误
       isRefreshing = false
-      Notification.error({
+      Notification_error({
         title: '请求错误',
         message: message
       })
       return Promise.reject(response.data)
-    } else {
+    } else{
       isRefreshing = false
-      return response.data
+      Notification_error({
+        title: '请求错误',
+        message: message
+      })
+      return Promise.reject(response.data)
     }
     // Do something with response data
     // return response;
   },
   function (error) {
+    const obj = error.config
+    if(error.code =='ECONNABORTED' && obj.retry){
+      obj.__retryCount = obj.__retryCount || 0
+       // 检查是否达到最大重试次数
+      if (obj.__retryCount >= config.retries) {
+        return Promise.reject(error)
+      }
+      obj.isPagination = false
+      // 增加重试计数器
+      obj.__retryCount += 1
+       // 创建一个新的Promise来处理每次重试之前等待一段时间
+      const backoff = new Promise((resolve) => {
+        setTimeout(() => {
+          resolve('重新请求:' + obj.__retryCount)
+        }, obj.timeout || 3000)
+      })
+  
+      // 返回Promise,以便Axios知道我们已经处理了错误
+      return backoff.then((txt) => {
+        obj.url = obj.url.replace('/api','')
+        return _axios(obj)
+      })
+    }
     if(error.response.status == 404){
-      Notification.error({
+      Notification_error({
         title: '接口不存在',
         message: error.response.data.message
       })
     }else{
       // Do something with response error
-      Notification.error({
+      Notification_error({
         title: '系统错误',
         message: error.response.data.message
       })
@@ -147,6 +159,18 @@ _axios.interceptors.response.use(
   }
 );
 
+function Notification_error(obj){
+  let {title,message} = obj
+  if(!message || message.length>35 ){
+    message = '系统错误'
+  }
+  Notification.error({
+    title: title,
+    message: message
+  })
+}
+
+
 Plugin.install = function (Vue) {
   Vue.axios = _axios;
   window.axios = _axios;

+ 41 - 0
src/utils/common.js

@@ -6,7 +6,28 @@ import showPermissionDialog from "@/utils/model/noPermission/index";
 import { Base64 } from 'js-base64';
 import Config from '@/config'
 import moment from "moment";
+
+import * as XLSX from 'xlsx';
+import { saveAs } from 'file-saver';
 export default {
+  //滚动到顶部
+  scrollToTop(){
+    setTimeout(()=>{
+      // 假设你有一个元素的ID是'myElement'
+      const elements = document.getElementsByClassName('el-loading-parent--relative');
+      if(elements && elements.length>0){
+        for(var i = 0;i<elements.length;i++){
+          var element = elements[i]
+          element.scrollTo(
+            {
+                top: 0 ,
+                behavior: "instant"
+            }
+          )
+        }
+      }
+     },100)
+  },
   /**
    * 防抖
    * @param {Function} func 
@@ -213,6 +234,26 @@ treeToArray(data,prop={children:children}){
   },
 
   /**
+   * 导出为excel
+   * @param {Array} data 需要导出的数据
+   * @param {String} name 文件名称
+   */
+  exportToExcel(data=[],name='export'){
+    // 将数据转换为工作表
+      const worksheet = XLSX.utils.aoa_to_sheet(data);
+ 
+      // 创建工作簿并添加工作表
+      const workbook = XLSX.utils.book_new();
+      XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
+ 
+      // 生成Excel文件
+      const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+ 
+      // 使用blob和FileReader创建一个URL然后下载
+      const dataBlob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8' });
+      saveAs(dataBlob, name+'.xlsx');
+  },
+  /**
    * 导出Excel
    * @param {string} head excel头,可为空
    * @param {String} body excel体,可为空

+ 3 - 2
src/utils/direct/index.js

@@ -344,7 +344,7 @@ const equal_heights = {
       },
 }
 
-
+import elTableInfiniteScroll from './tableInfiniteScroll.js'
 
 const directives = {
     draggable,
@@ -353,7 +353,8 @@ const directives = {
     DivHeight, 
     equal_heights,
     shake,
-    dialogDrag
+    dialogDrag,
+    elTableInfiniteScroll
 };
 // 这种写法可以批量注册指令
 export default {

+ 41 - 0
src/utils/direct/tableInfiniteScroll.js

@@ -0,0 +1,41 @@
+
+import elInfiniteScroll from 'element-ui/lib/infinite-scroll';
+
+const elInserted = elInfiniteScroll.inserted;
+const elUnbind = elInfiniteScroll.unbind;
+const elScope = 'ElInfiniteScroll';
+
+export default {
+  inserted(el, binding, ...params) {
+    // 获取 table 中的滚动层
+    const scrollElem = el.querySelector('.el-table__body-wrapper');
+
+    // 如果没找到元素,返回错误
+    if (!scrollElem) {
+      throw 'table-infinite-scroll: 找不到 .el-table__body-wrapper 容器';
+    }
+
+    // 设置自动滚动
+    scrollElem.style.overflowY = 'auto';
+
+    // 加入滚动路基
+    setTimeout(() => {
+      elInserted(scrollElem, binding, ...params);
+
+      // 将子集的引用放入 el 上,用于 unbind 中销毁事件
+      el[elScope] = scrollElem[elScope];
+    });
+  },
+  unbind: function unbind(el) {
+        var _el$scope = el[elScope]
+        if(!_el$scope){
+            return
+        }
+           var container = _el$scope.container,
+            onScroll = _el$scope.onScroll;
+    
+        if (container) {
+          container.removeEventListener('scroll', onScroll);
+        }
+    }
+};

+ 1 - 1
src/utils/model/upload/index.vue

@@ -221,7 +221,7 @@ export default {
     onChange(file, fileList) {
       if(this.limit){
         if(this.fileList.length>=this.limit){
-          this.$message.warning(`只能上传${this.$limit}个文件`)
+          this.$message.warning(`只能上传${this.limit}个文件`)
           return false
         }
       }

+ 27 - 22
src/utils/permissions.js

@@ -56,9 +56,9 @@ export default {
       return true
     }
     var data = {}
-    if(sessionStorage.getItem('projectPermission')){
-      data = JSON.parse(sessionStorage.getItem('projectPermission'))
-    }
+    // if(sessionStorage.getItem('projectPermission')){
+    //   data = JSON.parse(sessionStorage.getItem('projectPermission'))
+    // }
     var obj = data[projectId]
     if(!obj){
       var projectIds = [projectId]
@@ -66,19 +66,24 @@ export default {
         if(response.code == 200){
           var d = response.data.data[projectId]
           data[projectId] = d
-          sessionStorage.setItem('projectPermission',JSON.stringify(data))
+          // sessionStorage.setItem('projectPermission',JSON.stringify(data))
           obj = d
         }
       })
     }
     if(!obj){
-      return false
+      return 0
     }
     // 0创建人 1负责人 3被分享人 2参与人
     if(obj.includes('0')||obj.includes('1')||obj.includes('2')){
       return true
     }
-    return false
+    if(obj.includes('3')){
+      return false
+    }else{
+      return 0
+    }
+    
   },
   /**
    * 功能权限
@@ -107,17 +112,17 @@ export default {
       return false
     }
     var data = {}
-    if(type == 2){
-      var str = sessionStorage.getItem('product')
-      if(str){
-        data = JSON.parse(str)
-      }
-    }else if(type == 1){
-      var str = sessionStorage.getItem('productCategory')
-      if(str){
-        data = JSON.parse(str)
-      }
-    }
+    // if(type == 2){
+    //   var str = sessionStorage.getItem('product')
+    //   if(str){
+    //     data = JSON.parse(str)
+    //   }
+    // }else if(type == 1){
+    //   var str = sessionStorage.getItem('productCategory')
+    //   if(str){
+    //     data = JSON.parse(str)
+    //   }
+    // }
     var obj = data[id]
     if(!obj){
       
@@ -138,11 +143,11 @@ export default {
           var d = response.data.data
           if(d && d.length>0){
             data[d[0].id] = d[0]
-            if(type == 2){
-              sessionStorage.setItem('product',JSON.stringify(data))
-            }else if(type == 1){
-              sessionStorage.setItem('productCategory',JSON.stringify(data))
-            }
+            // if(type == 2){
+            //   sessionStorage.setItem('product',JSON.stringify(data))
+            // }else if(type == 1){
+            //   sessionStorage.setItem('productCategory',JSON.stringify(data))
+            // }
             obj = d[0]
           }
         }

+ 7 - 2
src/views/components/drawer/Field.vue

@@ -202,7 +202,8 @@ export default {
       btnLoading: false,
       loading: false,
       optionLoading: false,
-      tableData: []
+      tableData: [],
+      change:false,
     }
   },
   mounted() {
@@ -243,11 +244,12 @@ export default {
       this.projectId = id
       this.drawer = true
       this.searchOption.projectId = this.projectId
+      this.change = false
       this.getList()
     },
     close() {
       this.drawer = false
-      this.$emit('close',this.projectId)
+      this.$emit('close',this.projectId,this.change)
     },
     close2() {
       this.lockOption = false
@@ -477,6 +479,7 @@ export default {
             this.$api.updateCustomField(this.ruleForm).then(response => {
               this.$message.success('编辑成功')
               this.btnLoading = false
+              this.change = true
               this.getList()
               this.cancel()
             }).catch(error => {
@@ -486,6 +489,7 @@ export default {
             this.$api.addCustomField(this.ruleForm).then(response => {
               this.$message.success('新增成功')
               this.btnLoading = false
+              this.change = true
               this.getList()
               this.cancel()
             }).catch(error => {
@@ -511,6 +515,7 @@ export default {
         this.$api.deleteCustomField(ids).then(response => {
           this.$message.success('删除成功')
           this.loading = false
+          this.change = true
           this.getList()
         }).catch(error => {
           this.loading = false

+ 63 - 0
src/views/components/errorPage/404.vue

@@ -0,0 +1,63 @@
+<template>
+  <div class="page404">
+    <div class="content">
+        <el-image style="width: 100%;height:100%" :src="require('@/assets/img/404.jpg')" fits="contain"></el-image>
+        <div class="btn">
+            <el-button  type="text" @click="to">回到首页</el-button> 
+        </div>
+        
+        
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    return {
+        timer:null
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    // var that = this
+    // this.timer = setTimeout(()=>{
+    //   that.to()
+    // },5000)
+  },
+  beforeDestroy() {
+    clearTimeout(this.timer)
+  },
+  methods: {
+    to(){
+      this.$router.replace(
+        {
+          path:'/home'
+        }
+      )
+      clearTimeout(this.timer)
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+.page404{
+    position: relative;
+    height: 100%;
+    .content{
+        width: 1000px;
+        height: 600px;
+        position: absolute;
+        inset: 0;
+        margin: auto;
+    }
+    .btn{
+        display: flex;
+        justify-content: center;
+    }
+}
+</style>

+ 1 - 1
src/views/components/errorPage/components/ErrorPageLayout.vue

@@ -40,7 +40,7 @@ export default {
   },
   methods: {
     to(){
-      this.$router.push(
+      this.$router.replace(
         {
           path:'/home'
         }

+ 5 - 2
src/views/components/import/conditionImport/customSearch.vue

@@ -23,7 +23,7 @@
         </el-aside>
         <el-main>
             <div>
-                <myFormSearch :list="(editData && editData.component == 'customSearch')?editData.data:list" :field="field" :searchValue="true" @search="search"></myFormSearch>
+                <myFormSearch ref="myFormSearch" :list="(editData && editData.component == 'customSearch')?editData.data:list" :field="field" :searchValue="true" @search="search"></myFormSearch>
             </div>
         </el-main>
     </el-container>
@@ -144,10 +144,13 @@ export default {
         }
         this.$emit('search',str,params)
       }else{
-        this.$emit('search',`${val}`,params)
+        this.$emit('search',`${val?val:''}`,params)
       }
       
     },
+    search1(){
+      this.$refs.myFormSearch.search2()
+    },
     change(val){
       if(val){
         this.checkList = this.countryList1.filter(item=>item.value!='CN').map(item=>item.value)

+ 19 - 6
src/views/components/import/conditionImport/search.vue

@@ -35,11 +35,11 @@
         <div style="display:flex;align-items:start;height:calc(100% - 60px);overflow-y:auto">
             <div style="width:15%;height:100%"></div>
             <div style="width:70%;height:100%;">
-                <component :is='isComponent' @search="search" :editData="editData" :countryList="countryList" :DBType="DBType" :selected="selected"></component>
+                <component ref="componentsSearch" :is='isComponent' @search="search" :editData="editData" :countryList="countryList" :DBType="DBType" :selected="selected"></component>
             </div>  
             <div style="width:15%;height:100%">
                 <!-- <createNoveltySearch ref="createNoveltySearch" width="15%" :show="true" :position="{right:0,top:'120px'}"></createNoveltySearch> -->
-                <inventionPointDialog type="plus" :projectId="projectId" :btns="[1,2,3]" v-if="noveltySearch" @getProjectId="getProjectId"></inventionPointDialog>
+                <inventionPointDialog type="plus" :projectId="projectId" :DBType="DBType" :btns="[1,2,3]" v-if="noveltySearch" @getProjectId="getProjectId" @searchByInventionPoint="searchByInventionPoint"></inventionPointDialog>
             </div>
         </div>
         
@@ -79,7 +79,8 @@ export default {
                 },
                 loading:false,
                 data:[]
-            }
+            },
+            semanteme:''
         }
     },
     mounted() {
@@ -221,8 +222,16 @@ export default {
         changeComponent(val){
             this.isComponent = val
         },
+        searchByInventionPoint(val){
+            this.semanteme = val
+            if(this.isComponent == 'customSearch'){
+                this.$refs.componentsSearch.search1()
+            }else{
+                this.$refs.componentsSearch.search()
+            }
+        },
         async search(val,data){
-            if(val == '' && data.component!='patentNoSearch'){
+            if((val == '' && !this.semanteme) && data.component!='patentNoSearch'){
                 this.$message.error('检索信息不能为空')
                 return false
             }
@@ -235,7 +244,7 @@ export default {
             }
             var a = {
                 ...this.importData,
-                searchCondition:val,
+                searchCondition:val || "",
                 DBType:this.DBType,
                 retrieveRecordId:null,
                 type:4,
@@ -251,13 +260,17 @@ export default {
                     noveltySearch:this.noveltySearch,
                     projectId:this.projectId,
                     outside:this.DBType == 'inner'?false:true,
-                    innerProjectId:this.innerProjectId
+                    innerProjectId:this.innerProjectId,
+                    semanteme:this.semanteme
                 }
             })
             data.innerProjectId = this.innerProjectId
             this.$s.setSession('conditionImport',{
                 data:data,
             })
+            if(this.semanteme){
+                this.semanteme = ''
+            }
         },
         openHistory(){
             const router = this.$router.resolve({

+ 65 - 7
src/views/components/import/conditionImport/searchResult.vue

@@ -29,7 +29,7 @@
       </el-header>
       <el-main id="patent-list-container" v-loading="loading">
         <div class="height_100">
-          <component ref="patentViewList" :is="viewSelected" :outside="outside" :retrieveRecordId="retrieveRecordId"  :noveltySearch="noveltySearch" :column="columnList" :tableData="tableData"  @clickPatentNo="handleClick" :canSort="condition.component != 'patentNoSearch'?true:false"
+          <component ref="patentViewList" :is="viewSelected" :semanteme="semanteme" :outside="outside" :retrieveRecordId="retrieveRecordId"  :noveltySearch="noveltySearch" :column="columnList" :tableData="tableData"  @clickPatentNo="handleClick" :canSort="condition.component != 'patentNoSearch'?true:false"
             @select-change="handleSelect" :selected.sync="queryParams.selected" :queryParams="queryParams" :patentNoList.sync="patentNoList" :refresh='true'
             :view-field="patentViewField" @on-sort="handleSort" @addSelect="getChoosePatentNo" :projectId="projectId" :contrastFileList="saveRemarkList" @saveRemark="saveRemark"></component>
         </div>
@@ -89,7 +89,7 @@
       </span>
     </el-dialog>
     <addAndEditSearchRecords ref="addAndEditSearchRecords" :projectId="condition.importToId"></addAndEditSearchRecords>
-    <inventionPointDialog v-if="noveltySearch" :projectId="projectId" :retrieveRecordId="retrieveRecordId"  :contrastFileList="saveRemarkList"></inventionPointDialog>
+    <inventionPointDialog v-if="noveltySearch" :projectId="projectId" :retrieveRecordId="retrieveRecordId"  :contrastFileList="saveRemarkList" @updateInventionPoint="getPatentSimilarMess"></inventionPointDialog>
     <reportTemplateDialog ref="reportTemplateDialog"></reportTemplateDialog>
   </div>
 </template>
@@ -125,7 +125,8 @@ export default {
       type:Boolean,
       default:true
     },
-    innerProjectId:{}
+    innerProjectId:{},
+    semanteme:''
   },
   data() {
     return {
@@ -465,8 +466,13 @@ export default {
     },
     //获取最大页数
     getPageCount() {
-      var a = Math.ceil(Number(this.total) / Number(this.queryParams.size))
-      return a > 200 ? 200 : a
+      if(this.outside){
+        var a = Math.ceil(Number(this.total) / Number(this.queryParams.size))
+        return a > 200 ? 200 : a
+      }else{
+        return Math.ceil(Number(this.total) / Number(this.queryParams.size))
+      }
+      
     },
     //开始条数校验
     change1(val) {
@@ -503,6 +509,7 @@ export default {
         size: this.queryParams.size, //每页返回条数(最多 50 条)
         projectId: this.innerProjectId,
         searchQuery: this.condition.searchCondition || '',//检索条件
+        semanteme:this.semanteme
       }
       if(this.queryParams.OrderBy && this.queryParams.OrderByType){
         var orderDTOList = [
@@ -521,6 +528,17 @@ export default {
           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.data
+          if(params.semanteme){
+            records.forEach(item=>{
+              if(!item.score){
+                item.score =  'error'
+              }else{
+                var score = (item.score * 100 + '').substring(0, 5)
+                item.score =  Number(score)
+              }
+              
+            })
+          }
           this.tableData = records
           this.$store.commit("SET_PATENT_RECORDS", records);
           this.loading = false;
@@ -549,7 +567,7 @@ export default {
 
         //专利号检索
         numberQuery:this.condition.NO,
-        redisKey:this.condition.redisKey
+        redisKey:this.condition.redisKey,
       };
       if(!this.queryParams.retrieveRecordId){
         params.projectId = this.projectId
@@ -561,6 +579,7 @@ export default {
       this.$store.commit("SET_PATENT_PARAMS", queryParams);
       this.$store.commit("SET_PATENT_RECORDS", []);
       this.loading = true;
+      this.$commonJS.scrollToTop()
       await this.$api.patentSelect(params).then((response) => {
         if (response.code == 200) {
           this.total = response.data.total;
@@ -577,7 +596,7 @@ export default {
           this.$store.commit("SET_PATENT_PARAMS", queryParams);
           this.$store.commit("SET_PATENT_RECORDS", records);
           this.getImageAndStatus()
-          // this.getPatentSimilarMess()
+          this.getPatentSimilarMess()
           this.loading = false;
           if(response.data.redisKey && !this.condition.redisKey){
             this.condition.redisKey = response.data.redisKey
@@ -627,6 +646,45 @@ export default {
       if(this.tableData.length == 0 || !this.noveltySearch){
         return
       }
+      this.tableData.forEach(item=>{
+        let params = {
+          projectId:this.projectId,
+          patentScoreDTOList:[]
+        }
+        var obj = {
+          patentNo:item.patentNo,
+          appNo:item.appNo,
+          rowApplicationNo:item.rowApplicationNo,
+          publicNo:item.publicNo,
+          grantNo:item.grantNo
+        }
+        params.patentScoreDTOList.push(obj)
+        this.$api.getPatentSimilarMess(params).then(response=>{
+          if(response.code == 200){
+            var data = response.data.patentScoreDTOList
+            if(!data){
+              this.$set(item, 'score', 'error')
+              return
+            }
+            for(var i = 0;i<this.tableData.length;i++){
+              var item1 = this.tableData[i]
+              var index = data.findIndex(j=>{
+                return j.patentNo == item1.patentNo
+              })
+              if(index!=-1){
+                var score = (data[index].score * 100 + '').substring(0, 5)
+                this.$set(item1, 'score', Number(score))
+                data.splice(index,1)
+              }else{
+                this.$set(item1, 'score', 'error')
+              }
+            }
+          }
+        }).catch(error=>{
+          this.$set(item, 'score', 'error')
+        })
+      })
+      return
       var params = {
         projectId:this.projectId,
         patentScoreDTOList:[]

+ 4 - 1
src/views/components/import/conditionImport/searchResultIndex.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <search-Result :searchData="searchData" :noveltySearch="noveltySearch" :projectId="projectId" :retrieveRecordId="retrieveRecordId" :outside="outside" :innerProjectId="innerProjectId"></search-Result> 
+    <search-Result :searchData="searchData" :semanteme="semanteme" :noveltySearch="noveltySearch" :projectId="projectId" :retrieveRecordId="retrieveRecordId" :outside="outside" :innerProjectId="innerProjectId"></search-Result> 
   </div>
 </template>
 
@@ -37,6 +37,9 @@ export default {
     innerProjectId(){
       return this.$route.query.innerProjectId
     },
+    semanteme(){
+      return this.$route.query.semanteme
+    },
   },
   methods: {},
   created() {},

+ 6 - 6
src/views/login/index.vue

@@ -268,17 +268,17 @@ export default {
           if(redirectUrl){
             redirectUrl = JSON.parse(redirectUrl)
             localStorage.removeItem('redirectUrl')
-            if(redirectUrl.userName != this.ruleForm.username){
-              this.$router.push({
-                path: '/home'
-              })
-            }else{
+            // if(redirectUrl.userName && redirectUrl.userName != this.ruleForm.username){
+            //   this.$router.push({
+            //     path: '/home'
+            //   })
+            // }else{
               this.$router.replace({
                 path:redirectUrl.path!='/login'?redirectUrl.path:'/home',
                 query:redirectUrl.query,
                 params:redirectUrl.params
               })
-            }
+            // }
           }else{
             this.$router.push({
               path: '/home'

+ 18 - 2
src/views/noveltySearch/components/dialog/inventionPoint/inventionPoint.vue

@@ -2,20 +2,21 @@
   <div class="inventionPointDialog" v-if="show2">
     <div class="mini" :style="miniStyle" @click="changeDom('mini')" v-if="!show" v-drag="getPosition" ref="mini">查新</div>
     <div class="plus" v-else v-drag2="getPosition" ref="plus" :style="plusStyle">
-      <div class="head">
+      <div class="head" ondragstart="return false">
         <div>{{ text }}</div>
         <div style="width: 20px; height: 20px">
           <el-image  @click="changeDom('plus')"  style="width: 100%; height: 100%" :src="require('@/assets/img/收起.png')" fit="contain"></el-image>
         </div>
       </div>
       <div class="main">
-        <div class="main_head">
+        <div class="main_head" ondragstart="return false">
           <div>
             <span style="font-size:12px">发明点:</span>
             <el-button v-if="projectId" style="margin-left:10px" type="text" size="mini" @click="intoProject" >进入项目</el-button>
           </div>
           <div>
             <!-- <el-button  type="text"  size="mini"  :loading="loading" v-if="btns.indexOf(1)!=-1"  @click="submit(1)">关键词</el-button> -->
+            <el-button  type="text"  size="mini"  v-if="DBType == 'inner'"  @click="search()">检索</el-button>
             <el-button  type="text"  size="mini"  :loading="loading" v-if="btns.indexOf(2)!=-1"  @click="submit(2)">相似案件</el-button>
             <el-button  type="text"  size="mini"  :loading="loading" v-if="btns.indexOf(3)!=-1"  @click="submit(3)">保存</el-button>
           </div>
@@ -191,6 +192,10 @@ export default {
     miniStyle:{
       type:String,
       default:''
+    },
+    DBType:{
+      type:String,
+      default:''
     }
   },
   data() {
@@ -390,6 +395,7 @@ export default {
           if(!this.technicalCase.projectId){
             this.$emit('getProjectId',response.data.projectId)
           }
+          this.$emit('updateInventionPoint')
           this.technicalCase.technicalCaseId = response.data.technicalCaseId
           this.technicalCase.projectId = response.data.projectId
         }
@@ -411,6 +417,10 @@ export default {
     exportReport(){
       this.$refs.reportTemplateDialog.open(this.projectId)
     },
+    //检索
+    search(){
+      this.$emit('searchByInventionPoint',this.technicalCase.inventionPoint)
+    }
   },
 };
 </script>
@@ -454,6 +464,12 @@ export default {
       width: 100%;
       display: flex;
       justify-content: space-between;
+      -webkit-user-drag: none;
+      user-select: none;
+      -moz-user-select: none;
+      -webkit-user-select: none;
+      -ms-user-select: none;
+      -webkit-user-drag: none;
     }
     .main {
       .main_head {

+ 28 - 1
src/views/noveltySearch/components/noveltySearchCard.vue

@@ -8,7 +8,7 @@
                     </mySearch>
                   </div>
                   <div class="head_right">
-                      
+                      <!-- <el-button @click="exportReport">导出</el-button> -->
                   </div>
               </div>
           </el-header>
@@ -110,6 +110,30 @@ import createNoveltySearch from './dialog/createNoveltySearch.vue';
         this.getList()
     },
     methods: {
+      exportReport(){
+        console.log(this.tableData)
+        var data = []
+        var head = [
+          '序号','姓名','数量'
+        ]
+        data.push(head)
+        const unique = {};
+        this.tableData.forEach(item => {
+          if (unique[item.createName]) {
+            unique[item.createName].count += 1;
+          } else {
+            unique[item.createName] = { name: item.createName, count: 1 };
+          }
+        });
+        var num = 1
+        for(let key in unique){
+          var arr = []
+          arr.push(num,unique[key].name,unique[key].count)
+          data.push(arr)
+          num ++ 
+        }
+        this.$commonJS.exportToExcel(data,'查新检索报告')
+      },
          //获取检索字段和分组字段
     async getColumn() {
       let params = ['noveltyProject']
@@ -144,6 +168,9 @@ import createNoveltySearch from './dialog/createNoveltySearch.vue';
       },
       //获取数据
       getList(){
+        if(this.tableData.length == 0 && this.queryParams.current!=1){
+          this.queryParams.current -= 1
+        }
         this.loading = true
         var params = {
             ...this.queryParams,

+ 35 - 42
src/views/patentMining/components/dialog/addAndEditProject.vue

@@ -655,60 +655,52 @@ export default {
 
 
     //打开弹窗
-    async open(form) {
+    async open(form={}){
+      this.form = JSON.parse(JSON.stringify(form))
       this.personnelList.data = []
-      if (form && form.id) {
-        this.form = JSON.parse(JSON.stringify(form))
-        // 负责人
-        if (this.form.headId) {
-          this.personnelList.queryParams.id = this.form.headId
-          await this.getPermissionPersonnel(1)
-          this.personnelList.queryParams.id = null
-        }
-        // 部门委托客户
-        if (this.form.entrustId) {
-          
-          // this.personnelList.queryParams.id = this.form.entrustId
-          // await this.getPermissionPersonnel(1)
-          // this.personnelList.queryParams.id = null
-        }
-        // 参与人
-        if (this.form.involvedPersons && this.form.involvedPersons.length) {
-          this.form.adminPersons = []
-          this.form.adminIds = []
-          this.form.involvedPersons.forEach(item => {
-            let a = {
-              id: item.personId,
-              name: item.personName
-            }
-            this.form.adminPersons.push(a)
-            this.form.adminIds.push(a.id)
-          })
-        }
+
+      //获取title
+      if(this.form.id){
         this.title = '编辑专利挖掘项目'
-      } else {
-        // this.eventList.disabled = false
-        // if (this.form.eventId) {
-        //   this.eventList.disabled = true
-        //   this.eventList.data.push({
-        //     id: this.form.eventId,
-        //     name: this.form.eventName,
-        //   })
-        // }
+      }else{
         this.title = '新增专利挖掘项目'
       }
+      //负责人
+      if (this.form.headId) {
+        this.personnelList.queryParams.id = this.form.headId
+        await this.getPermissionPersonnel(1)
+        this.personnelList.queryParams.id = null
+      }
+      // 部门委托客户
+      if (this.form.entrustId) {
+      }
+      // 参与人
+      if (this.form.involvedPersons && this.form.involvedPersons.length) {
+        this.form.adminPersons = []
+        this.form.adminIds = []
+        this.form.involvedPersons.forEach(item => {
+          let a = {
+            id: item.personId,
+            name: item.personName
+          }
+          this.form.adminPersons.push(a)
+          this.form.adminIds.push(a.id)
+        })
+      }
+
+      //事件
       this.eventList.data = []
       this.eventList.name = ''
       this.eventList.disabled = false
       var hasEvent = false
-      if(this.form.eventId){
-        this.eventList.disabled = true
-        hasEvent = true
-      }
       if(this.form.eventIds && this.form.eventIds.length>0){
         this.form.eventId = this.form.eventIds[0]
         hasEvent = true
       }
+      if(this.form.eventId){
+        this.eventList.disabled = true
+        hasEvent = true
+      }
       if(hasEvent){
         if(this.form.eventId){
           let params = {
@@ -738,6 +730,7 @@ export default {
       }
       this.getPermissionPersonnel()
       this.dialogVisible = true
+
     },
     //关闭弹窗
     handleClose() {

+ 1 - 1
src/views/patentMining/components/viewIndex.vue

@@ -320,7 +320,7 @@ export default {
         eventName:this.eventName,
         eventId:this.eventId
       }
-      this.$refs.addAndEditProject.open()
+      this.$refs.addAndEditProject.open(form)
     },
     // 创建项目按钮下拉菜单内容
     handleCommand(ev) {

+ 41 - 186
src/views/product/components/jsMind/components/mind.vue

@@ -447,8 +447,6 @@ export default {
     init() {
       this.jm.view.minZoom = 0.1;
       this.jm.view.maxZoom = 5;
-      // this.jm.expand_all()
-      // this.setColor()
       // 重写编辑完成事件
       this.jm.view.edit_node_end = () => {
         const node = this.jm.view.get_editing_node();
@@ -473,117 +471,11 @@ export default {
       const selectedNode = this.jm.get_selected_node();
       if (selectedNode) {
         if (selectedNode.children.length == 0) {
-          // if (selectedNode.data.rowType == 1) {//查询产品
-          //   var queryParams = {
-          //     productCategoryId: selectedNode.data.ids,
-          //   };
-          //   this.$api.queryProducts(queryParams).then((res) => {
-          //     if (res.code == 200) {
-          //       this.jm.enable_edit();
-          //       res.data.list.forEach((item) => {
-          //         var data = {
-          //           expanded: false,
-          //           rowType: 2,
-          //           ids: item.id,
-          //           productName:item.productName,
-          //           children: [],
-          //         };
-          //         this.jm.toggle_node(selectedNode.id);
-          //         data.children = item.children ? item.children : [];
-          //         item.type = 2;
-          //         this.jm.add_node(
-          //           selectedNode.id,
-          //           "产品" + item.id,
-          //           this.getModelCardDom(item),
-          //           data
-          //         );
-          //       });
-          //       this.jm.disable_edit();
-          //     }
-          //   });
-          // } else if (selectedNode.data.rowType == 2) {//查询产品架构
-          //   var queryParams = {
-          //     productId: selectedNode.data.ids,
-          //     structureId: 0,
-          //   };
-          //   this.$api.queryStructures(queryParams).then((res) => {
-          //     if (res.code == 200) {
-          //       this.jm.enable_edit();
-
-          //       res.data.children.forEach((item) => {
-          //         var data = {
-          //           expanded: false,
-          //           rowType: 3,
-          //           ids: item.id,
-          //           productId: selectedNode.data.ids,
-          //           productName:selectedNode.data.productName,
-          //         };
-          //         this.jm.toggle_node(selectedNode.id);
-          //         data.children = item.children ? item.children : [];
-          //         item.productName=selectedNode.data.productName,
-          //         item.type = 3;
-          //         this.jm.add_node(
-          //           selectedNode.id,
-          //           "架构" + item.id,
-          //           this.getModelCardDom(item),
-          //           data
-          //         );
-          //         // if(item.children&& item.children.length>0){
-          //         //     this.deepChildren(item.id,item.children)
-          //         // }
-          //       });
-
-          //       this.jm.disable_edit();
-          //     }
-          //   });
-          // } else {
-          //   if ((selectedNode.data.children&&selectedNode.data.children.length==0) ||( selectedNode.data.hasChildren && selectedNode.data.hasChildren.length==0)) {
-          //     return false;
-          //   }
-          //   var queryParams = {
-          //     structureId: selectedNode.data.ids,
-          //     productId: selectedNode.data.productId,
-          //   };
-          //   this.$api.queryStructures(queryParams).then((res) => {
-          //     if (res.code == 200) {
-          //       this.jm.enable_edit();
-
-          //       res.data.children.forEach((item) => {
-          //         var data = {
-          //           expanded: false,
-          //           rowType: 3,
-          //           ids: item.id,
-          //           productId: selectedNode.data.productId,
-          //           productName:selectedNode.data.productName,
-          //         };
-          //         this.jm.toggle_node(selectedNode.id);
-          //         data.children = item.children ? item.children : [];
-          //         item.productName=selectedNode.data.productName,
-          //         item.type = 3;
-          //         this.jm.add_node(
-          //           selectedNode.id,
-          //           "架构" + item.id,
-          //           this.getModelCardDom(item),
-          //           data
-          //         );
-          //         // if(item.children&& item.children.length>0){
-          //         //     this.deepChildren(item.id,item.children)
-          //         // }
-          //       });
-
-          //       this.jm.disable_edit();
-          //     }
-          //   });
-          // }
+          
         } else {
           this.jm.toggle_node(selectedNode.id);
         }
-
-        //   return selectedNode.id
       }
-      // else {
-      //   return null
-      // }
     },
 
     // 拖拽
@@ -702,6 +594,7 @@ export default {
     },
 
 
+    //获取当前数据
    async getData() {
     if (this.type == 1) {//产品类别
       let params = {
@@ -743,8 +636,9 @@ export default {
   async LoadData(currentData){
     if(currentData.MindType == 1){//产品类别
       var data1 = currentData
-      //装载产品
-      const [products] = await Promise.allSettled([this.initData(data1)])
+      //装载产品和架构
+      const [products,classificationNode] = await Promise.allSettled([this.initData(data1),this.initData(data1,2)])
+      //产品的装载
       var productList = products.status =='fulfilled'?products.value:[]
       if(productList.length>0){
         data1.hasChildren = true
@@ -756,20 +650,46 @@ export default {
           item.topic = this.getModelCardDom(item)
           return item
         })     
+      }else{
+
       }
-      data1.topic = this.getModelCardDom(data1)
 
+      // 产品类别架构的装载
+      var classificationNodes = classificationNode.status =='fulfilled'?classificationNode.value:[]
+      if(classificationNodes && classificationNodes.length){
+        data1.hasChildren = true
+        if(!data1.children){
+          data1.children = []
+        }
+        this.deepChildren(classificationNodes,data1)
+        data1.children.push(...classificationNodes)
+      }
 
-      //装载架构
+
+      data1.topic = this.getModelCardDom(data1)
+
+      //判断产品类别是否有产品
       var data2 = data1.children
+      if(!data2){
+        return
+      }
       // 获取需要返回的架构数组以及funList
       var treeList = [], funList = []
       for(var i = 0;i<data2.length;i++){
+        if(data2[i].MindType!=2){
+          continue
+        }
         treeList.push(`tree${i+1}`)
         funList.push(this.initData(data2[i]))
       }
+      if(treeList.length == 0){
+        return
+      }
       treeList = await Promise.allSettled(funList)
       for(var i = 0;i<data2.length;i++){
+        if(data2[i].MindType!=2){
+          continue
+        }
         var trees = treeList[i].status =='fulfilled'?treeList[i].value:[]
         if(trees.length>0){
           data2[i].hasChildren = true
@@ -790,7 +710,7 @@ export default {
       }
       data1.topic = this.getModelCardDom(data1)
       data1.children = trees
-    }else if(currentData.MindType == 0){//全部
+    }else if(currentData.MindType == 0){//全部,有错误
       var data1 = currentData
       //装载产品类别
       const [category] = await Promise.allSettled([this.initData(data1)])
@@ -810,6 +730,9 @@ export default {
 
       //装载产品
       var data2 = data1.children
+      if(!data2){
+        return
+      }
       // 获取需要返回的架构数组以及funList
       var productList = [], funList = []
       for(var i = 0;i<data2.length;i++){
@@ -854,19 +777,19 @@ export default {
     }
   },
   //初始化JsMind数据
-  async initData(currentData){
-      if(currentData.MindType == 1){
+  async initData(currentData,type){
+      if(currentData.MindType == 1 && type!=2){//查询产品
         let params = {
           searchQuery:`category_id=${currentData.MindId}`,//检索条件
         }
         return await this.$api.queryProduct(params).then(response=> response.data.data)
-      }else if(currentData.MindType == 2){//产品
+      }else if(currentData.MindType == 2 || type == 2){//查询产品架构
         var params = {
           type: currentData.MindType,
           typeId: currentData.MindId
         }
         return await this.$api.queryTreeNodeTree(params).then(response=> response.data.data)
-      }else if(currentData.MindType == 0){
+      }else if(currentData.MindType == 0){//查询产品类别
         let params = {
           searchQuery:'',//检索条件
         }
@@ -874,72 +797,6 @@ export default {
       }
       
     },
-    // //初始化JsMind数据
-    // async initData(currentData){
-    //   if(currentData.MindType == 1){
-    //     let params = {
-    //       searchQuery:`product_id=${currentData.id}`,//检索条件
-    //     }
-    //     await this.$api.queryProduct(params).then(response=>{
-    //       if(response.code == 200){
-    //         if(response.data.data.length>0){
-    //           currentData.hasChildren = true
-    //           currentData.children = response.data.data.map(item=>{
-    //             item.MindId = `产品${item.id}`
-    //             item.MindType = 2
-    //             item.expanded = false
-    //             item.topic = this.getModelCardDom(item)
-    //             // this.jm.enable_edit();
-    //             // this.jm.update_node(item.MindId,this.getModelCardDom(item) )
-    //             // this.jm.disable_edit();
-    //             return item
-    //           })
-              
-              
-    //         }
-    //       }
-    //     })
-    //   }else if(currentData.MindType == 2){
-    //     var params = {
-    //       type: currentData.MindType,
-    //       typeId: currentData.id
-    //     }
-    //     await this.$api.queryTreeNodeTree(params).then(res => {
-    //       if (res.code == 200) {
-    //         var data = res.data.data
-    //         if(data.length>0){
-    //           currentData.hasChildren = true
-    //           var data = this.deepChildren(data,currentData)
-    //         }
-    //         currentData.children = data
-    //       }
-    //     })
-    //   }else if(currentData.MindType == 0){
-    //     let params = {
-    //       searchQuery:'',//检索条件
-    //     }
-    //     await this.$api.queryProductCategory(params).then(response=>{
-    //       if(response.code == 200){
-    //         if(response.data.data.length>0){
-    //           currentData.hasChildren = true
-    //           currentData.children = response.data.data.map(item=>{
-    //             item.MindId = `产品类别${item.id}`
-    //             item.MindType = 1
-    //             item.expanded = false
-    //             item.topic = this.getModelCardDom(item)
-    //             // this.jm.enable_edit();
-    //             // this.jm.update_node(item.MindId,this.getModelCardDom(item) )
-    //             // this.jm.disable_edit();
-    //             return item
-    //           })
-             
-    //         }
-    //       }
-    //     })
-    //   }
-      
-    // },
-
     //递归
     deepChildren(data,currentData){
       for(var i = 0;i<data.length;i++){
@@ -969,7 +826,6 @@ export default {
  async mounted() {
     window.check = this.check;
     await this.getData()
-    // await this.initData(this.currentData)
     this.mind.data = this.currentData
     this.jm = jsMind.show(this.options, this.mind);
 
@@ -979,7 +835,6 @@ export default {
         //   this.handleDrop(nextParentId, srcNode.id)
         // }
         this.editor = this.jm.view.e_editor;
-        //   this.init()
         this.toggleStucture("side");
         this.mouseWheel();
         this.mouseDrag();

+ 1 - 1
src/views/project/components/view/table.vue

@@ -260,7 +260,7 @@ export default {
 </style>
 <style lang="scss" scoped>
 .patentName{
-  z-index: 99999;
+  // z-index: 99999;
   position: relative;
   // margin: 0 15px;
   .jiankong{

+ 10 - 5
src/views/project/patentCollection/components/drawer/merge.vue

@@ -334,11 +334,16 @@ export default {
       var data = this.ruleFormTableData.filter(item=>{
         return !item.sign
       })
-      var disabled = [
-        {
-          mergeId:this.ruleForm.id
-        }
-      ]
+      if(this.ruleForm.id){
+        var disabled = [
+          {
+            mergeId:this.ruleForm.id
+          }
+        ]
+      }else{
+        var disabled = []
+      }
+      
       this.$refs.mergeTableDialog.open(titles[this.mergeType],data,disabled)
     },
     getChecked(value){

+ 1 - 0
src/views/project/patentCollection/components/drawer/mergeTableDialog.vue

@@ -84,6 +84,7 @@ export default {
         this.title=title
         this.mergedList = checked || []
         this.disabled=disabled||[]
+        this.searchOption = []
         this.getList()
         this.visible = true
     },

+ 12 - 6
src/views/project/patentCollection/components/mixins/index.js

@@ -55,17 +55,23 @@ export const projectData = {
       default: () => {
         return []
       }
-    }
+    },
+    semanteme:''
   },
 
   data() {
     return {
       customColors: [
-        { color: '#f56c6c', percentage: 20 },
-        { color: '#e6a23c', percentage: 40 },
-        { color: '#5cb87a', percentage: 60 },
-        { color: '#1989fa', percentage: 80 },
-        { color: '#6f7ad3', percentage: 100 }
+        { color: 'rgb(173, 173, 173)', percentage: 10 },
+        { color: 'rgb(130, 220, 130)', percentage: 20 },
+        { color: 'rgb(173, 255, 86)', percentage: 30 },
+        { color: 'rgb(255, 255, 173)', percentage: 40 },
+        { color: 'rgb(255, 255, 0)', percentage: 50 },
+        { color: 'rgb(255, 173, 0)', percentage: 60 },
+        { color: 'rgb(255, 130, 130)', percentage: 70 },
+        { color: 'rgb(220, 86, 86)', percentage: 80 },
+        { color: 'rgb(255, 0, 0)', percentage: 90 },
+        { color: 'rgb(130, 0, 0)', percentage: 100 }
       ],
     }
   },

+ 6 - 1
src/views/project/patentCollection/components/views/Abstract.vue

@@ -60,7 +60,12 @@
                       simpleStatus[patent.simpleStatus] }}</el-tag>
                     <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small" @click="openAddRemark(patent)" v-if="noveltySearch && !noveltyIsRemark(patent)">添加查新标注</el-tag>
                     <el-tag class="margin-left_10" style="cursor: pointer;" type="primary" effect="plain" size="small"  v-if="noveltySearch && noveltyIsRemark(patent)" @click="openAddRemark(patent)">已标注</el-tag>
-                    <el-progress style="display:inline-block;width:300px;margin-left:20px;" v-if="noveltySearch && patent.score" :text-inside="true" :stroke-width="20"  :percentage="patent.score*100"  :color="customColors" ></el-progress>
+                    <div v-if="(outside&&noveltySearch) || semanteme" style="display:inline-block;width:300px;margin-left:20px;height:20px" >
+                      <span v-if="!patent.score || patent.score == 'NaN'" style="font-size:12px;">相关度加载中<i class="el-icon-loading"></i></span>
+                      <span v-else-if="patent.score == 'error'" style="font-size:12px;"></span>
+                      <el-progress v-else style="display:inline-block;width:300px;margin-left:20px;" text-color="#000000" :text-inside="true" :stroke-width="20"  :percentage="patent.score"  :color="customColors" ></el-progress>
+                    </div>
+                    
                   </div>
                   <div style="font-size: 13px;">
                     <el-row>

+ 5 - 2
src/views/project/patentCollection/components/views/Picture.vue

@@ -28,8 +28,11 @@
           <myTooltip :content="getView(item, 'title')">
             <div class="noWrap" v-html="getView(item, 'title')"></div>
           </myTooltip>
-          <div v-if="noveltySearch && item.score">
-            <span>相关度</span><el-progress style="display:inline-block;width:calc(100% - 50px);margin-left:10px;" v-if="noveltySearch && item.score" :text-inside="true" :stroke-width="20"  :percentage="item.score*100"  :color="customColors" ></el-progress>
+          <div v-if="(outside&&noveltySearch) || semanteme">
+            <span>相关度:</span>
+            <span v-if="!item.score"><i class="el-icon-loading"></i></span>
+            <span v-else-if="item.score == 'error'">无</span>
+            <el-progress v-else style="display:inline-block;width:calc(100% - 50px);margin-left:10px;" :text-inside="true" :stroke-width="20"  :percentage="item.score"  :color="customColors" ></el-progress>
           </div>
         </div>
         <div class="picture text-align_center" style="height: 200px;width:100%;line-height:200px;">

+ 6 - 4
src/views/project/patentCollection/components/views/Table.vue

@@ -99,13 +99,15 @@
           <div v-else v-html="getView(scope.row, item.value, item.type)"></div>
         </template>
       </el-table-column>
-      <!-- <el-table-column v-if="noveltySearch" label="相关度" width="100" fixed="right">
+      <el-table-column v-if="(outside&&noveltySearch) || semanteme" label="相关度" width="100" fixed="right">
         <template slot-scope="scope">
-          <el-progress v-if="scope.row.score" :text-inside="true" :stroke-width="20"  :percentage="scope.row.score*100"  :color="customColors"></el-progress>
+          <el-progress v-if="scope.row.score && scope.row.scope!='error'" :text-inside="true" :stroke-width="20"  :percentage="scope.row.score"  :color="customColors"></el-progress>
+          <span v-else-if="scope.row.score == 'error'"></span>
+          <span v-else style="font-size:12px;">相关度加载中<i class="el-icon-loading"></i></span>
         </template>
-      </el-table-column> -->
+      </el-table-column>
     </el-table>
-    <addRemark ref="addRemark" :projectId="projectId" v-on="$listeners"></addRemark>
+    <addRemark ref="addRemark" :projectId="projectId" v-on="$listeners" v-if="noveltySearch"></addRemark>
   </div>
 </template>
 

+ 69 - 6
src/views/project/patentCollection/index.vue

@@ -21,16 +21,18 @@
 
             <searchPatent ref="searchPatent" :searchFiled="searchFiled" :searchPatentCheck="searchPatentCheck"
               @searchValue="handleSearchValue"></searchPatent>
+            
+            <el-button size="mini" type="primary" class="margin-left_10" @click="semanticRetrieval">语义检索</el-button>
 
             <!-- <mySearch :SearchFields="searchFiled" @search="search" :searchValue="searchOption"></mySearch> -->
             <el-popover placement="bottom" title="关键词高亮" width="320" trigger="click">
               <patent-keywords-highlight :project-id="projectId" />
-              <el-button slot="reference" size="small" type="primary" class="margin-right_10 margin-left_10">
+              <el-button slot="reference" size="small" type="primary" class="margin-left_10">
                 高亮<i class="el-icon-arrow-down el-icon--right"></i>
               </el-button>
             </el-popover>
 
-            <el-button size="small" type="success" @click="handleAnalyses" style="font-size:16px;padding:0px 9px;font-wight:0"><i class="el-icon-s-data" style="font-size:18px;"></i> 图表分析</el-button>
+            <el-button size="small" type="success" @click="handleAnalyses" class="margin-left_10" style="font-size:16px;padding:0px 9px;font-wight:0"><i class="el-icon-s-data" style="font-size:18px;"></i> 图表分析</el-button>
 
           </div>
           <div style="display:flex;align-items:center;">
@@ -143,7 +145,7 @@
         </el-header>
         <el-main v-loading="loading">
           <div class="height_100">
-            <component ref="patentViewList" :is="viewSelected" @download="handleDownload" @change-read="handleChangeRead"
+            <component ref="patentViewList" :is="viewSelected" :semanteme="semanteme" @download="handleDownload" @change-read="handleChangeRead"
               :projectId="projectId" :patentNoList.sync="patentNoList" @addSelect="getChoosePatentNo"
               @clickPatentNo="handleClick" :column="customList" @index-setting="handleIndexSetting" @on-sort="handleSort"
               :queryParams="queryParams" :tableData="tableData" :refresh='refresh'></component>
@@ -210,7 +212,7 @@
       </el-container>
     </el-container>
 
-    <Field-Drawer ref="FieldDrawer"></Field-Drawer>
+    <Field-Drawer ref="FieldDrawer" @close="closeFieldDrawer"></Field-Drawer>
     <field ref="field" type="patent" :projectId="projectId" @getFieldList="getFieldList"></field>
     <!-- 报告文档 -->
     <reportFileDrawer ref="reportFileDrawer"></reportFileDrawer>
@@ -316,6 +318,7 @@ export default {
       searchStr: '',
       // 存放自定义栏位的检索条件
       customFields: [],
+      semanteme:''
     };
   },
   watch: {},
@@ -342,7 +345,50 @@ export default {
     this.getList()
   },
   methods: {
-    
+    //语义检索
+    semanticRetrieval(){
+      var _this = this;
+      const h = _this.$createElement;
+      _this.$msgbox({
+          title: '语义检索',
+          message: h('div', {
+              attrs: {
+                  class: 'el-textarea',
+              },
+          }, [
+              h('textarea', {
+                  attrs: {
+                      class: 'el-textarea__inner',
+                      autocomplete: 'off',
+                      rows: 4,
+                      id:'commentContent'
+                  },
+                  value: _this.semanteme,
+                  on: { change: _this.onCommentInputChange }
+              })
+          ]),
+          showCancelButton: true,
+          closeOnClickModal:false,
+          confirmButtonText: '检索',
+          cancelButtonText: '取消',
+          beforeClose: (action, instance, done) => {
+              if (action === 'confirm') {
+                  instance.confirmButtonLoading = true;
+                  _this.queryParams.current = 1
+                  _this.getList()
+                  done();
+                  instance.confirmButtonLoading = false;
+              } else {
+                  done();
+              }
+          }
+        }).then(action => {
+           
+        });
+    },
+    onCommentInputChange() {
+      this.semanteme = document.getElementById("commentContent").value;
+    },
     // 处理后的条件
     handleSearchValue({ searchStr, customFields }) {
       this.searchStr = searchStr
@@ -524,13 +570,22 @@ export default {
         searchQuery: this.searchStr || '',//检索条件
         customFields: this.customFields,
         orderDTOList: this.sort,//排序信息
+        semanteme:this.semanteme
       }
       this.loading = true
+      this.$commonJS.scrollToTop()
       // this.$store.commit("SET_PATENT_PARAMS", params);
       this.$store.commit("SET_PATENT_RECORDS", []);
       this.$api.QueryPatent(params).then(res => {
         if (res.code == 200) {
+          if(params.semanteme){
+            res.data.data.forEach(item=>{
+              var score = (item.score * 100 + '').substring(0, 5)
+              item.score =  Number(score)
+            })
+          }
           this.tableData = res.data.data
+          
           this.total = res.data.total
 
 
@@ -584,6 +639,14 @@ export default {
       }
       this.$refs.FieldDrawer.open(this.projectId)
     },
+    //关闭自定义栏位弹窗
+    async closeFieldDrawer(projectId,change){
+      if(change){
+        this.customList = await this.$commonJS.getCustomField('patent', { projectId: this.projectId, taskId: this.taskId })
+        this.getColumn()
+        this.$refs.customFields.refreshField()
+      }
+    },
     //获取显示栏位
     getFieldList(data) {
       this.customList = []
@@ -798,7 +861,7 @@ export default {
     //图表分析
     async handleAnalyses() {
       var params = {
-        searchQuery: this.searchStr || '',//检索条件
+        condition: this.searchStr || '',//检索条件
         customFields: this.customFields || [],
         groupField:this.queryParams.groupField,
         orderDTOList: this.sort,//排序信息

+ 7 - 3
src/views/project/patentDetails/components/PatentLeft.vue

@@ -5,13 +5,13 @@
       style="display: flex;justify-content: space-evenly;height: 50px;line-height: 50px;border-bottom: 1px solid #ccc;">
       <div>总专利数量:{{ total }}</div>
     </div>
-    <div class="list" v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1 && patentList.length>0">
+    <div class="list" v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1 && patentList.length>0" v-loading="loading">
       <div class="left-patentNo"  v-for="(item,index) in patentList" :key="item.patentNo" :style="{background:(item.patentNo == patentNo)? '#cdd7eb':''}" @click="$emit('getPatentLeft',item.patentNo,index)">
         <div>{{ item.patentNo }}</div>
         <div v-if="item.title && (typeof item.title)=='object'">
-          <my-tooltip :content="item.title.filter(item=> item.if_origin)[0].text_content" placement="bottom-start">
+          <!-- <my-tooltip :content="item.title.filter(item=> item.if_origin)[0].text_content" placement="bottom-start"> -->
             <div class="noWrap">{{ item.title.filter(item=> item.if_origin)[0].text_content }}</div>
-          </my-tooltip>
+          <!-- </my-tooltip> -->
         </div>
       </div>
     </div>
@@ -46,6 +46,10 @@ export default {
     },
     noveltySearch:{
       default:false
+    },
+    loading:{
+      type:Boolean,
+      default:false
     }
   },
   data() {

+ 168 - 83
src/views/project/patentDetails/components/menu.vue

@@ -38,11 +38,11 @@
             </el-tooltip>
           </el-header>
           <el-main style="background: #FFFFFF;">
-            <PatentLeft :patentList="patentList" :reportType="reportType" :patentNo="patentNo" :total="total" @getPatentLeft="getPatentLeft" :noveltySearch="noveltySearch"></PatentLeft>
+            <PatentLeft :patentList="patentList" :loading="loading" :reportType="reportType" :patentNo="patentNo" :total="total" @getPatentLeft="getPatentLeft" :noveltySearch="noveltySearch"></PatentLeft>
           </el-main>
           <el-footer style="text-align: center;" v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">
-            <el-pagination background layout=" prev, pager, next" :current-page.sync="queryParams.current" :pager-count="5"
-              :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
+            <el-pagination background layout=" prev, pager, next" :current-page.sync="queryParams.current" :pager-count="5" :page-count="getPageCount()"
+              :page-size.sync="queryParams.size" @current-change="handleCurrentChange">
             </el-pagination>
           </el-footer>
         </el-container>
@@ -87,26 +87,30 @@
         </el-tooltip>
         <template v-if="patentList.length>1">
           <el-tooltip placement="right-end">
-          <template slot="content" v-if="patentList[index-1]">
+          <template slot="content" >
             <div>点击查看上一篇文献</div>
-            <div v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">专利:{{index!=0? patentList[index-1].patentNo:''}}</div>
-            <div v-else>文献:{{index!=0? patentList[index-1].name:''}}</div>
+            <!-- <div v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">
+              专利:{{index!=0? patentList[index-1].patentNo:""}}
+            </div>
+            <div v-else>文献:{{index!=0? patentList[index-1].name:''}}</div> -->
             <div>数量:{{currentLocation - 1}}</div>
           </template>
-          <div class="articles-Loop">
+          <div class="articles-Loop" v-loading="loading">
             <div  @click="prev" v-disabled="currentLocation - 1 == 0 || loading">
               <i class="el-icon-arrow-up" ></i>
             </div>
           </div>
         </el-tooltip>
         <el-tooltip placement="right-end">
-          <template slot="content" v-if="patentList[index+1]">
+          <template slot="content">
             <div>点击查看下一篇文献</div>
-            <div v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">专利:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].patentNo:''}}</div>
-            <div v-else>文献:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].name:''}}</div>
+            <!-- <div v-if="[1,2,7].findIndex(item=>{return item == reportType}) == -1">
+              专利:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].patentNo:''}}
+            </div>
+            <div v-else>文献:{{(total - currentLocation!=0 && total!=0)? patentList[index+1].name:''}}</div> -->
             <div>数量:{{total - currentLocation}}</div>
           </template>
-          <div class="articles-Loop" >
+          <div class="articles-Loop" v-loading="loading">
             <div  @click="next" v-disabled="total - currentLocation == 0 || loading">
               <i class="el-icon-arrow-down"></i>
             </div>
@@ -182,23 +186,22 @@ export default {
         isContract:true,//是否收缩
         queryParams:{
             current:1,
-            size:10,
+            size:50,
         },
         total:0,
         loading:false,
         patentList:[],
         currentLocation:this.location,
         index:0,
-        total:0
     };
   },
   watch: {
-    isContract(){
-      if(this.projectType != 4){
-        this.setQueryParams()
-        this.getData()
-      }
-    }
+    // isContract(){
+    //   if(this.projectType != 4){
+    //     this.setQueryParams()
+    //     this.getData()
+    //   }
+    // }
   },
   computed: {},
   created() {},
@@ -211,69 +214,92 @@ export default {
   methods: {
     setQueryParams(){
       if(!this.outside){
-        if(this.isContract){
-          this.queryParams.current = ((this.currentLocation-1) <= 5)? 1 : ((this.currentLocation-1) - 5)
-        }else{
-          this.queryParams.current = parseInt((this.currentLocation-1) / this.queryParams.size) + 1
-        }
+        // if(this.isContract){
+        //   this.queryParams.current = ((this.currentLocation-1) <= 5)? 1 : ((this.currentLocation-1) - 5)
+        // }else{
+        //   this.queryParams.current = parseInt((this.currentLocation-1) / this.queryParams.size) + 1
+        // }
+        this.queryParams.current = parseInt((this.currentLocation-1) / this.queryParams.size) + 1
       }else{
         this.queryParams.current = parseInt((this.currentLocation-1) / this.queryParams.size) + 1
       }
       
     },
-    getData(){
+    async getData(){
       if(this.outside){
-        this.getPatentSelect()
+        await this.getPatentSelect()
       }else{
         this.getPatentList() 
       }
     },
+    //获取最大页数
+    getPageCount() {
+      if(this.outside){
+        var a = Math.ceil(Number(this.total) / Number(this.queryParams.size))
+        return a > 200 ? 200 : a
+      }else{
+        return Math.ceil(Number(this.total) / Number(this.queryParams.size))
+      }
+      
+    },
     async getPatentSelect(){
-      // this.queryParams.current = parseInt((this.currentLocation-1) / this.queryParams.size) + 1
-      var prevParams={
-        current:(this.queryParams.current-1) * this.queryParams.size,
-        size:1
-      },
-      params={
+      var params = {
         current:this.queryParams.current,
         size:this.queryParams.size
-      },
-      nextParams={
-        current:(this.queryParams.current * this.queryParams.size)+1,
-        size:1
       }
       this.loading = true
-      const [data1,data2,data3] = await Promise.allSettled([this.getList(prevParams),this.getList(params),this.getList(nextParams)])
-      this.patentList = []
-      var prevData = data1.status =='fulfilled'?data1.value:{}
-      var data = data2.status =='fulfilled'?data2.value:[]
-      var nextData = data3.status =='fulfilled'?data3.value:{}
-      if(Object.keys(prevData).length>0){
-        this.patentList.push(prevData.data[0])
-      }
-      if(Object.keys(data).length>0){
-        this.patentList.push(...data.data)
-        this.total = data.total>10000?10000:data.total
-      }
-      if(Object.keys(nextData).length>0){
-        this.patentList.push(nextData.data[0])
-      }
-      var index = this.patentList.findIndex(item=>{
-            return item.patentNo == this.patentNo
-          })
-          if(index!=-1){
-            this.index = index
-          }
+      this.$commonJS.scrollToTop()
+      const [data] = await Promise.allSettled([this.getList(params)])
+      this.patentList=data.status =='fulfilled'?data.value.data:[]
+      this.total = data.value.total
       this.loading = false
+
+      
+      // this.queryParams.current = parseInt((this.currentLocation-1) / this.queryParams.size) + 1
+      // var prevParams={
+      //   current:(this.queryParams.current-1) * this.queryParams.size,
+      //   size:1
+      // },
+      // params={
+      //   current:this.queryParams.current,
+      //   size:this.queryParams.size
+      // },
+      // nextParams={
+      //   current:(this.queryParams.current * this.queryParams.size)+1,
+      //   size:1
+      // }
+      // this.loading = true
+      // const [data1,data2,data3] = await Promise.allSettled([this.getList(prevParams),this.getList(params),this.getList(nextParams)])
+      // this.patentList = []
+      // var prevData = data1.status =='fulfilled'?data1.value:{}
+      // var data = data2.status =='fulfilled'?data2.value:[]
+      // var nextData = data3.status =='fulfilled'?data3.value:{}
+      // if(Object.keys(prevData).length>0){
+      //   this.patentList.push(prevData.data[0])
+      // }
+      // if(Object.keys(data).length>0){
+      //   this.patentList.push(...data.data)
+      //   this.total = data.total>10000?10000:data.total
+      // }
+      // if(Object.keys(nextData).length>0){
+      //   this.patentList.push(nextData.data[0])
+      // }
+      // var index = this.patentList.findIndex(item=>{
+      //       return item.patentNo == this.patentNo
+      //     })
+      //     if(index!=-1){
+      //       this.index = index
+      //     }
+      // this.loading = false
     },
     //查询专利
     getList(queryParams) {
-      if( queryParams.current == 0 && this.isContract){
-        return {}
-      }
-      if(queryParams.size == 1 && !this.isContract){
-        return {}
-      }
+      // if( queryParams.current == 0 && this.isContract){
+      //   return {}
+      // }
+      // if(queryParams.size == 1 && !this.isContract){
+      //   return {}
+      // }
       var params = {
         CurrentQuery: this.searchOption.searchCondition, //检索式
         DBType: this.searchOption.DBType, //”CN”或”WD”,表示检索中文库或世界库
@@ -287,7 +313,7 @@ export default {
       return this.$api.patentSelect(params).then(response=> response.data)
     },
     getPatentLeft(patentNo,index,sign){
-      
+      this.index = index
       if(sign){
         this.currentLocation = index + 1
         this.updatePatentNo(patentNo,sign)
@@ -410,16 +436,19 @@ export default {
     other(event){
       this.$emit('event',event)
     },
+
+
     //上一篇
-    prev(){
-      this.index -=1
+    async prev(){
+      if(this.index == 0){
+        this.queryParams.current -= 1
+        await this.getData()
+        this.index = this.patentList.length
+      }
+      this.index -= 1
       this.currentLocation -=1
       if(this.outside){
         this.updatePatentNo(this.patentList[this.index].patentNo)
-        if(this.index==0 &&  this.currentLocation>0){
-          this.setQueryParams()
-          this.getData()
-        }
         return 
       }
       var reportType = [1,2,7]
@@ -431,21 +460,26 @@ export default {
         return false
       }
       this.updatePatentNo(this.patentList[this.index].patentNo)
-      if(this.index <= 2 && this.currentLocation>2){
-        this.setQueryParams()
-        this.getData()
-      }
     },
     //下一篇
-    next(){
+    async next(){
+      if(this.index == this.patentList.length - 1){
+        if(this.queryParams.current * this.queryParams.size >= this.total){
+            this.$message.warning('已经是最后一件专利')
+            return
+          }
+        if(this.outside && this.queryParams.current>=200){
+          this.$message.warning('无法查看更多专利详情')
+          return 
+        }
+        this.queryParams.current += 1
+        await this.getData()
+        this.index = -1
+      }
       this.index +=1
       this.currentLocation +=1
       if(this.outside){
         this.updatePatentNo(this.patentList[this.index].patentNo)
-        if(this.index==10 &&  this.currentLocation<this.total){
-          this.setQueryParams()
-          this.getData()
-        }
         return
       }
       var reportType = [1,2,7]
@@ -457,11 +491,62 @@ export default {
         return false
       }
       this.updatePatentNo(this.patentList[this.index].patentNo)
-      if(this.index >= 7  &&  this.currentLocation<this.total-2){
-        this.setQueryParams()
-        this.getData()
-      }
     }
+
+
+
+    //上一篇
+    // prev(){
+    //   this.index -=1
+    //   this.currentLocation -=1
+    //   if(this.outside){
+    //     this.updatePatentNo(this.patentList[this.index].patentNo)
+    //     if(this.index==0 &&  this.currentLocation>0){
+    //       this.setQueryParams()
+    //       this.getData()
+    //     }
+    //     return 
+    //   }
+    //   var reportType = [1,2,7]
+    //   var index = reportType.findIndex(item=>{
+    //     return item == this.reportType
+    //   })
+    //   if(index !=-1){
+    //     this.updatePatentNo(this.patentList[this.index],true)
+    //     return false
+    //   }
+    //   this.updatePatentNo(this.patentList[this.index].patentNo)
+    //   if(this.index <= 2 && this.currentLocation>2){
+    //     this.setQueryParams()
+    //     this.getData()
+    //   }
+    // },
+    // //下一篇
+    // next(){
+    //   this.index +=1
+    //   this.currentLocation +=1
+    //   if(this.outside){
+    //     this.updatePatentNo(this.patentList[this.index].patentNo)
+    //     if(this.index==10 &&  this.currentLocation<this.total){
+    //       this.setQueryParams()
+    //       this.getData()
+    //     }
+    //     return
+    //   }
+    //   var reportType = [1,2,7]
+    //   var index = reportType.findIndex(item=>{
+    //     return item == this.reportType
+    //   })
+    //   if(index !=-1){
+    //     this.updatePatentNo(this.patentList[this.index],true)
+    //     return false
+    //   }
+    //   this.updatePatentNo(this.patentList[this.index].patentNo)
+    //   if(this.index >= 7  &&  this.currentLocation<this.total-2){
+    //     this.setQueryParams()
+    //     this.getData()
+    //   }
+    // }
   },
 };
 </script>

+ 5 - 2
src/views/project/patentDetails/components/patentMessage/PatentInstruction.vue

@@ -72,12 +72,15 @@ export default {
       })
       
     },
-    initData(){
+    initData(sign = false){
       if (this.outside) {
         this.getData()
         return
       }
-      if(!this.patent.pdfTranslate){
+      if(sign){
+        this.patent.pdfTranslate = null
+      }
+      if(!this.patent.pdfTranslate || !this.patent.pdfTranslate.data || this.patent.pdfTranslate.data.length == 0){
             var params = {
               patentNo:this.patent.patentNo,
               patentField:this.patentField

+ 1 - 1
src/views/project/patentDetails/components/patentMessage/PatentRight.vue

@@ -384,7 +384,7 @@ export default {
       if(sign){
         this.patent.claimTranslate = null
       }
-        if(this.patent.claimTranslate){
+        if(this.patent.claimTranslate && this.patent.claimTranslate.data & this.patent.claimTranslate.data.length >= 0){
           return false
         }
         if (this.outside) {

+ 1 - 1
src/views/project/patentDetails/components/patentMessage/mixins/index.js

@@ -72,7 +72,7 @@ export const patentDetails = {
         this.$api.refreshPatent(params).then(response=>{
           if(response.code == 200){
             this.$message.success('数据刷新成功')
-            // this.loading = false
+            this.loading = false
             if(value == 5){
               this.refreshData()
             }

+ 6 - 2
src/views/project/patentDetails/components/patentMessage/mixins/translate.js

@@ -31,6 +31,10 @@ export const translate = {
     },
     methods: {
         showTabs(){
+          var exportDataValue={
+            3:'3',
+            4:'2'
+          }
             if(this.outside || this.patent.appCountry == 'CN' || (this.patent.appNo && this.patent.appNo.substring(0,2)== 'CN')){
               this.tabs = [
                 {
@@ -38,7 +42,7 @@ export const translate = {
                   name:'0',
                   field:'content',
                   icon:'el-icon-refresh',
-                  value:'3'
+                  value:exportDataValue[this.patentField]
                 },
               ]
               this.$set(this,'name','0')
@@ -55,7 +59,7 @@ export const translate = {
                   name:'0',
                   field:'content',
                   icon:'el-icon-refresh',
-                  value:'3'
+                  value:exportDataValue[this.patentField]
                 },
                 {
                   label:'译文',

+ 34 - 19
src/views/project/patentDetails/index.vue

@@ -29,6 +29,7 @@ import tortContrast from '@/views/report/tort/components/tortContrast1.vue'
 import teamwork from '@/views/report/components/dialog/teamwork.vue'
 import notPatentDetails from './components/notPatentDetails.vue'
 import {mapGetters} from 'vuex'
+import {getLastRoute} from '@/router'
 export default {
   components: {
     articleMenu,
@@ -129,22 +130,28 @@ export default {
   created() { },
   mounted() {
     if(this.search && !this.search.fromPath){
-      this.search.fromPath = window.history.length
-      if(window.history.state){
-        this.currentState = window.history.state.key
+      var lastRoute = getLastRoute()
+      if(lastRoute){
+        this.search.fromPath = JSON.stringify(lastRoute)
+      }else{
+        this.search.fromPath = 'noLastRoute'
       }
-      var that = this
-      window.addEventListener('popstate', function(event) {
-        // console.log(event,that.currentState,event.state.key)
-        // 在这里处理历史记录变化时的逻辑
-        if(that.currentState<event.state.key){
-          that.search.fromPath += 1
-        }else{
-          that.search.fromPath -= 1
-        }
+      // this.search.fromPath = window.history.length
+      // if(window.history.state){
+      //   this.currentState = window.history.state.key
+      // }
+      // var that = this
+      // window.addEventListener('popstate', function(event) {
+      //   // console.log(event,that.currentState,event.state.key)
+      //   // 在这里处理历史记录变化时的逻辑
+      //   if(that.currentState<event.state.key){
+      //     that.search.fromPath += 1
+      //   }else{
+      //     that.search.fromPath -= 1
+      //   }
         
-        that.currentState = event.state.key
-      })
+      //   that.currentState = event.state.key
+      // })
       this.$s.setSession('search',this.search)
     }
     if(this.noveltySearch){
@@ -292,11 +299,19 @@ export default {
     },
     //返回
     goBack() {
-      if(this.search.fromPath){
-        var now = window.history.length
-        var history= this.search.fromPath
-        var len = Number(now) - Number(history) + 1
-        window.history.go(-len)
+      if(this.search.fromPath && this.search.fromPath != 'noLastRoute'){
+        // var now = window.history.length
+        // var history= this.search.fromPath
+        // var len = Number(now) - Number(history) + 1
+        // window.history.go(-len)
+        var redirectUrl = JSON.parse(this.search.fromPath)
+        this.$router.push({
+          path:redirectUrl.path,
+          query:redirectUrl.query,
+          params:redirectUrl.params
+        })
+      }else{
+        this.$message.warning('未找到上级页面')
       }
     },
     //协同

+ 187 - 0
src/views/report/InvalidResponse/components/IPREmail/IPREmail.vue

@@ -0,0 +1,187 @@
+<template>
+    <div class="height_100">
+      <el-container>
+          <el-header>
+              <div class="head">
+                  <div>
+                      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" >
+                          <el-form-item label="姓名:" prop="name" >
+                              <el-input v-model="queryParams.name" placeholder="请输入姓名"></el-input>
+                          </el-form-item>
+                          <el-form-item label="邮箱:" prop="email">
+                            <el-input v-model="queryParams.email" placeholder="请输入邮箱"></el-input>
+                          </el-form-item>
+                          <el-form-item label="类型:" prop="ifDefault">
+                              <el-select v-model="queryParams.ifDefault" placeholder="请选择" clearable >
+                                  <el-option v-for="(item, key) in types" :key="key" :label="item" :value="key"></el-option>
+                              </el-select>
+                          </el-form-item>
+                          <el-form-item>
+                              <el-button type="primary" icon="el-icon-search" size="mini" @click="search">搜索</el-button>
+                              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+                          </el-form-item>
+                      </el-form>
+                  </div>
+                  <div>
+                    <el-button icon="el-icon-plus" size="mini" @click="add">新增</el-button>
+                  </div>
+              </div>
+          </el-header>
+          <el-main>
+            <IPREmailTable :tableData="tableData" :loading="loading">
+                <template slot="column">
+                    <el-table-column label="操作" align="center" width="120px">
+                        <template slot-scope="scope">
+                            <div v-if="userinfo.roleType==1 || userinfo.roleType == 2 || userinfo.id == scope.row.createId">
+                                <el-button type="text" size="small" @click="edit(scope.row)">编辑</el-button>
+                                <el-button type="text" size="small" @click="remove(scope.row)">删除</el-button>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </template>
+            </IPREmailTable>
+          </el-main>
+          <el-footer class="pagination">
+              <el-pagination background layout="total, sizes, prev, pager, next, jumper"
+                      :current-page.sync="queryParams.current" :page-size.sync="queryParams.size"
+                      @current-change="handleCurrentChange" @size-change="changeSize" :total="total">
+                  </el-pagination>
+          </el-footer>
+      </el-container>
+      <!-- 新增或者编辑IPR邮箱 -->
+      <addOrEditIPREmailDialog ref="addOrEditIPREmailDialog" @close="closeAddOrEditIPREmail"></addOrEditIPREmailDialog>
+    </div>
+</template>
+  
+<script>
+const defaultSearchForm={
+    name:null,
+    email:null,
+    ifDefault:null
+}
+import IPREmailTable from '../table/IPREmail.vue'
+import addOrEditIPREmailDialog from './components/dialog/addOrEditIPREmail.vue';
+export default {
+    components: {
+        IPREmailTable,
+        addOrEditIPREmailDialog
+    },
+    props: {
+    },
+    data() {
+        return {
+            tableData:[],
+            queryParams:{
+                current:1,
+                size:10,
+                ...defaultSearchForm,
+            },
+            total:0,
+            loading:false,
+            types:{
+                true:'默认发送邮箱',
+                false:'非默认发送邮箱'
+            }
+        };
+    },
+    watch: {},
+    computed: {
+        userinfo(){
+            return this.$s.getObj('userinfo')
+        },
+    },
+    created() {},
+    mounted() {
+      this.getList()
+    },
+    methods: {
+        async getList(){
+            this.loading = true
+            var api = 'iprPersonQuery'
+            this.$api[api](this.queryParams).then(response=>{
+                if(response.code == 200){
+                    this.tableData = response.data.data
+                    this.total = response.data.total
+                    this.loading = false
+                }
+            }).catch(error=>{
+                this.tableData = []
+                this.total = 0
+                this.loading = false
+            })
+        },
+        //切换分页
+        handleCurrentChange(value){
+            this.queryParams.current = value
+            this.getList()
+        },
+        //切换页大小
+        changeSize(value){
+            this.queryParams.size = value
+            this.queryParams.current = 1
+            this.getList()
+        },
+        //检索
+        search(){
+            this.queryParams.current = 1
+            this.getList()
+        },
+        //重置条件
+        resetQuery(){
+            this.queryParams = {
+                ...this.queryParams,
+                ...defaultSearchForm
+            }
+            this.search()
+        },
+        //添加IPR邮箱
+        add(){
+            this.$refs.addOrEditIPREmailDialog.open({},'add')
+        },
+        //编辑IPR邮箱
+        edit(row){
+            this.$refs.addOrEditIPREmailDialog.open(row,'edit')
+        },
+        //回调
+        closeAddOrEditIPREmail(model){
+            if(model == 'add'){
+                this.search()
+            }
+            if(model == 'edit'){
+                this.getList()
+            }
+        },
+        //删除
+        remove(row){
+            this.$confirm('确认删除选择的数据吗?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                this.loading = true
+                this.$api.iprPersonDelete([row.id]).then(response => {
+                    this.$message.success('删除成功')
+                    this.loading = false
+                    this.delFinish()
+                }).catch(error => {
+                    this.loading = false
+                })
+            })
+        },
+        delFinish(){
+            if(this.tableData.length == 1 && this.queryParams.current!=1){
+                this.queryParams.current -= 1
+            }
+            this.getList()
+        },
+    },
+  };
+  </script>
+  <style lang="scss" scoped>
+  .head{
+    width:100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+  </style>

+ 86 - 0
src/views/report/InvalidResponse/components/IPREmail/components/dialog/addEmail.vue

@@ -0,0 +1,86 @@
+<template>
+    <div>
+        <el-dialog  :title="title" :visible.sync="showDialog" width="600px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+            <el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="120px">
+            <el-form-item label="姓名:" prop="name">
+                <el-input v-model="form.name" placeholder="请输入姓名"></el-input>
+            </el-form-item>
+    
+            <el-form-item label="邮箱:" prop="email">
+                <el-input v-model="form.email" placeholder="请输入邮箱"></el-input>
+            </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button size="small" @click="handleClose">取 消</el-button>
+                <el-button size="small" v-if="model == 'add'" @click="initData({})">重 置</el-button>
+                <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+            </span>
+        </el-dialog>
+        </div>
+</template>
+  
+<script>
+  const defaultForm={
+    name:null,
+    email:null,
+  }
+  export default {
+    components: {},
+    props: {},
+    data() {
+      return {
+        form:{},
+        rules:{
+            name: [{ required: false, message: '请输入姓名', trigger: 'blur' },],
+            email: [
+              { required: true, message: "请输入邮箱", trigger: "blur" },
+                          {
+                              pattern:
+                                  /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9_\.\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
+                              message: "请输入正确的邮箱格式",
+                              trigger: "blur",
+                          },
+            ],
+        },
+        title:'添加邮箱',
+        showDialog:false,
+        model:'add',
+        btnLoading:false,
+      };
+    },
+    watch: {},
+    computed: {
+      userinfo(){
+        return this.$s.getObj('userinfo')
+      },
+    },
+    created() {},
+    mounted() {},
+    methods: {
+
+      open(form={},model='add'){
+        this.initData(form)
+        this.model = model
+        this.showDialog = true
+      },
+      //初始化数据
+      initData(form={}){
+        this.form = Object.assign({},defaultForm,form)
+      },
+      //关闭弹窗
+      handleClose(){
+        this.showDialog = false
+      },
+      submit(){
+        this.$refs['form'].validate((valid) => {
+            if (valid) {
+                this.$emit('newEmail',this.form)
+                this.handleClose()
+            }
+        });
+      },
+    },
+  };
+  </script>
+  <style lang="scss" scoped>
+  </style>

+ 141 - 0
src/views/report/InvalidResponse/components/IPREmail/components/dialog/addOrEditIPREmail.vue

@@ -0,0 +1,141 @@
+<template>
+  <div>
+    <el-dialog  :title="title" :visible.sync="showDialog" width="600px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="120px">
+        <el-form-item label="姓名:" prop="name">
+            <el-input v-model="form.name" placeholder="请输入姓名"></el-input>
+        </el-form-item>
+
+        <el-form-item label="邮箱:" prop="email">
+            <el-input v-model="form.email" placeholder="请输入邮箱"></el-input>
+        </el-form-item>
+        <el-form-item label="报告类型:" prop="reportTypes">
+            <div>{{ getReportTypeNames() }}</div>
+        </el-form-item>
+        <el-form-item label="默认发送邮箱:" prop="ifDefault">
+          <el-switch
+              v-model="form.ifDefault"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+              :active-value="true"
+              :inactive-value="false">
+            </el-switch>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+          <el-button size="small" @click="handleClose">取 消</el-button>
+          <el-button size="small" v-if="model == 'add'" @click="initData({})">重 置</el-button>
+          <el-button type="primary" :loading="btnLoading" @click="submit" >确 定</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+const defaultForm={
+  name:null,
+  email:null,
+  ifDefault:false,
+  reportTypes:[7],
+}
+export default {
+  components: {},
+  props: {},
+  data() {
+    return {
+      form:{},
+      rules:{
+          name: [{ required: true, message: '请输入姓名', trigger: 'blur' },],
+          email: [
+            { required: true, message: "请输入邮箱", trigger: "blur" },
+						{
+							pattern:
+								/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9_\.\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
+							message: "请输入正确的邮箱格式",
+							trigger: "blur",
+						},
+          ],
+      },
+      title:'',
+      showDialog:false,
+      model:'add',
+      btnLoading:false,
+    };
+  },
+  watch: {},
+  computed: {
+    userinfo(){
+      return this.$s.getObj('userinfo')
+    },
+    reportTypes() {
+      var a = this.$store.state.dictMessage.dictMessage.REPORT_TYPE
+      return a || {}
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {
+    //获取报告类型名称
+    getReportTypeNames(){
+      if(!this.form.reportTypes || this.form.reportTypes.length == 0){
+        return ''
+      }
+      var names = []
+      for(let i=0;i<this.form.reportTypes.length;i++){
+        var item = this.form.reportTypes[i]
+        var obj = this.reportTypes.find(type=>{
+          return type.value == item
+        })
+        if(obj){
+          names.push(obj.label)
+        }
+      }
+      return names.join('、')
+    },
+    open(form={},model='add'){
+      this.initData(form)
+      this.model = model
+      this.title = model=='add'?'添加IPR邮箱':'修改IPR邮箱'
+      this.showDialog = true
+    },
+    //初始化数据
+    initData(form={}){
+      this.form = Object.assign({},JSON.parse(JSON.stringify(defaultForm)),form)
+    },
+    //关闭弹窗
+    handleClose(){
+      this.showDialog = false
+    },
+    submit(){
+      this.$refs['form'].validate((valid) => {
+          if (valid) {
+              this.btnLoading = true
+              var a = '添加'
+              var api = 'iprPersonUpdate'
+              if(this.model == "edit"){
+                  a = '修改'
+              }
+              var params = JSON.parse(JSON.stringify(this.form))
+              if(!params.ifDefault){
+                params.reportTypes = null
+              }
+              this.$api[api](params).then(response => {
+                  if (response.code === 200) {
+                      this.btnLoading = false
+                      this.$message.success( a + '成功');
+                      this.$emit('close',this.model)
+                      this.handleClose()
+                  }
+              })
+              .catch(error => {
+                  this.$message.error(a + '失败')
+                  this.btnLoading = false
+              });
+          }
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 0 - 0
src/views/report/InvalidResponse/components/IPREmail/index.vue


+ 38 - 0
src/views/report/InvalidResponse/components/dialog/IPREmail.vue

@@ -0,0 +1,38 @@
+<template>
+  <div>
+    <el-dialog  title="IPR邮箱" :visible.sync="visible" width="1200px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+      <div style="height:calc(100vh - 250px)">
+        <IPREmail v-if="visible"></IPREmail>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import IPREmail from '../IPREmail/IPREmail.vue';
+export default {
+  components: {
+    IPREmail
+  },
+  props: {},
+  data() {
+    return {
+        visible:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(){
+        this.visible = true
+    },
+    handleClose(){
+        this.visible = false
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 135 - 2
src/views/report/InvalidResponse/components/dialog/editFlowPath.vue

@@ -58,6 +58,39 @@
               </div>
             </template>
           </el-form-item>
+          <template v-if="$permission.FunPermissions('xiaoshi/sendEmail')">
+            <el-form-item label="邮件通知:">
+              <div style="display:flex;align-items:center;flex-wrap: wrap;">
+                <el-switch
+                  v-model="form.ifSendEmail"
+                  active-color="#13ce66"
+                  inactive-color="#ff4949"
+                  :active-value="true"
+                  :inactive-value="false">
+                </el-switch>
+                <template v-if="form.ifSendEmail">
+                  <div class="margin-left_10" v-for="item in sendEmailPerson" :key="item.email">{{ item.name +'<' + item.email + '>'}}</div>
+                </template>
+                
+              </div>
+              
+            </el-form-item>
+            <el-form-item label="临时通知人员:" v-if="form.ifSendEmail">
+              <div style="display:flex;align-items:center;flex-wrap: wrap;">
+                <div v-for="(item,index) in otherPerson" :key="index" class="otherPerson">
+                  <div v-if="item.name">{{ item.name +'<' + item.email + '>'}}</div>
+                  <div v-else>{{ item.email }}</div>
+                  <div class="delOtherPerson">
+                    <i class="el-icon-close" style="color:red" @click="delOtherPerson(item,index)"></i>
+                  </div>
+                </div>
+                <div class="margin-left_10">
+                  <el-button size="small" @click="addNewEmail" icon="el-icon-plus">添加</el-button>
+                </div>
+              </div>
+            </el-form-item>
+          </template>
+          
           <el-form-item label="备注内容:">
             <el-input type='textarea' v-model="form.description" autocomplete="off" placeholder="请输入备注"></el-input>
           </el-form-item>
@@ -68,14 +101,21 @@
           <el-button type="primary" :loading="loading" @click="finish" >确 定</el-button>
         </span>
       </el-dialog>
+
+      <addEmailVue ref="addEmailVue" @newEmail="newEmail"></addEmailVue>
     </div>
 </template>
   
 <script>
+import addEmailVue from '../IPREmail/components/dialog/addEmail.vue'
+const defaultSendEmail = ['0','1','3','4','5','7','8']
   export default {
+    components:{
+      addEmailVue
+    },
     props:{
         projectId:{
-            default:0
+          default:0
         }
     },
     data() {
@@ -145,7 +185,9 @@
         },
         rules: {
           fileName:[{required : false , message:'请输入文献名称',trigger:'blur'}]
-        }
+        },
+        sendEmailPerson:[],
+        otherPerson:[],
       }
     },
     watch: {
@@ -157,8 +199,82 @@
         open(type,form) {
             this.type = this.types[type]
             this.form = JSON.parse(JSON.stringify(form))
+            this.otherPerson = []
+            if(this.$permission.FunPermissions('xiaoshi/sendEmail')){
+              if(defaultSendEmail.indexOf(type+'')!=-1){
+                this.$set(this.form,'ifSendEmail',true)
+              }else{
+                this.$set(this.form,'ifSendEmail',false)
+              }
+              this.getSendEmailPerson()
+            }
             this.showDialog=true
         },
+        //添加临时发送邮箱
+        addNewEmail(){
+          this.$refs.addEmailVue.open()
+        },
+        newEmail(data){
+          if(!data.email){
+            return
+          }
+          data.email = data.email.trim()
+          var index = this.otherPerson.findIndex(item=>{
+            return item.email == data.email
+          })
+          if(index == -1){
+            this.otherPerson.push(data)
+          }else{
+            this.$message.warning('该邮箱已存在')
+          }
+          
+        },
+        //删除临时发送邮箱
+        delOtherPerson(item,index){
+          this.otherPerson.splice(index,1)
+        },
+        //获取需要发送邮件的人员
+        async getSendEmailPerson(){
+          var [defaultPerson,handlePerson] = await Promise.allSettled([this.getDefaultPersons(),this.getHandlePerson()])
+          defaultPerson = defaultPerson.status =='fulfilled'?defaultPerson.value:{}
+          handlePerson = handlePerson.status =='fulfilled'?handlePerson.value:{}
+          var data = []
+          if(defaultPerson.data && defaultPerson.data.length>0){
+            data = defaultPerson.data
+          }
+          if(handlePerson && handlePerson.id){
+            var index = data.findIndex(item=>{
+              return item.id == handlePerson.iprPersonId
+            })
+            if(index == -1){
+              data.push(
+                {
+                  id:handlePerson.iprPersonId,
+                  name:handlePerson.name,
+                  email:handlePerson.email
+                }
+              )
+            }
+            
+          }
+          this.sendEmailPerson = data
+        },
+        //获取默认发送邮件人员
+        getDefaultPersons(){
+            var params = {
+                current:1,
+                size:100,
+                ifDefault:true
+            }
+            return this.$api.iprPersonQuery(params).then(response=> response.data)
+        },
+        //获取配案人员
+        getHandlePerson(){
+            var params = {
+              reportId:this.projectId
+            }
+            return this.$api.matchCasePersonQuery(params).then(response=> response.data)
+        },
         // 弹窗确定
         finish() {
             this.$refs.form.validate((valid) => {
@@ -168,6 +284,7 @@
                       return false
                     }
                     this.form.projectId = this.projectId
+                    this.form.extraEmailDTOS = this.otherPerson
                     this.form.fileGuids = guids
                     if(!this.projectId){
                       this.$emit('save',this.form)
@@ -415,4 +532,20 @@
       padding-bottom: 0px;
     }
   }
+  </style>
+  <style lang="scss" scoped>
+    .otherPerson{
+      display: flex;
+      align-items: center;
+      cursor: pointer;
+      .delOtherPerson{
+        opacity: 0;
+        margin-left:10px
+      }
+    }
+    .otherPerson:hover{
+      .delOtherPerson{
+        opacity: 1;
+      }
+    }
   </style>

+ 89 - 0
src/views/report/InvalidResponse/components/table/IPREmail.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="height_100">
+    <el-table 
+        ref="table"
+        border
+        :data="tableData"
+        row-key="id"
+        style="width: 100%"
+        height="calc(100% - 0px)"
+        v-loading="loading">
+        <slot name="check"></slot>
+        <el-table-column v-for="item in columnList" :render-header="$commonJS.renderHeaderMethods" :key="item.field" :prop="item.field" :label="item.name" :sortable="item.ifSort?'custom':false" :width="item.width || 'auto'" :min-width="item.minWidth?item.minWidth:''">
+            <template slot-scope="scope">
+                <div v-html="$commonJS.getColumnData(scope.row,item)"></div>
+            </template>
+        </el-table-column>
+        <slot name="column"></slot>
+    </el-table>
+  </div>
+</template>
+
+<script>
+const defaultColumnList = [
+    {
+        field:'name',
+        name:'姓名',
+        ifSort:false,
+        width:'150px',
+    },
+    {
+        field:'email',
+        name:'邮箱',
+        ifSort:false,
+    },
+    {
+        field:'ifDefault',
+        name:'类型',
+        ifSort:false,
+        width:'150px',
+        type:"function",
+        useFunction:(data)=>{
+            var types={
+                true:'默认发送邮箱',
+                false:'非默认发送邮箱'
+            }
+            return types[data.ifDefault]
+        }
+    },
+    {
+        field:'createName',
+        name:'创建人',
+        ifSort:false,
+        width:'150px',
+    },
+    {
+        field:'createTime',
+        name:'创建时间',
+        ifSort:false,
+        width:'180px',
+    },
+]
+export default {
+  components: {},
+  props: {
+    loading:{
+        type:Boolean,
+        default:false
+    },
+    tableData:{
+        type:Array,
+        default:()=>{
+            return []
+        }
+    }
+  },
+  data() {
+    return {
+        columnList:defaultColumnList
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

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

@@ -1,7 +1,7 @@
 <template>
   <!-- 选择专利弹窗 -->
   <div>
-    <el-dialog title="选择专利" :visible.sync="dialogVisible" width="800px" :before-close="handleClose">
+    <el-dialog title="选择专利" :visible.sync="dialogVisible" width="800px" @close="handleClose()" :close-on-click-modal="false" :append-to-body="true">
       <el-container>
         <el-header style="display: flex;align-items: center;">
           <slot name="head">
@@ -14,7 +14,7 @@
           </slot>
           
         </el-header>
-        <el-main style="height:calc(100vh - 300px)">
+        <el-main style="height:calc(100vh - 350px)">
           <Table :column="column" :tableData="tableData" :queryParams="queryParams" :refresh="refresh" v-loading="loading"
             :patentNoList.sync="patentNoList" :projectId="projectId" @on-sort="handleSort"></Table>
         </el-main>

+ 3 - 3
src/views/report/components/dialog/cronConclusion.vue

@@ -102,7 +102,7 @@ export default {
             }
             this.form.fileGuids = guids
           // this.$commonJS.allUploadFile(this.form)
-         
+        
           //判断报告是否是已完成的
         this.$refs.addMatter.submitForm1()
           this.form.status = 3
@@ -110,7 +110,7 @@ export default {
           if (this.form.scenarioIds && this.form.scenarioIds.length > 0) {
             var scenarioIds = JSON.parse(JSON.stringify(this.form.scenarioIds))
           }
-          if (this.form.eventId) {
+          if (this.form.eventIds && this.form.eventIds.length) {
             this.form.events = []
             this.form.scenarioIds = []
             this.form.matterIds.forEach(item => {
@@ -118,7 +118,7 @@ export default {
                 {
                   matterId: item,
                   scenarioId: scenarioIds[0],
-                  eventId: this.form.eventId
+                  eventId: this.form.eventIds[0]
                 }
               )
             })

+ 267 - 0
src/views/report/components/dialog/handlePerson.vue

@@ -0,0 +1,267 @@
+<template>
+  <div>
+    <el-dialog  title="配案人员" :visible.sync="visible" width="800px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+      <div style="height:calc(100vh - 250px)">
+        <el-table 
+            ref="table"
+            border
+            :data="tableData"
+            row-key="id"
+            style="width: 100%"
+            height="calc(100% - 0px)"
+            v-loading="loading">
+            <el-table-column prop="name" label="姓名" min-width="220">
+                <template slot-scope="scope">
+                    <div>
+                        <div v-if="model == 'list'">
+                            {{ scope.row.name }}
+                        </div>
+                        <div v-else>
+                            <el-autocomplete
+                              style="width: 100%;"
+                                class="inline-input"
+                                v-model="scope.row.name"
+                                v-SelectLazyLoading="IPREmailLoad"
+                                :fetch-suggestions="querySearchByName"
+                                placeholder="请输入内容"
+                                @select="(item)=>handleSelect(item,scope.row)"
+                            >
+                            <template slot-scope="{ item }">
+                                <div style="padding: 5px 0;">
+                                  <div style="text-overflow: ellipsis;overflow: hidden;line-height: normal;">{{ item.name }}</div>
+                                  <div style="font-size: 12px;color: #b4b4b4;line-height: normal;">{{ item.email }}</div>
+                                </div>
+                              </template>
+                            </el-autocomplete>
+                        </div>
+                    </div>
+                </template>
+            </el-table-column>
+            <el-table-column prop="email" label="邮箱" min-width="220">
+                <template slot-scope="scope">
+                    <div>
+                        <div v-if="model == 'list'">
+                            {{ scope.row.email }}
+                        </div>
+                        <div v-else>
+                            <el-autocomplete
+                              style="width: 100%;"
+                                class="inline-input"
+                                v-model="scope.row.email"
+                                v-SelectLazyLoading="IPREmailLoad"
+                                :fetch-suggestions="querySearchByEmail"
+                                placeholder="请输入内容"
+                                @select="(item)=>handleSelect(item,scope.row)"
+                            >
+                              <template slot-scope="{ item }">
+                                <div style="padding: 5px 0;">
+                                  <div style="text-overflow: ellipsis;overflow: hidden;line-height: normal;">{{ item.email }}</div>
+                                  <div style="font-size: 12px;color: #b4b4b4;line-height: normal;">{{ item.name }}</div>
+                                </div>
+                              </template>
+                            </el-autocomplete>
+                        </div>
+                    </div>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" width="180px">
+                <template slot-scope="scope">
+                    <div>
+                        <div v-if="model == 'list'">
+                            <el-button type="text" size="small" @click="edit(scope.row)">修改</el-button>
+                            <el-button type="text" size="small" @click="remove(scope.row)">移除</el-button>
+                        </div>
+                        <div v-else>
+                            <el-button type="text" size="small" @click="save(scope.row)">保存</el-button>
+                            <el-button v-if="model=='edit'" type="text" size="small" @click="cancel(scope.row)">取消</el-button>
+                        </div>
+                    </div>
+                </template>
+            </el-table-column>
+        </el-table>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+export default {
+  components: {
+    
+  },
+  props: {},
+  data() {
+    return {
+        visible:false,
+        tableData:[],
+        loading:false,
+        model:'List',
+        IPREmailList:{
+            queryParams:{
+                current:0,
+                size:10,
+                total:1,
+                name:null,
+                email:null
+            },
+            data:[]
+        },
+        editMessage:{},
+        reportId:null
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(reportId){
+      this.reportId =reportId
+      this.getList()
+      this.visible = true
+    },
+    getList(){
+      var params = {
+        reportId:this.reportId
+      }
+      this.loading = true
+      var api = 'matchCasePersonQuery'
+      this.$api[api](params).then(response=>{
+        if(response.code == 200){
+          if(response.data.id){
+            this.tableData = [response.data]
+            this.model = 'list'
+          }else{
+            this.tableData = [{}]
+            this.model = 'add'
+          }
+          this.loading = false
+        }
+      }).catch(error=>{
+          this.tableData = []
+          this.model = 'list'
+          this.loading = false
+      })
+    },
+    handleClose(){
+        this.visible = false
+    },
+    //编辑
+    edit(row){
+        this.model = 'edit'
+        this.editMessage = JSON.parse(JSON.stringify(row))
+    },
+    //移除配案人员
+    remove(row){
+      this.$confirm('确认删除选择的数据吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+      }).then(() => {
+          this.loading = true
+          this.$api.matchCasePersonDelete([row.id]).then(response => {
+              this.$message.success('移除成功')
+              this.loading = false
+              this.getList()
+              this.IPREmailList={
+                queryParams:{
+                  current:0,
+                  size:10,
+                  total:1,
+                  name:null,
+                  email:null
+                },
+                data:[]
+              }
+          }).catch(error => {
+              this.loading = false
+          })
+      })
+    },
+    //取消编辑
+    cancel(row){
+        row = this.editMessage
+        this.model = 'list'
+    },
+    //保存
+    save(row){
+      if(!row.name){
+        this.$message.warning('姓名不能为空')
+        return
+      }
+      if(!row.email){
+        this.$message.warning('邮箱不能为空')
+        return
+      }
+      var regx = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9_\.\-])+\.)+([a-zA-Z0-9]{2,4})+$/
+      if(!regx.test(row.email)){
+        this.$message.warning('邮箱格式不正确')
+        return
+      }
+      var a = '添加'
+      if(this.model == 'edit'){
+        a = '修改'
+      }
+      this.loading = true
+      row.reportId = this.reportId
+      this.$api.matchCasePersonUpdate(row).then(response=>{
+        if(response.code == 200){
+          this.$message.success(a+'成功')
+          this.loading = false
+          this.getList()
+        }
+      }).catch(error=>{
+        this.loading = false
+      })
+    },
+
+     /**
+    * IPR邮箱
+    */
+    // 懒加载IPR邮箱方法
+    IPREmailLoad() {
+      if (this.IPREmailList.queryParams.current * this.IPREmailList.queryParams.size >= this.IPREmailList.queryParams.total) {
+        return false
+      }
+      this.IPREmailList.queryParams.current++
+      this.getIPREmailList()
+    },
+    // 查询IPR邮箱
+    async getIPREmailList() {
+      let params = {
+        ...this.IPREmailList.queryParams,
+      }
+      await this.$api.iprPersonQuery(params).then(res => {
+        if (res.code == 200) {
+          this.IPREmailList.data.push(...res.data.data)
+          this.IPREmailList.queryParams.total = res.data.total
+          this.IPREmailList.cb(this.IPREmailList.data);
+        }
+      })
+    },
+    //获取下拉建议IPR邮箱数据
+    async querySearchByEmail(queryString, cb) {
+      this.IPREmailList.queryParams.current = 1
+      this.IPREmailList.queryParams.email = queryString
+      this.IPREmailList.data = []
+      this.IPREmailList.cb = cb
+      await this.getIPREmailList()
+    },
+    async querySearchByName(queryString, cb) {
+      this.IPREmailList.queryParams.current = 1
+      this.IPREmailList.queryParams.name = queryString
+      this.IPREmailList.data = []
+      this.IPREmailList.cb = cb
+      await this.getIPREmailList()
+    },
+    handleSelect(item,row){
+        this.$set(row,'name',item.name)
+        this.$set(row,'email',item.email)
+        this.$set(row,'iprPersonId',item.id)
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 24 - 0
src/views/report/components/handlePerson/handlePerson.vue

@@ -0,0 +1,24 @@
+<-- 配案人员 -->
+<template>
+  <div>
+
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    return {
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 0 - 0
src/views/report/components/handlePerson/index.vue


+ 27 - 21
src/views/report/components/index.vue

@@ -31,7 +31,8 @@
                   :key="item.label" @click.native="handleAnalyse(item.value)">{{ item.label }}</el-dropdown-item>
               </el-dropdown-menu>
             </el-dropdown>
-            <el-button type="primary" class="margin-left_10" size="small" @click="showField">显示栏位管理</el-button>
+            <el-button type="primary" class="margin-left_10 margin-right_10" size="small" @click="showField">显示栏位管理</el-button>
+            <el-button v-if="$permission.FunPermissions('xiaoshi/IPREmail')" type="primary" class="margin-right_10" size="small" @click="IPREmail">IPR邮箱</el-button>
           </div>
 
         </div>
@@ -64,6 +65,11 @@
     <exportReport ref="exportReport"></exportReport>
     <!-- 项目分享 -->
     <patentShare ref="patentShare"></patentShare>
+
+    <!-- IPR邮箱 -->
+    <IPREmailDialog ref="IPREmailDialog"></IPREmailDialog>
+    <!-- 配案人员/实际处理人 -->
+    <handlePersonDialog ref="handlePersonDialog"></handlePersonDialog>
   </div>
 </template>
 
@@ -79,6 +85,9 @@ import reportFileDrawer from './drawer/reportFileDrawer.vue'
 import cronConclusion from './dialog/cronConclusion.vue'
 import exportReport from './dialog/exportReport.vue'
 import patentShare from '@/views/components/drawer/Share.vue';
+
+import IPREmailDialog from '../InvalidResponse/components/dialog/IPREmail.vue'
+import handlePersonDialog from './dialog/handlePerson.vue'
 export default {
   components: {
     Table,
@@ -92,6 +101,8 @@ export default {
     cronConclusion,
     exportReport,
     patentShare,
+    IPREmailDialog,
+    handlePersonDialog
   },
   props: {
     isOperate: '',
@@ -193,23 +204,6 @@ export default {
           }
         })
       }
-      // if (a.REPORT_TYPE) {
-      //   // 报告类型
-      //   this.searchFiled[1].options = a.REPORT_TYPE.map(item => {
-      //     return {
-      //       value: item.value,
-      //       label: item.label
-      //     }
-      //   })
-      //   // 报告状态
-      //   this.searchFiled[2].options = a.REPORT_STATE.map(item => {
-      //     return {
-      //       value: item.value,
-      //       label: item.label
-      //     }
-      //   })
-      // }
-
       return a
     },
     state() {
@@ -249,12 +243,13 @@ export default {
         obj.options = a
       }
       return this.$store.state.dictMessage.matter || []
-    }
+    },
+    userinfo(){
+      return this.$s.getObj('userinfo')
+    },
   },
   created() { },
   async mounted() {
-   
-    
     if(this.componentType){
       await this.tabChange(this.componentType)
     }
@@ -265,6 +260,10 @@ export default {
     this.showViews()
   },
   methods: {
+    //IPR邮箱
+    IPREmail(){
+      this.$refs.IPREmailDialog.open()
+    },
     //标签页点击
     async tabChange(name){
       var type = Number(name)
@@ -652,9 +651,16 @@ export default {
           break;
         case 'e'://编辑
           this.handleEdit(row)
+          break;
+        case 'matchCase'://实际处理人/配案人员
+          this.matchCase(row)
           break
       }
     },
+    //实际处理人/配案人员
+    matchCase(row){
+      this.$refs.handlePersonDialog.open(row.id)
+    },
     //导入导出历史
     importAndExportHistory(row){
       this.$router.push({

+ 1 - 1
src/views/report/components/matter/addMatters.vue

@@ -243,7 +243,7 @@ export default {
     },
     submitForm1() {
       var list = this.validMatter()
-      if(list){
+      if(list && list.length>0){
         this.$api.addFollowUp(list).then(response => {
           if (response.code == 200) {
             this.btnLoading = false

+ 18 - 5
src/views/report/components/patentList/components/customFields/index.vue

@@ -118,6 +118,19 @@ export default {
     this.getAllCountColumns()
   },
   methods: {
+    //刷新栏位
+    async refreshField(){
+      var index = this.field.findIndex(item=>{
+        return item.filedKind == 0
+      })
+      if(index != -1){
+        await this.getShowCountColumns()
+      }
+      this.getAllCountColumns()
+      setTimeout(()=>{
+        this.refreshOptions(1)
+      },500)
+    },
     // 条件改变时刷新已打开的折叠面板
     refreshOptions(sign) {
       for (let i = 0; i < this.activeName.length; i++) {
@@ -502,6 +515,7 @@ export default {
     },
     // 给数据添加ifHidden
     handleFiled(data) {
+      var field = []
       for (var i = 0; i < data.length; i++) {
         data[i].check = []
         // 分类选择:获取树类型
@@ -517,12 +531,10 @@ export default {
         }
         this.getSelect(data[i])
         for (var j = 0; j < this.showField.length; j++) {
-          if (data[i].name == this.showField[j].name && data[i].filedKind == this.showField[j].filedKind) {
+          if (data[i].value == this.showField[j].value && data[i].filedKind == this.showField[j].filedKind) {
             data[i].ifHidden = false
-            
-            // this.field.push(data[i])
-            this.$set(this.field,j,data[i])
-            // this.field[j] = data[i]
+            field[j] = data[i]
+            // this.$set(field,j,data[i])
             
             //查统计todo统计接口
           //  this.esCountAnalysis(data[i])
@@ -536,6 +548,7 @@ export default {
           this.filedAll.push(data[i])
         }
       }
+      this.field = field.filter(Boolean)
       this.$store.commit('SET_SYSTEM_FIELD',this.filedAll)
     },
 

+ 4 - 4
src/views/report/components/productResult/productResult.vue

@@ -105,7 +105,7 @@
     <teamwork ref="teamwork" :projectId="projectId" :reportType="reportType"></teamwork>
 
     <!-- 选择专利弹窗 -->
-    <checkPatent ref="checkPatent" @checkPatentList="checkPatentList" sign="teamwork"
+    <checkPatentDialog ref="checkPatent" @checkPatentList="checkPatentList" sign="teamwork"
        :compareResult="compareResult" :tableData2="tableData2">
       <div slot="head">
         <el-select v-model="compareResult" clearable @change="changePatent" placeholder="请选择对比结果">
@@ -113,20 +113,20 @@
           </el-option>
         </el-select>
       </div>
-    </checkPatent>
+    </checkPatentDialog>
 
   </div>
 </template>
 
 <script>
 import CreateReport from '@/views/report/components/dialog/addAndEditReport.vue'
-import checkPatent from '../checkPatent/checkPatent.vue'
+import checkPatentDialog from '../checkPatent/checkPatent.vue'
 import teamwork from "@/views/report/components/dialog/teamwork.vue"
 import splitPage from '../splitPage/splitPage.vue'
 export default {
   components: {
     CreateReport,
-    checkPatent,
+    checkPatentDialog,
     teamwork,
     splitPage
   },

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

@@ -17,7 +17,8 @@
                 </span>
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
                   <el-dropdown-item command="0">分享</el-dropdown-item>
-                  <el-dropdown-item command="1" v-if="[2,3].includes(item.status) && item.reportType != 7">导出报告</el-dropdown-item>
+                  <el-dropdown-item v-if="item.reportType == 7 && $permission.FunPermissions('xiaoshi/handlePerson')" command="matchCase">实际处理人</el-dropdown-item>
+                  <el-dropdown-item command="1" v-if="[2,3].includes(item.status) && item.reportType != 7">生成报告</el-dropdown-item>
                   <el-dropdown-item command="2" v-if="[2,3].includes(item.status)">报告文档</el-dropdown-item>
                   <el-dropdown-item command="16" v-if="[1,2].includes(item.reportType)">检索记录</el-dropdown-item>
                   <el-dropdown-item command="3" v-if="[2].includes(item.status)&&[0,1,2,3].includes(item.reportType)">自定义字段</el-dropdown-item>

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

@@ -44,6 +44,7 @@
                 <span>编辑</span>
                 <el-dropdown-menu slot="dropdown" class="text-align_center">
                   <el-dropdown-item command="0">分享</el-dropdown-item>
+                  <el-dropdown-item v-if="scope.row.reportType == 7 && $permission.FunPermissions('xiaoshi/handlePerson')" command="matchCase">实际处理人</el-dropdown-item>
                   <el-dropdown-item command="1" v-if="[2,3].includes(scope.row.status) && scope.row.reportType != 7">生成报告</el-dropdown-item>
                   <el-dropdown-item command="2" v-if="[2,3].includes(scope.row.status)">报告文档</el-dropdown-item>
                   <el-dropdown-item command="16" v-if="[1,2].includes(scope.row.reportType)">检索记录</el-dropdown-item>