Browse Source

Merge remote-tracking branch 'origin/1025branch' into gzlh_master

# Conflicts:
#	src/views/ARTICLE/detail.vue
#	src/views/ARTICLE/edit.vue
#	src/views/ARTICLE/index.vue
#	src/views/TQSJ/index.vue
qzy 1 year ago
parent
commit
d400b63ab5
92 changed files with 11386 additions and 22066 deletions
  1. 4 1
      .env.production
  2. 1 18560
      package-lock.json
  3. 1 1
      public/index.html
  4. 9 0
      src/api/login.js
  5. 7 0
      src/api/norm/QUOTAFEE.js
  6. 23 0
      src/api/portal/ARTICLE/ARTICLE.js
  7. 10 0
      src/api/portal/COMPANYUSER/COMPANYUSER.js
  8. 6 6
      src/api/portal/ENTERPRISESCREENDATA/ENTERPRISESCREENDATA.js
  9. 9 1
      src/api/portal/ENTERPRISETRADEPERFORMANCE/ENTERPRISETRADEPERFORMANCE.js
  10. 22 1
      src/api/portal/GARDENBASEDATA/GARDENBASEDATA.js
  11. 9 0
      src/api/portal/GATHER/GATHER.js
  12. 9 0
      src/api/system/dept.js
  13. 20 19
      src/api/system/notice.js
  14. 64 64
      src/api/system/user.js
  15. 1 1
      src/api/wf/PROTEMPLATE.js
  16. BIN
      src/assets/images/portion.png
  17. BIN
      src/assets/images/sum.png
  18. 239 0
      src/components/AuxiliaryAudit/index.vue
  19. 0 1
      src/components/Crontab/index.vue
  20. 290 0
      src/components/DataAcquisition/index.vue
  21. 2 1
      src/components/Editor/index.vue
  22. 5 0
      src/components/cropper.vue
  23. 13 1
      src/components/editor.vue
  24. 92 0
      src/components/selectTree/index.vue
  25. 134 49
      src/layout/components/Navbar.vue
  26. 1 3
      src/main.js
  27. 2 2
      src/router/index.js
  28. 0 0
      src/utils/crypt-js.js
  29. 3724 0
      src/utils/crypt.js
  30. 0 1
      src/utils/dict/DictOptions.js
  31. 111 56
      src/utils/request.js
  32. 11 11
      src/views/APICONFIG/index.vue
  33. 3 13
      src/views/ARTICLE/detail.vue
  34. 21 12
      src/views/ARTICLE/edit.vue
  35. 4 2
      src/views/ARTICLE/enterData.vue
  36. 328 21
      src/views/ARTICLE/index.vue
  37. 0 1
      src/views/ARTICLE/task/index.vue
  38. 71 23
      src/views/AttendMeeting/index.vue
  39. 463 0
      src/views/AuxiliaryIndex/index.vue
  40. 286 136
      src/views/BONDED/index.vue
  41. 155 147
      src/views/BONDEDUPPLY/index.vue
  42. 341 124
      src/views/COMPANYUSER/index.vue
  43. 1 1
      src/views/CONTACTUS/index.vue
  44. 20 7
      src/views/COUNSELINGMESSAGE/edit.vue
  45. 13 6
      src/views/COUNSELINGMESSAGE/index.vue
  46. 215 0
      src/views/CompanyUserService/index.vue
  47. 248 151
      src/views/ECONOMICSINDEX/index.vue
  48. 208 89
      src/views/ENTERPRISESCREENDATA/index.vue
  49. 289 257
      src/views/ENTERPRISETRADEPERFORMANCE/index.vue
  50. 562 151
      src/views/GARDENBASEDATA/index.vue
  51. 8 5
      src/views/GARDENDATA/index.vue
  52. 169 17
      src/views/GARDENTRADEDATA/edit.vue
  53. 19 7
      src/views/GARDENTRADEDATA/index.vue
  54. 25 5
      src/views/GATHER/importFile.vue
  55. 444 364
      src/views/GATHER/index.vue
  56. 173 68
      src/views/GATHERWARNING/index.vue
  57. 2 16
      src/views/GXZZQ/index.vue
  58. 119 106
      src/views/IMPORTANTPROJECT/index.vue
  59. 191 130
      src/views/JOINTCONFERENCE/add.vue
  60. 69 16
      src/views/JOINTCONFERENCE/callback.vue
  61. 146 42
      src/views/JOINTCONFERENCE/detail.vue
  62. 28 14
      src/views/JOINTCONFERENCE/index.vue
  63. 7 5
      src/views/LEAVEMESSAGE/index.vue
  64. 6 6
      src/views/ONLINE/index.vue
  65. 1 1
      src/views/QUESTION/edit.vue
  66. 15 12
      src/views/QUESTION/index.vue
  67. 66 32
      src/views/RANK/index.vue
  68. 18 12
      src/views/RightDistribution/index.vue
  69. 0 2
      src/views/TOTEXP/index.vue
  70. 122 192
      src/views/TQSJ/index.vue
  71. 0 1
      src/views/ZBCS/index.vue
  72. 93 80
      src/views/dashboard/BarChart.vue
  73. 56 43
      src/views/dashboard/PieChart.vue
  74. 0 1
      src/views/dashboard/circleChart.vue
  75. 77 45
      src/views/index.vue
  76. 23 9
      src/views/login.vue
  77. 13 3
      src/views/news/detail.vue
  78. 104 41
      src/views/news/edit.vue
  79. 19 14
      src/views/news/index.vue
  80. 0 1
      src/views/news/task/index.vue
  81. 115 123
      src/views/norm/feeindex.vue
  82. 11 8
      src/views/norm/formula.vue
  83. 24 10
      src/views/norm/index.vue
  84. 0 1
      src/views/norm/quota.vue
  85. 520 350
      src/views/norm/quotaBonded.vue
  86. 27 24
      src/views/norm/quotafee.vue
  87. 295 75
      src/views/system/dept/index.vue
  88. 150 54
      src/views/system/notice/index.vue
  89. 1 1
      src/views/system/user/index.vue
  90. 52 126
      src/views/task/index.vue
  91. 128 81
      src/views/wf/index.vue
  92. 3 3
      vue.config.js

+ 4 - 1
.env.production

@@ -5,7 +5,10 @@ VUE_APP_TITLE = 综合保税区管理系统
 ENV = 'production'
 
 # 综合保税区管理系统/生产环境
-VUE_APP_BASE_API = 'http://bsq-server.aseanbusiness.cn'
+# VUE_APP_BASE_API = 'http://bsq-server.aseanbusiness.cn'
+# VUE_APP_BASE_API ='http://106.55.241.82:9001'
+# VUE_APP_BASE_API = 'http://localhost:9527'
+VUE_APP_BASE_API = 'https://bsq.bbwb.gxzf.gov.cn/server'
 # 请求、响应数据加密
 VUE_APP_AES_ENCRYPT_ENABLED = 'false'
 # 请求数据加密秘钥串

File diff suppressed because it is too large
+ 1 - 18560
package-lock.json


+ 1 - 1
public/index.html

@@ -204,6 +204,6 @@
 		    <div class="load_title">正在加载系统资源,请耐心等待</div>
         </div>
 	</div>
-   <script src="/tinymce/tinymce.min.js"></script>
+   <script src="/admin/tinymce/tinymce.min.js"></script>
   </body>
 </html>

+ 9 - 0
src/api/login.js

@@ -18,6 +18,15 @@ export function login(username, password, code, uuid) {
   })
 }
 
+
+// 获取公钥
+export function getPublicKey() {
+  return request({
+    url: '/genPUPRkey',
+    method: 'post',
+  })
+}
+
 // 注册方法
 export function register(data) {
   return request({

+ 7 - 0
src/api/norm/QUOTAFEE.js

@@ -9,6 +9,13 @@ export function listQUOTAFEE(query) {
   })
 }
 
+export function listQUOTAFEERole(query) {
+  return request({
+    url: '/business/QUOTAFEE/listAll/byRole',
+    method: 'get',
+    params: query
+  })
+}
 // 查询辅助指标明细所有列表
 export function listAllQUOTAFEE(query) {
   return request({

+ 23 - 0
src/api/portal/ARTICLE/ARTICLE.js

@@ -84,5 +84,28 @@ export function audit(data) {
   })
 }
 
+//设置重点项目录入开放时间
+export function articleDate(data) {
+  return request({
+    url: '/ARTICLE/articleDate/' + data,
+    method: 'post',
+    data:data
+  })
+}
+
+
+export function getqueryArticleDate() {
+  return request({
+    url: '/ARTICLE/queryArticleDate',
+    method: 'get',
+  })
+}
 
+//历史记录
 
+export function getqueryArticleHisDate() {
+  return request({
+    url: '/ARTICLE/ArticleHis',
+    method: 'get',
+  })
+}

+ 10 - 0
src/api/portal/COMPANYUSER/COMPANYUSER.js

@@ -51,3 +51,13 @@ export function delCOMPANYUSER(id) {
     method: 'get'
   })
 }
+
+// 获取服务标签
+export function getMark(id) {
+  return request({
+    url: '/MARK/listAll',
+    method: 'get'
+  })
+}
+
+

+ 6 - 6
src/api/portal/ENTERPRISESCREENDATA/ENTERPRISESCREENDATA.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询企业大屏所需供应商数据列表
 export function listENTERPRISESCREENDATA(query) {
   return request({
-    url: '/business/ENTERPRISESCREENDATA/list',
+    url: '/ENTERPRISESCREENDATA/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listENTERPRISESCREENDATA(query) {
 // 查询企业大屏所需供应商数据所有列表
 export function listAllENTERPRISESCREENDATA(query) {
   return request({
-    url: '/business/ENTERPRISESCREENDATA/listAll',
+    url: '/ENTERPRISESCREENDATA/listAll',
     method: 'get',
     params: query
   })
@@ -21,7 +21,7 @@ export function listAllENTERPRISESCREENDATA(query) {
 // 查询企业大屏所需供应商数据详细
 export function getENTERPRISESCREENDATA(id) {
   return request({
-    url: '/business/ENTERPRISESCREENDATA/getInfo/' + id,
+    url: '/ENTERPRISESCREENDATA/getInfo/' + id,
     method: 'get'
   })
 }
@@ -29,7 +29,7 @@ export function getENTERPRISESCREENDATA(id) {
 // 新增企业大屏所需供应商数据
 export function addENTERPRISESCREENDATA(data) {
   return request({
-    url: '/business/ENTERPRISESCREENDATA/add',
+    url: '/ENTERPRISESCREENDATA/add',
     method: 'post',
     data: data
   })
@@ -38,7 +38,7 @@ export function addENTERPRISESCREENDATA(data) {
 // 修改企业大屏所需供应商数据
 export function updateENTERPRISESCREENDATA(data) {
   return request({
-    url: '/business/ENTERPRISESCREENDATA/edit',
+    url: '/ENTERPRISESCREENDATA/edit',
     method: 'post',
     data: data
   })
@@ -47,7 +47,7 @@ export function updateENTERPRISESCREENDATA(data) {
 // 删除企业大屏所需供应商数据
 export function delENTERPRISESCREENDATA(id) {
   return request({
-    url: '/business/ENTERPRISESCREENDATA/remove/' + id,
+    url: '/ENTERPRISESCREENDATA/remove/' + id,
     method: 'get'
   })
 }

+ 9 - 1
src/api/portal/ENTERPRISETRADEPERFORMANCE/ENTERPRISETRADEPERFORMANCE.js

@@ -45,13 +45,21 @@ export function updateENTERPRISETRADEPERFORMANCE(data) {
 }
 
 // 获取部门列表
-export function getDeptList(data) {
+export function getDeptList() {
   return request({
     url: '/system/dept/list',
     method: 'get',
   })
 }
 
+// 获取已有基础数据的部门列表
+export function getBaseDeptList() {
+  return request({
+    url: '/GARDENBASEDATA/list',
+    method: 'get',
+  })
+}
+
 // 删除企业贸易绩效数据(每个月填报)
 export function delENTERPRISETRADEPERFORMANCE(id) {
   return request({

+ 22 - 1
src/api/portal/GARDENBASEDATA/GARDENBASEDATA.js

@@ -53,9 +53,30 @@ export function delGARDENBASEDATA(id) {
 }
 
 // 企业名录列表
-export function getEnterprise(id) {
+export function getEnterprise(query) {
   return request({
     url: "/system/dept/list",
     method: "get",
+    params: query,
+  });
+}
+
+// 导入企业数据
+export function importGARDENBASEDATA(data) {
+  return request({
+    url: "/GARDENBASEDATA/baseData/import",
+    method: "post",
+    data,
   });
 }
+
+// 附件下载
+export function fileDownloadFun(data) {
+  return request({
+    url: '/GARDENBASEDATA/download',
+    method: 'get',
+    params: data,
+    responseType: "blob"
+
+  })
+}

+ 9 - 0
src/api/portal/GATHER/GATHER.js

@@ -51,6 +51,15 @@ export function updateGATHER(data) {
     data: data
   })
 }
+// 湾办修改数据采集
+export function wbUpdateGATHER(data) {
+  return request({
+    url: '/gather/wbEdit',
+    method: 'post',
+    data: data
+  })
+}
+
 
 // 删除数据采集
 export function delGATHER(id) {

+ 9 - 0
src/api/system/dept.js

@@ -9,6 +9,15 @@ export function listDept(query) {
   })
 }
 
+// 查询保税区列表
+export function listDeptByCb(query) {
+  return request({
+    url: '/system/dept/cb/list',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询部门列表(排除节点)
 export function listDeptExcludeChild(deptId) {
   return request({

+ 20 - 19
src/api/system/notice.js

@@ -1,44 +1,45 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 // 查询公告列表
 export function listNotice(query) {
   return request({
-    url: '/system/notice/list',
-    method: 'get',
-    params: query
-  })
+    url: "/system/notice/list",
+    method: "get",
+    params: query,
+  });
 }
 
 // 查询公告详细
 export function getNotice(noticeId) {
   return request({
-    url: '/system/notice/getInfo/' + noticeId,
-    method: 'get'
-  })
+    url: "/system/notice/getInfo/" + noticeId,
+    method: "get",
+  });
 }
 
 // 新增公告
 export function addNotice(data) {
   return request({
-    url: '/system/notice/add',
-    method: 'post',
-    data: data
-  })
+    url: "/system/notice/add",
+    method: "post",
+    data: data,
+  });
 }
 
 // 修改公告
 export function updateNotice(data) {
+  
   return request({
-    url: '/system/notice/edit',
-    method: 'post',
-    data: data
-  })
+    url: "/system/notice/edit",
+    method: "post",
+    data: data,
+  });
 }
 
 // 删除公告
 export function delNotice(noticeId) {
   return request({
-    url: '/system/notice/remove/' + noticeId,
-    method: 'get'
-  })
+    url: "/system/notice/remove/" + noticeId,
+    method: "get",
+  });
 }

+ 64 - 64
src/api/system/user.js

@@ -1,145 +1,145 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 import { parseStrEmpty } from "@/utils/ruoyi";
 
 // 查询用户列表
 export function listUser(query) {
   return request({
-    url: '/system/user/list',
-    method: 'get',
-    params: query
-  })
+    url: "/system/user/list",
+    method: "get",
+    params: query,
+  });
 }
 
 // 查询用户详细
 export function getUser(userId) {
   return request({
-    url: '/system/user/getInfo/' + parseStrEmpty(userId),
-    method: 'get'
-  })
+    url: "/system/user/getInfo/" + parseStrEmpty(userId),
+    method: "get",
+  });
 }
 
 // 新增用户
 export function addUser(data) {
   return request({
-    url: '/system/user/add',
-    method: 'post',
-    data: data
-  })
+    url: "/system/user/add",
+    method: "post",
+    data: data,
+  });
 }
 
 // 修改用户
 export function updateUser(data) {
   return request({
-    url: '/system/user/edit',
-    method: 'post',
-    data: data
-  })
+    url: "/system/user/edit",
+    method: "post",
+    data: data,
+  });
 }
 
 // 删除用户
 export function delUser(userId) {
   return request({
-    url: '/system/user/remove/' + userId,
-    method: 'get'
-  })
+    url: "/system/user/remove/" + userId,
+    method: "get",
+  });
 }
 
 // 用户密码重置
-export function resetUserPwd(userId, password) {
+export function resetUserPwd(userId, password, is) {
   const data = {
     userId,
-    password
-  }
+    password,
+    type: is,
+  };
   return request({
-    url: '/system/user/resetPwd',
-    method: 'post',
-    data: data
-  })
+    url: "/system/user/resetPwd",
+    method: "post",
+    data: data,
+  });
 }
 
 // 用户状态修改
 export function changeUserStatus(userId, status) {
   const data = {
     userId,
-    status
-  }
+    status,
+  };
   return request({
-    url: '/system/user/changeStatus',
-    method: 'post',
-    data: data
-  })
+    url: "/system/user/changeStatus",
+    method: "post",
+    data: data,
+  });
 }
 
 // 查询用户个人信息
 export function getUserProfile() {
   return request({
-    url: '/system/user/profile',
-    method: 'get'
-  })
+    url: "/system/user/profile",
+    method: "get",
+  });
 }
 
 // 修改用户个人信息
 export function updateUserProfile(data) {
   return request({
-    url: '/system/user/profile/edit',
-    method: 'post',
-    data: data
-  })
+    url: "/system/user/profile/edit",
+    method: "post",
+    data: data,
+  });
 }
 
 // 用户密码重置
 export function updateUserPwd(oldPassword, newPassword) {
   const data = {
     oldPassword,
-    newPassword
-  }
+    newPassword,
+  };
   return request({
-    url: '/system/user/profile/updatePwd',
-    method: 'post',
-    params: data
-  })
+    url: "/system/user/profile/updatePwd",
+    method: "post",
+    params: data,
+  });
 }
 
 // 用户头像上传
 export function uploadAvatar(data) {
   return request({
-    url: '/system/user/profile/avatar',
-    method: 'post',
-    data: data
-  })
+    url: "/system/user/profile/avatar",
+    method: "post",
+    data: data,
+  });
 }
 
 // 查询授权角色
 export function getAuthRole(userId) {
   return request({
-    url: '/system/user/authRole/' + userId,
-    method: 'get'
-  })
+    url: "/system/user/authRole/" + userId,
+    method: "get",
+  });
 }
 
 // 保存授权角色
 export function updateAuthRole(data) {
   return request({
-    url: '/system/user/authRole',
-    method: 'post',
-    params: data
-  })
+    url: "/system/user/authRole",
+    method: "post",
+    params: data,
+  });
 }
 
 // 查询部门下拉树结构
 export function deptTreeSelect() {
   return request({
-    url: '/system/user/deptTree',
-    method: 'get'
-  })
+    url: "/system/user/deptTree",
+    method: "get",
+  });
 }
 
-
 // 上传文件
 export function upload(data) {
   return request({
-    url: '/common/upload/',
-    method: 'post',
-    data:data
-  })
+    url: "/common/upload/",
+    method: "post",
+    data: data,
+  });
 }

+ 1 - 1
src/api/wf/PROTEMPLATE.js

@@ -101,7 +101,7 @@ export function updatePro(data) {
 // 获取用户列表
 export function getUser() {
   return request({
-    url: '/test/user/list',
+    url: '/system/user/listAll',
     method: 'get',
   })
 }

BIN
src/assets/images/portion.png


BIN
src/assets/images/sum.png


+ 239 - 0
src/components/AuxiliaryAudit/index.vue

@@ -0,0 +1,239 @@
+<template>
+    <div>
+      <el-tabs v-model="activeName">
+        <el-tab-pane label="详细信息" name="详细信息">
+          <el-descriptions border>
+            <el-descriptions-item label="活动名称">{{
+              taskList.acname
+            }}</el-descriptions-item>
+            <el-descriptions-item label="流程名称">{{
+              taskList.proname
+            }}</el-descriptions-item>
+              <el-descriptions-item label="任务启动时间">
+                {{
+                  taskList.beginTime ? taskList.beginTime.substr(0, 10) : "无"
+                }}</el-descriptions-item
+                >
+                <el-descriptions-item label="提交人">{{
+              taskList.formobj.auditName
+            }}</el-descriptions-item>
+            <el-descriptions-item label="审批人">{{
+              taskList.execName
+            }}</el-descriptions-item>
+            <el-descriptions-item label="审核状态">
+              <el-tag v-if="taskList.status == 1" type="success">已审</el-tag>
+              <el-tag v-else-if="taskList.status == 2" type="danger">驳回</el-tag>
+              <!-- <el-tag v-else-if="taskList.formobj.status == 3" type="info">退回</el-tag> -->
+              <el-tag v-else-if="taskList.status == 0">待审核</el-tag>
+  
+            </el-descriptions-item>
+            <el-descriptions-item label="业务备注">{{
+              taskList.fromKeyword
+            }}</el-descriptions-item>
+  
+            <!-- <el-descriptions-item label="审核意见">{{
+              taskList.comments ? taskList.comments : "无"
+            }}</el-descriptions-item> -->
+          </el-descriptions>
+  
+         
+        </el-tab-pane>
+        <el-tab-pane
+          label="指标项"
+          name="指标项"
+          v-if="taskList.formobj.bondedFeeList.length != 0"
+        >
+          <el-form ref="form" >
+            <!-- v-if="dict.remark == item.normId" -->
+            <el-card
+              class="box-card"
+              v-for="(dict) in taskList.formobj.bondedFeeList"
+              :key="dict.id"
+              :value="dict"
+              style="margin-bottom: 24px; font-weight: bold"
+            >
+              <div slot="header" style="margin-left: 30px; font-size: 15px">
+                <el-row>
+                  <el-col :span="12">
+                    <el-form-item
+                      label-width="90px"
+                      prop="score"
+                      label="指标:"
+                    >
+                      <span>{{ dict.quotaName }}</span>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item
+                      label-width="90px"
+                      prop="score"
+                      label="分数:"
+                    >
+                      <el-input
+                        :disabled="true"
+                        v-model="dict.score"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </div>
+              <!--          目前详情还没有返回,先在新增显示-->
+              <div
+                slot="header"
+                style="margin-left: 30px; font-size: 15px"
+                
+              >
+                <el-form-item
+                  label-width="90px"
+                  prop="score"
+                  label="指标内容:"
+                >
+                  <span>{{ dict.content }}</span>
+                </el-form-item>
+              </div>
+              <el-form-item
+                v-if="dict.confirmWay == '附件'"
+                label-width="70px"
+                prop="linkUrls"
+                label="附件"
+              >
+                <div style="cursor: pointer;" @click="downloadAttachmentFile(dict)">
+                  {{ dict.fileNames ? dict.fileNames.replace(',', '') : '' }}
+
+                </div>
+              </el-form-item>
+              <el-form-item
+                v-if="dict.confirmWay == '文字说明'"
+                label-width="70px"
+                prop="remark"
+                label="说明"
+              >
+                <el-input
+                  type="textarea"
+                  :disabled="true"
+                  v-model="dict.remark"
+                  rows="3"
+                ></el-input>
+              </el-form-item>
+              <el-form-item
+                v-if="dict.confirmWay == '数值'"
+                label-width="70px"
+                prop="numValue"
+                label="数值"
+              >
+                <el-input
+                  type="number"
+                  :disabled="true"
+                  v-model="dict.numValue"
+                ></el-input>
+              </el-form-item>
+            </el-card>
+
+            <!-- <el-form-item  label-width="100px" label="驳回理由">
+          <el-input type="textarea" width="100%" v-model="form.test"></el-input>
+        </el-form-item> -->
+          </el-form>
+        </el-tab-pane>
+        <el-tab-pane label="审批记录" name="审批记录">
+          <el-timeline>
+            <el-timeline-item
+              v-for="(item, index) in taskList.formobj.taskVoList"
+              :timestamp="item.createTime"
+              placement="top"
+              :key="index + 'taskHisAction'"
+            >
+              <el-card>
+                <p>
+                  {{ item.execName }} {{ item.acname }} 于 {{ item.createTime }} --- <span > {{item.status == 0 ? '待审核' : (item.status == 1 ? '同意' : (item.status == 2 ? '驳回' : '退回')) }} </span> 
+                </p>
+
+                <p v-if="item.comments">{{"审核意见:" + item.comments }}</p>
+              </el-card>
+            </el-timeline-item>
+          </el-timeline>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </template>
+  
+  <script>
+import { getToken } from "@/utils/auth";
+import { download } from '@/api/portal/OPSERVICE/OPSERVICE.js';
+import { saveAs } from 'file-saver';
+  export default {
+    data() {
+      return {
+        activeName: "详细信息",
+        // 根路径
+        baseURL: process.env.VUE_APP_BASE_API,
+        BigImgVisible: false,
+
+        upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/upload",
+      },
+      };
+    },
+    props: ["taskList"],
+
+    methods: {
+      handlePictureCardPreview(file) {
+        this.taskList.formobj.picture = file.url;
+        this.BigImgVisible = true;
+      },
+          // 文件上传成功处理
+    handleFileSuccess(index, response, file, fileList) {
+      let linkUrls = "";
+      let fileNames = "";
+      fileList.forEach((item) => {
+        linkUrls += item.response.fileName + ",";
+        fileNames += item.response.newFileName + ",";
+      });
+      this.QUOTAFEEList.forEach((item, key) => {
+        if (key == index) {
+          item.linkUrls = linkUrls;
+          item.fileNames = fileNames;
+        }
+      });
+    },
+    handleRemove(file, fileList) {
+      this.fileList = fileList;
+    },
+    handleChange(file, fileList) {},
+
+    downloadAttachmentFile(data){
+      let filename = data.fileNames.replace(",","");
+      let fileurl = data.linkUrls.replace('/profile','').replace(",","");
+
+      download(fileurl,data.id).then(res=>{
+        const blob = new Blob([res]);
+        saveAs(blob, filename);
+      })
+    },
+
+    },
+  };
+  </script>
+  
+  <style>
+  .question_content {
+    background-color: #f5f7fa;
+    border: 1px solid rgb(223, 228, 237)  ;
+    border-radius: 4px;
+    border-color: #dfe4ed;
+    color: #c0c4cc;
+    cursor: not-allowed;
+    padding: 0 15px;
+  }
+  </style>
+  

+ 0 - 1
src/components/Crontab/index.vue

@@ -182,7 +182,6 @@ export default {
       "updateCrontabValue", name, value, from;
       this.crontabValueObj[name] = value;
       if (from && from !== name) {
-        console.log(`来自组件 ${from} 改变了 ${name} ${value}`);
         this.changeRadio(name, value);
       }
     },

+ 290 - 0
src/components/DataAcquisition/index.vue

@@ -0,0 +1,290 @@
+<template>
+  <div>
+    <div
+      v-for="(item, index) in tabList"
+      :key="index + 'tabs'"
+      :label="item.normName"
+      :name="item.normName"
+    >
+      <el-col
+        :span="24"
+        style="
+          border: 1px solid rgba(0, 0, 0, 0.05);
+          margin-bottom: 5px;
+          padding: 4px;
+        "
+      >
+        <p
+          style="
+            font-weight: 600;
+            margin: 0;
+            margin-bottom: 5px;
+            font-size: 17px;
+          "
+        >
+          {{ item.normName }}
+        </p>
+
+        <template v-for="listItem in taskList.formobj.feeLists">
+          <el-form
+            v-if="listItem.normId == item.normId"
+            :model="listItem"
+            :ref="'form' + listItem.normfeeId"
+            :key="listItem.normfeeId"
+            :disabled="listItem.sendValue == 1"
+            label-width="380px"
+          >
+            <!-- label-width="350px" -->
+            <el-col :span="8">
+              <el-form-item
+                style="padding: 10px"
+                :label="listItem.normfeeName + '(' + listItem.funitName + ')'"
+                prop="collCalue"
+              >
+                <!-- <el-input
+                  :disabled="!edit"
+                  v-model="listItem.collCalue"
+                  :placeholder="'请输入' + listItem.normfeeName"
+                ></el-input> -->
+                <div :title="listItem.collCalue"  style="background-color: rgba(0, 0, 0, .03); padding-left: 5px;" >{{ listItem.collCalue }}</div>
+
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </template>
+      </el-col>
+    </div>
+    <div style="font-size: 18px; font-weight: 600; margin-bottom: 20px">
+      审批记录:
+    </div>
+    <el-timeline>
+      <el-timeline-item
+        v-for="(item, index) in taskList.formobj.taskVoList"
+        :timestamp="item.createTime"
+        placement="top"
+        :key="index + 'taskHisAction'"
+      >
+        <el-card>
+          <p>
+            {{
+              item.execName +
+              "------" +
+              statusArr[item.status] +
+              "------" +
+              item.createTime
+            }}
+            <span v-if="item.comments != null">{{
+              "------备注:" + item.comments
+            }}</span>
+          </p>
+        </el-card>
+      </el-timeline-item>
+    </el-timeline>
+    <!-- <el-tabs v-model="activeName" type="border-card">
+      <el-tab-pane
+        v-for="(item, index) in tabList"
+        :key="index + 'tabs'"
+        :label="item.normName"
+        :name="item.normName"
+      >
+        <el-row :gutter="10">
+          <template v-for="listItem in taskList.formobj.feeLists">
+            <el-form
+              v-if="listItem.normId == item.normId"
+              :model="listItem"
+              :ref="'form' + listItem.normfeeId"
+              :key="listItem.normfeeId"
+            >
+              <el-col :span="12">
+                <el-form-item
+                  prop="collCalue"
+                  :label="
+                    listItem.normfeeName + '(' + listItem.funitName + ')'
+                  "
+                >
+                  <el-input
+                    :disabled="!edit"
+                    v-model="listItem.collCalue"
+                    :placeholder="'请输入' + listItem.normfeeName"
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form>
+          </template>
+        </el-row>
+      </el-tab-pane>
+      <div style="font-size: 18px; font-weight: 600; margin-bottom: 20px;">审批记录:</div>
+      <el-timeline>
+          <el-timeline-item
+            v-for="(item, index) in taskList.formobj.taskVoList"
+            :timestamp="item.createTime"
+            placement="top"
+            :key="index + 'taskHisAction'"
+          >
+            <el-card>
+              <p>
+                {{ item.execName  +"------" +statusArr[item.status]+"------" +item.createTime }} <span v-if="item.comments != null">{{"------备注:"+ item.comments }}</span>
+              </p>
+            </el-card>
+          </el-timeline-item>
+        </el-timeline>
+    </el-tabs> -->
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    taskList: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  components: {},
+  data() {
+    return {
+      tabList: [],
+      check: false,
+      title: "",
+      openDetail: false,
+      form: {},
+      edit: false,
+      statusArr: {
+        0: "待审核",
+        1: "同意",
+        2: "驳回",
+        3: "退回",
+      },
+    };
+  },
+  computed: {},
+  methods: {
+    handleClose() {
+      this.check = false;
+    },
+
+    submitForm(type) {
+      let p = [];
+      p = this.form.feeLists.map((item, index) => {
+        return new Promise((resolve, reject) => {
+          this.$refs["form" + item.normfeeId][0].validate((valid) => {
+            // this.$refs["form" + index].validate((valid) => {
+            if (valid) {
+              resolve(); //完成态
+            } else {
+              reject(); //已失败
+            }
+          });
+        });
+      });
+      Promise.all(p)
+        .then(() => {
+          if (type == "add") {
+            addGATHER(this.form).then((response) => {
+              if (response.code == 200) {
+                this.$modal.msgSuccess("录入成功");
+                this.getList();
+                this.open = false;
+                compute(this.form).then((response) => {});
+              }
+            });
+          } else if (type == "edit") {
+            updateGATHER(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.getList();
+              this.openDetail = false;
+              compute(this.form).then((response) => {});
+            });
+          }
+        })
+        .catch((err) => {
+          this.$message.error("请检查是否有必填项未输入!");
+        });
+    },
+    handleCheck(val, value) {
+      let data = {
+        gatherId: this.dataId,
+        auditType: 2,
+      };
+      let audit = {
+        gatherId: this.dataId,
+        auditType: 3,
+        remark: value,
+      };
+      if (val == 1) {
+        bsqAudit(data).then((res) => {
+          if (res.code == 200) {
+            this.$modal.msgSuccess("通过审核成功");
+            this.getList();
+            this.openDetail = false;
+          }
+        });
+      } else {
+        bsqAudit(audit).then((res) => {
+          if (res.code == 200) {
+            this.$modal.msgSuccess("驳回成功");
+            this.getList();
+            this.openDetail = false;
+          }
+        });
+      }
+    },
+    // 驳回处理
+    handleReject() {
+      this.$prompt("请输入驳回理由:", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        inputType: "textarea",
+      })
+        .then(({ value }) => {
+          this.handleCheck(2, value);
+          // this.$message({
+          //   type: 'success',
+          //   message: '你的邮箱是: ' + value
+          // });
+        })
+        .catch(() => {
+          // this.$message({
+          //   type: 'info',
+          //   message: '取消输入'
+          // });
+        });
+    },
+    // 取消按钮
+    cancel() {
+      this.check = false;
+      this.open = false;
+      this.openDetail = false;
+      this.openUpload = false;
+      this.reset();
+    },
+  },
+  created() {
+    this.tabList = JSON.parse(JSON.stringify(this.taskList.formobj.feeLists));
+    //去重获取tab
+    //遍历如果遇到相同的id则删掉
+    for (var i = 0; i < this.tabList.length - 1; i++) {
+      //设置激活的tab
+      if (i == 0) {
+        this.activeName = this.tabList[0].normName;
+      }
+      for (var j = i + 1; j < this.tabList.length; j++) {
+        if (this.tabList[i].normId == this.tabList[j].normId) {
+          this.tabList.splice(j, 1);
+          //因为数组长度减小1,所以直接 j++ 会漏掉一个元素,所以要 j--
+          j--;
+        }
+      }
+    }
+  },
+};
+</script>
+<style scoped lang="scss">
+.dialog-footer {
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+</style>

+ 2 - 1
src/components/Editor/index.vue

@@ -82,7 +82,7 @@ export default {
             [{ color: [] }, { background: [] }],             // 字体颜色、字体背景颜色
             [{ align: [] }],                                 // 对齐方式
             ["clean"],                                       // 清除文本格式
-            ["link", "image", "video"]                       // 链接、图片、视频
+            ["link", "image"]                       // 链接、图片、视频
           ],
         },
         placeholder: "请输入内容",
@@ -105,6 +105,7 @@ export default {
   watch: {
     value: {
       handler(val) {
+        console.log(val,'***');
         if (val !== this.currentValue) {
           this.currentValue = val === null ? "" : val;
           if (this.Quill) {

+ 5 - 0
src/components/cropper.vue

@@ -85,6 +85,11 @@ export default {
       imgSrc: '',
     };
   },
+  created(){
+    if(this.value){
+      this.imgSrc = `${this.baseUrl}${this.value}?t=${new Date().getTime()}`;
+    }
+  },
   methods: {
     editCropper(data) {
       this.open = true;

+ 13 - 1
src/components/editor.vue

@@ -12,6 +12,10 @@ export default {
     },
     value: {
       default: ''
+    },
+    edits:{
+      type:Boolean,
+      default:false
     }
   },
   data() {
@@ -20,17 +24,19 @@ export default {
       contentValue: this.value,
       baseUrl: process.env.VUE_APP_BASE_API,
       setting: {
+        readonly: true,
         menubar: false,
         ProgressState: true,
         toolbar:
           'fullscreen preview code | undo redo | lineheight bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | numlist bullist | upfile image axupimgs media importword table | formatselect fontselect fontsizeselect forecolor backcolor | indent outdent | superscript subscript | removeformat | wordcount | help',
         toolbar_drawer: 'sliding',
         quickbars_selection_toolbar: 'removeformat | bold italic underline strikethrough | fontsizeselect forecolor backcolor',
-        plugins: 'preview code lineheight wordcount upfile image axupimgs imagetools media importword table lists fullscreen quickbars help',
+        plugins: 'paste preview code lineheight wordcount upfile image axupimgs imagetools media importword table lists fullscreen quickbars help',
         language: 'zh_CN',
         content_style: 'img {max-width:100%;}', //编辑器内限制图片大小
         convert_urls: false,
         height: this.height,
+        paste_data_images: true,
         //图片上传
         images_upload_handler: (blobInfo, succFun, failFun) => {
           let formData = new FormData();
@@ -87,6 +93,7 @@ export default {
       }
     };
   },
+  
   watch: {
     value(newValue) {
       if (newValue) {
@@ -95,8 +102,13 @@ export default {
     },
     contentValue(newValue) {
       this.$emit('input', newValue);
+
+    },
+    edits(newValue){
+      this.setting.readonly = newValue
     }
   },
+ 
   mounted() {
     setTimeout(() => {
       this.open = true;

+ 92 - 0
src/components/selectTree/index.vue

@@ -0,0 +1,92 @@
+<template>
+    <el-select
+        filterable
+        v-model="modelValue"
+        :placeholder="placeholder"
+        ref="selectUpResId"
+      >
+      <el-option
+        :value="modelValue" 
+        style="overflow: auto; height: 100%"
+        hidden
+        />
+      <el-tree
+        :data="dataList"
+        :props="defaultProps"
+        :node-key="nodeKey"
+        :expand-on-click-node="expandNode" 
+        :check-on-click-node="checkNode" 
+        check-strictly
+        @node-click="handleNodeClick"
+      />
+    </el-select>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            form: {
+               label: '',
+               id: ''
+             },
+             dataList:[]
+        }
+      
+    },
+    props: {
+        // param: {
+        //   type: Array,
+        //   required: true
+        // },
+        placeholder: {
+            type: String,
+            default: '请选择'
+        },
+        formatId: {
+            type: String,
+            default: 'deptId'
+        },
+        defaultProps: {
+            type: Object,
+            default: () => {
+                return {
+                    children: "children",
+                    label: "deptName"
+                }
+             }
+        },
+        nodeKey: {
+            type: String,
+            default: 'deptId'
+        },
+        expandNode: {
+            type: Boolean,
+            default: false
+        },
+        checkNode: {
+            type: Boolean,
+            default: true
+        },
+        modelValue: {
+            type: String,
+            default: ''
+        }
+    },
+    // created() {
+    //     this.param.length > 0 && (this.dataList = this.handleTree(this.param, this.formatId));
+    // },
+    methods: {
+        init(param, formatId = 'deptId') {
+            this.$nextTick(() => {
+                this.dataList = this.handleTree(param, formatId);
+            })
+           
+        },
+        handleNodeClick(data) {
+          this.$emit('setNodeValue', data)
+          this.$refs.selectUpResId.blur()
+        }
+    }
+}
+</script>

+ 134 - 49
src/layout/components/Navbar.vue

@@ -1,6 +1,13 @@
 <template>
   <div class="navbar">
-    <div style="display: flex; justify-content: center; color: white; line-height: 47px">
+    <div
+      style="
+        display: flex;
+        justify-content: center;
+        color: white;
+        line-height: 47px;
+      "
+    >
       <div class="cursor index" @click="handlerIndex">
         <span class="icon">&#xe712;</span>
         <div class="mtt">首页</div>
@@ -9,20 +16,32 @@
         <top-nav></top-nav>
       </div>
       <search />
-      <hamburger id="hamburger-container" :is-active="sidebar.opened" v-show="isShowHamBurger" class="hamburger-container" @toggleClick="toggleSideBar" />
+      <hamburger
+        id="hamburger-container"
+        :is-active="sidebar.opened"
+        v-show="isShowHamBurger"
+        class="hamburger-container"
+        @toggleClick="toggleSideBar"
+      />
     </div>
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav" />
+    <breadcrumb
+      id="breadcrumb-container"
+      class="breadcrumb-container"
+      v-if="!topNav"
+    />
     <div class="right-menu">
       <div class="cursor index right-menu-item">
         <header-notice-vue />
       </div>
-      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
-
+      <el-dropdown
+        class="avatar-container right-menu-item hover-effect"
+        trigger="click"
+      >
         <div class="avatar-wrapper">
           <img :src="avatar" class="user-avatar" />
           <div class="cons">
             <div class="nickName">{{ user.nickName }}</div>
-            <div>{{ user.deptName ? user.deptName : '无部门' }}</div>
+            <div>{{ user.deptName ? user.deptName : "无部门" }}</div>
           </div>
           <i class="el-icon-caret-bottom" />
         </div>
@@ -39,39 +58,70 @@
         </el-dropdown-menu>
       </el-dropdown>
     </div>
+
+    <el-dialog
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :show-close="false"
+      :visible.sync="open"
+      :append-to-body="true"
+      title="修改密码"
+      width="70%"
+    >
+      <p>注:由于您首次登录请您尽快修改密码,保护您的账号安全!</p>
+      <el-row>
+        <el-col :span="24">
+          <div style="display: flex; align-items: center; margin-bottom: 20px">
+            <p style="width: 100px; color: #606266">新密码:</p>
+            <el-input type="password" show-password v-model="newPassword"></el-input>
+          </div>
+        </el-col>
+      </el-row>
+      <div
+        style="display: flex; justify-content: center; align-items: center"
+        class="dialog-footer"
+      >
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { mapGetters } from 'vuex';
-import Breadcrumb from '@/components/Breadcrumb';
-import TopNav from '@/components/TopNav';
-import Hamburger from '@/components/Hamburger';
-import Screenfull from '@/components/Screenfull';
-import SizeSelect from '@/components/SizeSelect';
-import Search from '@/components/HeaderSearch';
-import RuoYiGit from '@/components/RuoYi/Git';
-import RuoYiDoc from '@/components/RuoYi/Doc';
-import HeaderNoticeVue from './HeaderNotice.vue';
+import { resetUserPwd } from "@/api/system/user.js";
+import { getInfo } from "@/api/login.js";
+import { mapGetters } from "vuex";
+import Breadcrumb from "@/components/Breadcrumb";
+import TopNav from "@/components/TopNav";
+import Hamburger from "@/components/Hamburger";
+import Screenfull from "@/components/Screenfull";
+import SizeSelect from "@/components/SizeSelect";
+import Search from "@/components/HeaderSearch";
+import RuoYiGit from "@/components/RuoYi/Git";
+import RuoYiDoc from "@/components/RuoYi/Doc";
+import HeaderNoticeVue from "./HeaderNotice.vue";
 
 export default {
   data() {
     return {
+      newPassword: null,
+      userData: {},
+      open: false,
       // 菜单列表显示、隐藏
       isShowMenu: false,
       user: this.$store.state.user,
       // 伸缩按钮显示、隐藏
       isShowHamBurger: false,
       routeImgs: [
-        require('@/assets/route_images/u211.svg'),
-        require('@/assets/route_images/u217.svg'),
-        require('@/assets/route_images/u226.svg'),
-        require('@/assets/route_images/u214.svg'),
-        require('@/assets/route_images/u223.svg'),
-        require('@/assets/route_images/u229.svg'),
-        require('@/assets/route_images/u220.svg'),
-        require('@/assets/route_images/u232.svg')
-      ]
+        require("@/assets/route_images/u211.svg"),
+        require("@/assets/route_images/u217.svg"),
+        require("@/assets/route_images/u226.svg"),
+        require("@/assets/route_images/u214.svg"),
+        require("@/assets/route_images/u223.svg"),
+        require("@/assets/route_images/u229.svg"),
+        require("@/assets/route_images/u220.svg"),
+        require("@/assets/route_images/u232.svg"),
+      ],
     };
   },
   components: {
@@ -83,40 +133,75 @@ export default {
     SizeSelect,
     Search,
     RuoYiGit,
-    RuoYiDoc
+    RuoYiDoc,
   },
   computed: {
-    ...mapGetters(['sidebar', 'avatar', 'device', 'sidebarRouters', 'deptName','nickName']),
+    ...mapGetters([
+      "sidebar",
+      "avatar",
+      "device",
+      "sidebarRouters",
+      "deptName",
+      "nickName",
+    ]),
     setting: {
       get() {
         return this.$store.state.settings.showSettings;
       },
       set(val) {
-        this.$store.dispatch('settings/changeSetting', {
-          key: 'showSettings',
-          value: val
+        this.$store.dispatch("settings/changeSetting", {
+          key: "showSettings",
+          value: val,
         });
-      }
+      },
     },
     topNav: {
       get() {
         return this.$store.state.settings.topNav;
-      }
-    }
+      },
+    },
+  },
+  created() {
+    this.getUserInfo();
   },
   methods: {
+    submitForm() {
+      let reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$/;
+
+
+      if(reg.test(this.newPassword)){
+
+        resetUserPwd(this.user.userId, this.newPassword, false).then(
+          (res) => {
+            if (res.code == 200) {
+              this.$message.success("修改成功");
+              this.open = false;
+            }
+          }
+        );
+      }else{
+        this.$message.error("密码需包含大小写字母 + 数字 + 特殊字符,且不小于8位");
+      }
+    },
+
+    getUserInfo() {
+      getInfo().then((res) => {
+        this.userData = res.user;
+        if (res.user.type == true) this.open = true;
+      });
+    },
     toggleSideBar() {
-      this.$store.dispatch('app/toggleSideBar');
+      this.$store.dispatch("app/toggleSideBar");
     },
     async logout() {
-      this.$confirm('确定注销并退出系统吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
+      this.$confirm("确定注销并退出系统吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
       })
         .then(() => {
-          this.$store.dispatch('LogOut').then(() => {
-            location.href = '/index';
+          this.$store.dispatch("LogOut").then(() => {
+            location.href = "/admin";
           });
         })
         .catch(() => {});
@@ -127,22 +212,22 @@ export default {
 
     handlerIndex() {
       this.isShowHamBurger = false;
-      this.$router.push('/');
-    }
+      this.$router.push("/");
+    },
   },
 
   watch: {
-    '$route.fullPath': {
+    "$route.fullPath": {
       handler: function (newV, oldV) {
-        if (newV == '/index') {
+        if (newV == "/index") {
           this.isShowHamBurger = false;
         } else {
           this.isShowHamBurger = true;
         }
-      }
+      },
       // deep:true,
-    }
-  }
+    },
+  },
 };
 </script>
 
@@ -246,9 +331,9 @@ export default {
             height: 15px;
             margin-top: -7px;
             margin-bottom: 5px;
-
           }
-          .deptName {}
+          .deptName {
+          }
           .desc {
             margin-top: 7px;
           }

+ 1 - 3
src/main.js

@@ -24,9 +24,7 @@ Vue.use(VueTinymce) // 安装vue的tinymce组件
 //精简,灵活的web pc弹窗组件
 import layer from 'vue-layer'
 import 'vue-layer/lib/vue-layer.css';
-Vue.prototype.$layer = layer(Vue, {
-	msgtime: 3, //目前只有一项,即msg方法的默认消失时间,单位:秒
-});
+Vue.prototype.$layer = layer(Vue);
 
 import './assets/icons' // icon
 import './permission' // permission control

+ 2 - 2
src/router/index.js

@@ -171,8 +171,8 @@ Router.prototype.push = function push(location) {
 }
 
 export default new Router({
-  base: "/",
-  mode: 'history', // 去掉url中的#
+  base: "/admin",
+  mode: 'hash', // 去掉url中的#
   scrollBehavior: () => ({ y: 0 }),
   routes: constantRoutes
 })

File diff suppressed because it is too large
+ 0 - 0
src/utils/crypt-js.js


+ 3724 - 0
src/utils/crypt.js

@@ -0,0 +1,3724 @@
+import CryptoJS from "./crypt-js.js"
+
+function SM2Cipher(a) {
+    this.ct = 1;
+    this.sm3c3 = this.sm3keybase = this.p2 = null;
+    this.key = Array(32);
+    this.keyOff = 0;
+    this.cipherMode = "undefined" != typeof a ? a : SM2CipherMode.C1C3C2
+}
+(function (global, undefined) {
+    "use strict";
+    var SM2CipherMode = {
+        C1C2C3: "0",
+        C1C3C2: "1"
+    };
+    (function () {
+        function a(a, c) {
+            var b = (this._lBlock >>> a ^ this._rBlock) & c;
+            this._rBlock ^= b;
+            this._lBlock ^= b << a
+        }
+
+        function b(a, c) {
+            var b = (this._rBlock >>> a ^ this._lBlock) & c;
+            this._lBlock ^= b;
+            this._rBlock ^= b << a
+        }
+        var c = CryptoJS,
+            d = c.lib,
+            e = d.WordArray,
+            d = d.BlockCipher,
+            f = c.algo,
+            g = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4],
+            h = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32],
+            k = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
+            l = [{
+                0: 8421888,
+                268435456: 32768,
+                536870912: 8421378,
+                805306368: 2,
+                1073741824: 512,
+                1342177280: 8421890,
+                1610612736: 8389122,
+                1879048192: 8388608,
+                2147483648: 514,
+                2415919104: 8389120,
+                2684354560: 33280,
+                2952790016: 8421376,
+                3221225472: 32770,
+                3489660928: 8388610,
+                3758096384: 0,
+                4026531840: 33282,
+                134217728: 0,
+                402653184: 8421890,
+                671088640: 33282,
+                939524096: 32768,
+                1207959552: 8421888,
+                1476395008: 512,
+                1744830464: 8421378,
+                2013265920: 2,
+                2281701376: 8389120,
+                2550136832: 33280,
+                2818572288: 8421376,
+                3087007744: 8389122,
+                3355443200: 8388610,
+                3623878656: 32770,
+                3892314112: 514,
+                4160749568: 8388608,
+                1: 32768,
+                268435457: 2,
+                536870913: 8421888,
+                805306369: 8388608,
+                1073741825: 8421378,
+                1342177281: 33280,
+                1610612737: 512,
+                1879048193: 8389122,
+                2147483649: 8421890,
+                2415919105: 8421376,
+                2684354561: 8388610,
+                2952790017: 33282,
+                3221225473: 514,
+                3489660929: 8389120,
+                3758096385: 32770,
+                4026531841: 0,
+                134217729: 8421890,
+                402653185: 8421376,
+                671088641: 8388608,
+                939524097: 512,
+                1207959553: 32768,
+                1476395009: 8388610,
+                1744830465: 2,
+                2013265921: 33282,
+                2281701377: 32770,
+                2550136833: 8389122,
+                2818572289: 514,
+                3087007745: 8421888,
+                3355443201: 8389120,
+                3623878657: 0,
+                3892314113: 33280,
+                4160749569: 8421378
+            }, {
+                0: 1074282512,
+                16777216: 16384,
+                33554432: 524288,
+                50331648: 1074266128,
+                67108864: 1073741840,
+                83886080: 1074282496,
+                100663296: 1073758208,
+                117440512: 16,
+                134217728: 540672,
+                150994944: 1073758224,
+                167772160: 1073741824,
+                184549376: 540688,
+                201326592: 524304,
+                218103808: 0,
+                234881024: 16400,
+                251658240: 1074266112,
+                8388608: 1073758208,
+                25165824: 540688,
+                41943040: 16,
+                58720256: 1073758224,
+                75497472: 1074282512,
+                92274688: 1073741824,
+                109051904: 524288,
+                125829120: 1074266128,
+                142606336: 524304,
+                159383552: 0,
+                176160768: 16384,
+                192937984: 1074266112,
+                209715200: 1073741840,
+                226492416: 540672,
+                243269632: 1074282496,
+                260046848: 16400,
+                268435456: 0,
+                285212672: 1074266128,
+                301989888: 1073758224,
+                318767104: 1074282496,
+                335544320: 1074266112,
+                352321536: 16,
+                369098752: 540688,
+                385875968: 16384,
+                402653184: 16400,
+                419430400: 524288,
+                436207616: 524304,
+                452984832: 1073741840,
+                469762048: 540672,
+                486539264: 1073758208,
+                503316480: 1073741824,
+                520093696: 1074282512,
+                276824064: 540688,
+                293601280: 524288,
+                310378496: 1074266112,
+                327155712: 16384,
+                343932928: 1073758208,
+                360710144: 1074282512,
+                377487360: 16,
+                394264576: 1073741824,
+                411041792: 1074282496,
+                427819008: 1073741840,
+                444596224: 1073758224,
+                461373440: 524304,
+                478150656: 0,
+                494927872: 16400,
+                511705088: 1074266128,
+                528482304: 540672
+            }, {
+                0: 260,
+                1048576: 0,
+                2097152: 67109120,
+                3145728: 65796,
+                4194304: 65540,
+                5242880: 67108868,
+                6291456: 67174660,
+                7340032: 67174400,
+                8388608: 67108864,
+                9437184: 67174656,
+                10485760: 65792,
+                11534336: 67174404,
+                12582912: 67109124,
+                13631488: 65536,
+                14680064: 4,
+                15728640: 256,
+                524288: 67174656,
+                1572864: 67174404,
+                2621440: 0,
+                3670016: 67109120,
+                4718592: 67108868,
+                5767168: 65536,
+                6815744: 65540,
+                7864320: 260,
+                8912896: 4,
+                9961472: 256,
+                11010048: 67174400,
+                12058624: 65796,
+                13107200: 65792,
+                14155776: 67109124,
+                15204352: 67174660,
+                16252928: 67108864,
+                16777216: 67174656,
+                17825792: 65540,
+                18874368: 65536,
+                19922944: 67109120,
+                20971520: 256,
+                22020096: 67174660,
+                23068672: 67108868,
+                24117248: 0,
+                25165824: 67109124,
+                26214400: 67108864,
+                27262976: 4,
+                28311552: 65792,
+                29360128: 67174400,
+                30408704: 260,
+                31457280: 65796,
+                32505856: 67174404,
+                17301504: 67108864,
+                18350080: 260,
+                19398656: 67174656,
+                20447232: 0,
+                21495808: 65540,
+                22544384: 67109120,
+                23592960: 256,
+                24641536: 67174404,
+                25690112: 65536,
+                26738688: 67174660,
+                27787264: 65796,
+                28835840: 67108868,
+                29884416: 67109124,
+                30932992: 67174400,
+                31981568: 4,
+                33030144: 65792
+            }, {
+                0: 2151682048,
+                65536: 2147487808,
+                131072: 4198464,
+                196608: 2151677952,
+                262144: 0,
+                327680: 4198400,
+                393216: 2147483712,
+                458752: 4194368,
+                524288: 2147483648,
+                589824: 4194304,
+                655360: 64,
+                720896: 2147487744,
+                786432: 2151678016,
+                851968: 4160,
+                917504: 4096,
+                983040: 2151682112,
+                32768: 2147487808,
+                98304: 64,
+                163840: 2151678016,
+                229376: 2147487744,
+                294912: 4198400,
+                360448: 2151682112,
+                425984: 0,
+                491520: 2151677952,
+                557056: 4096,
+                622592: 2151682048,
+                688128: 4194304,
+                753664: 4160,
+                819200: 2147483648,
+                884736: 4194368,
+                950272: 4198464,
+                1015808: 2147483712,
+                1048576: 4194368,
+                1114112: 4198400,
+                1179648: 2147483712,
+                1245184: 0,
+                1310720: 4160,
+                1376256: 2151678016,
+                1441792: 2151682048,
+                1507328: 2147487808,
+                1572864: 2151682112,
+                1638400: 2147483648,
+                1703936: 2151677952,
+                1769472: 4198464,
+                1835008: 2147487744,
+                1900544: 4194304,
+                1966080: 64,
+                2031616: 4096,
+                1081344: 2151677952,
+                1146880: 2151682112,
+                1212416: 0,
+                1277952: 4198400,
+                1343488: 4194368,
+                1409024: 2147483648,
+                1474560: 2147487808,
+                1540096: 64,
+                1605632: 2147483712,
+                1671168: 4096,
+                1736704: 2147487744,
+                1802240: 2151678016,
+                1867776: 4160,
+                1933312: 2151682048,
+                1998848: 4194304,
+                2064384: 4198464
+            }, {
+                0: 128,
+                4096: 17039360,
+                8192: 262144,
+                12288: 536870912,
+                16384: 537133184,
+                20480: 16777344,
+                24576: 553648256,
+                28672: 262272,
+                32768: 16777216,
+                36864: 537133056,
+                40960: 536871040,
+                45056: 553910400,
+                49152: 553910272,
+                53248: 0,
+                57344: 17039488,
+                61440: 553648128,
+                2048: 17039488,
+                6144: 553648256,
+                10240: 128,
+                14336: 17039360,
+                18432: 262144,
+                22528: 537133184,
+                26624: 553910272,
+                30720: 536870912,
+                34816: 537133056,
+                38912: 0,
+                43008: 553910400,
+                47104: 16777344,
+                51200: 536871040,
+                55296: 553648128,
+                59392: 16777216,
+                63488: 262272,
+                65536: 262144,
+                69632: 128,
+                73728: 536870912,
+                77824: 553648256,
+                81920: 16777344,
+                86016: 553910272,
+                90112: 537133184,
+                94208: 16777216,
+                98304: 553910400,
+                102400: 553648128,
+                106496: 17039360,
+                110592: 537133056,
+                114688: 262272,
+                118784: 536871040,
+                122880: 0,
+                126976: 17039488,
+                67584: 553648256,
+                71680: 16777216,
+                75776: 17039360,
+                79872: 537133184,
+                83968: 536870912,
+                88064: 17039488,
+                92160: 128,
+                96256: 553910272,
+                100352: 262272,
+                104448: 553910400,
+                108544: 0,
+                112640: 553648128,
+                116736: 16777344,
+                120832: 262144,
+                124928: 537133056,
+                129024: 536871040
+            }, {
+                0: 268435464,
+                256: 8192,
+                512: 270532608,
+                768: 270540808,
+                1024: 268443648,
+                1280: 2097152,
+                1536: 2097160,
+                1792: 268435456,
+                2048: 0,
+                2304: 268443656,
+                2560: 2105344,
+                2816: 8,
+                3072: 270532616,
+                3328: 2105352,
+                3584: 8200,
+                3840: 270540800,
+                128: 270532608,
+                384: 270540808,
+                640: 8,
+                896: 2097152,
+                1152: 2105352,
+                1408: 268435464,
+                1664: 268443648,
+                1920: 8200,
+                2176: 2097160,
+                2432: 8192,
+                2688: 268443656,
+                2944: 270532616,
+                3200: 0,
+                3456: 270540800,
+                3712: 2105344,
+                3968: 268435456,
+                4096: 268443648,
+                4352: 270532616,
+                4608: 270540808,
+                4864: 8200,
+                5120: 2097152,
+                5376: 268435456,
+                5632: 268435464,
+                5888: 2105344,
+                6144: 2105352,
+                6400: 0,
+                6656: 8,
+                6912: 270532608,
+                7168: 8192,
+                7424: 268443656,
+                7680: 270540800,
+                7936: 2097160,
+                4224: 8,
+                4480: 2105344,
+                4736: 2097152,
+                4992: 268435464,
+                5248: 268443648,
+                5504: 8200,
+                5760: 270540808,
+                6016: 270532608,
+                6272: 270540800,
+                6528: 270532616,
+                6784: 8192,
+                7040: 2105352,
+                7296: 2097160,
+                7552: 0,
+                7808: 268435456,
+                8064: 268443656
+            }, {
+                0: 1048576,
+                16: 33555457,
+                32: 1024,
+                48: 1049601,
+                64: 34604033,
+                80: 0,
+                96: 1,
+                112: 34603009,
+                128: 33555456,
+                144: 1048577,
+                160: 33554433,
+                176: 34604032,
+                192: 34603008,
+                208: 1025,
+                224: 1049600,
+                240: 33554432,
+                8: 34603009,
+                24: 0,
+                40: 33555457,
+                56: 34604032,
+                72: 1048576,
+                88: 33554433,
+                104: 33554432,
+                120: 1025,
+                136: 1049601,
+                152: 33555456,
+                168: 34603008,
+                184: 1048577,
+                200: 1024,
+                216: 34604033,
+                232: 1,
+                248: 1049600,
+                256: 33554432,
+                272: 1048576,
+                288: 33555457,
+                304: 34603009,
+                320: 1048577,
+                336: 33555456,
+                352: 34604032,
+                368: 1049601,
+                384: 1025,
+                400: 34604033,
+                416: 1049600,
+                432: 1,
+                448: 0,
+                464: 34603008,
+                480: 33554433,
+                496: 1024,
+                264: 1049600,
+                280: 33555457,
+                296: 34603009,
+                312: 1,
+                328: 33554432,
+                344: 1048576,
+                360: 1025,
+                376: 34604032,
+                392: 33554433,
+                408: 34603008,
+                424: 0,
+                440: 34604033,
+                456: 1049601,
+                472: 1024,
+                488: 33555456,
+                504: 1048577
+            }, {
+                0: 134219808,
+                1: 131072,
+                2: 134217728,
+                3: 32,
+                4: 131104,
+                5: 134350880,
+                6: 134350848,
+                7: 2048,
+                8: 134348800,
+                9: 134219776,
+                10: 133120,
+                11: 134348832,
+                12: 2080,
+                13: 0,
+                14: 134217760,
+                15: 133152,
+                2147483648: 2048,
+                2147483649: 134350880,
+                2147483650: 134219808,
+                2147483651: 134217728,
+                2147483652: 134348800,
+                2147483653: 133120,
+                2147483654: 133152,
+                2147483655: 32,
+                2147483656: 134217760,
+                2147483657: 2080,
+                2147483658: 131104,
+                2147483659: 134350848,
+                2147483660: 0,
+                2147483661: 134348832,
+                2147483662: 134219776,
+                2147483663: 131072,
+                16: 133152,
+                17: 134350848,
+                18: 32,
+                19: 2048,
+                20: 134219776,
+                21: 134217760,
+                22: 134348832,
+                23: 131072,
+                24: 0,
+                25: 131104,
+                26: 134348800,
+                27: 134219808,
+                28: 134350880,
+                29: 133120,
+                30: 2080,
+                31: 134217728,
+                2147483664: 131072,
+                2147483665: 2048,
+                2147483666: 134348832,
+                2147483667: 133152,
+                2147483668: 32,
+                2147483669: 134348800,
+                2147483670: 134217728,
+                2147483671: 134219808,
+                2147483672: 134350880,
+                2147483673: 134217760,
+                2147483674: 134219776,
+                2147483675: 0,
+                2147483676: 133120,
+                2147483677: 2080,
+                2147483678: 131104,
+                2147483679: 134350848
+            }],
+            p = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
+            n = f.DES = d.extend({
+                _doReset: function () {
+                    for (var a = this._key.words, c = [], b = 0; 56 > b; b++) {
+                        var d = g[b] - 1;
+                        c[b] = a[d >>> 5] >>> 31 - d % 32 & 1
+                    }
+                    a = this._subKeys = [];
+                    for (d = 0; 16 > d; d++) {
+                        for (var e = a[d] = [], f = k[d], b = 0; 24 > b; b++)
+                            e[b / 6 | 0] |= c[(h[b] - 1 + f) % 28] << 31 - b % 6,
+                            e[4 + (b / 6 | 0)] |= c[28 + (h[b + 24] - 1 + f) % 28] << 31 - b % 6;
+                        e[0] = e[0] << 1 | e[0] >>> 31;
+                        for (b = 1; 7 > b; b++)
+                            e[b] >>>= 4 * (b - 1) + 3;
+                        e[7] = e[7] << 5 | e[7] >>> 27
+                    }
+                    c = this._invSubKeys = [];
+                    for (b = 0; 16 > b; b++)
+                        c[b] = a[15 - b]
+                },
+                encryptBlock: function (a, c) {
+                    this._doCryptBlock(a, c, this._subKeys)
+                },
+                decryptBlock: function (a, c) {
+                    this._doCryptBlock(a, c, this._invSubKeys)
+                },
+                _doCryptBlock: function (c, d, e) {
+                    this._lBlock = c[d];
+                    this._rBlock = c[d + 1];
+                    a.call(this, 4, 252645135);
+                    a.call(this, 16, 65535);
+                    b.call(this, 2, 858993459);
+                    b.call(this, 8, 16711935);
+                    a.call(this, 1, 1431655765);
+                    for (var f = 0; 16 > f; f++) {
+                        for (var g = e[f], h = this._lBlock, k = this._rBlock, n = 0, u = 0; 8 > u; u++)
+                            n |= l[u][((k ^ g[u]) & p[u]) >>> 0];
+                        this._lBlock = k;
+                        this._rBlock = h ^ n
+                    }
+                    e = this._lBlock;
+                    this._lBlock = this._rBlock;
+                    this._rBlock = e;
+                    a.call(this, 1, 1431655765);
+                    b.call(this, 8, 16711935);
+                    b.call(this, 2, 858993459);
+                    a.call(this, 16, 65535);
+                    a.call(this, 4, 252645135);
+                    c[d] = this._lBlock;
+                    c[d + 1] = this._rBlock
+                },
+                keySize: 2,
+                ivSize: 2,
+                blockSize: 2
+            });
+        c.DES = d._createHelper(n);
+        f = f.TripleDES = d.extend({
+            _doReset: function () {
+                var a = this._key.words;
+                this._des1 = n.createEncryptor(e.create(a.slice(0, 2)));
+                this._des2 = n.createEncryptor(e.create(a.slice(2, 4)));
+                this._des3 = n.createEncryptor(e.create(a.slice(4, 6)))
+            },
+            encryptBlock: function (a, c) {
+                this._des1.encryptBlock(a, c);
+                this._des2.decryptBlock(a, c);
+                this._des3.encryptBlock(a, c)
+            },
+            decryptBlock: function (a, c) {
+                this._des3.decryptBlock(a, c);
+                this._des2.encryptBlock(a, c);
+                this._des1.decryptBlock(a, c)
+            },
+            keySize: 6,
+            ivSize: 2,
+            blockSize: 2
+        });
+        c.TripleDES = d._createHelper(f)
+    })();
+    (function () {
+        var a = CryptoJS,
+            b = a.lib.WordArray;
+        a.enc.Base64 = {
+            stringify: function (a) {
+                var b = a.words,
+                    e = a.sigBytes,
+                    f = this._map;
+                a.clamp();
+                a = [];
+                for (var g = 0; g < e; g += 3)
+                    for (var h = (b[g >>> 2] >>> 24 - g % 4 * 8 & 255) << 16 | (b[g + 1 >>> 2] >>> 24 - (g + 1) % 4 * 8 & 255) << 8 | b[g + 2 >>> 2] >>> 24 - (g + 2) % 4 * 8 & 255, k = 0; 4 > k && g + .75 * k < e; k++)
+                        a.push(f.charAt(h >>> 6 * (3 - k) & 63));
+                if (b = f.charAt(64))
+                    for (; a.length % 4;)
+                        a.push(b);
+                return a.join("")
+            },
+            parse: function (a) {
+                var d = a.length,
+                    e = this._map,
+                    f = e.charAt(64);
+                f && (f = a.indexOf(f),
+                    -1 != f && (d = f));
+                for (var f = [], g = 0, h = 0; h < d; h++)
+                    if (h % 4) {
+                        var k = e.indexOf(a.charAt(h - 1)) << h % 4 * 2,
+                            l = e.indexOf(a.charAt(h)) >>> 6 - h % 4 * 2;
+                        f[g >>> 2] |= (k | l) << 24 - g % 4 * 8;
+                        g++
+                    }
+                return b.create(f, g)
+            },
+            _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
+        }
+    })();
+    var dbits, canary = 0xdeadbeefcafe,
+        j_lm = 15715070 == (canary & 16777215);
+
+    function BigInteger(a, b, c) {
+        null != a && ("number" == typeof a ? this.fromNumber(a, b, c) : null == b && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))
+    }
+
+    function nbi() {
+        return new BigInteger(null)
+    }
+
+    function am1(a, b, c, d, e, f) {
+        for (; 0 <= --f;) {
+            var g = b * this[a++] + c[d] + e;
+            e = Math.floor(g / 67108864);
+            c[d++] = g & 67108863
+        }
+        return e
+    }
+
+    function am2(a, b, c, d, e, f) {
+        var g = b & 32767;
+        for (b >>= 15; 0 <= --f;) {
+            var h = this[a] & 32767,
+                k = this[a++] >> 15,
+                l = b * h + k * g,
+                h = g * h + ((l & 32767) << 15) + c[d] + (e & 1073741823);
+            e = (h >>> 30) + (l >>> 15) + b * k + (e >>> 30);
+            c[d++] = h & 1073741823
+        }
+        return e
+    }
+
+    function am3(a, b, c, d, e, f) {
+        var g = b & 16383;
+        for (b >>= 14; 0 <= --f;) {
+            var h = this[a] & 16383,
+                k = this[a++] >> 14,
+                l = b * h + k * g,
+                h = g * h + ((l & 16383) << 14) + c[d] + e;
+            e = (h >> 28) + (l >> 14) + b * k;
+            c[d++] = h & 268435455
+        }
+        return e
+    }
+    j_lm && "Microsoft Internet Explorer" == navigator.appName ? (BigInteger.prototype.am = am2,
+        dbits = 30) : j_lm && "Netscape" != navigator.appName ? (BigInteger.prototype.am = am1,
+        dbits = 26) : (BigInteger.prototype.am = am3,
+        dbits = 28);
+    BigInteger.prototype.DB = dbits;
+    BigInteger.prototype.DM = (1 << dbits) - 1;
+    BigInteger.prototype.DV = 1 << dbits;
+    var BI_FP = 52;
+    BigInteger.prototype.FV = Math.pow(2, BI_FP);
+    BigInteger.prototype.F1 = BI_FP - dbits;
+    BigInteger.prototype.F2 = 2 * dbits - BI_FP;
+    var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz",
+        BI_RC = [],
+        rr, vv;
+    rr = 48;
+    for (vv = 0; 9 >= vv; ++vv)
+        BI_RC[rr++] = vv;
+    rr = 97;
+    for (vv = 10; 36 > vv; ++vv)
+        BI_RC[rr++] = vv;
+    rr = 65;
+    for (vv = 10; 36 > vv; ++vv)
+        BI_RC[rr++] = vv;
+
+    function int2char(a) {
+        return BI_RM.charAt(a)
+    }
+
+    function intAt(a, b) {
+        var c = BI_RC[a.charCodeAt(b)];
+        return null == c ? -1 : c
+    }
+
+    function bnpCopyTo(a) {
+        for (var b = this.t - 1; 0 <= b; --b)
+            a[b] = this[b];
+        a.t = this.t;
+        a.s = this.s
+    }
+
+    function bnpFromInt(a) {
+        this.t = 1;
+        this.s = 0 > a ? -1 : 0;
+        0 < a ? this[0] = a : -1 > a ? this[0] = a + this.DV : this.t = 0
+    }
+
+    function nbv(a) {
+        var b = nbi();
+        b.fromInt(a);
+        return b
+    }
+
+    function bnpFromString(a, b) {
+        var c;
+        if (16 == b)
+            c = 4;
+        else if (8 == b)
+            c = 3;
+        else if (256 == b)
+            c = 8;
+        else if (2 == b)
+            c = 1;
+        else if (32 == b)
+            c = 5;
+        else if (4 == b)
+            c = 2;
+        else {
+            this.fromRadix(a, b);
+            return
+        }
+        this.s = this.t = 0;
+        for (var d = a.length, e = !1, f = 0; 0 <= --d;) {
+            var g = 8 == c ? a[d] & 255 : intAt(a, d);
+            0 > g ? "-" == a.charAt(d) && (e = !0) : (e = !1,
+                0 == f ? this[this.t++] = g : f + c > this.DB ? (this[this.t - 1] |= (g & (1 << this.DB - f) - 1) << f,
+                    this[this.t++] = g >> this.DB - f) : this[this.t - 1] |= g << f,
+                f += c,
+                f >= this.DB && (f -= this.DB))
+        }
+        8 == c && 0 != (a[0] & 128) && (this.s = -1,
+            0 < f && (this[this.t - 1] |= (1 << this.DB - f) - 1 << f));
+        this.clamp();
+        e && BigInteger.ZERO.subTo(this, this)
+    }
+
+    function bnpClamp() {
+        for (var a = this.s & this.DM; 0 < this.t && this[this.t - 1] == a;)
+            --this.t
+    }
+
+    function bnToString(a) {
+        if (0 > this.s)
+            return "-" + this.negate().toString(a);
+        if (16 == a)
+            a = 4;
+        else if (8 == a)
+            a = 3;
+        else if (2 == a)
+            a = 1;
+        else if (32 == a)
+            a = 5;
+        else if (4 == a)
+            a = 2;
+        else
+            return this.toRadix(a);
+        var b = (1 << a) - 1,
+            c, d = !1,
+            e = "",
+            f = this.t,
+            g = this.DB - f * this.DB % a;
+        if (0 < f--)
+            for (g < this.DB && 0 < (c = this[f] >> g) && (d = !0,
+                    e = int2char(c)); 0 <= f;)
+                g < a ? (c = (this[f] & (1 << g) - 1) << a - g,
+                    c |= this[--f] >> (g += this.DB - a)) : (c = this[f] >> (g -= a) & b,
+                    0 >= g && (g += this.DB,
+                        --f)),
+                0 < c && (d = !0),
+                d && (e += int2char(c));
+        return d ? e : "0"
+    }
+
+    function bnNegate() {
+        var a = nbi();
+        BigInteger.ZERO.subTo(this, a);
+        return a
+    }
+
+    function bnAbs() {
+        return 0 > this.s ? this.negate() : this
+    }
+
+    function bnCompareTo(a) {
+        var b = this.s - a.s;
+        if (0 != b)
+            return b;
+        var c = this.t,
+            b = c - a.t;
+        if (0 != b)
+            return 0 > this.s ? -b : b;
+        for (; 0 <= --c;)
+            if (0 != (b = this[c] - a[c]))
+                return b;
+        return 0
+    }
+
+    function nbits(a) {
+        var b = 1,
+            c;
+        0 != (c = a >>> 16) && (a = c,
+            b += 16);
+        0 != (c = a >> 8) && (a = c,
+            b += 8);
+        0 != (c = a >> 4) && (a = c,
+            b += 4);
+        0 != (c = a >> 2) && (a = c,
+            b += 2);
+        0 != a >> 1 && (b += 1);
+        return b
+    }
+
+    function bnBitLength() {
+        return 0 >= this.t ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM)
+    }
+
+    function bnpDLShiftTo(a, b) {
+        var c;
+        for (c = this.t - 1; 0 <= c; --c)
+            b[c + a] = this[c];
+        for (c = a - 1; 0 <= c; --c)
+            b[c] = 0;
+        b.t = this.t + a;
+        b.s = this.s
+    }
+
+    function bnpDRShiftTo(a, b) {
+        for (var c = a; c < this.t; ++c)
+            b[c - a] = this[c];
+        b.t = Math.max(this.t - a, 0);
+        b.s = this.s
+    }
+
+    function bnpLShiftTo(a, b) {
+        var c = a % this.DB,
+            d = this.DB - c,
+            e = (1 << d) - 1,
+            f = Math.floor(a / this.DB),
+            g = this.s << c & this.DM,
+            h;
+        for (h = this.t - 1; 0 <= h; --h)
+            b[h + f + 1] = this[h] >> d | g,
+            g = (this[h] & e) << c;
+        for (h = f - 1; 0 <= h; --h)
+            b[h] = 0;
+        b[f] = g;
+        b.t = this.t + f + 1;
+        b.s = this.s;
+        b.clamp()
+    }
+
+    function bnpRShiftTo(a, b) {
+        b.s = this.s;
+        var c = Math.floor(a / this.DB);
+        if (c >= this.t)
+            b.t = 0;
+        else {
+            var d = a % this.DB,
+                e = this.DB - d,
+                f = (1 << d) - 1;
+            b[0] = this[c] >> d;
+            for (var g = c + 1; g < this.t; ++g)
+                b[g - c - 1] |= (this[g] & f) << e,
+                b[g - c] = this[g] >> d;
+            0 < d && (b[this.t - c - 1] |= (this.s & f) << e);
+            b.t = this.t - c;
+            b.clamp()
+        }
+    }
+
+    function bnpSubTo(a, b) {
+        for (var c = 0, d = 0, e = Math.min(a.t, this.t); c < e;)
+            d += this[c] - a[c],
+            b[c++] = d & this.DM,
+            d >>= this.DB;
+        if (a.t < this.t) {
+            for (d -= a.s; c < this.t;)
+                d += this[c],
+                b[c++] = d & this.DM,
+                d >>= this.DB;
+            d += this.s
+        } else {
+            for (d += this.s; c < a.t;)
+                d -= a[c],
+                b[c++] = d & this.DM,
+                d >>= this.DB;
+            d -= a.s
+        }
+        b.s = 0 > d ? -1 : 0; -
+        1 > d ? b[c++] = this.DV + d : 0 < d && (b[c++] = d);
+        b.t = c;
+        b.clamp()
+    }
+
+    function bnpMultiplyTo(a, b) {
+        var c = this.abs(),
+            d = a.abs(),
+            e = c.t;
+        for (b.t = e + d.t; 0 <= --e;)
+            b[e] = 0;
+        for (e = 0; e < d.t; ++e)
+            b[e + c.t] = c.am(0, d[e], b, e, 0, c.t);
+        b.s = 0;
+        b.clamp();
+        this.s != a.s && BigInteger.ZERO.subTo(b, b)
+    }
+
+    function bnpSquareTo(a) {
+        for (var b = this.abs(), c = a.t = 2 * b.t; 0 <= --c;)
+            a[c] = 0;
+        for (c = 0; c < b.t - 1; ++c) {
+            var d = b.am(c, b[c], a, 2 * c, 0, 1);
+            (a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) >= b.DV && (a[c + b.t] -= b.DV,
+                a[c + b.t + 1] = 1)
+        }
+        0 < a.t && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1));
+        a.s = 0;
+        a.clamp()
+    }
+
+    function bnpDivRemTo(a, b, c) {
+        var d = a.abs();
+        if (!(0 >= d.t)) {
+            var e = this.abs();
+            if (e.t < d.t)
+                null != b && b.fromInt(0),
+                null != c && this.copyTo(c);
+            else {
+                null == c && (c = nbi());
+                var f = nbi(),
+                    g = this.s;
+                a = a.s;
+                var h = this.DB - nbits(d[d.t - 1]);
+                0 < h ? (d.lShiftTo(h, f),
+                    e.lShiftTo(h, c)) : (d.copyTo(f),
+                    e.copyTo(c));
+                d = f.t;
+                e = f[d - 1];
+                if (0 != e) {
+                    var k = e * (1 << this.F1) + (1 < d ? f[d - 2] >> this.F2 : 0),
+                        l = this.FV / k,
+                        k = (1 << this.F1) / k,
+                        p = 1 << this.F2,
+                        n = c.t,
+                        q = n - d,
+                        m = null == b ? nbi() : b;
+                    f.dlShiftTo(q, m);
+                    0 <= c.compareTo(m) && (c[c.t++] = 1,
+                        c.subTo(m, c));
+                    BigInteger.ONE.dlShiftTo(d, m);
+                    for (m.subTo(f, f); f.t < d;)
+                        f[f.t++] = 0;
+                    for (; 0 <= --q;) {
+                        var r = c[--n] == e ? this.DM : Math.floor(c[n] * l + (c[n - 1] + p) * k);
+                        if ((c[n] += f.am(0, r, c, q, 0, d)) < r)
+                            for (f.dlShiftTo(q, m),
+                                c.subTo(m, c); c[n] < --r;)
+                                c.subTo(m, c)
+                    }
+                    null != b && (c.drShiftTo(d, b),
+                        g != a && BigInteger.ZERO.subTo(b, b));
+                    c.t = d;
+                    c.clamp();
+                    0 < h && c.rShiftTo(h, c);
+                    0 > g && BigInteger.ZERO.subTo(c, c)
+                }
+            }
+        }
+    }
+
+    function bnMod(a) {
+        var b = nbi();
+        this.abs().divRemTo(a, null, b);
+        0 > this.s && 0 < b.compareTo(BigInteger.ZERO) && a.subTo(b, b);
+        return b
+    }
+
+    function Classic(a) {
+        this.m = a
+    }
+
+    function cConvert(a) {
+        return 0 > a.s || 0 <= a.compareTo(this.m) ? a.mod(this.m) : a
+    }
+
+    function cRevert(a) {
+        return a
+    }
+
+    function cReduce(a) {
+        a.divRemTo(this.m, null, a)
+    }
+
+    function cMulTo(a, b, c) {
+        a.multiplyTo(b, c);
+        this.reduce(c)
+    }
+
+    function cSqrTo(a, b) {
+        a.squareTo(b);
+        this.reduce(b)
+    }
+    Classic.prototype.convert = cConvert;
+    Classic.prototype.revert = cRevert;
+    Classic.prototype.reduce = cReduce;
+    Classic.prototype.mulTo = cMulTo;
+    Classic.prototype.sqrTo = cSqrTo;
+
+    function bnpInvDigit() {
+        if (1 > this.t)
+            return 0;
+        var a = this[0];
+        if (0 == (a & 1))
+            return 0;
+        var b = a & 3,
+            b = b * (2 - (a & 15) * b) & 15,
+            b = b * (2 - (a & 255) * b) & 255,
+            b = b * (2 - ((a & 65535) * b & 65535)) & 65535,
+            b = b * (2 - a * b % this.DV) % this.DV;
+        return 0 < b ? this.DV - b : -b
+    }
+
+    function Montgomery(a) {
+        this.m = a;
+        this.mp = a.invDigit();
+        this.mpl = this.mp & 32767;
+        this.mph = this.mp >> 15;
+        this.um = (1 << a.DB - 15) - 1;
+        this.mt2 = 2 * a.t
+    }
+
+    function montConvert(a) {
+        var b = nbi();
+        a.abs().dlShiftTo(this.m.t, b);
+        b.divRemTo(this.m, null, b);
+        0 > a.s && 0 < b.compareTo(BigInteger.ZERO) && this.m.subTo(b, b);
+        return b
+    }
+
+    function montRevert(a) {
+        var b = nbi();
+        a.copyTo(b);
+        this.reduce(b);
+        return b
+    }
+
+    function montReduce(a) {
+        for (; a.t <= this.mt2;)
+            a[a.t++] = 0;
+        for (var b = 0; b < this.m.t; ++b) {
+            var c = a[b] & 32767,
+                d = c * this.mpl + ((c * this.mph + (a[b] >> 15) * this.mpl & this.um) << 15) & a.DM,
+                c = b + this.m.t;
+            for (a[c] += this.m.am(0, d, a, b, 0, this.m.t); a[c] >= a.DV;)
+                a[c] -= a.DV,
+                a[++c]++
+        }
+        a.clamp();
+        a.drShiftTo(this.m.t, a);
+        0 <= a.compareTo(this.m) && a.subTo(this.m, a)
+    }
+
+    function montSqrTo(a, b) {
+        a.squareTo(b);
+        this.reduce(b)
+    }
+
+    function montMulTo(a, b, c) {
+        a.multiplyTo(b, c);
+        this.reduce(c)
+    }
+    Montgomery.prototype.convert = montConvert;
+    Montgomery.prototype.revert = montRevert;
+    Montgomery.prototype.reduce = montReduce;
+    Montgomery.prototype.mulTo = montMulTo;
+    Montgomery.prototype.sqrTo = montSqrTo;
+
+    function bnpIsEven() {
+        return 0 == (0 < this.t ? this[0] & 1 : this.s)
+    }
+
+    function bnpExp(a, b) {
+        if (4294967295 < a || 1 > a)
+            return BigInteger.ONE;
+        var c = nbi(),
+            d = nbi(),
+            e = b.convert(this),
+            f = nbits(a) - 1;
+        for (e.copyTo(c); 0 <= --f;)
+            if (b.sqrTo(c, d),
+                0 < (a & 1 << f))
+                b.mulTo(d, e, c);
+            else
+                var g = c,
+                    c = d,
+                    d = g;
+        return b.revert(c)
+    }
+
+    function bnModPowInt(a, b) {
+        var c;
+        c = 256 > a || b.isEven() ? new Classic(b) : new Montgomery(b);
+        return this.exp(a, c)
+    }
+    BigInteger.prototype.copyTo = bnpCopyTo;
+    BigInteger.prototype.fromInt = bnpFromInt;
+    BigInteger.prototype.fromString = bnpFromString;
+    BigInteger.prototype.clamp = bnpClamp;
+    BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+    BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+    BigInteger.prototype.lShiftTo = bnpLShiftTo;
+    BigInteger.prototype.rShiftTo = bnpRShiftTo;
+    BigInteger.prototype.subTo = bnpSubTo;
+    BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+    BigInteger.prototype.squareTo = bnpSquareTo;
+    BigInteger.prototype.divRemTo = bnpDivRemTo;
+    BigInteger.prototype.invDigit = bnpInvDigit;
+    BigInteger.prototype.isEven = bnpIsEven;
+    BigInteger.prototype.exp = bnpExp;
+    BigInteger.prototype.toString = bnToString;
+    BigInteger.prototype.negate = bnNegate;
+    BigInteger.prototype.abs = bnAbs;
+    BigInteger.prototype.compareTo = bnCompareTo;
+    BigInteger.prototype.bitLength = bnBitLength;
+    BigInteger.prototype.mod = bnMod;
+    BigInteger.prototype.modPowInt = bnModPowInt;
+    BigInteger.ZERO = nbv(0);
+    BigInteger.ONE = nbv(1);
+
+    function bnClone() {
+        var a = nbi();
+        this.copyTo(a);
+        return a
+    }
+
+    function bnIntValue() {
+        if (0 > this.s) {
+            if (1 == this.t)
+                return this[0] - this.DV;
+            if (0 == this.t)
+                return -1
+        } else {
+            if (1 == this.t)
+                return this[0];
+            if (0 == this.t)
+                return 0
+        }
+        return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]
+    }
+
+    function bnByteValue() {
+        return 0 == this.t ? this.s : this[0] << 24 >> 24
+    }
+
+    function bnShortValue() {
+        return 0 == this.t ? this.s : this[0] << 16 >> 16
+    }
+
+    function bnpChunkSize(a) {
+        return Math.floor(Math.LN2 * this.DB / Math.log(a))
+    }
+
+    function bnSigNum() {
+        return 0 > this.s ? -1 : 0 >= this.t || 1 == this.t && 0 >= this[0] ? 0 : 1
+    }
+
+    function bnpToRadix(a) {
+        null == a && (a = 10);
+        if (0 == this.signum() || 2 > a || 36 < a)
+            return "0";
+        var b = this.chunkSize(a),
+            b = Math.pow(a, b),
+            c = nbv(b),
+            d = nbi(),
+            e = nbi(),
+            f = "";
+        for (this.divRemTo(c, d, e); 0 < d.signum();)
+            f = (b + e.intValue()).toString(a).substr(1) + f,
+            d.divRemTo(c, d, e);
+        return e.intValue().toString(a) + f
+    }
+
+    function bnpFromRadix(a, b) {
+        this.fromInt(0);
+        null == b && (b = 10);
+        for (var c = this.chunkSize(b), d = Math.pow(b, c), e = !1, f = 0, g = 0, h = 0; h < a.length; ++h) {
+            var k = intAt(a, h);
+            0 > k ? "-" == a.charAt(h) && 0 == this.signum() && (e = !0) : (g = b * g + k,
+                ++f >= c && (this.dMultiply(d),
+                    this.dAddOffset(g, 0),
+                    g = f = 0))
+        }
+        0 < f && (this.dMultiply(Math.pow(b, f)),
+            this.dAddOffset(g, 0));
+        e && BigInteger.ZERO.subTo(this, this)
+    }
+
+    function bnpFromNumber(a, b, c) {
+        if ("number" == typeof b)
+            if (2 > a)
+                this.fromInt(1);
+            else
+                for (this.fromNumber(a, c),
+                    this.testBit(a - 1) || this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this),
+                    this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(b);)
+                    this.dAddOffset(2, 0),
+                    this.bitLength() > a && this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
+        else {
+            c = [];
+            var d = a & 7;
+            c.length = (a >> 3) + 1;
+            b.nextBytes(c);
+            c[0] = 0 < d ? c[0] & (1 << d) - 1 : 0;
+            this.fromString(c, 256)
+        }
+    }
+
+    function bnToByteArray() {
+        var a = this.t,
+            b = [];
+        b[0] = this.s;
+        var c = this.DB - a * this.DB % 8,
+            d, e = 0;
+        if (0 < a--)
+            for (c < this.DB && (d = this[a] >> c) != (this.s & this.DM) >> c && (b[e++] = d | this.s << this.DB - c); 0 <= a;)
+                if (8 > c ? (d = (this[a] & (1 << c) - 1) << 8 - c,
+                        d |= this[--a] >> (c += this.DB - 8)) : (d = this[a] >> (c -= 8) & 255,
+                        0 >= c && (c += this.DB,
+                            --a)),
+                    0 != (d & 128) && (d |= -256),
+                    0 == e && (this.s & 128) != (d & 128) && ++e,
+                    0 < e || d != this.s)
+                    b[e++] = d;
+        return b
+    }
+
+    function bnEquals(a) {
+        return 0 == this.compareTo(a)
+    }
+
+    function bnMin(a) {
+        return 0 > this.compareTo(a) ? this : a
+    }
+
+    function bnMax(a) {
+        return 0 < this.compareTo(a) ? this : a
+    }
+
+    function bnpBitwiseTo(a, b, c) {
+        var d, e, f = Math.min(a.t, this.t);
+        for (d = 0; d < f; ++d)
+            c[d] = b(this[d], a[d]);
+        if (a.t < this.t) {
+            e = a.s & this.DM;
+            for (d = f; d < this.t; ++d)
+                c[d] = b(this[d], e);
+            c.t = this.t
+        } else {
+            e = this.s & this.DM;
+            for (d = f; d < a.t; ++d)
+                c[d] = b(e, a[d]);
+            c.t = a.t
+        }
+        c.s = b(this.s, a.s);
+        c.clamp()
+    }
+
+    function op_and(a, b) {
+        return a & b
+    }
+
+    function bnAnd(a) {
+        var b = nbi();
+        this.bitwiseTo(a, op_and, b);
+        return b
+    }
+
+    function op_or(a, b) {
+        return a | b
+    }
+
+    function bnOr(a) {
+        var b = nbi();
+        this.bitwiseTo(a, op_or, b);
+        return b
+    }
+
+    function op_xor(a, b) {
+        return a ^ b
+    }
+
+    function bnXor(a) {
+        var b = nbi();
+        this.bitwiseTo(a, op_xor, b);
+        return b
+    }
+
+    function op_andnot(a, b) {
+        return a & ~b
+    }
+
+    function bnAndNot(a) {
+        var b = nbi();
+        this.bitwiseTo(a, op_andnot, b);
+        return b
+    }
+
+    function bnNot() {
+        for (var a = nbi(), b = 0; b < this.t; ++b)
+            a[b] = this.DM & ~this[b];
+        a.t = this.t;
+        a.s = ~this.s;
+        return a
+    }
+
+    function bnShiftLeft(a) {
+        var b = nbi();
+        0 > a ? this.rShiftTo(-a, b) : this.lShiftTo(a, b);
+        return b
+    }
+
+    function bnShiftRight(a) {
+        var b = nbi();
+        0 > a ? this.lShiftTo(-a, b) : this.rShiftTo(a, b);
+        return b
+    }
+
+    function lbit(a) {
+        if (0 == a)
+            return -1;
+        var b = 0;
+        0 == (a & 65535) && (a >>= 16,
+            b += 16);
+        0 == (a & 255) && (a >>= 8,
+            b += 8);
+        0 == (a & 15) && (a >>= 4,
+            b += 4);
+        0 == (a & 3) && (a >>= 2,
+            b += 2);
+        0 == (a & 1) && ++b;
+        return b
+    }
+
+    function bnGetLowestSetBit() {
+        for (var a = 0; a < this.t; ++a)
+            if (0 != this[a])
+                return a * this.DB + lbit(this[a]);
+        return 0 > this.s ? this.t * this.DB : -1
+    }
+
+    function cbit(a) {
+        for (var b = 0; 0 != a;)
+            a &= a - 1,
+            ++b;
+        return b
+    }
+
+    function bnBitCount() {
+        for (var a = 0, b = this.s & this.DM, c = 0; c < this.t; ++c)
+            a += cbit(this[c] ^ b);
+        return a
+    }
+
+    function bnTestBit(a) {
+        var b = Math.floor(a / this.DB);
+        return b >= this.t ? 0 != this.s : 0 != (this[b] & 1 << a % this.DB)
+    }
+
+    function bnpChangeBit(a, b) {
+        var c = BigInteger.ONE.shiftLeft(a);
+        this.bitwiseTo(c, b, c);
+        return c
+    }
+
+    function bnSetBit(a) {
+        return this.changeBit(a, op_or)
+    }
+
+    function bnClearBit(a) {
+        return this.changeBit(a, op_andnot)
+    }
+
+    function bnFlipBit(a) {
+        return this.changeBit(a, op_xor)
+    }
+
+    function bnpAddTo(a, b) {
+        for (var c = 0, d = 0, e = Math.min(a.t, this.t); c < e;)
+            d += this[c] + a[c],
+            b[c++] = d & this.DM,
+            d >>= this.DB;
+        if (a.t < this.t) {
+            for (d += a.s; c < this.t;)
+                d += this[c],
+                b[c++] = d & this.DM,
+                d >>= this.DB;
+            d += this.s
+        } else {
+            for (d += this.s; c < a.t;)
+                d += a[c],
+                b[c++] = d & this.DM,
+                d >>= this.DB;
+            d += a.s
+        }
+        b.s = 0 > d ? -1 : 0;
+        0 < d ? b[c++] = d : -1 > d && (b[c++] = this.DV + d);
+        b.t = c;
+        b.clamp()
+    }
+
+    function bnAdd(a) {
+        var b = nbi();
+        this.addTo(a, b);
+        return b
+    }
+
+    function bnSubtract(a) {
+        var b = nbi();
+        this.subTo(a, b);
+        return b
+    }
+
+    function bnMultiply(a) {
+        var b = nbi();
+        this.multiplyTo(a, b);
+        return b
+    }
+
+    function bnSquare() {
+        var a = nbi();
+        this.squareTo(a);
+        return a
+    }
+
+    function bnDivide(a) {
+        var b = nbi();
+        this.divRemTo(a, b, null);
+        return b
+    }
+
+    function bnRemainder(a) {
+        var b = nbi();
+        this.divRemTo(a, null, b);
+        return b
+    }
+
+    function bnDivideAndRemainder(a) {
+        var b = nbi(),
+            c = nbi();
+        this.divRemTo(a, b, c);
+        return [b, c]
+    }
+
+    function bnpDMultiply(a) {
+        this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);
+        ++this.t;
+        this.clamp()
+    }
+
+    function bnpDAddOffset(a, b) {
+        if (0 != a) {
+            for (; this.t <= b;)
+                this[this.t++] = 0;
+            for (this[b] += a; this[b] >= this.DV;)
+                this[b] -= this.DV,
+                ++b >= this.t && (this[this.t++] = 0),
+                ++this[b]
+        }
+    }
+
+    function NullExp() {}
+
+    function nNop(a) {
+        return a
+    }
+
+    function nMulTo(a, b, c) {
+        a.multiplyTo(b, c)
+    }
+
+    function nSqrTo(a, b) {
+        a.squareTo(b)
+    }
+    NullExp.prototype.convert = nNop;
+    NullExp.prototype.revert = nNop;
+    NullExp.prototype.mulTo = nMulTo;
+    NullExp.prototype.sqrTo = nSqrTo;
+
+    function bnPow(a) {
+        return this.exp(a, new NullExp)
+    }
+
+    function bnpMultiplyLowerTo(a, b, c) {
+        var d = Math.min(this.t + a.t, b);
+        c.s = 0;
+        for (c.t = d; 0 < d;)
+            c[--d] = 0;
+        var e;
+        for (e = c.t - this.t; d < e; ++d)
+            c[d + this.t] = this.am(0, a[d], c, d, 0, this.t);
+        for (e = Math.min(a.t, b); d < e; ++d)
+            this.am(0, a[d], c, d, 0, b - d);
+        c.clamp()
+    }
+
+    function bnpMultiplyUpperTo(a, b, c) {
+        --b;
+        var d = c.t = this.t + a.t - b;
+        for (c.s = 0; 0 <= --d;)
+            c[d] = 0;
+        for (d = Math.max(b - this.t, 0); d < a.t; ++d)
+            c[this.t + d - b] = this.am(b - d, a[d], c, 0, 0, this.t + d - b);
+        c.clamp();
+        c.drShiftTo(1, c)
+    }
+
+    function Barrett(a) {
+        this.r2 = nbi();
+        this.q3 = nbi();
+        BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);
+        this.mu = this.r2.divide(a);
+        this.m = a
+    }
+
+    function barrettConvert(a) {
+        if (0 > a.s || a.t > 2 * this.m.t)
+            return a.mod(this.m);
+        if (0 > a.compareTo(this.m))
+            return a;
+        var b = nbi();
+        a.copyTo(b);
+        this.reduce(b);
+        return b
+    }
+
+    function barrettRevert(a) {
+        return a
+    }
+
+    function barrettReduce(a) {
+        a.drShiftTo(this.m.t - 1, this.r2);
+        a.t > this.m.t + 1 && (a.t = this.m.t + 1,
+            a.clamp());
+        this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
+        for (this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); 0 > a.compareTo(this.r2);)
+            a.dAddOffset(1, this.m.t + 1);
+        for (a.subTo(this.r2, a); 0 <= a.compareTo(this.m);)
+            a.subTo(this.m, a)
+    }
+
+    function barrettSqrTo(a, b) {
+        a.squareTo(b);
+        this.reduce(b)
+    }
+
+    function barrettMulTo(a, b, c) {
+        a.multiplyTo(b, c);
+        this.reduce(c)
+    }
+    Barrett.prototype.convert = barrettConvert;
+    Barrett.prototype.revert = barrettRevert;
+    Barrett.prototype.reduce = barrettReduce;
+    Barrett.prototype.mulTo = barrettMulTo;
+    Barrett.prototype.sqrTo = barrettSqrTo;
+
+    function bnModPow(a, b) {
+        var c = a.bitLength(),
+            d, e = nbv(1),
+            f;
+        if (0 >= c)
+            return e;
+        d = 18 > c ? 1 : 48 > c ? 3 : 144 > c ? 4 : 768 > c ? 5 : 6;
+        f = 8 > c ? new Classic(b) : b.isEven() ? new Barrett(b) : new Montgomery(b);
+        var g = [],
+            h = 3,
+            k = d - 1,
+            l = (1 << d) - 1;
+        g[1] = f.convert(this);
+        if (1 < d)
+            for (c = nbi(),
+                f.sqrTo(g[1], c); h <= l;)
+                g[h] = nbi(),
+                f.mulTo(c, g[h - 2], g[h]),
+                h += 2;
+        for (var p = a.t - 1, n, q = !0, m = nbi(), c = nbits(a[p]) - 1; 0 <= p;) {
+            c >= k ? n = a[p] >> c - k & l : (n = (a[p] & (1 << c + 1) - 1) << k - c,
+                0 < p && (n |= a[p - 1] >> this.DB + c - k));
+            for (h = d; 0 == (n & 1);)
+                n >>= 1,
+                --h;
+            0 > (c -= h) && (c += this.DB,
+                --p);
+            if (q)
+                g[n].copyTo(e),
+                q = !1;
+            else {
+                for (; 1 < h;)
+                    f.sqrTo(e, m),
+                    f.sqrTo(m, e),
+                    h -= 2;
+                0 < h ? f.sqrTo(e, m) : (h = e,
+                    e = m,
+                    m = h);
+                f.mulTo(m, g[n], e)
+            }
+            for (; 0 <= p && 0 == (a[p] & 1 << c);)
+                f.sqrTo(e, m),
+                h = e,
+                e = m,
+                m = h,
+                0 > --c && (c = this.DB - 1,
+                    --p)
+        }
+        return f.revert(e)
+    }
+
+    function bnGCD(a) {
+        var b = 0 > this.s ? this.negate() : this.clone();
+        a = 0 > a.s ? a.negate() : a.clone();
+        if (0 > b.compareTo(a)) {
+            var c = b,
+                b = a;
+            a = c
+        }
+        var c = b.getLowestSetBit(),
+            d = a.getLowestSetBit();
+        if (0 > d)
+            return b;
+        c < d && (d = c);
+        0 < d && (b.rShiftTo(d, b),
+            a.rShiftTo(d, a));
+        for (; 0 < b.signum();)
+            0 < (c = b.getLowestSetBit()) && b.rShiftTo(c, b),
+            0 < (c = a.getLowestSetBit()) && a.rShiftTo(c, a),
+            0 <= b.compareTo(a) ? (b.subTo(a, b),
+                b.rShiftTo(1, b)) : (a.subTo(b, a),
+                a.rShiftTo(1, a));
+        0 < d && a.lShiftTo(d, a);
+        return a
+    }
+
+    function bnpModInt(a) {
+        if (0 >= a)
+            return 0;
+        var b = this.DV % a,
+            c = 0 > this.s ? a - 1 : 0;
+        if (0 < this.t)
+            if (0 == b)
+                c = this[0] % a;
+            else
+                for (var d = this.t - 1; 0 <= d; --d)
+                    c = (b * c + this[d]) % a;
+        return c
+    }
+
+    function bnModInverse(a) {
+        var b = a.isEven();
+        if (this.isEven() && b || 0 == a.signum())
+            return BigInteger.ZERO;
+        for (var c = a.clone(), d = this.clone(), e = nbv(1), f = nbv(0), g = nbv(0), h = nbv(1); 0 != c.signum();) {
+            for (; c.isEven();)
+                c.rShiftTo(1, c),
+                b ? (e.isEven() && f.isEven() || (e.addTo(this, e),
+                        f.subTo(a, f)),
+                    e.rShiftTo(1, e)) : f.isEven() || f.subTo(a, f),
+                f.rShiftTo(1, f);
+            for (; d.isEven();)
+                d.rShiftTo(1, d),
+                b ? (g.isEven() && h.isEven() || (g.addTo(this, g),
+                        h.subTo(a, h)),
+                    g.rShiftTo(1, g)) : h.isEven() || h.subTo(a, h),
+                h.rShiftTo(1, h);
+            0 <= c.compareTo(d) ? (c.subTo(d, c),
+                b && e.subTo(g, e),
+                f.subTo(h, f)) : (d.subTo(c, d),
+                b && g.subTo(e, g),
+                h.subTo(f, h))
+        }
+        if (0 != d.compareTo(BigInteger.ONE))
+            return BigInteger.ZERO;
+        if (0 <= h.compareTo(a))
+            return h.subtract(a);
+        if (0 > h.signum())
+            h.addTo(a, h);
+        else
+            return h;
+        return 0 > h.signum() ? h.add(a) : h
+    }
+    var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997],
+        lplim = 67108864 / lowprimes[lowprimes.length - 1];
+
+    function bnIsProbablePrime(a) {
+        var b, c = this.abs();
+        if (1 == c.t && c[0] <= lowprimes[lowprimes.length - 1]) {
+            for (b = 0; b < lowprimes.length; ++b)
+                if (c[0] == lowprimes[b])
+                    return !0;
+            return !1
+        }
+        if (c.isEven())
+            return !1;
+        for (b = 1; b < lowprimes.length;) {
+            for (var d = lowprimes[b], e = b + 1; e < lowprimes.length && d < lplim;)
+                d *= lowprimes[e++];
+            for (d = c.modInt(d); b < e;)
+                if (0 == d % lowprimes[b++])
+                    return !1
+        }
+        return c.millerRabin(a)
+    }
+
+    function bnpMillerRabin(a) {
+        var b = this.subtract(BigInteger.ONE),
+            c = b.getLowestSetBit();
+        if (0 >= c)
+            return !1;
+        var d = b.shiftRight(c);
+        a = a + 1 >> 1;
+        a > lowprimes.length && (a = lowprimes.length);
+        for (var e = nbi(), f = 0; f < a; ++f) {
+            e.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
+            var g = e.modPow(d, this);
+            if (0 != g.compareTo(BigInteger.ONE) && 0 != g.compareTo(b)) {
+                for (var h = 1; h++ < c && 0 != g.compareTo(b);)
+                    if (g = g.modPowInt(2, this),
+                        0 == g.compareTo(BigInteger.ONE))
+                        return !1;
+                if (0 != g.compareTo(b))
+                    return !1
+            }
+        }
+        return !0
+    }
+    BigInteger.prototype.chunkSize = bnpChunkSize;
+    BigInteger.prototype.toRadix = bnpToRadix;
+    BigInteger.prototype.fromRadix = bnpFromRadix;
+    BigInteger.prototype.fromNumber = bnpFromNumber;
+    BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+    BigInteger.prototype.changeBit = bnpChangeBit;
+    BigInteger.prototype.addTo = bnpAddTo;
+    BigInteger.prototype.dMultiply = bnpDMultiply;
+    BigInteger.prototype.dAddOffset = bnpDAddOffset;
+    BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+    BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+    BigInteger.prototype.modInt = bnpModInt;
+    BigInteger.prototype.millerRabin = bnpMillerRabin;
+    BigInteger.prototype.clone = bnClone;
+    BigInteger.prototype.intValue = bnIntValue;
+    BigInteger.prototype.byteValue = bnByteValue;
+    BigInteger.prototype.shortValue = bnShortValue;
+    BigInteger.prototype.signum = bnSigNum;
+    BigInteger.prototype.toByteArray = bnToByteArray;
+    BigInteger.prototype.equals = bnEquals;
+    BigInteger.prototype.min = bnMin;
+    BigInteger.prototype.max = bnMax;
+    BigInteger.prototype.and = bnAnd;
+    BigInteger.prototype.or = bnOr;
+    BigInteger.prototype.xor = bnXor;
+    BigInteger.prototype.andNot = bnAndNot;
+    BigInteger.prototype.not = bnNot;
+    BigInteger.prototype.shiftLeft = bnShiftLeft;
+    BigInteger.prototype.shiftRight = bnShiftRight;
+    BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+    BigInteger.prototype.bitCount = bnBitCount;
+    BigInteger.prototype.testBit = bnTestBit;
+    BigInteger.prototype.setBit = bnSetBit;
+    BigInteger.prototype.clearBit = bnClearBit;
+    BigInteger.prototype.flipBit = bnFlipBit;
+    BigInteger.prototype.add = bnAdd;
+    BigInteger.prototype.subtract = bnSubtract;
+    BigInteger.prototype.multiply = bnMultiply;
+    BigInteger.prototype.divide = bnDivide;
+    BigInteger.prototype.remainder = bnRemainder;
+    BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+    BigInteger.prototype.modPow = bnModPow;
+    BigInteger.prototype.modInverse = bnModInverse;
+    BigInteger.prototype.pow = bnPow;
+    BigInteger.prototype.gcd = bnGCD;
+    BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+    BigInteger.prototype.square = bnSquare;
+
+    function Arcfour() {
+        this.j = this.i = 0;
+        this.S = []
+    }
+
+    function ARC4init(a) {
+        var b, c, d;
+        for (b = 0; 256 > b; ++b)
+            this.S[b] = b;
+        for (b = c = 0; 256 > b; ++b)
+            c = c + this.S[b] + a[b % a.length] & 255,
+            d = this.S[b],
+            this.S[b] = this.S[c],
+            this.S[c] = d;
+        this.j = this.i = 0
+    }
+
+    function ARC4next() {
+        var a;
+        this.i = this.i + 1 & 255;
+        this.j = this.j + this.S[this.i] & 255;
+        a = this.S[this.i];
+        this.S[this.i] = this.S[this.j];
+        this.S[this.j] = a;
+        return this.S[a + this.S[this.i] & 255]
+    }
+    Arcfour.prototype.init = ARC4init;
+    Arcfour.prototype.next = ARC4next;
+
+    function prng_newstate() {
+        return new Arcfour
+    }
+    var rng_psize = 256,
+        rng_state, rng_pool, rng_pptr;
+
+    function rng_seed_int(a) {
+        rng_pool[rng_pptr++] ^= a & 255;
+        rng_pool[rng_pptr++] ^= a >> 8 & 255;
+        rng_pool[rng_pptr++] ^= a >> 16 & 255;
+        rng_pool[rng_pptr++] ^= a >> 24 & 255;
+        rng_pptr >= rng_psize && (rng_pptr -= rng_psize)
+    }
+
+    function rng_seed_time() {
+        rng_seed_int((new Date).getTime())
+    }
+    if (null == rng_pool) {
+        rng_pool = [];
+        rng_pptr = 0;
+        var t;
+        if ("Netscape" == navigator.appName && "5" > navigator.appVersion && window.crypto) {
+            var z = window.crypto.random(32);
+            for (t = 0; t < z.length; ++t)
+                rng_pool[rng_pptr++] = z.charCodeAt(t) & 255
+        }
+        for (; rng_pptr < rng_psize;)
+            t = Math.floor(65536 * Math.random()),
+            rng_pool[rng_pptr++] = t >>> 8,
+            rng_pool[rng_pptr++] = t & 255;
+        rng_pptr = 0;
+        rng_seed_time()
+    }
+
+    function rng_get_byte() {
+        if (null == rng_state) {
+            rng_seed_time();
+            rng_state = prng_newstate();
+            rng_state.init(rng_pool);
+            for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
+                rng_pool[rng_pptr] = 0;
+            rng_pptr = 0
+        }
+        return rng_state.next()
+    }
+
+    function rng_get_bytes(a) {
+        var b;
+        for (b = 0; b < a.length; ++b)
+            a[b] = rng_get_byte()
+    }
+
+    function SecureRandom() {}
+    SecureRandom.prototype.nextBytes = rng_get_bytes;
+    var KJUR = {};
+    //"undefined" != typeof KJUR && KJUR || (KJUR = {});  
+    "undefined" != typeof KJUR.crypto && KJUR.crypto || (KJUR.crypto = {});
+    KJUR.crypto.Util = new function () {
+        this.DIGESTINFOHEAD = {
+            sha1: "3021300906052b0e03021a05000414",
+            sha224: "302d300d06096086480165030402040500041c",
+            sha256: "3031300d060960864801650304020105000420",
+            sha384: "3041300d060960864801650304020205000430",
+            sha512: "3051300d060960864801650304020305000440",
+            md2: "3020300c06082a864886f70d020205000410",
+            md5: "3020300c06082a864886f70d020505000410",
+            ripemd160: "3021300906052b2403020105000414"
+        };
+        this.DEFAULTPROVIDER = {
+            md5: "cryptojs",
+            sha1: "cryptojs",
+            sha224: "cryptojs",
+            sha256: "cryptojs",
+            sha384: "cryptojs",
+            sha512: "cryptojs",
+            ripemd160: "cryptojs",
+            hmacmd5: "cryptojs",
+            hmacsha1: "cryptojs",
+            hmacsha224: "cryptojs",
+            hmacsha256: "cryptojs",
+            hmacsha384: "cryptojs",
+            hmacsha512: "cryptojs",
+            hmacripemd160: "cryptojs",
+            sm3: "cryptojs",
+            MD5withRSA: "cryptojs/jsrsa",
+            SHA1withRSA: "cryptojs/jsrsa",
+            SHA224withRSA: "cryptojs/jsrsa",
+            SHA256withRSA: "cryptojs/jsrsa",
+            SHA384withRSA: "cryptojs/jsrsa",
+            SHA512withRSA: "cryptojs/jsrsa",
+            RIPEMD160withRSA: "cryptojs/jsrsa",
+            MD5withECDSA: "cryptojs/jsrsa",
+            SHA1withECDSA: "cryptojs/jsrsa",
+            SHA224withECDSA: "cryptojs/jsrsa",
+            SHA256withECDSA: "cryptojs/jsrsa",
+            SHA384withECDSA: "cryptojs/jsrsa",
+            SHA512withECDSA: "cryptojs/jsrsa",
+            RIPEMD160withECDSA: "cryptojs/jsrsa",
+            SHA1withDSA: "cryptojs/jsrsa",
+            SHA224withDSA: "cryptojs/jsrsa",
+            SHA256withDSA: "cryptojs/jsrsa",
+            MD5withRSAandMGF1: "cryptojs/jsrsa",
+            SHA1withRSAandMGF1: "cryptojs/jsrsa",
+            SHA224withRSAandMGF1: "cryptojs/jsrsa",
+            SHA256withRSAandMGF1: "cryptojs/jsrsa",
+            SHA384withRSAandMGF1: "cryptojs/jsrsa",
+            SHA512withRSAandMGF1: "cryptojs/jsrsa",
+            RIPEMD160withRSAandMGF1: "cryptojs/jsrsa"
+        };
+        this.CRYPTOJSMESSAGEDIGESTNAME = {
+            md5: "CryptoJS.algo.MD5",
+            sha1: "CryptoJS.algo.SHA1",
+            sha224: "CryptoJS.algo.SHA224",
+            sha256: "CryptoJS.algo.SHA256",
+            sha384: "CryptoJS.algo.SHA384",
+            sha512: "CryptoJS.algo.SHA512",
+            ripemd160: "CryptoJS.algo.RIPEMD160",
+            sm3: "CryptoJS.algo.SM3"
+        };
+        this.getDigestInfoHex = function (a, b) {
+            if ("undefined" == typeof this.DIGESTINFOHEAD[b])
+                throw "alg not supported in Util.DIGESTINFOHEAD: " + b;
+            return this.DIGESTINFOHEAD[b] + a
+        };
+        this.getPaddedDigestInfoHex = function (a, b, c) {
+            var d = this.getDigestInfoHex(a, b);
+            a = c / 4;
+            if (d.length + 22 > a)
+                throw "key is too short for SigAlg: keylen=" + c + "," + b;
+            b = "00" + d;
+            c = "";
+            a = a - 4 - b.length;
+            for (d = 0; d < a; d += 2)
+                c += "ff";
+            return "0001" + c + b
+        };
+        this.hashString = function (a, b) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: b
+            })).digestString(a)
+        };
+        this.hashHex = function (a, b) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: b
+            })).digestHex(a)
+        };
+        this.sha1 = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "sha1",
+                prov: "cryptojs"
+            })).digestString(a)
+        };
+        this.sha256 = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "sha256",
+                prov: "cryptojs"
+            })).digestString(a)
+        };
+        this.sha256Hex = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "sha256",
+                prov: "cryptojs"
+            })).digestHex(a)
+        };
+        this.sha512 = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "sha512",
+                prov: "cryptojs"
+            })).digestString(a)
+        };
+        this.sha512Hex = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "sha512",
+                prov: "cryptojs"
+            })).digestHex(a)
+        };
+        this.md5 = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "md5",
+                prov: "cryptojs"
+            })).digestString(a)
+        };
+        this.ripemd160 = function (a) {
+            return (new KJUR.crypto.MessageDigest({
+                alg: "ripemd160",
+                prov: "cryptojs"
+            })).digestString(a)
+        };
+        this.getCryptoJSMDByName = function (a) {}
+    };
+    KJUR.crypto.MessageDigest = function (a) {
+        this.setAlgAndProvider = function (a, c) {
+            null != a && void 0 === c && (c = KJUR.crypto.Util.DEFAULTPROVIDER[a]);
+            if (-1 != ":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:sm3:".indexOf(a) && "cryptojs" == c) {
+                try {
+                    this.md = eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[a]).create()
+                } catch (d) {
+                    throw "setAlgAndProvider hash alg set fail alg=" + a + "/" + d;
+                }
+                this.updateString = function (a) {
+                    this.md.update(a)
+                };
+                this.updateHex = function (a) {
+                    a = CryptoJS.enc.Hex.parse(a);
+                    this.md.update(a)
+                };
+                this.digest = function () {
+                    return this.md.finalize().toString(CryptoJS.enc.Hex)
+                };
+                this.digestString = function (a) {
+                    this.updateString(a);
+                    return this.digest()
+                };
+                this.digestHex = function (a) {
+                    this.updateHex(a);
+                    return this.digest()
+                }
+            }
+            if (-1 != ":sha256:".indexOf(a) && "sjcl" == c) {
+                try {
+                    this.md = new sjcl.hash.sha256
+                } catch (d) {
+                    throw "setAlgAndProvider hash alg set fail alg=" + a + "/" + d;
+                }
+                this.updateString = function (a) {
+                    this.md.update(a)
+                };
+                this.updateHex = function (a) {
+                    a = sjcl.codec.hex.toBits(a);
+                    this.md.update(a)
+                };
+                this.digest = function () {
+                    var a = this.md.finalize();
+                    return sjcl.codec.hex.fromBits(a)
+                };
+                this.digestString = function (a) {
+                    this.updateString(a);
+                    return this.digest()
+                };
+                this.digestHex = function (a) {
+                    this.updateHex(a);
+                    return this.digest()
+                }
+            }
+        };
+        this.updateString = function (a) {
+            throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
+        };
+        this.updateHex = function (a) {
+            throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
+        };
+        this.digest = function () {
+            throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName;
+        };
+        this.digestString = function (a) {
+            throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
+        };
+        this.digestHex = function (a) {
+            throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
+        };
+        void 0 !== a && void 0 !== a.alg && (this.algName = a.alg,
+            void 0 === a.prov && (this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]),
+            this.setAlgAndProvider(this.algName, this.provName))
+    };
+    KJUR.crypto.Mac = function (a) {
+        this.setAlgAndProvider = function (a, c) {
+            null == a && (a = "hmacsha1");
+            a = a.toLowerCase();
+            if ("hmac" != a.substr(0, 4))
+                throw "setAlgAndProvider unsupported HMAC alg: " + a;
+            void 0 === c && (c = KJUR.crypto.Util.DEFAULTPROVIDER[a]);
+            this.algProv = a + "/" + c;
+            var d = a.substr(4);
+            if (-1 != ":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(d) && "cryptojs" == c) {
+                try {
+                    var e = eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[d]);
+                    this.mac = CryptoJS.algo.HMAC.create(e, this.pass)
+                } catch (f) {
+                    throw "setAlgAndProvider hash alg set fail hashAlg=" + d + "/" + f;
+                }
+                this.updateString = function (a) {
+                    this.mac.update(a)
+                };
+                this.updateHex = function (a) {
+                    a = CryptoJS.enc.Hex.parse(a);
+                    this.mac.update(a)
+                };
+                this.doFinal = function () {
+                    return this.mac.finalize().toString(CryptoJS.enc.Hex)
+                };
+                this.doFinalString = function (a) {
+                    this.updateString(a);
+                    return this.doFinal()
+                };
+                this.doFinalHex = function (a) {
+                    this.updateHex(a);
+                    return this.doFinal()
+                }
+            }
+        };
+        this.updateString = function (a) {
+            throw "updateString(str) not supported for this alg/prov: " + this.algProv;
+        };
+        this.updateHex = function (a) {
+            throw "updateHex(hex) not supported for this alg/prov: " + this.algProv;
+        };
+        this.doFinal = function () {
+            throw "digest() not supported for this alg/prov: " + this.algProv;
+        };
+        this.doFinalString = function (a) {
+            throw "digestString(str) not supported for this alg/prov: " + this.algProv;
+        };
+        this.doFinalHex = function (a) {
+            throw "digestHex(hex) not supported for this alg/prov: " + this.algProv;
+        };
+        void 0 !== a && (void 0 !== a.pass && (this.pass = a.pass),
+            void 0 !== a.alg && (this.algName = a.alg,
+                void 0 === a.prov && (this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]),
+                this.setAlgAndProvider(this.algName, this.provName)))
+    };
+    KJUR.crypto.Signature = function (a) {
+        var b = null;
+        this._setAlgNames = function () {
+            this.algName.match(/^(.+)with(.+)$/) && (this.mdAlgName = RegExp.$1.toLowerCase(),
+                this.pubkeyAlgName = RegExp.$2.toLowerCase())
+        };
+        this._zeroPaddingOfSignature = function (a, b) {
+            for (var e = "", f = b / 4 - a.length, g = 0; g < f; g++)
+                e += "0";
+            return e + a
+        };
+        this.setAlgAndProvider = function (a, b) {
+            this._setAlgNames();
+            if ("cryptojs/jsrsa" != b)
+                throw "provider not supported: " + b;
+            if (-1 != ":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:sm3:".indexOf(this.mdAlgName)) {
+                try {
+                    this.md = new KJUR.crypto.MessageDigest({
+                        alg: this.mdAlgName
+                    })
+                } catch (e) {
+                    throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + e;
+                }
+                this.init = function (a, c) {
+                    var b = null;
+                    try {
+                        b = void 0 === c ? KEYUTIL.getKey(a) : KEYUTIL.getKey(a, c)
+                    } catch (d) {
+                        throw "init failed:" + d;
+                    }
+                    if (!0 === b.isPrivate)
+                        this.prvKey = b,
+                        this.state = "SIGN";
+                    else if (!0 === b.isPublic)
+                        this.pubKey = b,
+                        this.state = "VERIFY";
+                    else
+                        throw "init failed.:" + b;
+                };
+                this.initSign = function (a) {
+                    "string" == typeof a.ecprvhex && "string" == typeof a.eccurvename ? (this.ecprvhex = a.ecprvhex,
+                        this.eccurvename = a.eccurvename) : this.prvKey = a;
+                    this.state = "SIGN"
+                };
+                this.initVerifyByPublicKey = function (a) {
+                    "string" == typeof a.ecpubhex && "string" == typeof a.eccurvename ? (this.ecpubhex = a.ecpubhex,
+                        this.eccurvename = a.eccurvename) : a instanceof KJUR.crypto.ECDSA ? this.pubKey = a : a instanceof RSAKey && (this.pubKey = a);
+                    this.state = "VERIFY"
+                };
+                this.initVerifyByCertificatePEM = function (a) {
+                    var c = new X509;
+                    c.readCertPEM(a);
+                    this.pubKey = c.subjectPublicKeyRSA;
+                    this.state = "VERIFY"
+                };
+                this.updateString = function (a) {
+                    this.md.updateString(a)
+                };
+                this.updateHex = function (a) {
+                    this.md.updateHex(a)
+                };
+                this.sign = function () {
+                    "sm2" != this.eccurvename && (this.sHashHex = this.md.digest());
+                    if ("undefined" != typeof this.ecprvhex && "undefined" != typeof this.eccurvename) {
+                        if ("sm2" == this.eccurvename) {
+                            var a = new KJUR.crypto.SM3withSM2({
+                                    curve: this.eccurvename
+                                }),
+                                c = a.ecparams.G,
+                                b = c.multiply(new BigInteger(this.ecprvhex, 16)),
+                                d = b.getX().toBigInteger().toRadix(16) + b.getY().toBigInteger().toRadix(16),
+                                b = new SM3Digest,
+                                c = (new SM3Digest).GetZ(c, d),
+                                c = b.GetWords(b.GetHex(c).toString()),
+                                d = CryptoJS.enc.Utf8.stringify(this.md.md._data),
+                                d = CryptoJS.enc.Utf8.parse(d).toString(),
+                                d = b.GetWords(d),
+                                k = Array(b.GetDigestSize());
+                            b.BlockUpdate(c, 0, c.length);
+                            b.BlockUpdate(d, 0, d.length);
+                            b.DoFinal(k, 0);
+                            this.sHashHex = b.GetHex(k).toString()
+                        } else
+                            a = new KJUR.crypto.ECDSA({
+                                curve: this.eccurvename
+                            });
+                        this.hSign = a.signHex(this.sHashHex, this.ecprvhex)
+                    } else if ("rsaandmgf1" == this.pubkeyAlgName)
+                        this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen);
+                    else if ("rsa" == this.pubkeyAlgName)
+                        this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName);
+                    else if (this.prvKey instanceof KJUR.crypto.ECDSA)
+                        this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);
+                    else if (this.prvKey instanceof KJUR.crypto.DSA)
+                        this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);
+                    else
+                        throw "Signature: unsupported public key alg: " + this.pubkeyAlgName;
+                    return this.hSign
+                };
+                this.signString = function (a) {
+                    this.updateString(a);
+                    this.sign()
+                };
+                this.signHex = function (a) {
+                    this.updateHex(a);
+                    this.sign()
+                };
+                this.verify = function (a) {
+                    "sm2" != this.eccurvename && (this.sHashHex = this.md.digest());
+                    if ("undefined" != typeof this.ecpubhex && "undefined" != typeof this.eccurvename) {
+                        if ("sm2" == this.eccurvename) {
+                            var c = new KJUR.crypto.SM3withSM2({
+                                    curve: this.eccurvename
+                                }),
+                                b = c.ecparams.G,
+                                d = this.ecpubhex.substr(2, 128),
+                                k = new SM3Digest,
+                                b = (new SM3Digest).GetZ(b, d),
+                                b = k.GetWords(k.GetHex(b).toString()),
+                                d = CryptoJS.enc.Utf8.stringify(this.md.md._data),
+                                d = CryptoJS.enc.Utf8.parse(d).toString(),
+                                d = k.GetWords(d),
+                                l = Array(k.GetDigestSize());
+                            k.BlockUpdate(b, 0, b.length);
+                            k.BlockUpdate(d, 0, d.length);
+                            k.DoFinal(l, 0);
+                            this.sHashHex = k.GetHex(l).toString()
+                        } else
+                            c = new KJUR.crypto.ECDSA({
+                                curve: this.eccurvename
+                            });
+                        return c.verifyHex(this.sHashHex, a, this.ecpubhex)
+                    }
+                    if ("rsaandmgf1" == this.pubkeyAlgName)
+                        return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, a, this.mdAlgName, this.pssSaltLen);
+                    if ("rsa" == this.pubkeyAlgName || this.pubKey instanceof KJUR.crypto.ECDSA || this.pubKey instanceof KJUR.crypto.DSA)
+                        return this.pubKey.verifyWithMessageHash(this.sHashHex, a);
+                    throw "Signature: unsupported public key alg: " + this.pubkeyAlgName;
+                }
+            }
+        };
+        this.init = function (a, b) {
+            throw "init(key, pass) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.initVerifyByPublicKey = function (a) {
+            throw "initVerifyByPublicKey(rsaPubKeyy) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.initVerifyByCertificatePEM = function (a) {
+            throw "initVerifyByCertificatePEM(certPEM) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.initSign = function (a) {
+            throw "initSign(prvKey) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.updateString = function (a) {
+            throw "updateString(str) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.updateHex = function (a) {
+            throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.sign = function () {
+            throw "sign() not supported for this alg:prov=" + this.algProvName;
+        };
+        this.signString = function (a) {
+            throw "digestString(str) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.signHex = function (a) {
+            throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.verify = function (a) {
+            throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName;
+        };
+        this.initParams = a;
+        if (void 0 !== a && (void 0 !== a.alg && (this.algName = a.alg,
+                    this.provName = void 0 === a.prov ? KJUR.crypto.Util.DEFAULTPROVIDER[this.algName] : a.prov,
+                    this.algProvName = this.algName + ":" + this.provName,
+                    this.setAlgAndProvider(this.algName, this.provName),
+                    this._setAlgNames()),
+                void 0 !== a.psssaltlen && (this.pssSaltLen = a.psssaltlen),
+                void 0 !== a.prvkeypem)) {
+            if (void 0 !== a.prvkeypas)
+                throw "both prvkeypem and prvkeypas parameters not supported";
+            try {
+                b = new RSAKey,
+                    b.readPrivateKeyFromPEMString(a.prvkeypem),
+                    this.initSign(b)
+            } catch (c) {
+                throw "fatal error to load pem private key: " + c;
+            }
+        }
+    };
+    KJUR.crypto.OID = new function () {
+        this.oidhex2name = {
+            "2a864886f70d010101": "rsaEncryption",
+            "2a8648ce3d0201": "ecPublicKey",
+            "2a8648ce380401": "dsa",
+            "2a8648ce3d030107": "secp256r1",
+            "2b8104001f": "secp192k1",
+            "2b81040021": "secp224r1",
+            "2b8104000a": "secp256k1",
+            "2b81040023": "secp521r1",
+            "2b81040022": "secp384r1",
+            "2a8648ce380403": "SHA1withDSA",
+            "608648016503040301": "SHA224withDSA",
+            "608648016503040302": "SHA256withDSA"
+        }
+    };
+
+    function ECFieldElementFp(a, b) {
+        this.x = b;
+        this.q = a
+    }
+
+    function feFpEquals(a) {
+        return a == this ? !0 : this.q.equals(a.q) && this.x.equals(a.x)
+    }
+
+    function feFpToBigInteger() {
+        return this.x
+    }
+
+    function feFpNegate() {
+        return new ECFieldElementFp(this.q, this.x.negate().mod(this.q))
+    }
+
+    function feFpAdd(a) {
+        return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q))
+    }
+
+    function feFpSubtract(a) {
+        return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q))
+    }
+
+    function feFpMultiply(a) {
+        return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q))
+    }
+
+    function feFpSquare() {
+        return new ECFieldElementFp(this.q, this.x.square().mod(this.q))
+    }
+
+    function feFpDivide(a) {
+        return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))
+    }
+    ECFieldElementFp.prototype.equals = feFpEquals;
+    ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
+    ECFieldElementFp.prototype.negate = feFpNegate;
+    ECFieldElementFp.prototype.add = feFpAdd;
+    ECFieldElementFp.prototype.subtract = feFpSubtract;
+    ECFieldElementFp.prototype.multiply = feFpMultiply;
+    ECFieldElementFp.prototype.square = feFpSquare;
+    ECFieldElementFp.prototype.divide = feFpDivide;
+
+    function ECPointFp(a, b, c, d) {
+        this.curve = a;
+        this.x = b;
+        this.y = c;
+        this.z = null == d ? BigInteger.ONE : d;
+        this.zinv = null
+    }
+
+    function pointFpGetX() {
+        null == this.zinv && (this.zinv = this.z.modInverse(this.curve.q));
+        return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))
+    }
+
+    function pointFpGetY() {
+        null == this.zinv && (this.zinv = this.z.modInverse(this.curve.q));
+        return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))
+    }
+
+    function pointFpEquals(a) {
+        return a == this ? !0 : this.isInfinity() ? a.isInfinity() : a.isInfinity() ? this.isInfinity() : a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q).equals(BigInteger.ZERO) ? a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q).equals(BigInteger.ZERO) : !1
+    }
+
+    function pointFpIsInfinity() {
+        return null == this.x && null == this.y ? !0 : this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO)
+    }
+
+    function pointFpNegate() {
+        return new ECPointFp(this.curve, this.x, this.y.negate(), this.z)
+    }
+
+    function pointFpAdd(a) {
+        if (this.isInfinity())
+            return a;
+        if (a.isInfinity())
+            return this;
+        var b = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q),
+            c = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);
+        if (BigInteger.ZERO.equals(c))
+            return BigInteger.ZERO.equals(b) ? this.twice() : this.curve.getInfinity();
+        var d = new BigInteger("3"),
+            e = this.x.toBigInteger(),
+            f = this.y.toBigInteger();
+        a.x.toBigInteger();
+        a.y.toBigInteger();
+        var g = c.square(),
+            h = g.multiply(c),
+            e = e.multiply(g),
+            g = b.square().multiply(this.z),
+            c = g.subtract(e.shiftLeft(1)).multiply(a.z).subtract(h).multiply(c).mod(this.curve.q),
+            b = e.multiply(d).multiply(b).subtract(f.multiply(h)).subtract(g.multiply(b)).multiply(a.z).add(b.multiply(h)).mod(this.curve.q);
+        a = h.multiply(this.z).multiply(a.z).mod(this.curve.q);
+        return new ECPointFp(this.curve, this.curve.fromBigInteger(c), this.curve.fromBigInteger(b), a)
+    }
+
+    function pointFpTwice() {
+        if (this.isInfinity())
+            return this;
+        if (0 == this.y.toBigInteger().signum())
+            return this.curve.getInfinity();
+        var a = new BigInteger("3"),
+            b = this.x.toBigInteger(),
+            c = this.y.toBigInteger(),
+            d = c.multiply(this.z),
+            e = d.multiply(c).mod(this.curve.q),
+            c = this.curve.a.toBigInteger(),
+            f = b.square().multiply(a);
+        BigInteger.ZERO.equals(c) || (f = f.add(this.z.square().multiply(c)));
+        f = f.mod(this.curve.q);
+        c = f.square().subtract(b.shiftLeft(3).multiply(e)).shiftLeft(1).multiply(d).mod(this.curve.q);
+        a = f.multiply(a).multiply(b).subtract(e.shiftLeft(1)).shiftLeft(2).multiply(e).subtract(f.square().multiply(f)).mod(this.curve.q);
+        d = d.square().multiply(d).shiftLeft(3).mod(this.curve.q);
+        return new ECPointFp(this.curve, this.curve.fromBigInteger(c), this.curve.fromBigInteger(a), d)
+    }
+
+    function pointFpMultiply(a) {
+        if (this.isInfinity())
+            return this;
+        if (0 == a.signum())
+            return this.curve.getInfinity();
+        var b = a.multiply(new BigInteger("3")),
+            c = this.negate(),
+            d = this,
+            e;
+        for (e = b.bitLength() - 2; 0 < e; --e) {
+            var d = d.twice(),
+                f = b.testBit(e),
+                g = a.testBit(e);
+            f != g && (d = d.add(f ? this : c))
+        }
+        return d
+    }
+
+    function pointFpMultiplyTwo(a, b, c) {
+        var d;
+        d = a.bitLength() > c.bitLength() ? a.bitLength() - 1 : c.bitLength() - 1;
+        for (var e = this.curve.getInfinity(), f = this.add(b); 0 <= d;)
+            e = e.twice(),
+            a.testBit(d) ? e = c.testBit(d) ? e.add(f) : e.add(this) : c.testBit(d) && (e = e.add(b)),
+            --d;
+        return e
+    }
+    ECPointFp.prototype.getX = pointFpGetX;
+    ECPointFp.prototype.getY = pointFpGetY;
+    ECPointFp.prototype.equals = pointFpEquals;
+    ECPointFp.prototype.isInfinity = pointFpIsInfinity;
+    ECPointFp.prototype.negate = pointFpNegate;
+    ECPointFp.prototype.add = pointFpAdd;
+    ECPointFp.prototype.twice = pointFpTwice;
+    ECPointFp.prototype.multiply = pointFpMultiply;
+    ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;
+
+    function ECCurveFp(a, b, c) {
+        this.q = a;
+        this.a = this.fromBigInteger(b);
+        this.b = this.fromBigInteger(c);
+        this.infinity = new ECPointFp(this, null, null)
+    }
+
+    function curveFpGetQ() {
+        return this.q
+    }
+
+    function curveFpGetA() {
+        return this.a
+    }
+
+    function curveFpGetB() {
+        return this.b
+    }
+
+    function curveFpEquals(a) {
+        return a == this ? !0 : this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b)
+    }
+
+    function curveFpGetInfinity() {
+        return this.infinity
+    }
+
+    function curveFpFromBigInteger(a) {
+        return new ECFieldElementFp(this.q, a)
+    }
+
+    function curveFpDecodePointHex(a) {
+        switch (parseInt(a.substr(0, 2), 16)) {
+            case 0:
+                return this.infinity;
+            case 2:
+            case 3:
+                return null;
+            case 4:
+            case 6:
+            case 7:
+                var b = (a.length - 2) / 2,
+                    c = a.substr(2, b);
+                a = a.substr(b + 2, b);
+                return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(a, 16)));
+            default:
+                return null
+        }
+    }
+    ECCurveFp.prototype.getQ = curveFpGetQ;
+    ECCurveFp.prototype.getA = curveFpGetA;
+    ECCurveFp.prototype.getB = curveFpGetB;
+    ECCurveFp.prototype.equals = curveFpEquals;
+    ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
+    ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
+    ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
+    ECFieldElementFp.prototype.getByteLength = function () {
+        return Math.floor((this.toBigInteger().bitLength() + 7) / 8)
+    };
+    ECPointFp.prototype.getEncoded = function (a) {
+        var b = function (a, c) {
+                var b = a.toByteArrayUnsigned();
+                if (c < b.length)
+                    b = b.slice(b.length - c);
+                else
+                    for (; c > b.length;)
+                        b.unshift(0);
+                return b
+            },
+            c = this.getX().toBigInteger(),
+            d = this.getY().toBigInteger(),
+            c = b(c, 32);
+        a ? d.isEven() ? c.unshift(2) : c.unshift(3) : (c.unshift(4),
+            c = c.concat(b(d, 32)));
+        return c
+    };
+    ECPointFp.decodeFrom = function (a, b) {
+        var c = b.length - 1,
+            d = b.slice(1, 1 + c / 2),
+            c = b.slice(1 + c / 2, 1 + c);
+        d.unshift(0);
+        c.unshift(0);
+        d = new BigInteger(d);
+        c = new BigInteger(c);
+        return new ECPointFp(a, a.fromBigInteger(d), a.fromBigInteger(c))
+    };
+    ECPointFp.decodeFromHex = function (a, b) {
+        b.substr(0, 2);
+        var c = b.length - 2,
+            d = b.substr(2, c / 2),
+            c = b.substr(2 + c / 2, c / 2),
+            d = new BigInteger(d, 16),
+            c = new BigInteger(c, 16);
+        return new ECPointFp(a, a.fromBigInteger(d), a.fromBigInteger(c))
+    };
+    ECPointFp.prototype.add2D = function (a) {
+        if (this.isInfinity())
+            return a;
+        if (a.isInfinity())
+            return this;
+        if (this.x.equals(a.x))
+            return this.y.equals(a.y) ? this.twice() : this.curve.getInfinity();
+        var b = a.x.subtract(this.x),
+            b = a.y.subtract(this.y).divide(b);
+        a = b.square().subtract(this.x).subtract(a.x);
+        b = b.multiply(this.x.subtract(a)).subtract(this.y);
+        return new ECPointFp(this.curve, a, b)
+    };
+    ECPointFp.prototype.twice2D = function () {
+        if (this.isInfinity())
+            return this;
+        if (0 == this.y.toBigInteger().signum())
+            return this.curve.getInfinity();
+        var a = this.curve.fromBigInteger(BigInteger.valueOf(2)),
+            b = this.curve.fromBigInteger(BigInteger.valueOf(3)),
+            b = this.x.square().multiply(b).add(this.curve.a).divide(this.y.multiply(a)),
+            a = b.square().subtract(this.x.multiply(a)),
+            b = b.multiply(this.x.subtract(a)).subtract(this.y);
+        return new ECPointFp(this.curve, a, b)
+    };
+    ECPointFp.prototype.multiply2D = function (a) {
+        if (this.isInfinity())
+            return this;
+        if (0 == a.signum())
+            return this.curve.getInfinity();
+        var b = a.multiply(new BigInteger("3")),
+            c = this.negate(),
+            d = this,
+            e;
+        for (e = b.bitLength() - 2; 0 < e; --e) {
+            var d = d.twice(),
+                f = b.testBit(e),
+                g = a.testBit(e);
+            f != g && (d = d.add2D(f ? this : c))
+        }
+        return d
+    };
+    ECPointFp.prototype.isOnCurve = function () {
+        var a = this.getX().toBigInteger(),
+            b = this.getY().toBigInteger(),
+            c = this.curve.getA().toBigInteger(),
+            d = this.curve.getB().toBigInteger(),
+            e = this.curve.getQ(),
+            b = b.multiply(b).mod(e),
+            a = a.multiply(a).multiply(a).add(c.multiply(a)).add(d).mod(e);
+        return b.equals(a)
+    };
+    ECPointFp.prototype.toString = function () {
+        return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")"
+    };
+    ECPointFp.prototype.validate = function () {
+        var a = this.curve.getQ();
+        if (this.isInfinity())
+            throw Error("Point is at infinity.");
+        var b = this.getX().toBigInteger(),
+            c = this.getY().toBigInteger();
+        if (0 > b.compareTo(BigInteger.ONE) || 0 < b.compareTo(a.subtract(BigInteger.ONE)))
+            throw Error("x coordinate out of bounds");
+        if (0 > c.compareTo(BigInteger.ONE) || 0 < c.compareTo(a.subtract(BigInteger.ONE)))
+            throw Error("y coordinate out of bounds");
+        if (!this.isOnCurve())
+            throw Error("Point is not on the curve.");
+        if (this.multiply(a).isInfinity())
+            throw Error("Point is not a scalar multiple of G.");
+        return !0
+    };
+    "undefined" != typeof KJUR && KJUR || (KJUR = {});
+    "undefined" != typeof KJUR.crypto && KJUR.crypto || (KJUR.crypto = {});
+    KJUR.crypto.ECDSA = function (a) {
+        var b = new SecureRandom;
+        this.type = "EC";
+        this.getBigRandom = function (a) {
+            return (new BigInteger(a.bitLength(), b)).mod(a.subtract(BigInteger.ONE)).add(BigInteger.ONE)
+        };
+        this.setNamedCurve = function (a) {
+            this.ecparams = KJUR.crypto.ECParameterDB.getByName(a);
+            this.pubKeyHex = this.prvKeyHex = null;
+            this.curveName = a
+        };
+        this.setPrivateKeyHex = function (a) {
+            this.isPrivate = !0;
+            this.prvKeyHex = a
+        };
+        this.setPublicKeyHex = function (a) {
+            this.isPublic = !0;
+            this.pubKeyHex = a
+        };
+        this.generateKeyPairHex = function () {
+            var a = this.getBigRandom(this.ecparams.n),
+                b = this.ecparams.G.multiply(a),
+                e = b.getX().toBigInteger(),
+                b = b.getY().toBigInteger(),
+                f = this.ecparams.keylen / 4,
+                a = ("0000000000" + a.toString(16)).slice(-f),
+                e = ("0000000000" + e.toString(16)).slice(-f),
+                b = ("0000000000" + b.toString(16)).slice(-f),
+                e = "04" + e + b;
+            this.setPrivateKeyHex(a);
+            this.setPublicKeyHex(e);
+            return {
+                ecprvhex: a,
+                ecpubhex: e
+            }
+        };
+        this.signWithMessageHash = function (a) {
+            return this.signHex(a, this.prvKeyHex)
+        };
+        this.signHex = function (a, b) {
+            var e = new BigInteger(b, 16),
+                f = this.ecparams.n,
+                g = new BigInteger(a, 16);
+            do
+                var h = this.getBigRandom(f),
+                    k = this.ecparams.G.multiply(h).getX().toBigInteger().mod(f);
+            while (0 >= k.compareTo(BigInteger.ZERO));
+            e = h.modInverse(f).multiply(g.add(e.multiply(k))).mod(f);
+            return KJUR.crypto.ECDSA.biRSSigToASN1Sig(k, e)
+        };
+        this.sign = function (a, b) {
+            var e = this.ecparams.n,
+                f = BigInteger.fromByteArrayUnsigned(a);
+            do
+                var g = this.getBigRandom(e),
+                    h = this.ecparams.G.multiply(g).getX().toBigInteger().mod(e);
+            while (0 >= h.compareTo(BigInteger.ZERO));
+            e = g.modInverse(e).multiply(f.add(b.multiply(h))).mod(e);
+            return this.serializeSig(h, e)
+        };
+        this.verifyWithMessageHash = function (a, b) {
+            return this.verifyHex(a, b, this.pubKeyHex)
+        };
+        this.verifyHex = function (a, b, e) {
+            var f;
+            f = KJUR.crypto.ECDSA.parseSigHex(b);
+            b = f.r;
+            f = f.s;
+            e = ECPointFp.decodeFromHex(this.ecparams.curve, e);
+            a = new BigInteger(a, 16);
+            return this.verifyRaw(a, b, f, e)
+        };
+        this.verify = function (a, b, e) {
+            var f;
+            if (Bitcoin.Util.isArray(b))
+                b = this.parseSig(b),
+                f = b.r,
+                b = b.s;
+            else if ("object" === typeof b && b.r && b.s)
+                f = b.r,
+                b = b.s;
+            else
+                throw "Invalid value for signature";
+            if (!(e instanceof ECPointFp))
+                if (Bitcoin.Util.isArray(e))
+                    e = ECPointFp.decodeFrom(this.ecparams.curve, e);
+                else
+                    throw "Invalid format for pubkey value, must be byte array or ECPointFp";
+            a = BigInteger.fromByteArrayUnsigned(a);
+            return this.verifyRaw(a, f, b, e)
+        };
+        this.verifyRaw = function (a, b, e, f) {
+            var g = this.ecparams.n,
+                h = this.ecparams.G;
+            if (0 > b.compareTo(BigInteger.ONE) || 0 <= b.compareTo(g) || 0 > e.compareTo(BigInteger.ONE) || 0 <= e.compareTo(g))
+                return !1;
+            e = e.modInverse(g);
+            a = a.multiply(e).mod(g);
+            e = b.multiply(e).mod(g);
+            return h.multiply(a).add(f.multiply(e)).getX().toBigInteger().mod(g).equals(b)
+        };
+        this.serializeSig = function (a, b) {
+            var e = a.toByteArraySigned(),
+                f = b.toByteArraySigned(),
+                g = [];
+            g.push(2);
+            g.push(e.length);
+            g = g.concat(e);
+            g.push(2);
+            g.push(f.length);
+            g = g.concat(f);
+            g.unshift(g.length);
+            g.unshift(48);
+            return g
+        };
+        this.parseSig = function (a) {
+            var b;
+            if (48 != a[0])
+                throw Error("Signature not a valid DERSequence");
+            b = 2;
+            if (2 != a[b])
+                throw Error("First element in signature must be a DERInteger");
+            var e = a.slice(b + 2, b + 2 + a[b + 1]);
+            b += 2 + a[b + 1];
+            if (2 != a[b])
+                throw Error("Second element in signature must be a DERInteger");
+            a = a.slice(b + 2, b + 2 + a[b + 1]);
+            e = BigInteger.fromByteArrayUnsigned(e);
+            a = BigInteger.fromByteArrayUnsigned(a);
+            return {
+                r: e,
+                s: a
+            }
+        };
+        this.parseSigCompact = function (a) {
+            if (65 !== a.length)
+                throw "Signature has the wrong length";
+            var b = a[0] - 27;
+            if (0 > b || 7 < b)
+                throw "Invalid signature type";
+            var e = this.ecparams.n,
+                f = BigInteger.fromByteArrayUnsigned(a.slice(1, 33)).mod(e);
+            a = BigInteger.fromByteArrayUnsigned(a.slice(33, 65)).mod(e);
+            return {
+                r: f,
+                s: a,
+                i: b
+            }
+        };
+        void 0 !== a && void 0 !== a.curve && (this.curveName = a.curve);
+        void 0 === this.curveName && (this.curveName = "secp256r1");
+        this.setNamedCurve(this.curveName);
+        void 0 !== a && (void 0 !== a.prv && this.setPrivateKeyHex(a.prv),
+            void 0 !== a.pub && this.setPublicKeyHex(a.pub))
+    };
+    KJUR.crypto.ECDSA.parseSigHex = function (a) {
+        var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);
+        a = new BigInteger(b.r, 16);
+        b = new BigInteger(b.s, 16);
+        return {
+            r: a,
+            s: b
+        }
+    };
+    KJUR.crypto.ECDSA.parseSigHexInHexRS = function (a) {
+        if ("30" != a.substr(0, 2))
+            throw "signature is not a ASN.1 sequence";
+        var b = ASN1HEX.getPosArrayOfChildren_AtObj(a, 0);
+        if (2 != b.length)
+            throw "number of signature ASN.1 sequence elements seem wrong";
+        var c = b[0],
+            b = b[1];
+        if ("02" != a.substr(c, 2))
+            throw "1st item of sequene of signature is not ASN.1 integer";
+        if ("02" != a.substr(b, 2))
+            throw "2nd item of sequene of signature is not ASN.1 integer";
+        c = ASN1HEX.getHexOfV_AtObj(a, c);
+        a = ASN1HEX.getHexOfV_AtObj(a, b);
+        return {
+            r: c,
+            s: a
+        }
+    };
+    KJUR.crypto.ECDSA.asn1SigToConcatSig = function (a) {
+        var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);
+        a = b.r;
+        b = b.s;
+        "00" == a.substr(0, 2) && 8 == a.length / 2 * 8 % 128 && (a = a.substr(2));
+        "00" == b.substr(0, 2) && 8 == b.length / 2 * 8 % 128 && (b = b.substr(2));
+        if (0 != a.length / 2 * 8 % 128)
+            throw "unknown ECDSA sig r length error";
+        if (0 != b.length / 2 * 8 % 128)
+            throw "unknown ECDSA sig s length error";
+        return a + b
+    };
+    KJUR.crypto.ECDSA.concatSigToASN1Sig = function (a) {
+        if (0 != a.length / 2 * 8 % 128)
+            throw "unknown ECDSA concatinated r-s sig  length error";
+        var b = a.substr(0, a.length / 2);
+        a = a.substr(a.length / 2);
+        return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(b, a)
+    };
+    KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function (a, b) {
+        var c = new BigInteger(a, 16),
+            d = new BigInteger(b, 16);
+        return KJUR.crypto.ECDSA.biRSSigToASN1Sig(c, d)
+    };
+    KJUR.crypto.ECDSA.biRSSigToASN1Sig = function (a, b) {
+        var c = new KJUR.asn1.DERInteger({
+                bigint: a
+            }),
+            d = new KJUR.asn1.DERInteger({
+                bigint: b
+            });
+        return (new KJUR.asn1.DERSequence({
+            array: [c, d]
+        })).getEncodedHex()
+    };
+    (function () {
+        var a = CryptoJS,
+            b = a.lib,
+            c = b.WordArray,
+            d = b.Hasher,
+            e = [],
+            b = a.algo.SM3 = d.extend({
+                _doReset: function () {
+                    this._hash = new c.init([1937774191, 1226093241, 388252375, 3666478592, 2842636476, 372324522, 3817729613, 2969243214])
+                },
+                _doProcessBlock: function (a, b) {
+                    for (var c = this._hash.words, d = c[0], l = c[1], p = c[2], n = c[3], q = c[4], m = 0; 80 > m; m++) {
+                        if (16 > m)
+                            e[m] = a[b + m] | 0;
+                        else {
+                            var r = e[m - 3] ^ e[m - 8] ^ e[m - 14] ^ e[m - 16];
+                            e[m] = r << 1 | r >>> 31
+                        }
+                        r = (d << 5 | d >>> 27) + q + e[m];
+                        r = 20 > m ? r + ((l & p | ~l & n) + 1518500249) : 40 > m ? r + ((l ^ p ^ n) + 1859775393) : 60 > m ? r + ((l & p | l & n | p & n) - 1894007588) : r + ((l ^ p ^ n) - 899497514);
+                        q = n;
+                        n = p;
+                        p = l << 30 | l >>> 2;
+                        l = d;
+                        d = r
+                    }
+                    c[0] = c[0] + d | 0;
+                    c[1] = c[1] + l | 0;
+                    c[2] = c[2] + p | 0;
+                    c[3] = c[3] + n | 0;
+                    c[4] = c[4] + q | 0
+                },
+                _doFinalize: function () {
+                    var a = this._data,
+                        b = a.words,
+                        c = 8 * this._nDataBytes,
+                        d = 8 * a.sigBytes;
+                    b[d >>> 5] |= 128 << 24 - d % 32;
+                    b[(d + 64 >>> 9 << 4) + 14] = Math.floor(c / 4294967296);
+                    b[(d + 64 >>> 9 << 4) + 15] = c;
+                    a.sigBytes = 4 * b.length;
+                    this._process();
+                    return this._hash
+                },
+                clone: function () {
+                    var a = d.clone.call(this);
+                    a._hash = this._hash.clone();
+                    return a
+                }
+            });
+        a.SM3 = d._createHelper(b);
+        a.HmacSM3 = d._createHmacHelper(b)
+    })();
+
+    function SM3Digest() {
+        this.BYTE_LENGTH = 64;
+        this.xBuf = [];
+        this.byteCount = this.xBufOff = 0;
+        this.DIGEST_LENGTH = 32;
+        this.v0 = [1937774191, 1226093241, 388252375, 3666478592, 2842636476, 372324522, 3817729613, 2969243214];
+        this.v0 = [1937774191, 1226093241, 388252375, -628488704, -1452330820, 372324522, -477237683, -1325724082];
+        this.v = Array(8);
+        this.v_ = Array(8);
+        this.X0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+        this.X = Array(68);
+        this.xOff = 0;
+        this.T_00_15 = 2043430169;
+        this.T_16_63 = 2055708042;
+        0 < arguments.length ? this.InitDigest(arguments[0]) : this.Init()
+    }
+    SM3Digest.prototype = {
+        Init: function () {
+            this.xBuf = Array(4);
+            this.Reset()
+        },
+        InitDigest: function (a) {
+            this.xBuf = Array(a.xBuf.length);
+            Array.Copy(a.xBuf, 0, this.xBuf, 0, a.xBuf.length);
+            this.xBufOff = a.xBufOff;
+            this.byteCount = a.byteCount;
+            Array.Copy(a.X, 0, this.X, 0, a.X.length);
+            this.xOff = a.xOff;
+            Array.Copy(a.v, 0, this.v, 0, a.v.length)
+        },
+        GetDigestSize: function () {
+            return this.DIGEST_LENGTH
+        },
+        Reset: function () {
+            this.xBufOff = this.byteCount = 0;
+            Array.Clear(this.xBuf, 0, this.xBuf.length);
+            Array.Copy(this.v0, 0, this.v, 0, this.v0.length);
+            this.xOff = 0;
+            Array.Copy(this.X0, 0, this.X, 0, this.X0.length)
+        },
+        GetByteLength: function () {
+            return this.BYTE_LENGTH
+        },
+        ProcessBlock: function () {
+            var a, b = this.X,
+                c = Array(64);
+            for (a = 16; 68 > a; a++)
+                b[a] = this.P1(b[a - 16] ^ b[a - 9] ^ this.ROTATE(b[a - 3], 15)) ^ this.ROTATE(b[a - 13], 7) ^ b[a - 6];
+            for (a = 0; 64 > a; a++)
+                c[a] = b[a] ^ b[a + 4];
+            var d = this.v,
+                e = this.v_;
+            Array.Copy(d, 0, e, 0, this.v0.length);
+            var f, g;
+            for (a = 0; 16 > a; a++)
+                g = this.ROTATE(e[0], 12),
+                f = Int32.parse(Int32.parse(g + e[4]) + this.ROTATE(this.T_00_15, a)),
+                f = this.ROTATE(f, 7),
+                g ^= f,
+                g = Int32.parse(Int32.parse(this.FF_00_15(e[0], e[1], e[2]) + e[3]) + g) + c[a],
+                f = Int32.parse(Int32.parse(this.GG_00_15(e[4], e[5], e[6]) + e[7]) + f) + b[a],
+                e[3] = e[2],
+                e[2] = this.ROTATE(e[1], 9),
+                e[1] = e[0],
+                e[0] = g,
+                e[7] = e[6],
+                e[6] = this.ROTATE(e[5], 19),
+                e[5] = e[4],
+                e[4] = this.P0(f);
+            for (a = 16; 64 > a; a++)
+                g = this.ROTATE(e[0], 12),
+                f = Int32.parse(Int32.parse(g + e[4]) + this.ROTATE(this.T_16_63, a)),
+                f = this.ROTATE(f, 7),
+                g ^= f,
+                g = Int32.parse(Int32.parse(this.FF_16_63(e[0], e[1], e[2]) + e[3]) + g) + c[a],
+                f = Int32.parse(Int32.parse(this.GG_16_63(e[4], e[5], e[6]) + e[7]) + f) + b[a],
+                e[3] = e[2],
+                e[2] = this.ROTATE(e[1], 9),
+                e[1] = e[0],
+                e[0] = g,
+                e[7] = e[6],
+                e[6] = this.ROTATE(e[5], 19),
+                e[5] = e[4],
+                e[4] = this.P0(f);
+            for (a = 0; 8 > a; a++)
+                d[a] ^= Int32.parse(e[a]);
+            this.xOff = 0;
+            Array.Copy(this.X0, 0, this.X, 0, this.X0.length)
+        },
+        ProcessWord: function (a, b) {
+            var c = a[b] << 24,
+                c = c | (a[++b] & 255) << 16,
+                c = c | (a[++b] & 255) << 8,
+                c = c | a[++b] & 255;
+            this.X[this.xOff] = c;
+            16 == ++this.xOff && this.ProcessBlock()
+        },
+        ProcessLength: function (a) {
+            14 < this.xOff && this.ProcessBlock();
+            this.X[14] = this.URShiftLong(a, 32);
+            this.X[15] = a & 4294967295
+        },
+        IntToBigEndian: function (a, b, c) {
+            b[c] = Int32.parseByte(this.URShift(a, 24));
+            b[++c] = Int32.parseByte(this.URShift(a, 16));
+            b[++c] = Int32.parseByte(this.URShift(a, 8));
+            b[++c] = Int32.parseByte(a)
+        },
+        DoFinal: function (a, b) {
+            this.Finish();
+            for (var c = 0; 8 > c; c++)
+                this.IntToBigEndian(this.v[c], a, b + 4 * c);
+            this.Reset();
+            for (var d = a.length, c = 0; c < d; c++)
+                a[c] &= 255;
+            return this.DIGEST_LENGTH
+        },
+        Update: function (a) {
+            this.xBuf[this.xBufOff++] = a;
+            this.xBufOff == this.xBuf.length && (this.ProcessWord(this.xBuf, 0),
+                this.xBufOff = 0);
+            this.byteCount++
+        },
+        BlockUpdate: function (a, b, c) {
+            for (; 0 != this.xBufOff && 0 < c;)
+                this.Update(a[b]),
+                b++,
+                c--;
+            for (; c > this.xBuf.length;)
+                this.ProcessWord(a, b),
+                b += this.xBuf.length,
+                c -= this.xBuf.length,
+                this.byteCount += this.xBuf.length;
+            for (; 0 < c;)
+                this.Update(a[b]),
+                b++,
+                c--
+        },
+        Finish: function () {
+            var a = this.byteCount << 3;
+            for (this.Update(128); 0 != this.xBufOff;)
+                this.Update(0);
+            this.ProcessLength(a);
+            this.ProcessBlock()
+        },
+        ROTATE: function (a, b) {
+            return a << b | this.URShift(a, 32 - b)
+        },
+        P0: function (a) {
+            return a ^ this.ROTATE(a, 9) ^ this.ROTATE(a, 17)
+        },
+        P1: function (a) {
+            return a ^ this.ROTATE(a, 15) ^ this.ROTATE(a, 23)
+        },
+        FF_00_15: function (a, b, c) {
+            return a ^ b ^ c
+        },
+        FF_16_63: function (a, b, c) {
+            return a & b | a & c | b & c
+        },
+        GG_00_15: function (a, b, c) {
+            return a ^ b ^ c
+        },
+        GG_16_63: function (a, b, c) {
+            return a & b | ~a & c
+        },
+        URShift: function (a, b) {
+            if (a > Int32.maxValue || a < Int32.minValue)
+                a = Int32.parse(a);
+            return 0 <= a ? a >> b : (a >> b) + (2 << ~b)
+        },
+        URShiftLong: function (a, b) {
+            var c;
+            c = new BigInteger;
+            c.fromInt(a);
+            if (0 <= c.signum())
+                c = c.shiftRight(b).intValue();
+            else {
+                var d = new BigInteger;
+                d.fromInt(2);
+                var e = ~b;
+                c = "";
+                if (0 > e) {
+                    d = 64 + e;
+                    for (e = 0; e < d; e++)
+                        c += "0";
+                    d = new BigInteger;
+                    d.fromInt(a >> b);
+                    c = new BigInteger("10" + c, 2);
+                    c.toRadix(10);
+                    c = c.add(d).toRadix(10)
+                } else
+                    c = d.shiftLeft(~b).intValue(),
+                    c = (a >> b) + c
+            }
+            return c
+        },
+        GetZ: function (a, b) {
+            var c = CryptoJS.enc.Utf8.parse("1234567812345678"),
+                d = 32 * c.words.length;
+            this.Update(d >> 8 & 255);
+            this.Update(d & 255);
+            c = this.GetWords(c.toString());
+            this.BlockUpdate(c, 0, c.length);
+            var c = this.GetWords(a.curve.a.toBigInteger().toRadix(16)),
+                d = this.GetWords(a.curve.b.toBigInteger().toRadix(16)),
+                e = this.GetWords(a.getX().toBigInteger().toRadix(16)),
+                f = this.GetWords(a.getY().toBigInteger().toRadix(16)),
+                g = this.GetWords(b.substr(0, 64)),
+                h = this.GetWords(b.substr(64, 64));
+            this.BlockUpdate(c, 0, c.length);
+            this.BlockUpdate(d, 0, d.length);
+            this.BlockUpdate(e, 0, e.length);
+            this.BlockUpdate(f, 0, f.length);
+            this.BlockUpdate(g, 0, g.length);
+            this.BlockUpdate(h, 0, h.length);
+            c = Array(this.GetDigestSize());
+            this.DoFinal(c, 0);
+            return c
+        },
+        GetWords: function (a) {
+            for (var b = [], c = a.length, d = 0; d < c; d += 2)
+                b[b.length] = parseInt(a.substr(d, 2), 16);
+            return b
+        },
+        GetHex: function (a) {
+            for (var b = [], c = 0, d = 0; d < 2 * a.length; d += 2)
+                b[d >>> 3] |= parseInt(a[c]) << 24 - d % 8 * 4,
+                c++;
+            return new CryptoJS.lib.WordArray.init(b, a.length)
+        }
+    };
+    Array.Clear = function (a, b, c) {
+        for (var elm in a)
+            a[elm] = null
+    };
+    Array.Copy = function (a, b, c, d, e) {
+        a = a.slice(b, b + e);
+        for (b = 0; b < a.length; b++)
+            c[d] = a[b],
+            d++
+    };
+    var Int32 = { //zdk  
+        minValue: -parseInt("10000000000000000000000000000000", 2),
+        maxValue: 2147483647,
+        parse: function (a) {
+            if (a < this.minValue) {
+                a = new Number(-a);
+                a = a.toString(2);
+                a = a.substr(a.length - 31, 31);
+                for (var b = "", c = 0; c < a.length; c++)
+                    var d = a.substr(c, 1),
+                        b = b + ("0" == d ? "1" : "0");
+                a = parseInt(b, 2);
+                return a + 1
+            }
+            if (a > this.maxValue) {
+                a = Number(a);
+                a = a.toString(2);
+                a = a.substr(a.length - 31, 31);
+                b = "";
+                for (c = 0; c < a.length; c++)
+                    d = a.substr(c, 1),
+                    b += "0" == d ? "1" : "0";
+                a = parseInt(b, 2);
+                return -(a + 1)
+            }
+            return a
+        },
+        parseByte: function (a) {
+            if (0 > a) {
+                a = new Number(-a);
+                a = a.toString(2);
+                a = a.substr(a.length - 8, 8);
+                for (var b = "", c = 0; c < a.length; c++)
+                    var d = a.substr(c, 1),
+                        b = b + ("0" == d ? "1" : "0");
+                return parseInt(b, 2) + 1
+            }
+            return 255 < a ? (a = Number(a),
+                a = a.toString(2),
+                parseInt(a.substr(a.length - 8, 8), 2)) : a
+        }
+    };
+    "undefined" != typeof KJUR && KJUR || (KJUR = {});
+    "undefined" != typeof KJUR.crypto && KJUR.crypto || (KJUR.crypto = {});
+    KJUR.crypto.SM3withSM2 = function (a) {
+        var b = new SecureRandom;
+        this.type = "SM2";
+        this.getBigRandom = function (a) {
+            return (new BigInteger(a.bitLength(), b)).mod(a.subtract(BigInteger.ONE)).add(BigInteger.ONE)
+        };
+        this.setNamedCurve = function (a) {
+            this.ecparams = KJUR.crypto.ECParameterDB.getByName(a);
+            this.pubKeyHex = this.prvKeyHex = null;
+            this.curveName = a
+        };
+        this.setPrivateKeyHex = function (a) {
+            this.isPrivate = !0;
+            this.prvKeyHex = a
+        };
+        this.setPublicKeyHex = function (a) {
+            this.isPublic = !0;
+            this.pubKeyHex = a
+        };
+        this.generateKeyPairHex = function () {
+            var a = this.getBigRandom(this.ecparams.n),
+                b = this.ecparams.G.multiply(a),
+                e = b.getX().toBigInteger(),
+                b = b.getY().toBigInteger(),
+                f = this.ecparams.keylen / 4,
+                a = ("0000000000" + a.toString(16)).slice(-f),
+                e = ("0000000000" + e.toString(16)).slice(-f),
+                b = ("0000000000" + b.toString(16)).slice(-f),
+                e = "04" + e + b;
+            this.setPrivateKeyHex(a);
+            this.setPublicKeyHex(e);
+            return {
+                ecprvhex: a,
+                ecpubhex: e
+            }
+        };
+        this.signWithMessageHash = function (a) {
+            return this.signHex(a, this.prvKeyHex)
+        };
+        this.signHex = function (a, b) {
+            var e = new BigInteger(b, 16),
+                f = this.ecparams.n,
+                g = new BigInteger(a, 16),
+                h = null,
+                k = null,
+                l = k = null;
+            do {
+                do
+                    k = this.generateKeyPairHex(),
+                    h = new BigInteger(k.ecprvhex, 16),
+                    k = ECPointFp.decodeFromHex(this.ecparams.curve, k.ecpubhex),
+                    k = g.add(k.getX().toBigInteger()),
+                    k = k.mod(f);
+                while (k.equals(BigInteger.ZERO) || k.add(h).equals(f));
+                var p = e.add(BigInteger.ONE),
+                    p = p.modInverse(f),
+                    l = k.multiply(e),
+                    l = h.subtract(l).mod(f),
+                    l = p.multiply(l).mod(f)
+            } while (l.equals(BigInteger.ZERO));
+            return KJUR.crypto.ECDSA.biRSSigToASN1Sig(k, l)
+        };
+        this.sign = function (a, b) {
+            var e = this.ecparams.n,
+                f = BigInteger.fromByteArrayUnsigned(a);
+            do
+                var g = this.getBigRandom(e),
+                    h = this.ecparams.G.multiply(g).getX().toBigInteger().mod(e);
+            while (0 >= h.compareTo(BigInteger.ZERO));
+            e = g.modInverse(e).multiply(f.add(b.multiply(h))).mod(e);
+            return this.serializeSig(h, e)
+        };
+        this.verifyWithMessageHash = function (a, b) {
+            return this.verifyHex(a, b, this.pubKeyHex)
+        };
+        this.verifyHex = function (a, b, e) {
+            var f;
+            f = KJUR.crypto.ECDSA.parseSigHex(b);
+            b = f.r;
+            f = f.s;
+            e = ECPointFp.decodeFromHex(this.ecparams.curve, e);
+            a = new BigInteger(a, 16);
+            return this.verifyRaw(a, b, f, e)
+        };
+        this.verify = function (a, b, e) {
+            var f;
+            if (Bitcoin.Util.isArray(b))
+                b = this.parseSig(b),
+                f = b.r,
+                b = b.s;
+            else if ("object" === typeof b && b.r && b.s)
+                f = b.r,
+                b = b.s;
+            else
+                throw "Invalid value for signature";
+            if (!(e instanceof ECPointFp))
+                if (Bitcoin.Util.isArray(e))
+                    e = ECPointFp.decodeFrom(this.ecparams.curve, e);
+                else
+                    throw "Invalid format for pubkey value, must be byte array or ECPointFp";
+            a = BigInteger.fromByteArrayUnsigned(a);
+            return this.verifyRaw(a, f, b, e)
+        };
+        this.verifyRaw = function (a, b, e, f) {
+            var g = this.ecparams.n,
+                h = this.ecparams.G,
+                k = b.add(e).mod(g);
+            if (k.equals(BigInteger.ZERO))
+                return !1;
+            e = h.multiply(e);
+            e = e.add(f.multiply(k));
+            a = a.add(e.getX().toBigInteger()).mod(g);
+            return b.equals(a)
+        };
+        this.serializeSig = function (a, b) {
+            var e = a.toByteArraySigned(),
+                f = b.toByteArraySigned(),
+                g = [];
+            g.push(2);
+            g.push(e.length);
+            g = g.concat(e);
+            g.push(2);
+            g.push(f.length);
+            g = g.concat(f);
+            g.unshift(g.length);
+            g.unshift(48);
+            return g
+        };
+        this.parseSig = function (a) {
+            var b;
+            if (48 != a[0])
+                throw Error("Signature not a valid DERSequence");
+            b = 2;
+            if (2 != a[b])
+                throw Error("First element in signature must be a DERInteger");
+            var e = a.slice(b + 2, b + 2 + a[b + 1]);
+            b += 2 + a[b + 1];
+            if (2 != a[b])
+                throw Error("Second element in signature must be a DERInteger");
+            a = a.slice(b + 2, b + 2 + a[b + 1]);
+            e = BigInteger.fromByteArrayUnsigned(e);
+            a = BigInteger.fromByteArrayUnsigned(a);
+            return {
+                r: e,
+                s: a
+            }
+        };
+        this.parseSigCompact = function (a) {
+            if (65 !== a.length)
+                throw "Signature has the wrong length";
+            var b = a[0] - 27;
+            if (0 > b || 7 < b)
+                throw "Invalid signature type";
+            var e = this.ecparams.n,
+                f = BigInteger.fromByteArrayUnsigned(a.slice(1, 33)).mod(e);
+            a = BigInteger.fromByteArrayUnsigned(a.slice(33, 65)).mod(e);
+            return {
+                r: f,
+                s: a,
+                i: b
+            }
+        };
+        void 0 !== a && void 0 !== a.curve && (this.curveName = a.curve);
+        void 0 === this.curveName && (this.curveName = "sm2");
+        this.setNamedCurve(this.curveName);
+        void 0 !== a && (void 0 !== a.prv && this.setPrivateKeyHex(a.prv),
+            void 0 !== a.pub && this.setPublicKeyHex(a.pub))
+    };
+    "undefined" != typeof KJUR && KJUR || (KJUR = {});
+    "undefined" != typeof KJUR.crypto && KJUR.crypto || (KJUR.crypto = {});
+    KJUR.crypto.ECParameterDB = new function () {
+        var a = {},
+            b = {};
+        this.getByName = function (c) {
+            var d = c;
+            "undefined" != typeof b[d] && (d = b[c]);
+            if ("undefined" != typeof a[d])
+                return a[d];
+            throw "unregistered EC curve name: " + d;
+        };
+        this.regist = function (c, d, e, f, g, h, k, l, p, n, q, m) {
+            a[c] = {};
+            e = new BigInteger(e, 16);
+            f = new BigInteger(f, 16);
+            g = new BigInteger(g, 16);
+            h = new BigInteger(h, 16);
+            k = new BigInteger(k, 16);
+            e = new ECCurveFp(e, f, g);
+            l = e.decodePointHex("04" + l + p);
+            a[c].name = c;
+            a[c].keylen = d;
+            a[c].curve = e;
+            a[c].G = l;
+            a[c].n = h;
+            a[c].h = k;
+            a[c].oid = q;
+            a[c].info = m;
+            for (d = 0; d < n.length; d++)
+                b[n[d]] = c
+        }
+    };
+    KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 : SECG curve over a 128 bit prime field");
+    KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 : SECG curve over a 160 bit prime field");
+    KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 : SECG curve over a 160 bit prime field");
+    KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);
+    KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);
+    KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);
+    KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);
+    KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);
+    KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);
+    KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]);
+    KJUR.crypto.ECParameterDB.regist("sm2", 256, "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", "1", "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", ["sm2", "SM2"]);
+
+    SM2Cipher.prototype = {
+        Reset: function () {
+            this.sm3keybase = new SM3Digest;
+            this.sm3c3 = new SM3Digest;
+            for (var a = this.p2.getX().toBigInteger().toRadix(16); 64 > a.length;)
+                a = "0" + a;
+            for (var a = this.GetWords(a), b = this.p2.getY().toBigInteger().toRadix(16); 64 > b.length;)
+                b = "0" + b;
+            b = this.GetWords(b);
+            this.sm3keybase.BlockUpdate(a, 0, a.length);
+            this.sm3c3.BlockUpdate(a, 0, a.length);
+            this.sm3keybase.BlockUpdate(b, 0, b.length);
+            this.ct = 1;
+            this.NextKey()
+        },
+        NextKey: function () {
+            var a = new SM3Digest(this.sm3keybase);
+            a.Update(this.ct >> 24 & 255);
+            a.Update(this.ct >> 16 & 255);
+            a.Update(this.ct >> 8 & 255);
+            a.Update(this.ct & 255);
+            a.DoFinal(this.key, 0);
+            this.keyOff = 0;
+            this.ct++
+        },
+        KDF: function (a) {
+            var b = Array(a),
+                c = new SM3Digest,
+                d = Array(32),
+                e = 1,
+                f = a / 32;
+            a %= 32;
+            for (var g = this.p2.getX().toBigInteger().toRadix(16); 64 > g.length;)
+                g = "0" + g;
+            for (var g = this.GetWords(g), h = this.p2.getY().toBigInteger().toRadix(16); 64 > h.length;)
+                h = "0" + h;
+            for (var h = this.GetWords(h), k = 0, l = 0; l < f; l++)
+                c.BlockUpdate(g, 0, g.length),
+                c.BlockUpdate(h, 0, h.length),
+                c.Update(e >> 24 & 255),
+                c.Update(e >> 16 & 255),
+                c.Update(e >> 8 & 255),
+                c.Update(e & 255),
+                c.DoFinal(b, k),
+                k += 32,
+                e++;
+            0 != a && (c.BlockUpdate(g, 0, g.length),
+                c.BlockUpdate(h, 0, h.length),
+                c.Update(e >> 24 & 255),
+                c.Update(e >> 16 & 255),
+                c.Update(e >> 8 & 255),
+                c.Update(e & 255),
+                c.DoFinal(d, 0));
+            Array.Copy(d, 0, b, k, a);
+            for (l = 0; l < b.length; l++)
+                b[l] &= 255;
+            return b
+        },
+        InitEncipher: function (a) {
+            var b = null,
+                c = null,
+                c = new KJUR.crypto.ECDSA({
+                    curve: "sm2"
+                }),
+                d = c.generateKeyPairHex(),
+                b = new BigInteger(d.ecprvhex, 16),
+                c = ECPointFp.decodeFromHex(c.ecparams.curve, d.ecpubhex);
+            this.p2 = a.multiply(b);
+            this.Reset();
+            return c
+        },
+        EncryptBlock: function (a) {
+            this.sm3c3.BlockUpdate(a, 0, a.length);
+            for (var b = this.KDF(a.length), c = 0; c < a.length; c++)
+                a[c] ^= b[c]
+        },
+        InitDecipher: function (a, b) {
+            this.p2 = b.multiply(a);
+            this.p2.getX().toBigInteger().toRadix(16);
+            this.p2.getY().toBigInteger().toRadix(16);
+            this.Reset()
+        },
+        DecryptBlock: function (a) {
+            for (var b = this.KDF(a.length), c = 0, d = "", c = 0; c < b.length; c++)
+                d += b[c].toString(16);
+            for (c = 0; c < a.length; c++)
+                a[c] ^= b[c];
+            this.sm3c3.BlockUpdate(a, 0, a.length)
+        },
+        Dofinal: function (a) {
+            for (var b = this.p2.getY().toBigInteger().toRadix(16); 64 > b.length;)
+                b = "0" + b;
+            b = this.GetWords(b);
+            this.sm3c3.BlockUpdate(b, 0, b.length);
+            this.sm3c3.DoFinal(a, 0);
+            this.Reset()
+        },
+        Encrypt: function (a, b) {
+            var c = Array(b.length);
+            Array.Copy(b, 0, c, 0, b.length);
+            var d = this.InitEncipher(a);
+            this.EncryptBlock(c);
+            var e = Array(32);
+            this.Dofinal(e);
+            for (var f = d.getX().toBigInteger().toRadix(16), d = d.getY().toBigInteger().toRadix(16); 64 > f.length;)
+                f = "0" + f;
+            for (; 64 > d.length;)
+                d = "0" + d;
+            f += d;
+            c = this.GetHex(c).toString();
+            0 != c.length % 2 && (c = "0" + c);
+            e = this.GetHex(e).toString();
+            d = f + c + e;
+            this.cipherMode == SM2CipherMode.C1C3C2 && (d = f + e + c);
+            return d
+        },
+        GetWords: function (a) {
+            for (var b = [], c = a.length, d = 0; d < c; d += 2)
+                b[b.length] = parseInt(a.substr(d, 2), 16);
+            return b
+        },
+        GetHex: function (a) {
+            for (var b = [], c = 0, d = 0; d < 2 * a.length; d += 2)
+                b[d >>> 3] |= parseInt(a[c]) << 24 - d % 8 * 4,
+                c++;
+            return new CryptoJS.lib.WordArray.init(b, a.length)
+        },
+        Decrypt: function (a, b) {
+            var c = b.substr(0, 64),
+                d = b.substr(0 + c.length, 64),
+                e = b.substr(c.length + d.length, b.length - c.length - d.length - 64),
+                f = b.substr(b.length - 64);
+            this.cipherMode == SM2CipherMode.C1C3C2 && (f = b.substr(c.length + d.length, 64),
+                e = b.substr(c.length + d.length + 64));
+            e = this.GetWords(e);
+            c = this.CreatePoint(c, d);
+            this.InitDecipher(a, c);
+            this.DecryptBlock(e);
+            c = Array(32);
+            this.Dofinal(c);
+            return this.GetHex(c).toString() == f ? (f = this.GetHex(e),
+                CryptoJS.enc.Utf8.stringify(f)) : ""
+        },
+        CreatePoint: function (a, b) {
+            var c = new KJUR.crypto.ECDSA({
+                curve: "sm2"
+            });
+            return ECPointFp.decodeFromHex(c.ecparams.curve, "04" + a + b)
+        }
+    };
+
+    /*-------------下面修改----------*/
+
+    var SM2Key = function (key) {
+        this.setKey(key);
+    };
+
+    function SM2SetKey(key) {
+        if (key && typeof key === 'object') {
+            this.eccX = key.eccX;
+            this.eccY = key.eccY;
+        } else {
+            this.eccX = "F1342ADB38855E1F8C37D1181378DE446E52788389F7DB3DEA022A1FC4D4D856";
+            this.eccY = "66FC6DE253C822F1E52914D9E0B80C5D825759CE696CF039A8449F98017510B7";
+        }
+    }
+
+    /* 
+     *加密数据 
+     */
+    function SM2Encrypt(text) {
+        var cipherMode = SM2CipherMode.C1C3C2,
+            cipher = new SM2Cipher(cipherMode),
+            textData = CryptoJS.enc.Utf8.parse(text);
+        var cipher = new SM2Cipher(cipherMode);
+        var userKey = cipher.CreatePoint(this.eccX, this.eccY);
+        var msgData = cipher.GetWords(textData.toString());
+
+        return cipher.Encrypt(userKey, msgData);
+    }
+
+    SM2Key.prototype.setKey = SM2SetKey;
+    SM2Key.prototype.encrypt = SM2Encrypt;
+
+    //export default SM2Key;  
+    global.SM2 = {
+        SM2CipherMode: SM2CipherMode,
+        SM2Cipher: SM2Cipher,
+        CryptoJS: CryptoJS
+    }
+}(window));
+
+window.SM2Utils = {};
+
+export function sm2Encrypt(data, publickey, cipherMode) {
+    cipherMode = cipherMode == 0 ? cipherMode : 1;
+    // msg = SM2.utf8tob64(msg);
+    var msgData = CryptoJS.enc.Utf8.parse(data);
+
+    msgData = CryptoJS.enc.Base64.stringify(msgData);
+	//在转utf-8
+    msgData = CryptoJS.enc.Utf8.parse(msgData);
+
+    var pubkeyHex = publickey;
+    if (pubkeyHex.length > 64 * 2) {
+        pubkeyHex = pubkeyHex.substr(pubkeyHex.length - 64 * 2);
+    }
+    var xHex = pubkeyHex.substr(0, 64);
+    var yHex = pubkeyHex.substr(64);
+    var cipher = new SM2Cipher(cipherMode);
+    var userKey = cipher.CreatePoint(xHex, yHex);
+    msgData = cipher.GetWords(msgData.toString());
+    var encryptData = cipher.Encrypt(userKey, msgData);
+
+    return '04' + encryptData;
+}
+
+/**
+ * 根据公钥进行加密
+ */
+SM2Utils.encs = function (key, s, cipherMode) {
+    if (s == null || s.length == 0) {
+        return "";
+    }
+    return sm2Encrypt(s, key, cipherMode);
+}

+ 0 - 1
src/utils/dict/DictOptions.js

@@ -8,7 +8,6 @@ export const options = {
        * 字典请求,方法签名为function(dictMeta: DictMeta): Promise
        */
       request: (dictMeta) => {
-        console.log(`load dict ${dictMeta.type}`)
         return Promise.resolve([])
       },
       /**

+ 111 - 56
src/utils/request.js

@@ -22,9 +22,63 @@ const service = axios.create({
   timeout: 60 * 60 * 1000
 })
 
+
+// 正在进行中的请求列表
+let reqList = [];
+let count = 0; // 请求接口计数器
+/**
+ * 阻止重复请求
+ * @param {array} reqList - 请求缓存列表
+ * @param {string} url - 当前请求地址
+ * @param {function} cancel - 请求中断函数
+ * @param {string} errorMessage - 请求中断时需要显示的错误信息
+ */
+const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
+  const errorMsg = errorMessage || ''
+  for (let i = 0; i < reqList.length; i++) {
+    if (reqList[i].url === url) {
+      // reqList[i].cancel(errorMsg); // 中断上一个重复请求
+      reqList[i].cancel(); // 中断上一个重复请求
+      reqList.splice(i, 1); // 删除上一个重复请求
+      reqList.push({ // 存储新的请求
+        url,
+        cancel
+      })
+      return
+    }
+  }
+  reqList.push({
+    url,
+    cancel
+  })
+}
+
+/**
+ * 允许某个请求可以继续进行
+ * @param {array} reqList 全部请求列表
+ * @param {string} url 请求地址
+ */
+const allowRequest = function (reqList, url) {
+  for (let i = 0; i < reqList.length; i++) {
+    if (reqList[i] === url) {
+      reqList.splice(i, 1)
+      break
+    }
+  }
+}
+
 // request拦截器
 service.interceptors.request.use(config => {
-  Vue.prototype.$layer.loading({content:'请稍等!'});
+  Vue.prototype.$layer.loading({ content: '请稍等!' });
+  let cancel = null;
+  // 设置cancelToken对象
+  config.cancelToken = new axios.CancelToken(function (c) {
+    cancel = c
+  })
+  // 阻止重复请求。当上个请求未完成时,相同的请求不会进行
+  stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
+  // ++count;
+
   // 是否需要设置 token
   const isToken = (config.headers || {}).isToken === false
   // 是否需要防止数据重复提交
@@ -35,13 +89,11 @@ service.interceptors.request.use(config => {
   // 请求参数加密
   if (process.env.VUE_APP_AES_ENCRYPT_ENABLED == 'true') {
     if (config.data) {
-      console.log(JSON.stringify(config.data));
       config.data = {
         // 加密参数
         dataParams: encodeURIComponent(aes.encrypt(JSON.stringify(config.data)))
       }
     } else if (config.params) {
-      console.log(JSON.stringify(config.params));
       config.params = {
         // 加密参数
         dataParams: encodeURIComponent(aes.encrypt(JSON.stringify(config.params)))
@@ -63,75 +115,78 @@ service.interceptors.request.use(config => {
     config.params = {};
     config.url = url;
   }
-	if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
-		const requestObj = {
-			url: config.url,
-			data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
-			time: new Date().getTime()
-		}
-		const sessionObj = cache.session.getJSON('sessionObj')
-		if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
-			cache.session.setJSON('sessionObj', requestObj)
-		} else {
-			cache.session.setJSON('sessionObj', requestObj)
-		}
-	}
+  if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
+    const requestObj = {
+      url: config.url,
+      data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
+      time: new Date().getTime()
+    }
+    const sessionObj = cache.session.getJSON('sessionObj')
+    if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
+      cache.session.setJSON('sessionObj', requestObj)
+    } else {
+      cache.session.setJSON('sessionObj', requestObj)
+    }
+  }
   return config
 }, error => {
-    console.log(error)
-    Promise.reject(error)
+  Promise.reject(error)
 })
 
 // 响应拦截器
 service.interceptors.response.use(res => {
-     setTimeout(() => {
-  	    Vue.prototype.$layer.closeAll('loading');
-     }, 500);
-    // 未设置状态码则默认成功状态
-    const code = res.data.code || 200;
-    // 获取错误信息
-    const msg = errorCode[code] || res.data.msg || errorCode['default']
-    // 二进制数据则直接返回
-    if(res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer'){
-      return res.data
-    }
-    if (code === 401) {
-      if (!isRelogin.show) {
-        isRelogin.show = true;
-        MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
-          confirmButtonText: '重新登录',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }
+  // setTimeout(() => {
+  //   Vue.prototype.$layer.closeAll('loading');
+  // }, 500);
+  if(res.status == 200)  Vue.prototype.$layer.closeAll('loading');
+  // --count;
+  // if (count === 0) {
+  //   Vue.prototype.$layer.closeAll('loading');
+  // }
+  // 未设置状态码则默认成功状态
+  const code = res.data.code || 200;
+  // 获取错误信息
+  const msg = errorCode[code] || res.data.msg || errorCode['default']
+  // 二进制数据则直接返回
+  if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
+    return res.data
+  }
+  if (code === 401) {
+    if (!isRelogin.show) {
+      isRelogin.show = true;
+      MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+        confirmButtonText: '重新登录',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }
       ).then(() => {
         isRelogin.show = false;
         store.dispatch('LogOut').then(() => {
-          location.href = '/index';
+          location.href = '/admin/index';
         })
       }).catch(() => {
         isRelogin.show = false;
       });
     }
-      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
-    } else if (code === 500) {
-      Message({
-        message: msg,
-        type: 'error'
-      })
-      return Promise.reject(new Error(msg))
-    } else if (code !== 200) {
-      Notification.error({
-        title: msg
-      })
-      return Promise.reject('error')
-    } else {
-      return res.data
-    }
-  },
+    return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+  } else if (code === 500) {
+    Message({
+      message: msg,
+      type: 'error'
+    })
+    return Promise.reject(new Error(msg))
+  } else if (code !== 200) {
+    Notification.error({
+      title: msg
+    })
+    return Promise.reject('error')
+  } else {
+    return res.data
+  }
+},
   error => {
-    console.log('err' + error)
     setTimeout(() => {
-       Vue.prototype.$layer.closeAll('loading');
+      Vue.prototype.$layer.closeAll('loading');
     }, 500);
     let { message } = error;
     if (message == "Network Error") {

+ 11 - 11
src/views/APICONFIG/index.vue

@@ -60,7 +60,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['business:APICONFIG:add']"
+          v-hasPermi="['apiconfig:APICONFIG:add']"
           >新增</el-button
         >
       </el-col>
@@ -72,7 +72,7 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['business:APICONFIG:edit']"
+          v-hasPermi="['apiconfig:APICONFIG:edit']"
           >修改</el-button
         >
       </el-col>
@@ -84,7 +84,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['business:APICONFIG:remove']"
+          v-hasPermi="['apiconfig:APICONFIG:remove']"
           >删除</el-button
         >
       </el-col>
@@ -95,7 +95,7 @@
           size="mini"
           icon="el-icon-upload"
           @click="openUpload = true"
-          v-hasPermi="['business:APICONFIG:export']"
+          v-hasPermi="['apiconfig:APICONFIG:export']"
           >导入</el-button
         >
       </el-col>
@@ -136,12 +136,12 @@
           {{ scope.row.apiCode }}
         </template>
       </el-table-column>
-      <el-table-column label="接口名称" align="center" prop="apiName">
+      <el-table-column label="接口名称" width="180" show-overflow-tooltip  align="center" prop="apiName">
         <template slot-scope="scope">
           {{ scope.row.apiName }}
         </template>
       </el-table-column>
-      <el-table-column label="接口url" align="center" prop="apiUrl">
+      <el-table-column label="接口url" width="180" show-overflow-tooltip align="center" prop="apiUrl">
         <template slot-scope="scope">
           {{ scope.row.apiUrl }}
         </template>
@@ -152,12 +152,13 @@
           <span v-else-if="scope.row.status == 0">不启用</span>
         </template>
       </el-table-column>
-      <el-table-column label="配置协议" align="center" prop="accord">
+      <el-table-column label="配置协议"  width="140" show-overflow-tooltip  align="center" prop="accord">
         <template slot-scope="scope">
           {{ scope.row.accord }}
         </template>
       </el-table-column>
       <el-table-column
+      width="180" 
         label="是否启用分布式线程"
         align="center"
         prop="hadoopFlag"
@@ -179,7 +180,7 @@
           <span v-else-if="scope.row.linkStatus == 0">失败</span>
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="remark">
+      <el-table-column label="备注" width="180" show-overflow-tooltip align="center" prop="remark">
         <template slot-scope="scope">
           {{ scope.row.remark }}
         </template>
@@ -195,7 +196,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:APICONFIG:edit']"
+            v-hasPermi="['apiconfig:APICONFIG:edit']"
             >修改</el-button
           >
           <el-button
@@ -203,7 +204,7 @@
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['business:APICONFIG:remove']"
+            v-hasPermi="['apiconfig:APICONFIG:remove']"
             >删除</el-button
           >
         </template>
@@ -535,7 +536,6 @@ export default {
       this.reset();
     },
     getCurrentRow(val) {
-      console.log(val);
     },
     // 表单重置
     reset() {

+ 3 - 13
src/views/ARTICLE/detail.vue

@@ -4,19 +4,9 @@
           <el-descriptions-item label="项目名称">{{
            form.atvName
           }}</el-descriptions-item>
-          <el-descriptions-item label="项目类别">
-            <!-- <el-tag v-if="form.scale == 1" type="success"
-              >小型</el-tag
-            >
-            <el-tag v-else-if="form.scale == 2" type="success"
-              >中型</el-tag
-            >
-            <el-tag v-else-if="form.scale == 3" type="success"
-              >大型</el-tag
-            > -->
-            {{ form.scale }}
+          <el-descriptions-item label="建设规模">
+            <el-tag type="success">{{ form.scale }}</el-tag>
           </el-descriptions-item>
-
           <el-descriptions-item label="年度投资计划(万)">{{
             form.plan
           }}</el-descriptions-item>
@@ -96,4 +86,4 @@ export default {
 </script>
 
 <style>
-</style>
+</style>

+ 21 - 12
src/views/ARTICLE/edit.vue

@@ -8,10 +8,14 @@
           style="width: 50%"
         ></el-input>
       </el-form-item>
-      <el-form-item label="项目类别" prop="scale">
+      <el-form-item label="建设规模" prop="scale">
+        <el-input
+          v-model="form.scale"
+          placeholder="请输入建设内容"
+        ></el-input>
         <!-- <el-select
           v-model="form.scale"
-          placeholder="请选择项目类别"
+          placeholder="请选择建设规模"
           @change="typeSelect"
           style="width: 50%"
         >
@@ -22,11 +26,6 @@
             :value="item.label"
           ></el-option>
         </el-select> -->
-        <el-input
-          v-model="form.scale"
-          placeholder="请输入项目类别"
-          style="width: 50%"
-        ></el-input>
       </el-form-item>
       <el-form-item label="建设内容" prop="content">
         <el-input
@@ -36,6 +35,14 @@
           placeholder="请输入建设内容"
         ></el-input>
       </el-form-item>
+      <el-form-item label="总投资金额(万)" prop="totalPlan">
+        <el-input
+          type="number"
+          v-model="form.totalPlan"
+          placeholder="请输入总投资金额"
+          style="width: 50%"
+        ></el-input>
+      </el-form-item>
       <el-form-item label="年度投资计划(万)" prop="plan">
         <el-input
           type="number"
@@ -46,9 +53,11 @@
       </el-form-item>
       <el-form-item label="形象进度" prop="schedule">
         <el-input
+          type="textarea"
+          :rows="5"
           v-model="form.schedule"
           placeholder="请输入形象进度"
-          style="width: 50%"
+          style="width: 100%"
         ></el-input>
       </el-form-item>
     </el-form>
@@ -88,7 +97,7 @@ export default {
           { required: true, message: "项目名称不能为空", trigger: "blur" },
         ],
         scale: [
-          { required: true, message: "项目类别不能为空", trigger: "blur" },
+          { required: true, message: "建设规模不能为空", trigger: "blur" },
         ],
         unit: [{ required: true, message: "单位不能为空", trigger: "blur" }],
         content: [
@@ -97,6 +106,9 @@ export default {
         plan: [
           { required: true, message: "年度投资计划不能为空", trigger: "blur" },
         ],
+        totalPlan: [
+          { required: true, message: "总投资金额不能为空", trigger: "blur" },
+        ],
         reality: [
           {
             required: true,
@@ -168,7 +180,6 @@ export default {
         if (valid) {
           this.form.status = type;
           if (this.form.id != null) {
-            // console.log("修改内容");
             updateARTICLE(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
               this.$layer.close(this.layerid);
@@ -176,7 +187,6 @@ export default {
             });
           } else {
             if (type == 0) {
-              // console.log("草稿保存");
               addARTICLE(this.form).then((response) => {
                 this.$modal.msgSuccess("保存成功");
                 this.$layer.close(this.layerid);
@@ -184,7 +194,6 @@ export default {
               });
             } 
             if (type == 1) {
-              // console.log("提交审核");
               addARTICLE(this.form).then((response) => {
                 this.$modal.msgSuccess("提交审核成功");
                 this.$layer.close(this.layerid);

+ 4 - 2
src/views/ARTICLE/enterData.vue

@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div style="width: 100%;">
     <div class="cmain">
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
         <el-form-item label="日期" prop="month">
@@ -17,8 +17,11 @@
 
         <el-form-item label="形象进度" prop="schedule">
           <el-input
+            type="textarea"
+            :row="5"
             v-model="form.schedule"
             placeholder="请输入形象进度"
+            style="width: 100%"
           ></el-input>
         </el-form-item>
       </el-form>
@@ -52,7 +55,6 @@ export default {
     },
   },
   created() {
-    // console.log(this.param.param);
   },
   data() {
     return {

+ 328 - 21
src/views/ARTICLE/index.vue

@@ -14,9 +14,36 @@
           placeholder="请输入项目名称"
         ></el-input>
       </el-form-item>
+      <el-form-item label="保税区">
+        <el-select v-model="queryParams.deptId" placeholder="请选择保税区">
+          <el-option
+            v-for="item in bsqList"
+            :key="item.value"
+            :label="item.deptName"
+            :value="item.deptId"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="年份" prop="year" label-width="110">
+        <!-- <el-select v-model="queryParams.year" placeholder="请选择年份" clearable filterable class="se">
+          <el-option v-for="item in nearYearList" :key="item" :label="item" :value="item" />
+        </el-select> -->
+        <el-date-picker
+          v-model="queryParams.year"
+          type="year"
+          value-format="yyyy"
+          placeholder="选择年">
+        </el-date-picker>
+      </el-form-item>
 
-      <el-form-item label="项目类别">
-        <!-- <el-select v-model="queryParams.scale" placeholder="请选择项目类别">
+      <el-form-item label="建设规模">
+        <el-input
+          v-model="queryParams.scale"
+          placeholder="请输入建设规模"
+        ></el-input>
+        <!-- <el-select v-model="queryParams.scale" placeholder="请输入建设规模">
           <el-option
             v-for="item in scaleList"
             :key="item.value + 'typeList'"
@@ -24,10 +51,6 @@
             :value="item.label"
           ></el-option>
         </el-select> -->
-        <el-input
-          v-model="queryParams.scale"
-          placeholder="请输入项目名称"
-        ></el-input>
       </el-form-item>
 
       <el-form-item label="年度计划投资" label-width="120px">
@@ -69,6 +92,7 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['business:ARTICLE:add']"
+          :disabled="isButtonDisabled"
           >新增</el-button
         >
       </el-col>
@@ -83,6 +107,27 @@
           >删除</el-button
         >
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          size="mini"
+          icon="el-icon-edit"
+          @click="handleInsert"
+          v-hasPermi="['business:ARTICLE:insert']"
+          >设置重点项目录入开放时间</el-button
+        >
+      </el-col>
+
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          size="mini"
+          icon="el-icon-search"
+          @click="handleSelect"
+          v-hasPermi="['business:ARTICLE:ArticleHis']"
+          >查看历史记录</el-button
+        >
+      </el-col>
       <right-toolbar
         :showSearch.sync="showSearch"
         @queryTable="getList"
@@ -90,40 +135,97 @@
     </el-row>
 
     <el-table :data="ARTICLEList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection"></el-table-column>
-      <el-table-column label="保税区名称" align="center" prop="deptName">
+      <el-table-column
+        type="selection"
+        :selectable="selected"
+      ></el-table-column>
+      <el-table-column
+        label="年份"
+        width="150"
+        show-overflow-tooltip
+        align="center"
+        prop="createTime"
+      >
+      <template slot-scope="scope">
+          {{ parseTime(scope.row.createTime, '{y}') }}
+      </template>
+      </el-table-column>
+      <el-table-column
+        label="保税区名称"
+        width="150"
+        show-overflow-tooltip
+        align="center"
+        prop="deptName"
+      >
         <template slot-scope="scope">
           {{ scope.row.deptName }}
         </template>
       </el-table-column>
-      <el-table-column label="项目名称" align="center" prop="atvName">
+      <el-table-column
+        label="项目名称"
+        width="180"
+        show-overflow-tooltip
+        align="center"
+        prop="atvName"
+      >
         <template slot-scope="scope">
           {{ scope.row.atvName }}
         </template>
       </el-table-column>
-      <el-table-column label="项目类别" align="center" prop="scale">
-       <template slot-scope="scope">
-        {{ scope.row.scale }}
-           <!-- <el-tag v-if="scope.row.scale == 1" type="success">小型</el-tag>
+      <el-table-column
+        label="建设规模"
+        show-overflow-tooltip
+        align="center"
+        prop="scale"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.scale }}
+          <!-- <el-tag v-if="scope.row.scale == 1" type="success">小型</el-tag>
           <el-tag v-else-if="scope.row.scale == 2" type="success">中型</el-tag>
-          <el-tag v-else-if="scope.row.scale == 3" type="success">大型</el-tag> -->
+          <el-tag v-else-if="scope.row.scale == 3" type="success">大型</el-tag>-->
         </template>
       </el-table-column>
-      <el-table-column label="年度投资计划(万)" align="center" prop="plan">
+
+      <el-table-column
+        label="年度投资计划(万)"
+        width="180"
+        show-overflow-tooltip
+        align="center"
+        prop="plan"
+      >
         <template slot-scope="scope">
           {{ scope.row.plan }}
         </template>
       </el-table-column>
       <el-table-column
+        width="180"
+        label="总投资金额(万)"
+        align="center"
+        prop="totalPlan"
+        show-overflow-tooltip
+      >
+        <template slot-scope="scope">
+          {{ scope.row.totalPlan }}
+        </template>
+      </el-table-column>
+      <el-table-column
         label="实际完成投资额(万)"
+        width="180"
         align="center"
         prop="reality"
+        show-overflow-tooltip
       >
         <template slot-scope="scope">
           {{ scope.row.reality }}
         </template>
       </el-table-column>
-      <el-table-column label="投资完成百分比" align="center" prop="retio">
+      <el-table-column
+        label="投资完成百分比"
+        width="180"
+        show-overflow-tooltip
+        align="center"
+        prop="retio"
+      >
         <template slot-scope="scope">
           {{
             scope.row.retio
@@ -132,12 +234,24 @@
           }}
         </template>
       </el-table-column>
-      <el-table-column label="形象进度" align="center" prop="schedule">
+      <el-table-column
+        label="形象进度"
+        width="200"
+        show-overflow-tooltip
+        align="center"
+        prop="schedule"
+      >
         <template slot-scope="scope">
           {{ scope.row.schedule }}
         </template>
       </el-table-column>
-      <el-table-column label="项目审核状态" align="center" prop="status">
+      <el-table-column
+        label="项目审核状态"
+        width="180"
+        show-overflow-tooltip
+        align="center"
+        prop="status"
+      >
         <template slot-scope="scope">
           <el-tag v-if="scope.row.status == 0">草稿</el-tag>
           <el-tag v-else-if="scope.row.status == 1" type="info">审核中</el-tag>
@@ -154,6 +268,8 @@
         label="操作"
         align="center"
         class-name="small-padding fixed-width"
+        fixed="right"
+        width="140"
       >
         <template slot-scope="scope">
           <el-button
@@ -187,6 +303,14 @@
             v-hasPermi="['business:ARTICLE:edit']"
             >数据填报</el-button
           >
+          <el-button
+            size="mini"
+            type="text"
+            v-if="scope.row.status == 0"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['business:ARTICLE:remove']"
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
@@ -198,10 +322,91 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+
+    <!-- 设置重点项目录入开放时间对话框 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="500px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="开放时间" prop="beginTime">
+          <el-date-picker
+            v-model="form.beginTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="截止时间" prop="endTime">
+          <el-date-picker
+            v-model="form.endTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 历史记录 -->
+    <el-dialog
+      :title="historyTitle"
+      :visible.sync="history"
+      :close-on-click-modal="false"
+      width="40%"
+      append-to-body
+    >
+      <el-timeline>
+        <el-timeline-item v-for="(item,index) in historyList" :timestamp="'版本:'+item.version" placement="top">
+          <el-card>
+            <!-- <h4>状态:{{ item.status }}</h4> -->
+            <p>开放时间:{{ item.beginTime }}</p>
+            <p>截止时间:{{ item.endTime }}</p>
+
+          </el-card>
+        </el-timeline-item>
+        
+      </el-timeline>
+      <!-- <el-timeline>
+          <el-timeline-item
+            v-for="(item, index) in form.taskVoList"
+            :timestamp="item.createTime"
+            placement="top"
+            :key="index + 'taskHisAction'"
+          >
+            <el-card>
+              <p>
+                {{ item.execName }}------{{
+                  item.status == 0
+                    ? "待审核"
+                    : item.status == 1
+                    ? "同意"
+                    : item.status == 2
+                    ? "驳回"
+                    : "退回"
+                }}------{{ item.acname }}------{{ item.createTime }}
+                <p v-if="item.comments != null">{{
+                  "审核意见:" + item.comments
+                }}</p>
+              </p>
+            </el-card>
+          </el-timeline-item>
+        </el-timeline> -->
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import {parseTime} from "@/utils/ruoyi";
 import {
   listARTICLE,
   getARTICLE,
@@ -209,14 +414,21 @@ import {
   addARTICLE,
   updateARTICLE,
   getUserInfo,
+  articleDate,
+  getqueryArticleDate,
+  getqueryArticleHisDate,
 } from "@/api/portal/ARTICLE/ARTICLE.js";
 import edit from "./edit.vue";
 import enterData from "./enterData.vue";
 import detail from "./detail.vue";
+import { listDept } from "@/api/system/dept";
+import {formatDate} from "@/utils/index.js";
 export default {
   name: "ARTICLE",
   data() {
     return {
+      bsqList: [],
+      isButtonDisabled: false,
       scaleList: [
         { label: "小型", value: 1 },
         { label: "中型", value: 2 },
@@ -246,6 +458,10 @@ export default {
       ARTICLEList: [],
       // 弹出层标题
       title: "",
+      // 历史记录列表
+      historyTitle: "",
+      history: false,
+      historyList:[],
       // 是否显示弹出层
       open: false,
       // 查询参数
@@ -268,17 +484,68 @@ export default {
         reality: null,
         retio: null,
         schedule: null,
-        least:null,
-        most:null
+        least: null,
+        most: null,
       },
       deptId: "",
+      // 表单参数
+      form: {
+        beginTime: "",
+        endTime: "",
+      },
+      rules: {
+        beginTime: [
+          { required: true, message: "开始时间不能为空", trigger: "blur" },
+        ],
+        endTime: [
+          { required: true, message: "截止时间不能为空", trigger: "blur" },
+          {
+            validator: (rule, value, callback) => {
+              if (new Date(value) < new Date(this.form.beginTime)) {
+                callback(new Error("截止时间不能早于开始时间"));
+              } else {
+                callback();
+              }
+            },
+            trigger: "blur",
+          },
+        ],
+      },
     };
   },
   created() {
+    listDept({ type: 2 }).then((res) => {
+      this.bsqList = res.data;
+    });
     this.getList();
     this.getDeptId();
+    this.getqueryArticleDate();
   },
   methods: {
+    //选择规则
+    selected(row, index) {
+      if (row.status != 0) {
+        // 选择多选框的功能就拿来批量删除,所以不是草稿禁选
+        return false;
+      } else {
+        return true;
+      }
+    },
+    //获取填报时间
+    getqueryArticleDate() {
+      getqueryArticleDate().then((res) => {
+        const beginTime = new Date(res.data.beginTime);
+        const endTime = new Date(res.data.endTime);
+        const currentTime = new Date();
+        this.form.beginTime = beginTime;
+        this.form.endTime = endTime;
+        // 检查当前时间是否在 beginTime 和 endTime 范围内
+        if (currentTime < beginTime || currentTime > endTime) {
+          this.isButtonDisabled = true;
+          this.$message.warning("当前日期不在填报时间范围内");
+        }
+      });
+    },
     getDeptId() {
       getUserInfo().then((res) => {
         this.deptId = res.user.deptId;
@@ -321,7 +588,8 @@ export default {
     // 取消按钮
     cancel() {
       this.open = false;
-      this.reset();
+      this.form.beginTime = "";
+      this.form.endTime = "";
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -381,6 +649,45 @@ export default {
         })
         .catch(() => {});
     },
+    //设置重点项目录入开放时间
+    handleInsert() {
+      this.getqueryArticleDate();
+      this.open = true;
+      this.title = "设置重点项目录入开放时间";
+    },
+
+    // 查看历史记录
+    handleSelect() {
+      this.history = true;
+      this.historyTitle = "查看历史记录";
+      getqueryArticleHisDate().then((res) => {
+        this.historyList = res.data;
+        this.historyList.forEach(item=>{
+          item.beginTime = formatDate(item.beginTime);
+          item.endTime = formatDate(item.endTime);
+        })
+        
+      });
+    },
+    submitForm() {
+      if (new Date(this.form.endTime) < new Date(this.form.beginTime)) {
+        this.$message.error("截止时间不能早于开始时间");
+        return;
+      }
+      const timeData = [
+        new Date(this.form.beginTime).getTime(),
+        new Date(this.form.endTime).getTime(),
+      ];
+
+      articleDate(timeData).then((res) => {
+        if (res.code == 200) {
+          this.$modal.msgSuccess("设置重点项目录入开放时间成功");
+          this.open = false;
+          this.getList();
+          this.getqueryArticleDate();
+        }
+      });
+    },
   },
 };
 </script>

+ 0 - 1
src/views/ARTICLE/task/index.vue

@@ -84,7 +84,6 @@ export default {
   },
   props: ["taskList"],
   created() {
-    console.log(this.taskList);
   },
   methods: {},
 };

+ 71 - 23
src/views/AttendMeeting/index.vue

@@ -40,17 +40,17 @@
     </el-form>
 
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['business:JOINTCONFERENCE:add']"
-          >发起会议</el-button
-        >
-      </el-col>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="primary"-->
+<!--          plain-->
+<!--          icon="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-if="checkPermi(['business:JOINTCONFERENCE:add'])"-->
+<!--          >发起会议</el-button-->
+<!--        >-->
+<!--      </el-col>-->
       <!-- <el-col :span="1.5">
         <el-button
           type="success"
@@ -71,7 +71,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['business:JOINTCONFERENCE:remove']"
+          v-if="checkPermi(['business:JOINTCONFERENCE:remove'])"
           >删除</el-button
         >
       </el-col>
@@ -87,19 +87,32 @@
     >
       <el-table-column type="selection" width="55" align="center" />
 
-      <el-table-column label="会议标题" align="center" prop="conferenceTitle">
+      <el-table-column
+        label="会议标题"
+        width="360"
+        align="center"
+        show-overflow-tooltip
+        fixed
+        prop="conferenceTitle"
+      >
         <template slot-scope="scope">
           {{ scope.row.conferenceTitle }}
         </template>
       </el-table-column>
 
-      <el-table-column label="协作单位" align="center" prop="cooperativeUnit">
+      <el-table-column
+        label="协作单位"
+        width="500"
+        align="center"
+        show-overflow-tooltip
+        prop="cooperativeUnit"
+      >
         <template slot-scope="scope">
           {{ scope.row.cooperativeUnit }}
         </template>
       </el-table-column>
 
-      <el-table-column label="会议状态" align="center" prop="status">
+      <el-table-column label="会议状态" width="100" align="center" prop="status">
         <template slot-scope="scope">
           <el-tag v-if="scope.row.status == 1">未指派</el-tag>
           <el-tag v-else-if="scope.row.status == 2" type="success"
@@ -108,8 +121,24 @@
           <el-tag v-else-if="scope.row.status == 3" type="info">已完成</el-tag>
         </template>
       </el-table-column>
+      <el-table-column
+        label="提交人"
+        width="140"
+        align="center"
+        show-overflow-tooltip
+        prop="createByName"
+      >
+      </el-table-column>
+      <el-table-column
+        label="提交时间"
+        width="160"
+        align="center"
+        show-overflow-tooltip
+        prop="createTime"
+      >
+      </el-table-column>
 
-      <el-table-column label="已回复单位数量" align="center" prop="replied">
+      <el-table-column label="已回复单位数量"  width="200" align="center" prop="replied">
         <template slot-scope="scope">
           {{ scope.row.replied }}
         </template>
@@ -117,7 +146,9 @@
 
       <el-table-column
         label="操作"
+        fixed="right"
         align="center"
+        width="220"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
@@ -125,21 +156,28 @@
             size="mini"
             type="text"
             @click="goDetail(scope.row)"
-            v-hasPermi="['business:JOINTCONFERENCE:query']"
+            v-if="checkPermi(['business:JOINTCONFERENCE:query'])"
             >会议详情</el-button
           >
           <el-button
             size="mini"
             type="text"
             @click="handleUnit(scope.row)"
-            v-hasPermi="['business:JOINTCONFERENCE:add']"
+            v-if="
+              scope.row.condition != 1 &&
+              scope.row.status != 3 &&
+              checkPermi(['business:JOINTCONFERENCE:edit'])
+            "
             >单位指派</el-button
           >
           <el-button
             size="mini"
             type="text"
             @click="handleReply(scope.row)"
-            v-hasPermi="['business:JOINTCONFERENCE:edit']"
+            v-if="
+              scope.row.status != 3 &&
+              checkPermi(['business:CONFERENCEREPLY:add'])
+            "
             >会议回复</el-button
           >
         </template>
@@ -157,6 +195,8 @@
 </template>
 
 <script>
+import { getUserInfo } from "@/api/portal/ARTICLE/ARTICLE";
+
 import {
   listJOINTCONFERENCE,
   getJOINTCONFERENCE,
@@ -169,9 +209,9 @@ import detail from "@/views/JOINTCONFERENCE/detail.vue";
 import callback from "@/views/JOINTCONFERENCE/callback.vue";
 
 import { getInfo } from "@/api/login";
+import { checkPermi } from "@/utils/permission.js";
 
 export default {
-  // name: "JOINTCONFERENCE",
   data() {
     return {
       meetId: null,
@@ -263,6 +303,7 @@ export default {
     });
   },
   methods: {
+    checkPermi,
     goDetail(row) {
       this.iframe({
         obj: detail,
@@ -276,7 +317,7 @@ export default {
       const id = row.id || this.ids;
       this.iframe({
         obj: add,
-        param: { id: id },
+        param: { id: id, edit: true },
         title: "单位指派",
         width: "750px",
         height: "60%",
@@ -297,6 +338,7 @@ export default {
 
       listJOINTCONFERENCE(this.queryParams).then((response) => {
         this.JOINTCONFERENCEList = response.rows;
+        this.JOINTCONFERENCEList?.map((item) => item?.createByName ? '' : item.createByName = item?.createBy_dictText)
         this.total = response.total;
         this.loading = false;
       });
@@ -343,7 +385,7 @@ export default {
         param: {},
         title: "发起会议",
         width: "750px",
-        height: "60%",
+        height: "70%",
       });
     },
     /** 修改按钮操作 */
@@ -358,7 +400,7 @@ export default {
 
       this.iframe({
         obj: add,
-        param: {id:id},
+        param: { id: id },
         title: "修改会议",
         width: "750px",
         height: "60%",
@@ -411,3 +453,9 @@ export default {
   },
 };
 </script>
+
+<style scoped lang="scss">
+p {
+  margin: 0;
+}
+</style>

+ 463 - 0
src/views/AuxiliaryIndex/index.vue

@@ -0,0 +1,463 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="是否启用" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择"
+          clearable
+          filterable
+        >
+          <el-option
+            v-for="dict in statusOpt"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-if="checkPermi(['norm:NORMROLE:add'])"
+          >新增</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-if="checkPermi(['norm:NORMROLE:edit'])"
+          >修改</el-button
+        >
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-if="checkPermi(['norm:NORMROLE:remove'])"
+          >删除</el-button
+        >
+      </el-col>
+      <!-- <el-col :span="1.5">
+          <el-button
+            type="warning"
+            plain
+            icon="el-icon-download"
+            size="mini"
+            @click="handleExport"
+            v-hasPermi="['business:NORMROLE:export']"
+            >导出</el-button
+          >
+        </el-col> -->
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table :data="NORMROLEList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column label="指标名称" align="center">
+        <template slot-scope="scope">
+          <!-- <el-link
+              @click="tableBdClick(scope.row)"
+              class="text-color"
+              type="primaty"> -->
+          {{ scope.row.fname }}
+          <!-- </el-link> -->
+        </template>
+      </el-table-column>
+      <el-table-column label="指标内容" width="350" show-overflow-tooltip align="center" prop="content"></el-table-column>
+
+      <el-table-column label="角色名称" align="center" prop="senId_dictText">
+      </el-table-column>
+      <el-table-column label="是否启用" align="center" prop="status">
+        <template slot-scope="scope">
+          <el-switch
+            v-model="scope.row.status"
+            @change="statusChange(scope.row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注"  width="200" show-overflow-tooltip align="center" prop="remark">
+      </el-table-column>
+      <el-table-column
+      fixed="right"
+        label="操作"
+        align="center"
+        width="120"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-if="checkPermi(['norm:NORMROLE:edit'])"
+            >修改</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-if="checkPermi(['norm:NORMROLE:remove'])"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改指标采集权限配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="35%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="选择角色" prop="senId">
+          <el-select filterable multiple   v-model="form.senId" placeholder="请选择">
+            <el-option
+              v-for="(item) in roleList"
+              :key="item.value"
+              :label="item.roleName"
+              :value="item.roleId"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="选择指标" prop="feeId">
+          <el-select filterable v-model="form.feeId" placeholder="请选择">
+            <el-option
+              v-for="(item) in indList"
+              :key="item.value"
+              :label="item.content"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listNORMROLE,
+  getNORMROLE,
+  delNORMROLE,
+  addNORMROLE,
+  updateNORMROLE,
+  setNORMROLEStop,
+  setNORMROLEStart,
+  listAllNORMROLE,
+  getNORMROLEAllList,
+} from "@/api/portal/RightDistribution/RightDistribution";
+import { listQUOTAFEE } from "@/api/norm/QUOTAFEE";
+
+import { listRole } from "@/api/system/role";
+import { checkPermi } from "@/utils/permission.js";
+
+export default {
+  name: "NORMROLE",
+  data() {
+    return {
+      roleValue: "",
+      indValue: "",
+
+      statusOpt: [
+        {
+          label: "未启用",
+          value: 0,
+        },
+        {
+          label: "启用",
+          value: 1,
+        },
+      ],
+      // 根路径
+      baseURL: process.env.VUE_APP_BASE_API,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 指标采集权限配置表格数据
+      NORMROLEList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        nsType: 2,
+        normId: null,
+        id: null,
+        createTime: null,
+        createBy: null,
+        updateTime: null,
+        updateBy: null,
+        delFlag: null,
+        deptId: null,
+        feeId: null,
+        senId: null,
+        status: null,
+        startTime: null,
+        stopTime: null,
+        remark: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        roleId: [{ required: true, message: "角色不能为空", trigger: "blur" }],
+        ind: [{ required: true, message: "指标不能为空", trigger: "blur" }],
+        deptId: [
+          { required: true, message: "部门id不能为空", trigger: "blur" },
+        ],
+        normId: [{ required: true, message: "指标不能为空", trigger: "blur" }],
+        feeId: [{ required: true, message: "指标不能为空", trigger: "blur" }],
+        senId: [{ required: true, message: "角色不能为空", trigger: "blur" }],
+        status: [
+          {
+            required: true,
+            message: "是否启用(1=启用,0不启用)不能为空",
+            trigger: "blur",
+          },
+        ],
+        startTime: [
+          { required: true, message: "启用时间不能为空", trigger: "blur" },
+        ],
+        stopTime: [
+          { required: true, message: "停用时间不能为空", trigger: "blur" },
+        ],
+        remark: [{ required: true, message: "备注不能为空", trigger: "blur" }],
+      },
+      indList: [],
+      roleList: [],
+    };
+  },
+  created() {
+    this.getList();
+    this.getNormroleallList();
+    this.getRoleList();
+  },
+  methods: {
+    checkPermi,
+    changeInd(i) {
+      this.form.feeId = this.indList[i].normId;
+      this.form.fname = this.indList[i].normName;
+    },
+    changeRole(i) {
+      this.form.senId = this.roleList[i].roleId;
+    },
+    statusChange(val) {
+      if (val.status == 0) {
+        setNORMROLEStart(val.id).then((res) => {
+          if (res.code == 200) {
+            this.$message.success("修改成功");
+          }
+        });
+      } else {
+        setNORMROLEStop(val.id).then((res) => {
+          if (res.code == 200) {
+            this.$message.success("修改成功");
+          }
+        });
+      }
+      this.getList();
+    },
+
+    tableBdClick(data) {
+      this.queryParams.id = data.senId;
+      listNORMROLE(this.pageParams).then((res) => {
+      });
+    },
+
+    // 查询指标采集权限配置所有列表
+    getNormroleallList() {
+      listQUOTAFEE().then((res) => {
+        this.indList = res.rows;
+      });
+    },
+
+    // 查询角色列表
+    getRoleList() {
+      listRole().then((res) => {
+        this.roleList = res.rows;
+      });
+    },
+    /** 查询指标采集权限配置列表 */
+    getList() {
+      this.loading = true;
+      listNORMROLE(this.queryParams).then((response) => {
+        response.rows.forEach((item, index) => {
+          response.rows[index].status = item.status == 0 ? false : true;
+        });
+        this.NORMROLEList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        delFlag: null,
+        deptId: null,
+        feeId: null,
+        senId: null,
+        status: null,
+        startTime: null,
+        stopTime: null,
+        remark: null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加辅助指标采集权限分配";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getNORMROLE(id).then((response) => {
+        this.form = response.data;
+        this.form.roleName = "张三";
+        this.form.senId = this.form.senId.split(",");
+        this.form.senId.forEach((item,i)=>{
+          this.form.senId[i] = +item;
+        });
+        this.open = true;
+        this.title = "修改辅助指标采集权限分配";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.senId = this.form.senId.toString();
+          if (this.form.id != null) {
+            updateNORMROLE(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            this.form.nsType = 2;
+            this.form.status = 1;
+            addNORMROLE(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal
+        .confirm('是否确认删除指标采集权限配置编号为"' + ids + '"的数据项?')
+        .then(function () {
+          return delNORMROLE(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "/NORMROLE/export",
+        {
+          ...this.queryParams,
+        },
+        `NORMROLE_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>

+ 286 - 136
src/views/BONDED/index.vue

@@ -7,74 +7,125 @@
       </el-form-item>
     </el-form> -->
 
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['business:BONDED:add']"
-          >注册</el-button
-        >
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['business:BONDED:edit']"
-          >修改</el-button
-        >
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['business:BONDED:remove']"
-          >删除</el-button
-        >
-      </el-col>
-      <right-toolbar
-        :showSearch.sync="showSearch"
-        @queryTable="getList"
-      ></right-toolbar>
-    </el-row>
+<!--    上方按钮暂时不用-->
+<!--    <el-row :gutter="10" class="mb8">-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="primary"-->
+<!--          plain-->
+<!--          icon="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['business:BONDED:add']"-->
+<!--          >注册</el-button-->
+<!--        >-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['business:BONDED:edit']"-->
+<!--          >修改</el-button-->
+<!--        >-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['business:BONDED:remove']"-->
+<!--          >删除</el-button-->
+<!--        >-->
+<!--      </el-col>-->
+<!--      <right-toolbar-->
+<!--        :showSearch.sync="showSearch"-->
+<!--        @queryTable="getList"-->
+<!--      ></right-toolbar>-->
+<!--    </el-row>-->
 
     <el-table
-      
       :data="BONDEDList"
       @selection-change="handleSelectionChange"
     >
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="保税区名称" align="center" prop="bondedName">
+<!--      <el-table-column type="selection" width="55" align="center" ></el-table-column>-->
+      <el-table-column label="保税区名称" align="center" prop="deptName"></el-table-column>
+      <el-table-column label="产品定位" align="center" prop="industryOrientation" show-overflow-tooltip>
         <template slot-scope="scope">
-          {{ scope.row.bondedName }}
+          {{ scope.row.industryOrientation }}
         </template>
       </el-table-column>
-      <el-table-column label="场站编号" align="center" prop="yardNumber">
+      <el-table-column label="规划面积(公顷)" align="center" prop="planningArea">
         <template slot-scope="scope">
-          {{ scope.row.yardNumber }}
+          {{ scope.row.planningArea }}
         </template>
       </el-table-column>
-      <el-table-column label="成立时间" align="center" prop="establishedTime">
+      <el-table-column label="验收面积(公顷)" align="center" prop="acceptanceArea">
         <template slot-scope="scope">
-          {{ scope.row.establishedTime }}
+          {{ scope.row.acceptanceArea }}
         </template>
       </el-table-column>
-      <el-table-column label="地址" align="center" prop="site">
+      <el-table-column label="批复时间" align="center" prop="approvalTime">
         <template slot-scope="scope">
-          {{ scope.row.site }}
+          <span>{{ parseTime(scope.row.approvalTime, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
+      <el-table-column label="已使用面积(公顷)" width="200"  show-overflow-tooltip align="center" prop="useArea">
+        <template slot-scope="scope">
+          {{ scope.row.useArea }}
+        </template>
+      </el-table-column>
+      <el-table-column label="使用率" align="center" prop="usageRate">
+        <template slot-scope="scope">
+          {{ scope.row.usageRate }}
+        </template>
+      </el-table-column>
+      <el-table-column label="标仓面积(公顷)" align="center" prop="warehouse">
+        <template slot-scope="scope">
+          {{ scope.row.warehouse }}
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="标仓使用面积(万平方米)" align="center" prop="warehouseUsable">
+        <template slot-scope="scope">
+          {{ scope.row.warehouseUsable }}
+        </template>
+      </el-table-column>
+      <el-table-column label="油库面积(万平方米)" align="center" prop="oilDepot">
+        <template slot-scope="scope">
+          {{ scope.row.oilDepot }}
+        </template>
+      </el-table-column>
+      <el-table-column label="油库使用面积(万平方米)" align="center" prop="oilDepotUsable">
+        <template slot-scope="scope">
+          {{ scope.row.oilDepotUsable }}
+        </template>
+      </el-table-column>
+      <el-table-column label="冷库面积(万平方米)" align="center" prop="refrigeratory">
+        <template slot-scope="scope">
+          {{ scope.row.refrigeratory }}
+        </template>
+      </el-table-column>
+      <el-table-column label="冷库使用面积(万平方米)" align="center" prop="refrigeratoryUsable">
+        <template slot-scope="scope">
+          {{ scope.row.refrigeratoryUsable }}
+        </template>
+      </el-table-column>
+      <el-table-column label="厂房面积(万平方米)" align="center" prop="workshop">
+        <template slot-scope="scope">
+          {{ scope.row.workshop }}
+        </template>
+      </el-table-column>
+      <el-table-column label="厂房使用面积(万平方米)" align="center" prop="workshopUsable">
+        <template slot-scope="scope">
+          {{ scope.row.workshopUsable }}
+        </template>
+      </el-table-column> -->
       <el-table-column
         label="操作"
         align="center"
@@ -85,61 +136,130 @@
             size="mini"
             type="text"
             icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:BONDED:edit']"
+            @click="handleUpdate(scope.row.deptId)"
+            v-hasPermi="['business:BONDED:query']"
             >修改</el-button
           >
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['business:BONDED:remove']"
-            >删除</el-button
-          >
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-delete"-->
+<!--            @click="handleDelete(scope.row.deptId)"-->
+<!--            v-hasPermi="['business:BONDED:remove']"-->
+<!--            >删除</el-button-->
+<!--          >-->
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+<!--    <pagination-->
+<!--      v-show="total > 0"-->
+<!--      :total="total"-->
+<!--      :page.sync="queryParams.pageNum"-->
+<!--      :limit.sync="queryParams.pageSize"-->
+<!--      @pagination="getList"-->
+<!--    />-->
 
     <!-- 添加或修改保税区管理对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-        <el-form-item label="保税区名称" prop="bondedName">
-          <el-input
-            v-model="form.bondedName"
-            placeholder="请输入保税区名称"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="场站编号" prop="yardNumber">
-          <el-input
-            v-model="form.yardNumber"
-            placeholder="请输入场站编号"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="成立时间" prop="establishedTime">
-          <el-date-picker
-            v-model="form.establishedTime"
-            type="date"
-            placeholder="选择日期"
-            format="yyyy 年 MM 月 dd 日"
-            value-format="yyyy-MM-dd"
-          >
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="地址" prop="site">
-          <el-input v-model="form.site" placeholder="请输入地址"></el-input>
-        </el-form-item>
+    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="60%" append-to-body novalidate>
+      <el-form ref="form" :model="form" :rules="rules" label-width="200px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="保税区名称" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="请输入保税区名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="产品定位" prop="industryOrientation">
+              <el-input v-model="form.industryOrientation" placeholder="请输入" type="textarea" autosize></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="规划面积(公顷)" prop="planningArea">
+              <el-input type="number" v-model="form.planningArea" placeholder="请输入(公顷)" ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="验收面积(公顷)" prop="acceptanceArea">
+              <el-input type="number" v-model="form.acceptanceArea" placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="已使用面积(公顷)" prop="useArea">
+              <el-input type="number" v-model="form.useArea" placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="批复时间" prop="approvalTime">
+              <el-date-picker
+                style="width: 100%"
+                v-model="form.approvalTime"
+                type="date"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="标仓面积(公顷)" prop="warehouse">
+              <el-input type="number" v-model="form.warehouse"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="标仓使用面积(公顷)" prop="warehouseUsable">
+              <el-input type="number" v-model="form.warehouseUsable"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="油库面积(公顷)" prop="oilDepot">
+              <el-input type="number" v-model="form.oilDepot"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="油库使用面积(公顷)" prop="oilDepotUsable">
+              <el-input type="number" v-model="form.oilDepotUsable"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="冷库面积(公顷)" prop="refrigeratory">
+              <el-input type="number" v-model="form.refrigeratory"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="冷库使用面积(公顷)" prop="refrigeratoryUsable">
+              <el-input type="number" v-model="form.refrigeratoryUsable"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="厂房面积(公顷)" prop="workshop">
+              <el-input type="number" v-model="form.workshop"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="厂房使用面积(公顷)" prop="workshopUsable">
+              <el-input type="number" v-model="form.workshopUsable"  placeholder="请输入(公顷)"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12"></el-col>
+          <el-col :span="12"></el-col>
+        </el-row>
+
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button type="primary" @click="submitForm(form)">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
@@ -199,24 +319,21 @@ export default {
       form: {},
       // 表单校验
       rules: {
-        id: [{ required: true, message: "主键id不能为空", trigger: "blur" }],
-        delFlag: [
-          { required: true, message: "删除标记不能为空", trigger: "blur" },
-        ],
-        deptId: [
-          { required: true, message: "部门id不能为空", trigger: "blur" },
-        ],
-        bondedName: [
-          { required: true, message: "保税区名称不能为空", trigger: "blur" },
-        ],
-        yardNumber: [
-          { required: true, message: "场站编号不能为空", trigger: "blur" },
-          { pattern: /^[1-9a-zA-Z]{1,}$/, message: '场站编号只能输入数字和字母', trigger: 'blur' }
-        ],
-        establishedTime: [
-          { required: true, message: "成立时间不能为空", trigger: "blur" },
-        ],
-        site: [{ required: true, message: "地址不能为空", trigger: "blur" }],
+        deptName: [{ required: true, message: "保税区名称不能为空", trigger: "blur" },],
+        industryOrientation: [{ required: true, message: "产业定位不能为空", trigger: "blur" }],
+        planningArea: [{ required: true, message: "规划面积不能为空", trigger: "blur" }],
+        acceptanceArea: [{ required: true, message: "验收面积不能为空", trigger: "blur" }],
+        useArea: [{ required: true, message: "已使用面积不能为空", trigger: "blur" }],
+        usageRate: [{ required: true, message: "使用率不能为空", trigger: "blur" }],
+        warehouse: [{ required: true, message: "仓库面积不能为空", trigger: "blur" }],
+        warehouseUsable: [{ required: true, message: "仓库使用面积不能为空", trigger: "blur" }],
+        oilDepot: [{ required: true, message: "油库面积不能为空", trigger: "blur" }],
+        oilDepotUsable: [{ required: true, message: "油库使用面积不能为空", trigger: "blur" }],
+        refrigeratory: [{ required: true, message: "冷库面积不能为空", trigger: "blur" }],
+        refrigeratoryUsable: [{ required: true, message: "冷库使用面积不能为空", trigger: "blur" }],
+        workshop: [{ required: true, message: "厂房面积不能为空", trigger: "blur" }],
+        workshopUsable: [{ required: true, message: "厂房使用面积不能为空", trigger: "blur" }],
+        approvalTime: [{ required: true, message: "批复时间不能为空", trigger: "blur" }],
       },
     };
   },
@@ -228,7 +345,7 @@ export default {
     getList() {
       this.loading = true;
       listBONDED(this.queryParams).then((response) => {
-        this.BONDEDList = response.rows;
+        this.BONDEDList = response;
         this.total = response.total;
         this.loading = false;
       });
@@ -276,40 +393,69 @@ export default {
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const id = row.id || this.ids;
-      getBONDED(id).then((response) => {
+      // const id = row.id || this.ids;
+      getBONDED(row).then((response) => {
         this.form = response.data;
         this.open = true;
-        this.title = "修改保税区管理";
+        this.title = "修改保税区信息管理";
       });
     },
+    handleNumberInput(key) {
+      // 将输入的值转换为整数
+      this.form[key] = parseInt(this.form[key]);
+
+      // 如果需要检查是否是数字,可以添加以下检查
+      if (isNaN(this.form[key])) {
+        this.form[key] = 0; // 或者设置为默认值
+      }
+    },
     /** 提交按钮 */
     submitForm() {
-      this.$refs["form"].validate((valid) => {
-        if (valid) {
-          if (this.form.id != null) {
-            updateBONDED(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addBONDED(this.form).then((response) => {
-              this.$modal.msgSuccess("注册成功");
-              this.open = false;
-              this.getList();
-            });
+      // 验证输入是否是有效的数字
+      const isNumber = (value) => !isNaN(parseFloat(value)) && isFinite(value);
+      this.form.useArea = parseFloat(this.form.useArea)
+
+      if (isNumber(this.form.acceptanceArea) &&
+        isNumber(this.form.useArea) &&
+        isNumber(this.form.warehouseUsable) &&
+        isNumber(this.form.oilDepotUsable) &&
+        isNumber(this.form.refrigeratoryUsable) &&
+        isNumber(this.form.workshopUsable) &&
+        isNumber(this.form.planningArea) &&
+        isNumber(this.form.warehouse) &&
+        isNumber(this.form.oilDepot) &&
+        isNumber(this.form.refrigeratory) &&
+        isNumber(this.form.workshop)
+      ) {
+        this.$refs["form"].validate((valid) => {
+          if (valid) {
+            if (this.form.deptId != null) {
+              updateBONDED(this.form).then((response) => {
+                this.$modal.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              });
+            } else {
+              addBONDED(this.form).then((response) => {
+                this.$modal.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              });
+            }
           }
-        }
-      });
+        });
+      } else {
+        // 处理无效输入的逻辑
+        this.$modal.msgError("请输入有效的数字");
+      }
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const ids = row.id || this.ids;
+      // const ids = row.id || this.ids;
       this.$modal
         .confirm("是否确认删除?")
         .then(function () {
-          return delBONDED(ids);
+          return delBONDED(row);
         })
         .then(() => {
           this.getList();
@@ -330,3 +476,7 @@ export default {
   },
 };
 </script>
+
+<style>
+.el-tooltip__popper{font-size: 14px; max-width:40% }/* 设置显示隐藏部分内容,按40%显示 */
+</style>

+ 155 - 147
src/views/BONDEDUPPLY/index.vue

@@ -12,39 +12,16 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['business:BONDEDUPPLY:add']"
-          >新增</el-button
-        >
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['business:BONDEDUPPLY:add']">新增</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['business:BONDEDUPPLY:edit']"
-          >修改</el-button
-        >
+        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
+          v-hasPermi="['business:BONDEDUPPLY:edit']">修改</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['business:BONDEDUPPLY:remove']"
-          >删除</el-button
-        >
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
+          v-hasPermi="['business:BONDEDUPPLY:remove']">删除</el-button>
       </el-col>
       <!-- <el-col :span="1.5">
         <el-button
@@ -57,176 +34,182 @@
           >导出</el-button
         >
       </el-col> -->
-      <right-toolbar
-        :showSearch.sync="showSearch"
-        @queryTable="getList"
-      ></right-toolbar>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
     <el-table :data="BONDEDUPPLYList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="录单单位名称 " align="center" prop="lddwmc">
+      <el-table-column label="录单单位名称 "  width="220" show-overflow-tooltip  align="center" prop="lddwmc">
       </el-table-column>
-      <el-table-column label="进出口标志 " align="center" prop="jckbz">
+      <el-table-column label="进出口标志 "  width="140" show-overflow-tooltip  align="center" prop="jckbz">
       </el-table-column>
-      <el-table-column label="进出口日期 " align="center" prop="jckrq">
+      <el-table-column label="进出口日期 "  width="140" show-overflow-tooltip  align="center" prop="jckrq">
       </el-table-column>
-      <el-table-column label="净重 " align="center" prop="jz">
+      <el-table-column label="净重 "  width="100" show-overflow-tooltip  align="center" prop="jz">
       </el-table-column>
-      <el-table-column label="净值 " align="center" prop="jingzhi">
+      <el-table-column label="净值 "  width="100" show-overflow-tooltip  align="center" prop="jingzhi">
       </el-table-column>
-      <el-table-column label="件数 " align="center" prop="js">
+      <el-table-column label="件数 "  width="100" show-overflow-tooltip  align="center" prop="js">
       </el-table-column>
-      <el-table-column label="境内收发货人编号 " align="center" prop="jnsfhrbh">
+      <el-table-column label="境内收发货人编号 "  width="220" show-overflow-tooltip  align="center" prop="jnsfhrbh">
       </el-table-column>
-      <el-table-column label="境内收发货人名称 " align="center" prop="jnsfhrmc">
+      <el-table-column label="境内收发货人名称 "  width="220" show-overflow-tooltip  align="center" prop="jnsfhrmc">
       </el-table-column>
-      <el-table-column label="境外发货人代码 " align="center" prop="jwfhrdm">
+      <el-table-column label="境外发货人代码 "  width="220" show-overflow-tooltip  align="center" prop="jwfhrdm">
       </el-table-column>
-      <el-table-column label="境外收发货人名称 " align="center" prop="jwsfhrmc">
+      <el-table-column label="境外收发货人名称 "  width="220" show-overflow-tooltip  align="center" prop="jwsfhrmc">
       </el-table-column>
-      <el-table-column label="境外收发货人地址 " align="center" prop="jwsfhrdz">
+      <el-table-column label="境外收发货人地址 "  width="220" show-overflow-tooltip  align="center" prop="jwsfhrdz">
       </el-table-column>
-      <el-table-column label="启运日期 " align="center" prop="qyrq">
+      <el-table-column label="启运日期 "  width="220" show-overflow-tooltip  align="center" prop="qyrq">
       </el-table-column>
-      <el-table-column label="卸毕日期 " align="center" prop="xbrq">
+      <el-table-column label="卸毕日期 "  width="220" show-overflow-tooltip  align="center" prop="xbrq">
       </el-table-column>
-      <el-table-column label="供应链主键" align="center" prop="id">
+      <!-- <el-table-column label="供应链主键"  width="220" show-overflow-tooltip  align="center" prop="id">
       </el-table-column>
-      <el-table-column label="保税区主键" align="center" prop="deptId">
+      <el-table-column label="保税区主键"  width="220" show-overflow-tooltip  align="center" prop="deptId">
+      </el-table-column> -->
+      <el-table-column label="报关单币种统计 "  width="220" show-overflow-tooltip  align="center" prop="bgdbztj">
       </el-table-column>
-      <el-table-column label="报关单币种统计 " align="center" prop="bgdbztj">
+      <el-table-column label="申报单位名称 "  width="220" show-overflow-tooltip  align="center" prop="sbdwmc">
       </el-table-column>
-      <el-table-column label="申报单位名称 " align="center" prop="sbdwmc">
+      <el-table-column label="录单单位编码名称 "  width="220" show-overflow-tooltip  align="center" prop="lddwbmmc">
       </el-table-column>
-      <el-table-column label="录单单位编码名称 " align="center" prop="lddwbmmc">
-      </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
-      </el-table-column>
-      <el-table-column
-        fixed="right"
-        label="操作"
-        align="center"
-        class-name="small-padding fixed-width"
-        width="120px"
-      >
+
+      <el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width" width="120px">
         <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:BONDEDUPPLY:edit']"
-            >修改</el-button
-          >
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['business:BONDEDUPPLY:remove']"
-            >删除</el-button
-          >
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:BONDEDUPPLY:edit']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['business:BONDEDUPPLY:remove']">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
 
     <!-- 添加或修改保税区供应链数据对话框 -->
-    <el-dialog
-      :title="title"
-      :visible.sync="open"
-      :close-on-click-modal="false"
-      width="35%"
-      append-to-body
-    >
-      <el-tabs v-model="activeName">
-        <el-tab-pane label="基本信息" name="first">
-          <el-form ref="forms" :model="form" :rules="rules" label-width="140px">
+    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="65%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="140px">
+        <el-row>
+          <el-col :span="12">
             <el-form-item label="录单单位名称" prop="lddwmc">
               <el-input v-model="form.lddwmc"></el-input>
             </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="进出口标志" prop="jckbz">
               <el-input v-model="form.jckbz"></el-input>
             </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
             <el-form-item label="进出口日期" prop="jckrq">
-              <el-date-picker
-                v-model="form.jckrq"
-                type="date"
-                value-format="yyyy-MM-dd"
-                placeholder="选择日期"
-              >
+              <!-- <el-input v-model="form.jckrq"></el-input> -->
+              <el-date-picker style="width: 100%" v-model="form.jckrq" type="date" value-format="yyyy-MM-dd"
+                placeholder="选择日期">
               </el-date-picker>
             </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="净重" prop="jz">
               <el-input v-model="form.jz"></el-input>
             </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
             <el-form-item label="净值" prop="jingzhi">
               <el-input v-model="form.jingzhi"></el-input>
             </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="件数" prop="js">
               <el-input v-model="form.js"></el-input>
             </el-form-item>
-
-            <el-form-item label="启运日期  " prop="qyrq">
-              <el-date-picker
-                v-model="form.qyrq"
-                type="date"
-                value-format="yyyy-MM-dd"
-                placeholder="选择日期"
-              >
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="卸毕日期   " prop="xbrq">
-              <!-- <el-input v-model="form.xbrq"></el-input> -->
-              <el-date-picker
-                v-model="form.xbrq"
-                type="date"
-                value-format="yyyy-MM-dd"
-                placeholder="选择日期"
-              >
-              </el-date-picker>
-            </el-form-item>
-
-            <el-form-item label="报关单币种统计   " prop="bgdbztj">
-              <el-input v-model="form.bgdbztj"></el-input>
-            </el-form-item>
-            <el-form-item label="申报单位名称   " prop="sbdwmc">
-              <el-input v-model="form.sbdwmc"></el-input>
-            </el-form-item>
-            <el-form-item label="录单单位编码名称   " prop="lddwbmmc">
-              <el-input v-model="form.lddwbmmc"></el-input>
-            </el-form-item>
-          </el-form>
-        </el-tab-pane>
-        <el-tab-pane label="境内外信息" name="second">
-          <el-form ref="form" :model="form" :rules="rules" label-width="140px">
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
             <el-form-item label="境内收发货人标号" prop="jnsfhrbh">
               <el-input v-model="form.jnsfhrbh"></el-input>
             </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="境内收发货人名称 " prop="jnsfhrmc">
               <el-input v-model="form.jnsfhrmc"></el-input>
             </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
             <el-form-item label="境外发货人代码 " prop="jwfhrdm">
               <el-input v-model="form.jwfhrdm"></el-input>
             </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="境外收发货人名称   " prop="jwsfhrmc">
               <el-input v-model="form.jwsfhrmc"></el-input>
             </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="卸毕日期   " prop="xbrq">
+              <!--              <el-input v-model="form.xbrq"></el-input>-->
+              <el-date-picker style="width: 100%" v-model="form.xbrq" type="date" value-format="yyyy-MM-dd"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="启运日期  " prop="qyrq">
+              <!-- <el-input v-model="form.qyrq"></el-input> -->
+              <el-date-picker style="width: 100%" v-model="form.qyrq" type="date" value-format="yyyy-MM-dd"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
             <el-form-item label="境外收发货人地址   " prop="jwsfhrdz">
               <el-input v-model="form.jwsfhrdz"></el-input>
             </el-form-item>
-          </el-form>
-        </el-tab-pane>
-      </el-tabs>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="报关单币种统计   " prop="bgdbztj">
+              <el-input v-model="form.bgdbztj"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="申报单位名称   " prop="sbdwmc">
+              <el-input v-model="form.sbdwmc"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="录单单位编码名称   " prop="lddwbmmc">
+              <el-input v-model="form.lddwbmmc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12"></el-col>
+          <el-col :span="12"></el-col>
+        </el-row>
 
+        <!-- <el-form-item label="供应链主键  " prop="id">
+          <el-input v-model="form.id"></el-input>
+        </el-form-item>
+        <el-form-item label="保税区主键  " prop="deptId">
+          <el-input v-model="form.deptId"></el-input>
+        </el-form-item> -->
+      </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
@@ -306,17 +289,41 @@ export default {
         jckrq: [
           { required: true, message: "进出口日期 不能为空", trigger: "blur" },
         ],
-        jz: [{ required: true, message: "净重 不能为空", trigger: "blur" }],
+        jz: [
+          { required: true, message: "净重 不能为空", trigger: "blur" },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "请输入正整数",
+            trigger: "blur"
+          }
+        ],
         jingzhi: [
           { required: true, message: "净值 不能为空", trigger: "blur" },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "请输入正整数",
+            trigger: "blur"
+          }
+        ],
+        js: [
+          { required: true, message: "件数 不能为空", trigger: "blur" },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "请输入正整数",
+            trigger: "blur"
+          }
         ],
-        js: [{ required: true, message: "件数 不能为空", trigger: "blur" }],
         jnsfhrbh: [
           {
             required: true,
             message: "境内收发货人编号 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "请输入正整数",
+            trigger: "blur"
+          }
         ],
         jnsfhrmc: [
           {
@@ -353,10 +360,10 @@ export default {
           { required: true, message: "卸毕日期 不能为空", trigger: "blur" },
         ],
         id: [
-          { required: true, message: "供应链主键不能为空", trigger: "blur" },
+          { required: true, message: "供应链不能为空", trigger: "blur" },
         ],
         deptId: [
-          { required: true, message: "保税区主键不能为空", trigger: "blur" },
+          { required: true, message: "保税区不能为空", trigger: "blur" },
         ],
         bgdbztj: [
           {
@@ -364,6 +371,11 @@ export default {
             message: "报关单币种统计 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "不能为负数",
+            trigger: "blur"
+          }
         ],
         sbdwmc: [
           { required: true, message: "申报单位名称 不能为空", trigger: "blur" },
@@ -433,7 +445,6 @@ export default {
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map((item) => item.id);
-      console.log(this.ids);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -445,14 +456,12 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      console.log(row.lddwmc);
       this.reset();
       let lddwmc = row.id || this.ids;
       getBONDEDUPPLY(lddwmc).then((response) => {
         this.form = response.data;
         this.open = true;
         this.title = "修改保税区供应链数据";
-        console.log(this.form, "form");
       });
     },
     /** 提交按钮 */
@@ -483,7 +492,7 @@ export default {
               this.reset();
             });
           }
-        }else{
+        } else {
           this.$message.error("请补全境内外信息");
         }
       });
@@ -491,7 +500,6 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const lddwmcs = row.id || this.ids;
-      console.log(lddwmcs);
       this.$modal
         .confirm(
           '是否确认删除保税区供应链数据编号为"' + lddwmcs + '"的数据项?'
@@ -503,7 +511,7 @@ export default {
           this.getList();
           this.$modal.msgSuccess("删除成功");
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     /** 导出按钮操作 */
     handleExport() {

+ 341 - 124
src/views/COMPANYUSER/index.vue

@@ -1,37 +1,84 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      :inline="true"
+      v-show="showSearch"
+    >
       <el-form-item label="姓名" prop="nickName">
-        <el-input v-model="queryParams.nickName" placeholder="请输入姓名"></el-input>
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="请输入姓名"
+        ></el-input>
       </el-form-item>
       <el-form-item label="用户名" prop="userName">
-        <el-input v-model="queryParams.userName" placeholder="请输入用户名"></el-input>
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入用户名"
+        ></el-input>
       </el-form-item>
       <el-form-item label="类型" prop="type">
-        <el-select v-model="queryParams.type" placeholder="请选择类型" clearable filterable>
-          <el-option v-for="dict in typeList" :key="dict.value + 'typeList'" :label="dict.label" :value="dict.value" />
+        <el-select
+          v-model="queryParams.type"
+          placeholder="请选择类型"
+          clearable
+          filterable
+        >
+          <el-option
+            v-for="dict in typeList"
+            :key="dict.value + 'typeList'"
+            :label="dict.label"
+            :value="dict.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery"
+          >搜索</el-button
+        >
         <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="success" icon="el-icon-search" :disabled="single" @click="handleView" v-hasPermi="['business:COMPANYUSER:query']">查看</el-button>
+        <el-button
+          type="success"
+          icon="el-icon-search"
+          :disabled="single"
+          @click="handleView"
+          v-hasPermi="['business:COMPANYUSER:query']"
+          >查看</el-button
+        >
       </el-col>
       <el-col :span="1.5">
-        <el-button type="success" icon="el-icon-edit" :disabled="single" @click="handleUpdate" v-hasPermi="['business:COMPANYUSER:edit']">修改</el-button>
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['business:COMPANYUSER:edit']"
+          >修改</el-button
+        >
       </el-col>
       <el-col :span="1.5">
-        <el-button type="danger" icon="el-icon-delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['business:COMPANYUSER:remove']">删除</el-button>
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['business:COMPANYUSER:remove']"
+          >删除</el-button
+        >
       </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <el-table  :data="COMPANYUSERList" @selection-change="handleSelectionChange">
+    <el-table :data="COMPANYUSERList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="姓名" align="left" prop="nickName">
         <template slot-scope="scope">
@@ -69,55 +116,119 @@
           {{ scope.row.research }}
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template slot-scope="scope">
-          <el-button size="mini" type="text" icon="el-icon-search" @click="handleView(scope.row)" v-hasPermi="['business:COMPANYUSER:query']">查看</el-button>
-          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:COMPANYUSER:edit']">修改</el-button>
-          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['business:COMPANYUSER:remove']">删除</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-search"
+            @click="handleView(scope.row)"
+            v-hasPermi="['business:COMPANYUSER:query']"
+            >查看</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:COMPANYUSER:edit']"
+            >修改</el-button
+          >
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['business:COMPANYUSER:remove']"
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
 
     <!-- 添加或修改门户用户对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="850px" :close-on-click-modal="false" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="850px"
+      :close-on-click-modal="false"
+      append-to-body
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="12">
             <el-form-item label="用户类型" prop="type">
-              <el-select v-model="form.type" placeholder="请选择类型" :disabled="isViewMode" filterable style="width: 100%">
-                <el-option v-for="dict in typeList" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+              <el-select
+                v-model="form.type"
+                placeholder="请选择类型"
+                :disabled="isViewMode"
+                filterable
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="dict in typeList"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="用户姓名" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="请输入姓名" :disabled="isViewMode"></el-input>
+              <el-input
+                v-model="form.nickName"
+                placeholder="请输入姓名"
+                :disabled="isViewMode"
+              ></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="学历" prop="education">
-              <el-select v-model="form.education" placeholder="请选择" :disabled="isViewMode" style="width: 100%">
+              <el-select
+                v-model="form.education"
+                placeholder="请选择"
+                :disabled="isViewMode"
+                style="width: 100%"
+              >
                 <el-option
                   v-for="item in options1"
                   :key="item.value"
                   :label="item.label"
-                  :value="item.value">
+                  :value="item.value"
+                >
                 </el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="工作经验" prop="experience">
-              <el-select v-model="form.experience" placeholder="请选择" :disabled="isViewMode" style="width: 100%">
+              <el-select
+                v-model="form.experience"
+                placeholder="请选择"
+                :disabled="isViewMode"
+                style="width: 100%"
+              >
                 <el-option
                   v-for="item in options2"
                   :key="item.value"
                   :label="item.label"
-                  :value="item.value">
+                  :value="item.value"
+                >
                 </el-option>
               </el-select>
             </el-form-item>
@@ -126,7 +237,12 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="性别" prop="gender">
-              <el-select v-model="form.gender" placeholder="请选择" :disabled="isViewMode" style="width: 100%">
+              <el-select
+                v-model="form.gender"
+                placeholder="请选择"
+                :disabled="isViewMode"
+                style="width: 100%"
+              >
                 <el-option
                   v-for="item in options3"
                   :key="item.value"
@@ -139,7 +255,12 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="民族" prop="nation">
-              <el-select v-model="form.nation" placeholder="请选择" :disabled="isViewMode" style="width: 100%">
+              <el-select
+                v-model="form.nation"
+                placeholder="请选择"
+                :disabled="isViewMode"
+                style="width: 100%"
+              >
                 <el-option
                   v-for="item in nationOptions"
                   :key="item.id"
@@ -154,18 +275,26 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="专业领域" prop="field">
-              <el-input v-model="form.field" placeholder="请输入专业领域" :disabled="isViewMode"></el-input>
+              <el-input
+                v-model="form.field"
+                placeholder="请输入专业领域"
+                :disabled="isViewMode"
+              ></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="研究方向" prop="research">
-              <el-input v-model="form.research" placeholder="请输入研究方向" :disabled="isViewMode"></el-input>
+              <el-input
+                v-model="form.research"
+                placeholder="请输入研究方向"
+                :disabled="isViewMode"
+              ></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="出生日期" prop="birthDate" >
+            <el-form-item label="出生日期" prop="birthDate">
               <el-date-picker
                 style="width: 100%"
                 v-model="form.birthDate"
@@ -179,43 +308,70 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="服务项目" prop="servicesAvailable">
-              <el-input v-model="form.servicesAvailable" placeholder="请输入服务项目" :disabled="isViewMode"></el-input>
+              <!-- <el-input
+                v-model="form.servicesAvailable"
+                placeholder="请输入服务项目"
+                :disabled="isViewMode"
+              ></el-input> -->
+
+              <el-select
+                :disabled="isViewMode"
+                v-model="form.servicesAvailable"
+                placeholder="请选择服务项目"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in markList"
+                  :label="item.mark"
+                  :key="item.dictCode"
+                  :value="item.mark"
+                >
+                </el-option>
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row v-if="isViewMode">
+        <el-row  v-if="isShow">
           <el-col :span="12">
             <el-form-item label="学位证书" prop="diploma">
-              <el-image
-                v-if="form.credentials"
+              <cropper v-if="!isViewMode" v-model="form.diploma" :fixed_number="[3, 4]"></cropper>
+                <el-image
+                v-if="isViewMode"
                 :fit="'contain'"
                 style="
-                width: 20%;
-                margin-top: 10px;
-                border-radius: 5px;
-                margin-bottom: -15px;"
+                  width: 100px;
+                  margin-top: 10px;
+                  border-radius: 5px;
+                  margin-bottom: -15px;
+                "
                 :z-index="500"
-                :src="this.baseURL + form.diploma"
+                :src="baseIP + form.diploma"
               ></el-image>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="资格证书" prop="credentials">
-              <el-image
-                v-if="form.credentials"
+              <cropper
+                v-if="!isViewMode"
+                v-model="form.credentials"
+                :fixed_number="[3, 4]"
+              ></cropper>
+               <el-image
+                 v-if="isViewMode"
                 :fit="'contain'"
                 style="
-                width: 20%;
-                margin-top: 10px;
-                border-radius: 5px;
-                margin-bottom: -15px;"
+                  width:100px;
+                  margin-top: 10px;
+                  border-radius: 5px;
+                  margin-bottom: -15px;
+                "
                 :z-index="500"
-                :src="this.baseURL + form.credentials"
+                :src="baseIP + form.credentials"
               ></el-image>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row v-else>
+        <!-- <el-row v-else>
           <el-col :span="12">
             <el-form-item label="学位证书" prop="diploma">
               <cropper v-model="form.diploma" :fixed_number="[3, 4]"></cropper>
@@ -223,13 +379,16 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="资格证书" prop="credentials">
-              <cropper v-model="form.credentials" :fixed_number="[3, 4]"></cropper>
+              <cropper
+                v-model="form.credentials"
+                :fixed_number="[3, 4]"
+              ></cropper>
             </el-form-item>
           </el-col>
-        </el-row>
+        </el-row> -->
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button type="primary" @click="submitForm" v-if="!isViewMode">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
@@ -237,24 +396,36 @@
 </template>
 
 <script>
-import { listCOMPANYUSER, getCOMPANYUSER, delCOMPANYUSER, addCOMPANYUSER, updateCOMPANYUSER } from '@/api/portal/COMPANYUSER/COMPANYUSER.js';
-import { nation as nationOptions } from '@/utils/nation'; // 导入数组
-
+import {
+  listCOMPANYUSER,
+  getCOMPANYUSER,
+  delCOMPANYUSER,
+  addCOMPANYUSER,
+  updateCOMPANYUSER,
+  getMark,
+} from "@/api/portal/COMPANYUSER/COMPANYUSER.js";
+import { nation as nationOptions } from "@/utils/nation"; // 导入数组
 
 export default {
-  name: 'COMPANYUSER',
+  name: "COMPANYUSER",
   computed: {
-    nationOptions() {return nationOptions;},
+    nationOptions() {
+      return nationOptions;
+    },
   },
   data() {
     return {
+      // 专家的资格证书、学位证书
+      isShow: true,
+      markList: [],
       isViewMode: false,
       typeList: [
-        { label: '普通用户', value: '1' },
-        { label: '专家', value: '2' }
+        { label: "普通用户", value: "1" },
+        { label: "专家", value: "2" },
       ],
       // 根路径
       baseURL: process.env.VUE_APP_BASE_API,
+      baseIP:process.env.VUE_APP_BASE_IP,
       // 遮罩层
       loading: true,
       // 选中数组
@@ -270,7 +441,7 @@ export default {
       // 门户用户表格数据
       COMPANYUSERList: [],
       // 弹出层标题
-      title: '',
+      title: "",
       // 是否显示弹出层
       open: false,
       // 查询参数
@@ -293,67 +464,104 @@ export default {
         education: null,
         experience: null,
         field: null,
-        research: null
+        research: null,
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
-        id: [{ required: true, message: '$comment不能为空', trigger: 'blur' }],
-        delFlag: [{ required: true, message: '删除标识不能为空', trigger: 'blur' }],
-        nickName: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
-        userName: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
-        password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
-        loginIp: [{ required: true, message: '登录ip不能为空', trigger: 'blur' }],
-        loginDate: [{ required: true, message: '登录日期不能为空', trigger: 'blur' }],
-        type: [{ required: true, message: '类型不能为空', trigger: 'change' }],
-        baseInfo: [{ required: true, message: '基本信息不能为空', trigger: 'blur' }],
-        education: [{ required: true, message: '学历不能为空', trigger: 'blur' }],
-        experience: [{ required: true, message: '工作经验不能为空', trigger: 'blur' }],
-        field: [{ required: true, message: '专业领域不能为空', trigger: 'blur' }],
-        research: [{ required: true, message: '研究方向不能为空', trigger: 'blur' }]
+        id: [{ required: true, message: "$comment不能为空", trigger: "blur" }],
+        delFlag: [
+          { required: true, message: "删除标识不能为空", trigger: "blur" },
+        ],
+        nickName: [
+          { required: true, message: "姓名不能为空", trigger: "blur" },
+        ],
+        userName: [
+          { required: true, message: "用户名不能为空", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "密码不能为空", trigger: "blur" },
+        ],
+        loginIp: [
+          { required: true, message: "登录ip不能为空", trigger: "blur" },
+        ],
+        loginDate: [
+          { required: true, message: "登录日期不能为空", trigger: "blur" },
+        ],
+        type: [{ required: true, message: "类型不能为空", trigger: "change" }],
+        baseInfo: [
+          { required: true, message: "基本信息不能为空", trigger: "blur" },
+        ],
+        education: [
+          { required: true, message: "学历不能为空", trigger: "blur" },
+        ],
+        experience: [
+          { required: true, message: "工作经验不能为空", trigger: "blur" },
+        ],
+        field: [
+          { required: true, message: "专业领域不能为空", trigger: "blur" },
+        ],
+        research: [
+          { required: true, message: "研究方向不能为空", trigger: "blur" },
+        ],
       },
-      options1: [{
-        value: '专科',
-        label: '专科'
-      }, {
-        value: '本科',
-        label: '本科'
-      }, {
-        value: '研究生',
-        label: '研究生'
-      }, {
-        value: '博士',
-        label: '博士'
-      }],
-      options2: [{
-        value: '5年以下',
-        label: '5年以下'
-      }, {
-        value: '5-10年',
-        label: '5-10年'
-      }, {
-        value: '10年以上',
-        label: '10年以上'
-      }],
-      options3: [{
-        value: '1',
-        label: '男'
-      }, {
-        value: '2',
-        label: '女'
-      }],
-      value: ''
+      options1: [
+        {
+          value: "专科",
+          label: "专科",
+        },
+        {
+          value: "本科",
+          label: "本科",
+        },
+        {
+          value: "研究生",
+          label: "研究生",
+        },
+        {
+          value: "博士",
+          label: "博士",
+        },
+      ],
+      options2: [
+        {
+          value: "5年以下",
+          label: "5年以下",
+        },
+        {
+          value: "5-10年",
+          label: "5-10年",
+        },
+        {
+          value: "10年以上",
+          label: "10年以上",
+        },
+      ],
+      options3: [
+        {
+          value: 1,
+          label: "男",
+        },
+        {
+          value: 2,
+          label: "女",
+        },
+      ],
+      value: "",
     };
   },
   created() {
     this.getList();
+    getMark().then((res) => {
+      this.markList = res.data;
+    });
   },
   methods: {
     /** 查询门户用户列表 */
     getList() {
       this.loading = true;
-      listCOMPANYUSER(this.queryParams).then(response => {
+      listCOMPANYUSER(this.queryParams).then((response) => {
         this.COMPANYUSERList = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -379,9 +587,10 @@ export default {
         education: null,
         experience: null,
         field: null,
-        research: null
+        research: null,
       };
-      this.resetForm('form');
+      this.isShow = true;
+      this.resetForm("form");
     },
     /** 搜索按钮操作 */
     handleQuery() {
@@ -390,12 +599,12 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm('queryForm');
+      this.resetForm("queryForm");
       this.handleQuery();
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id);
+      this.ids = selection.map((item) => item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -403,42 +612,50 @@ export default {
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = '添加门户用户';
+      this.title = "添加门户用户";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
       const id = row.id || this.ids;
-      getCOMPANYUSER(id).then(response => {
+      getCOMPANYUSER(id).then((response) => {
         this.form = response.data;
         this.open = true;
         this.isViewMode = false;
-        this.title = '修改门户用户';
+        this.title = "修改门户用户";
+        if(this.form.type == 1){
+          this.isShow = false;
+        }
+
       });
     },
     handleView(row) {
+      
+      this.open = true;
       this.reset();
       const id = row.id || this.ids;
-      getCOMPANYUSER(id).then(response => {
+      getCOMPANYUSER(id).then((response) => {
         this.form = response.data;
         this.isViewMode = true;
-        this.open = true;
-        this.title = '查看门户用户';
+        this.title = "查看门户用户";
+        if(this.form.type == 1){
+          this.isShow = false;
+        }
       });
     },
     /** 提交按钮 */
     submitForm() {
-      this.$refs['form'].validate(valid => {
+      this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.form.id != null) {
-            updateCOMPANYUSER(this.form).then(response => {
-              this.$modal.msgSuccess('修改成功');
+            updateCOMPANYUSER(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addCOMPANYUSER(this.form).then(response => {
-              this.$modal.msgSuccess('新增成功');
+            addCOMPANYUSER(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
               this.open = false;
               this.getList();
             });
@@ -450,26 +667,26 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$modal
-        .confirm('是否确认删除这个门户用户吗?')
+        .confirm("是否确认删除这个门户用户吗?")
         .then(function () {
           return delCOMPANYUSER(ids);
         })
         .then(() => {
           this.getList();
-          this.$modal.msgSuccess('删除成功');
+          this.$modal.msgSuccess("删除成功");
         })
         .catch(() => {});
     },
     /** 导出按钮操作 */
     handleExport() {
       this.download(
-        'business/COMPANYUSER/export',
+        "business/COMPANYUSER/export",
         {
-          ...this.queryParams
+          ...this.queryParams,
         },
         `COMPANYUSER_${new Date().getTime()}.xlsx`
       );
-    }
-  }
+    },
+  },
 };
 </script>

+ 1 - 1
src/views/CONTACTUS/index.vue

@@ -159,7 +159,7 @@ export default {
         depName: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }],
         pcode: [{ required: true, message: '单位编码不能为空', trigger: 'blur' }],
         telphone: [{ required: true, message: '联系电话不能为空', trigger: 'blur' },
-                { validator: this.validateMobile, trigger: 'blur' }],
+                ],
         location: [{ required: true, message: '位置不能为空', trigger: 'blur' }],
         email: [{ required: true, message: '邮箱不能为空', trigger: 'blur' },
                 { validator: this.validEmailFun, trigger: 'blur' }

+ 20 - 7
src/views/COUNSELINGMESSAGE/edit.vue

@@ -1,14 +1,14 @@
 <template>
   <div class="cmain">
-    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+    <el-form ref="form" :model="form" :rules="rules" :disabled="edits" label-width="80px">
       <el-form-item label="标题" prop="title">
         <el-input v-model="form.title" placeholder="请输入标题"></el-input>
       </el-form-item>
 <!--      <el-form-item label="图片上传">-->
 <!--        <cropper v-model="form.fileUrl" :fixed_number="[4, 2]"></cropper>-->
 <!--      </el-form-item>-->
-      <el-form-item label="内容" prop="content">
-        <editor v-model="form.content" />
+      <el-form-item label="内容" prop="content" >
+        <editor v-model="form.content" :edits="edits" />
       </el-form-item>
 
 <!--      <el-form-item label="图片上传">-->
@@ -30,8 +30,8 @@
     </el-form>
 
     <div slot="footer" class="mfooter">
-      <el-button type="info" @click="submitzc">暂 存</el-button>
-      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button type="info" @click="submitzc" v-if="checkPermi(['business:COUNSELINGMESSAGE:confirm']) && !edits">暂存草稿</el-button>
+      <el-button type="primary" @click="submitForm" v-if="checkPermi(['business:COUNSELINGMESSAGE:confirm'])&& !edits">提交审核</el-button>
       <el-button @click="$layer.close(layerid)">取 消</el-button>
     </div>
     <el-dialog :visible.sync="dialogVisible" :close-on-click-modal="false" fullscreen append-to-body @close="dialogVisible = false">
@@ -42,6 +42,7 @@
 
 <script>
 import { listCOUNSELINGMESSAGE, getCOUNSELINGMESSAGE, delCOUNSELINGMESSAGE, addCOUNSELINGMESSAGE, updateCOUNSELINGMESSAGE, upload, newCommit } from '@/api/portal/COUNSELINGMESSAGE/COUNSELINGMESSAGE';
+import { checkPermi } from "@/utils/permission";
 
 export default {
   name: 'edit.vue',
@@ -51,6 +52,7 @@ export default {
       dialogVisible:false,
       disabled: false,
       fileList: [],
+      edits: null,
       // 表单参数
       form: {content:''},
       // 表单校验
@@ -62,11 +64,20 @@ export default {
       }
     }
   },
+  created(){
+  },
   mounted() {
+    this.edits = this.param.edit;
     if (this.param.id) {
       getCOUNSELINGMESSAGE(this.param.id).then(response => {
         this.form = response.data;
-        this.form.content = response.data.content.replace(new RegExp('/profile/upload/', 'g'), this.baseUrl + '/profile/upload/');
+        if(this.form.content.includes(process.env.VUE_APP_BASE_API)){
+          this.form.content = response.data.content
+        }else{
+          this.form.content = response.data.content.replace(
+          new RegExp("/profile/upload/", "g"),
+          this.baseUrl + "/profile/upload/")
+        }
       });
     }
   },
@@ -82,6 +93,7 @@ export default {
     }
   },
   methods:{
+    checkPermi,
     //旧的图片上传
     httprequest() {},
     /** 上传附件 */
@@ -112,7 +124,8 @@ export default {
               this.$layer.close(this.layerid);
               this.$parent.getList();
             });
-          } else if (this.form.status == 0 || this.form.status == 2 || this.form.status == 3 || this.form.status == 5 ||this.form.status == 2) {
+          } else if ((this.form.id !== null) && this.form.status == 0 || this.form.status == 2 || this.form.status == 3 || this.form.status == 5 ||this.form.status == 6) {
+            this.form.status = '0';
             updateCOUNSELINGMESSAGE(this.form).then(response => {
               this.$modal.msgSuccess('修改成功');
               this.$layer.close(this.layerid);

+ 13 - 6
src/views/COUNSELINGMESSAGE/index.vue

@@ -28,20 +28,20 @@
     <!--列表-->
     <el-table  :data="COUNSELINGMESSAGEList" @selection-change="handleSelectionChange" height="calc(100vh - 300px)">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="标题信息" align="center" prop="title" width="220px"/>
+      <el-table-column label="标题信息" width="260" show-overflow-tooltip align="center" prop="title"/>
       <el-table-column label="创建时间" align="center" prop="createTime" >
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          <span>{{ scope.row.createTime }}</span>
         </template>
       </el-table-column>
       <el-table-column label="更新时间" align="center" prop="updateTime" >
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
+          <span>{{ scope.row.updateTime}}</span>
         </template>
       </el-table-column>
       <el-table-column label="审核日期" align="center" prop="auditTime" >
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>
+          <span>{{ scope.row.auditTime}}</span>
         </template>
       </el-table-column>
       <el-table-column label="信息状态" align="center" prop="status">
@@ -59,10 +59,12 @@
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button v-if="scope.row.status == 5" size="mini" type="text"  @click="handleDownOrUp(scope.row)">下架</el-button>
-          <el-button v-if="scope.row.status == 0 || scope.row.status == 2" size="mini" type="text" @click="handleCommit(scope.row)">提交审核</el-button>
+          <el-button v-if="scope.row.status == 0 || scope.row.status == 2 ||scope.row.status ==null" size="mini" type="text" @click="handleCommit(scope.row)">提交审核</el-button>
           <el-button v-if="scope.row.status == 3" size="mini" type="text"  @click="handleDownOrUp(scope.row)">上报</el-button>
           <el-button v-if="scope.row.status == 6 || scope.row.status == 4" size="mini" type="text" @click="handleDownOrUp(scope.row)">发布</el-button>
-          <el-button v-if="scope.row.status == 0 || scope.row.status == 2 || scope.row.status == 3 || scope.row.status == 4 || scope.row.status == 6" size="mini" type="text" @click="handleUpdate(scope.row)">修改</el-button>
+          <el-button size="mini" type="text"  @click="handleDetail(scope.row)">详情</el-button>
+          <el-button v-if="scope.row.status == 0 || scope.row.status == 2 || scope.row.status == 3 ||  scope.row.status == 6 ||scope.row.status ==null && scope.row.status != 4" size="mini" type="text" @click="handleUpdate(scope.row)">修改</el-button>
+          <el-button v-if="scope.row.status != 5 && scope.row.status != 1" size="mini" type="text" @click="handleDelete(scope.row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -246,6 +248,11 @@ export default {
         })
         .catch(() => {});
     },
+    // 详情
+    handleDetail(row) {
+      const id = row.id || this.ids;
+      this.iframe({ obj: edit, param: { id: id, edit:true }, title: '资讯详情', width: '1050px', height: '750px' });
+    },
     /** 导出按钮操作 */
     handleExport() {
       this.download(

+ 215 - 0
src/views/CompanyUserService/index.vue

@@ -0,0 +1,215 @@
+<template>
+  <div>
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="详细信息" name="详细信息">
+        <el-descriptions border>
+          <el-descriptions-item label="活动名称">{{ taskList.acname }}</el-descriptions-item>
+          <el-descriptions-item label="任务启动时间">
+            {{ taskList.beginTime ? taskList.beginTime.substr(0, 10) : '无' }}
+          </el-descriptions-item>
+          <el-descriptions-item label="业务备注">{{ taskList.fromKeyword }}</el-descriptions-item>
+          <el-descriptions-item label="流程名称">{{ taskList.proname }}</el-descriptions-item>
+          <el-descriptions-item label="审核状态">
+            <el-tag v-if="taskList.status == 1" type="success">同意</el-tag>
+            <el-tag v-else-if="taskList.status == 2" type="danger">驳回</el-tag>
+            <el-tag v-else-if="taskList.status == 3" type="info">退回</el-tag>
+            <el-tag v-else-if="taskList.status == 0">待审核</el-tag>
+          </el-descriptions-item>
+          <el-descriptions-item label="审核意见">{{ taskList.comments ? taskList.comments : '无' }}</el-descriptions-item>
+        </el-descriptions>
+        <el-form ref="form" align="top" :model="taskList" label-width="auto" style="margin-top: 20px">
+          <el-row>
+            <el-col :span="12">
+              <el-col :span="12">
+                <el-form-item label="姓名:">{{ getFormobjAttribute('nickName') }}</el-form-item>
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="头像:" style="display: flex;align-items: center;">
+                <el-image
+                  :fit="'contain'"
+                  style="
+                  width: 100px;
+                  margin-top: 10px;
+                  border-radius: 5px;
+                  margin-bottom: -15px;"
+                  :z-index="50000"
+                  :src="baseUrl + getFormobjAttribute('userAvatar')"
+                  @click="showImagePreview(taskList.formobj.userAvatar)"
+                >
+                <div slot="error" class="image-slot">
+                  -
+                </div>
+              </el-image>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="类型:">
+                <span v-if="getFormobjAttribute('type') == 2">专家</span>
+                <span v-else>其它</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="民族:">{{ getFormobjAttribute('nation') }}</el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="用户名:">{{ getFormobjAttribute('userName') }}</el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="学历:">{{ getFormobjAttribute('education') }}</el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="手机:">{{ getFormobjAttribute('phone') }}</el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="邮箱:">{{ getFormobjAttribute('email') }}</el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="服务方向:">{{ getFormobjAttribute('servicesAvailable') }}</el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="工作经验:">{{ getFormobjAttribute('experience') }}</el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="专业领域:">{{ getFormobjAttribute('field') }}</el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="研究方向:">{{ getFormobjAttribute('research') }}</el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="学位证书:" style="display: flex;align-items: center;">
+                <el-image
+                  :fit="'contain'"
+                  style="
+                  width: 100px;
+                  margin-top: 10px;
+                  border-radius: 5px;
+                  margin-bottom: -15px;"
+                  :z-index="50000"
+                  :src="baseUrl + getFormobjAttribute('diploma')"
+                  @click="showImagePreview(taskList.formobj.diploma)"
+                >
+                <div slot="error" class="image-slot">
+                  -
+                </div>
+              </el-image>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="资格证书:" style="display: flex;align-items: center;">
+                <el-image
+                  :fit="'contain'"
+                  style="
+                  width: 100px;
+                  margin-top: 10px;
+                  border-radius: 5px;
+                  margin-bottom: -15px;
+                  "
+                  :z-index="50000"
+                  :src="baseUrl + getFormobjAttribute('credentials')"
+                  @click="showImagePreview(taskList.formobj.credentials)"
+                >
+                <div slot="error" class="image-slot">
+                  -
+                </div>
+              </el-image>
+               </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <el-dialog :visible="BigImgVisible" :close-on-click-modal="false" fullscreen append-to-body @close="BigImgVisible = false">
+          <img width="100%" :src="getFormobjAttribute('fileUrl')" alt="" />
+        </el-dialog>
+      </el-tab-pane>
+      <el-tab-pane label="审批记录" name="审批记录">
+        <el-timeline>
+          <el-timeline-item v-for="(item, index) in taskList.taskHisAction" :timestamp="item.createTime" placement="top" :key="index + 'taskHisAction'">
+            <el-card>
+              <p>{{ item.execId }} {{ item.acname }} 于 {{ item.createTime }}</p>
+            </el-card>
+          </el-timeline-item>
+        </el-timeline>
+      </el-tab-pane>
+      <!-- 图片预览弹出框 -->
+      <el-dialog
+        :visible.sync="imagePreviewVisible"
+        width="50%"
+        title="预览图片"
+        :close-on-click-modal="true"
+      >
+        <img
+          :src="previewImageUrl"
+          style="width: 100%; height: auto;"
+          alt="预览图片"
+        />
+      </el-dialog>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      baseURL: process.env.VUE_APP_BASE_API,
+      activeName: '详细信息',
+      fileList: [],
+      BigImgVisible: false,
+      imagePreviewVisible: false, // 控制图片预览弹出框的显示与隐藏
+      previewImageUrl: '', // 预览图片的URL
+    };
+  },
+  props: ['taskList'],
+  created() {
+    if (this.taskList.formobj && this.taskList.formobj.fileUrl) {
+      this.fileList.push({
+        url: this.baseURL + this.taskList.formobj.fileUrl,
+        name: "xxx",
+      });
+    }
+  },
+  watch: {
+    taskList(curVal, oldVal) {
+      if (curVal) {
+        curVal.formobj.content = curVal.formobj.content.replace(new RegExp('/profile/upload/', 'g'), this.baseUrl + '/profile/upload/');
+        this.fileList.pop();
+        this.fileList.push({ url: this.baseUrl + curVal.formobj.fileUrl, name: "xxx", });
+      }
+    },
+  },
+  methods: {
+    handlePictureCardPreview(file) {
+      this.taskList.formobj.fileUrl = file.url;
+      this.BigImgVisible = true;
+    },
+    showImagePreview(url) {
+      this.previewImageUrl = this.baseURL + url;
+      this.imagePreviewVisible = true;
+    },
+    getFormobjAttribute(key) {
+      if(this.taskList.formobj) {
+        return this.taskList.formobj[key];
+      } else {
+        return "#";
+      }
+    },
+  }
+};
+</script>
+
+<style></style>

+ 248 - 151
src/views/ECONOMICSINDEX/index.vue

@@ -86,116 +86,129 @@
         prop="id"
       >
       </el-table-column> -->
-      <el-table-column label="进出口总值" align="center" prop="jckzz">
+      <el-table-column label="进出口总值" show-overflow-tooltip width="110" align="center" prop="jckzz">
       </el-table-column>
-      <el-table-column label="加工贸易进出口值 " align="center" prop="jgmyjckz">
+      <el-table-column label="加工贸易进出口值 " show-overflow-tooltip width="160" align="center" prop="jgmyjckz">
       </el-table-column>
-      <el-table-column label="物流货物进出口值 " align="center" prop="wlhwjckz">
+      <el-table-column label="物流货物进出口值 " show-overflow-tooltip width="160" align="center" prop="wlhwjckz">
       </el-table-column>
-      <el-table-column label="一般贸易进出口值 " align="center" prop="ybmyjckz">
+      <el-table-column label="一般贸易进出口值 " show-overflow-tooltip width="160" align="center" prop="ybmyjckz">
       </el-table-column>
-      <el-table-column label="经营总收入 " align="center" prop="jyzsr">
+      <el-table-column label="经营总收入 " show-overflow-tooltip width="100" align="center" prop="jyzsr">
       </el-table-column>
-      <el-table-column label="海关税收 " align="center" prop="hgss">
+      <el-table-column label="海关税收 " show-overflow-tooltip width="110" align="center" prop="hgss">
       </el-table-column>
-      <el-table-column label="税务部门税收 " align="center" prop="swbmss">
+      <el-table-column label="税务部门税收 " show-overflow-tooltip width="120" align="center" prop="swbmss">
       </el-table-column>
       <el-table-column
+        width="180" 
         label="货物贸易涉外收支总额 "
         align="center"
+        show-overflow-tooltip
         prop="hwmyswszze"
       >
       </el-table-column>
-      <el-table-column label="期末企业从业人员 " align="center" prop="qmqycyry">
+      <el-table-column label="期末企业从业人员 " width="140" show-overflow-tooltip align="center" prop="qmqycyry">
       </el-table-column>
-      <el-table-column label="活跃企业数 " align="center" prop="hyqys">
+      <el-table-column label="活跃企业数 " width="110" show-overflow-tooltip align="center" prop="hyqys">
       </el-table-column>
-      <el-table-column label="单位面积进出口值 " align="center" prop="dwmjjckz">
+      <el-table-column label="单位面积进出口值 " width="140" show-overflow-tooltip align="center" prop="dwmjjckz">
       </el-table-column>
       <el-table-column
         label="单位面积经营总收入 "
+        width="160"
         align="center"
+        show-overflow-tooltip
         prop="dwmjjyzsr"
       >
       </el-table-column>
-      <el-table-column label="单位面积海关税收 " align="center" prop="dwmjhgss">
+      <el-table-column label="单位面积海关税收"  width="160" show-overflow-tooltip align="center" prop="dwmjhgss">
       </el-table-column>
       <el-table-column
+      show-overflow-tooltip
         label="单位面积税务部门税收 "
+        width="170"
         align="center"
         prop="dwmjswbmss"
       >
       </el-table-column>
       <el-table-column
+      show-overflow-tooltip
         label="单位面积货物贸易涉外收支额 "
+         width="220"
         align="center"
         prop="dwmjhwmyswsze"
       >
       </el-table-column>
       <el-table-column
+      show-overflow-tooltip
         label="期末单位面积企业从业人员 "
+         width="220"
         align="center"
         prop="qmdwmjqycyry"
       >
       </el-table-column>
-      <el-table-column label="进出口总值增幅 " align="center" prop="jckzzzf">
+      <el-table-column label="进出口总值增幅 "  width="140" show-overflow-tooltip align="center" prop="jckzzzf">
       </el-table-column>
       <el-table-column
-        label="同期活跃企业数增幅 "
+        label="同期活跃企业数增幅 "  width="160"
+        show-overflow-tooltip
         align="center"
         prop="tqhyqyszf"
       >
       </el-table-column>
       <el-table-column
-        label="期末批准规划面积验收率 "
+        label="期末批准规划面积验收率 "  width="190"
+        show-overflow-tooltip
         align="center"
         prop="qmpzghmjysl"
       >
       </el-table-column>
       <el-table-column
-        label="期末封闭围网面积开发率 "
+        label="期末封闭围网面积开发率 "  width="190"
+        show-overflow-tooltip
         align="center"
         prop="qmfbwwmjkfl"
       >
       </el-table-column>
-      <el-table-column label="实际使用外资金额 " align="center" prop="sjsywzje">
+      <el-table-column label="实际使用外资金额 "  width="160" show-overflow-tooltip align="center" prop="sjsywzje">
       </el-table-column>
-      <el-table-column label="进出区货物总值" align="center" prop="jcqhwzz">
+      <el-table-column label="进出区货物总值"  width="160" show-overflow-tooltip align="center" prop="jcqhwzz">
       </el-table-column>
       <el-table-column
-        label="进出口总值占其所在省"
+        label="进出口总值占其所在省"  width="180"
         align="center"
+        show-overflow-tooltip
         prop="jckzzzqszstqjckbz"
       >
       </el-table-column>
-      <el-table-column label="维修业务进出口值 " align="center" prop="wxywjckz">
+      <el-table-column label="维修业务进出口值 "  width="160" show-overflow-tooltip align="center" prop="wxywjckz">
       </el-table-column>
-      <el-table-column label="研发业务进出口值 " align="center" prop="yfywjckz">
+      <el-table-column label="研发业务进出口值 "  width="160" show-overflow-tooltip align="center" prop="yfywjckz">
       </el-table-column>
-      <el-table-column label="租赁贸易进出口值 " align="center" prop="zlmyjckz">
+      <el-table-column label="租赁贸易进出口值 "  width="160" show-overflow-tooltip align="center" prop="zlmyjckz">
       </el-table-column>
       <el-table-column
-        label="跨境电商业务进出口值 "
-        align="center"
+        label="跨境电商业务进出口值 "  width="180"
+        align="center" show-overflow-tooltip
         prop="kjdsywjckz"
       >
       </el-table-column>
-      <el-table-column label="规模以上工业产值 " align="center" prop="gmysgycz">
+      <el-table-column label="规模以上工业产值 "  width="160" show-overflow-tooltip align="center" prop="gmysgycz">
       </el-table-column>
-      <el-table-column label="固定资产投资 " align="center" prop="gdtzcz">
+      <el-table-column label="固定资产投资 "  width="160" show-overflow-tooltip align="center" prop="gdtzcz">
       </el-table-column>
       <el-table-column
-        label="占同期所在市进出口值比重 "
-        align="center"
+        label="占同期所在市进出口值比重 "  width="200"
+        align="center" show-overflow-tooltip
         prop="ztqszsjckzbz"
       >
       </el-table-column>
-      <el-table-column label="时间" align="center" prop="createTime">
-      </el-table-column>
       <el-table-column
         fixed="right"
         label="操作"
-        align="center"
+        align="center"  
+        width="130"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
@@ -228,100 +241,196 @@
     />
 
     <!-- 添加或修改综合保税区经济运行主要指标对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="65%" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="220px">
-        <el-form-item label="进出口总值" prop="jckzz">
-          <el-input v-model="form.jckzz"></el-input>
-        </el-form-item>
-        <el-form-item label="加工贸易进出口值" prop="jgmyjckz">
-          <el-input v-model="form.jgmyjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="物流货物进出口值" prop="wlhwjckz">
-          <el-input v-model="form.wlhwjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="一般贸易进出口值" prop="ybmyjckz">
-          <el-input v-model="form.ybmyjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="经营总收入 " prop="jyzsr">
-          <el-input v-model="form.jyzsr"></el-input>
-        </el-form-item>
-        <el-form-item label="海关税收 " prop="hgss">
-          <el-input v-model="form.hgss"></el-input>
-        </el-form-item>
-        <el-form-item label="税务部门税收 " prop="swbmss">
-          <el-input v-model="form.swbmss"></el-input>
-        </el-form-item>
-        <el-form-item label="货物贸易涉外收支总额 " prop="hwmyswszze">
-          <el-input v-model="form.hwmyswszze"></el-input>
-        </el-form-item>
-        <el-form-item label="期末企业从业人员 " prop="qmqycyry">
-          <el-input v-model="form.qmqycyry"></el-input>
-        </el-form-item>
-        <el-form-item label="活跃企业数 " prop="hyqys">
-          <el-input v-model="form.hyqys"></el-input>
-        </el-form-item>
-        <el-form-item label="单位面积进出口值 " prop="dwmjjckz">
-          <el-input v-model="form.dwmjjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="单位面积经营总收入 " prop="dwmjjyzsr">
-          <el-input v-model="form.dwmjjyzsr"></el-input>
-        </el-form-item>
-        <el-form-item label="单位面积海关税收 " prop="dwmjhgss">
-          <el-input v-model="form.dwmjhgss"></el-input>
-        </el-form-item>
-        <el-form-item label="单位面积税务部门税收 " prop="dwmjswbmss">
-          <el-input v-model="form.dwmjswbmss"></el-input>
-        </el-form-item>
-        <el-form-item label="单位面积货物贸易涉外收支额 " prop="dwmjhwmyswsze">
-          <el-input v-model="form.dwmjhwmyswsze"></el-input>
-        </el-form-item>
-        <el-form-item label="期末单位面积企业从业人员 " prop="qmdwmjqycyry">
-          <el-input v-model="form.qmdwmjqycyry"></el-input>
-        </el-form-item>
-        <el-form-item label="进出口总值增幅 " prop="jckzzzf">
-          <el-input v-model="form.jckzzzf"></el-input>
-        </el-form-item>
-        <el-form-item label="同期活跃企业数增幅 " prop="tqhyqyszf">
-          <el-input v-model="form.tqhyqyszf"></el-input>
-        </el-form-item>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="65%"
+      append-to-body
+    >
+      <el-tabs v-model="tabMsg" type="border-card">
+        <el-tab-pane name="basicMsg" label="基本信息">
+          <el-form ref="forms" :model="form" :rules="rules" label-width="220px">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="进出口总值" prop="jckzz">
+                  <el-input v-model="form.jckzz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="加工贸易进出口值" prop="jgmyjckz">
+                  <el-input v-model="form.jgmyjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="物流货物进出口值" prop="wlhwjckz">
+                  <el-input v-model="form.wlhwjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="一般贸易进出口值" prop="ybmyjckz">
+                  <el-input v-model="form.ybmyjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="经营总收入 " prop="jyzsr">
+                  <el-input v-model="form.jyzsr"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="海关税收 " prop="hgss">
+                  <el-input v-model="form.hgss"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="税务部门税收 " prop="swbmss">
+                  <el-input v-model="form.swbmss"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="货物贸易涉外收支总额 " prop="hwmyswszze">
+                  <el-input v-model="form.hwmyswszze"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="期末企业从业人员 " prop="qmqycyry">
+                  <el-input v-model="form.qmqycyry"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="活跃企业数 " prop="hyqys">
+                  <el-input v-model="form.hyqys"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="单位面积进出口值 " prop="dwmjjckz">
+                  <el-input v-model="form.dwmjjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="单位面积经营总收入 " prop="dwmjjyzsr">
+                  <el-input v-model="form.dwmjjyzsr"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="单位面积海关税收 " prop="dwmjhgss">
+                  <el-input v-model="form.dwmjhgss"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="单位面积税务部门税收 " prop="dwmjswbmss">
+                  <el-input v-model="form.dwmjswbmss"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item
+                  label="单位面积货物贸易涉外收支额 "
+                  prop="dwmjhwmyswsze"
+                >
+                  <el-input v-model="form.dwmjhwmyswsze"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item
+                  label="期末单位面积企业从业人员 "
+                  prop="qmdwmjqycyry"
+                >
+                  <el-input v-model="form.qmdwmjqycyry"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </el-tab-pane>
+        <el-tab-pane name="extraMsg" label="额外信息">
+          <el-form ref="form" :model="form" :rules="rules" label-width="220px">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="进出口总值增幅 " prop="jckzzzf">
+                  <el-input v-model="form.jckzzzf"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="同期活跃企业数增幅 " prop="tqhyqyszf">
+                  <el-input v-model="form.tqhyqyszf"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item
+                  label="期末批准规划面积验收率  "
+                  prop="qmpzghmjysl"
+                >
+                  <el-input v-model="form.qmpzghmjysl"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item
+                  label="期末封闭围网面积开发率  "
+                  prop="qmfbwwmjkfl"
+                >
+                  <el-input v-model="form.qmfbwwmjkfl"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="实际使用外资金额  " prop="sjsywzje">
+                  <el-input v-model="form.sjsywzje"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="进出区货物总值 " prop="jcqhwzz">
+                  <el-input v-model="form.jcqhwzz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item
+                  label="进出口总值占其所在省 "
+                  prop="jckzzzqszstqjckbz"
+                >
+                  <el-input v-model="form.jckzzzqszstqjckbz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="维修业务进出口值  " prop="wxywjckz">
+                  <el-input v-model="form.wxywjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="研发业务进出口值  " prop="yfywjckz">
+                  <el-input v-model="form.yfywjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="租赁贸易进出口值  " prop="zlmyjckz">
+                  <el-input v-model="form.zlmyjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="跨境电商业务进出口值  " prop="kjdsywjckz">
+                  <el-input v-model="form.kjdsywjckz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="规模以上工业产值  " prop="gmysgycz">
+                  <el-input v-model="form.gmysgycz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="固定资产投资  " prop="gdtzcz">
+                  <el-input v-model="form.gdtzcz"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item
+                  label="占同期所在市进出口值比重  "
+                  prop="ztqszsjckzbz"
+                >
+                  <el-input v-model="form.ztqszsjckzbz"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </el-tab-pane>
+      </el-tabs>
 
-        <el-form-item label="期末批准规划面积验收率  " prop="qmpzghmjysl">
-          <el-input v-model="form.qmpzghmjysl"></el-input>
-        </el-form-item>
-        <el-form-item label="期末封闭围网面积开发率  " prop="qmfbwwmjkfl">
-          <el-input v-model="form.qmfbwwmjkfl"></el-input>
-        </el-form-item>
-        <el-form-item label="实际使用外资金额  " prop="sjsywzje">
-          <el-input v-model="form.sjsywzje"></el-input>
-        </el-form-item>
-        <el-form-item label="进出区货物总值 " prop="jcqhwzz">
-          <el-input v-model="form.jcqhwzz"></el-input>
-        </el-form-item>
-        <el-form-item label="进出口总值占其所在省 " prop="jckzzzqszstqjckbz">
-          <el-input v-model="form.jckzzzqszstqjckbz"></el-input>
-        </el-form-item>
-        <el-form-item label="维修业务进出口值  " prop="wxywjckz">
-          <el-input v-model="form.wxywjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="研发业务进出口值  " prop="yfywjckz">
-          <el-input v-model="form.yfywjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="租赁贸易进出口值  " prop="zlmyjckz">
-          <el-input v-model="form.zlmyjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="跨境电商业务进出口值  " prop="kjdsywjckz">
-          <el-input v-model="form.kjdsywjckz"></el-input>
-        </el-form-item>
-        <el-form-item label="规模以上工业产值  " prop="gmysgycz">
-          <el-input v-model="form.gmysgycz"></el-input>
-        </el-form-item>
-        <el-form-item label="固定资产投资  " prop="gdtzcz">
-          <el-input v-model="form.gdtzcz"></el-input>
-        </el-form-item>
-        <el-form-item label="占同期所在市进出口值比重  " prop="ztqszsjckzbz">
-          <el-input v-model="form.ztqszsjckzbz"></el-input>
-        </el-form-item>
-      </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
@@ -343,6 +452,8 @@ export default {
   name: "ECONOMICSINDEX",
   data() {
     return {
+      tabMsg: "basicMsg",
+
       // 根路径
       baseURL: process.env.VUE_APP_BASE_API,
       // 遮罩层
@@ -404,35 +515,10 @@ export default {
       form: {},
       // 表单校验
       rules: {
-        names: [
-          {
-            required: true,
-            message: "综合保税区经济运行主要指标表主键不能为空",
-            trigger: "blur",
-          },
-
-          {
-            pattern: /^-?(([0-9]*(\.[0-9]{1,3})$)|([0-9]+$))/,
-            message: "值需为数字或小数",
-            trigger: "blur",
-          },
-        ],
-        id: [
-          {
-            required: true,
-            message: "综合保税区经济运行主要指标表主键不能为空",
-            trigger: "blur",
-          },
-          {
-            pattern: /^-?(([0-9]*(\.[0-9]{1,3})$)|([0-9]+$))/,
-            message: "值需为数字或小数",
-            trigger: "blur",
-          },
-        ],
         jckzz: [
           { required: true, message: "进出口总值 不能为空", trigger: "blur" },
           {
-            pattern: /^-?(([0-9]*(\.[0-9]{1,3})$)|([0-9]+$))/,
+            pattern: /^-?(([0-9]*(\.[0-9]{1,100})$)|([0-9]+$))/,
             message: "值需为数字或小数",
             trigger: "blur",
           },
@@ -444,7 +530,7 @@ export default {
             trigger: "blur",
           },
           {
-            pattern: /^-?(([0-9]*(\.[0-9]{1,3})$)|([0-9]+$))/,
+            pattern: /^-?(([0-9]*(\.[0-9]{1,100})$)|([0-9]+$))/,
             message: "值需为数字或小数",
             trigger: "blur",
           },
@@ -857,7 +943,18 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
-      this.$refs["form"].validate((valid) => {
+      let is;
+      this.$refs["form"].validate((valid)=>{
+        if(!valid) {
+          this.$message.error("额外数据未填写齐全");
+          is = true;
+        }
+        return;
+      })
+      
+      if (is) return false;
+
+      this.$refs["forms"].validate((valid) => {
         if (valid) {
           if (this.form.id != null) {
             updateECONOMICSINDEX(this.form).then((response) => {

+ 208 - 89
src/views/ENTERPRISESCREENDATA/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <!-- <el-form-item label="供应商类型(三种) " prop="providerType">
+    <!-- <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form-item label="供应商类型(三种) " prop="providerType">
         <el-select v-model="queryParams.providerType" placeholder="请选择供应商类型(三种) " clearable filterable>
           <el-option
             v-for="dict in dict.type.${dictType}"
@@ -10,12 +10,12 @@
             :value="dict.value"
           />
         </el-select>
-      </el-form-item> -->
+      </el-form-item> 
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
-    </el-form>
+    </el-form> -->
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
@@ -24,9 +24,10 @@
           plain
           icon="el-icon-plus"
           size="mini"
+          v-if="checkPermi(['business:ENTERPRISESCREENDATA:add'])"
           @click="handleAdd"
-          v-hasPermi="['business:ENTERPRISESCREENDATA:add']"
-        >新增</el-button>
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -34,10 +35,11 @@
           plain
           icon="el-icon-edit"
           size="mini"
+          v-if="checkPermi(['business:ENTERPRISESCREENDATA:edit'])"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['business:ENTERPRISESCREENDATA:edit']"
-        >修改</el-button>
+          >修改</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -45,75 +47,74 @@
           plain
           icon="el-icon-delete"
           size="mini"
+          v-if="checkPermi(['business:ENTERPRISESCREENDATA:remove'])"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['business:ENTERPRISESCREENDATA:remove']"
-        >删除</el-button>
+          >删除</el-button
+        >
       </el-col>
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
           type="warning"
           plain
           icon="el-icon-download"
           size="mini"
           @click="handleExport"
-          v-hasPermi="['business:ENTERPRISESCREENDATA:export']"
-        >导出</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+          >导出</el-button
+        >
+      </el-col> -->
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="ENTERPRISESCREENDATAList" @selection-change="handleSelectionChange">
+    <el-table
+      :data="ENTERPRISESCREENDATAList"
+      @selection-change="handleSelectionChange"
+    >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="企业大屏所需数据主键" align="center" prop="id">
-       
-      </el-table-column>
+
       <el-table-column label="企业名称" align="center" prop="enterpriseName">
-        
       </el-table-column>
       <el-table-column label="供应商名称 " align="center" prop="providerName">
-       
-      </el-table-column>
-      <el-table-column label="供应商类型(三种) " align="center" prop="providerType">
-    
-      </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
-      
-      </el-table-column>
-      <el-table-column label="创建人" align="center" prop="createBy">
-        
       </el-table-column>
-      <el-table-column label="更新时间" align="center" prop="updateTime">
-        
+      <el-table-column
+        label="供应商类型(三种) "
+        align="center"
+        prop="providerType"
+      >
       </el-table-column>
-      <el-table-column label="修改人" align="center" prop="updateBy">
      
-      </el-table-column>
-      <el-table-column label="部门主键" align="center" prop="deeptId">
-       
-      </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template slot-scope="scope">
           <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
+            v-if="checkPermi(['business:ENTERPRISESCREENDATA:edit'])"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:ENTERPRISESCREENDATA:edit']"
-          >修改</el-button>
+            >修改</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
+            v-if="checkPermi(['business:ENTERPRISESCREENDATA:remove'])"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['business:ENTERPRISESCREENDATA:remove']"
-          >删除</el-button>
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
 
     <pagination
-      v-show="total>0"
+      v-show="total > 0"
       :total="total"
       :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
@@ -121,18 +122,65 @@
     />
 
     <!-- 添加或修改企业大屏所需供应商数据对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="供应商类型(三种) " prop="providerType">
-          <!-- <el-select v-model="form.providerType" placeholder="请选择供应商类型(三种) " filterable>
-            <el-option
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-              :label="dict.label"
-:value="dict.value"
-            ></el-option>
-          </el-select> -->
-        </el-form-item>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="35%"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="140px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="企业名称" prop="enterpriseName">
+              <!-- <el-select
+                @change="selectDept"
+                v-model="form.enterpriseName"
+                placeholder="请选择供应商类型(三种) "
+                filterable
+              >
+                <el-option
+                  v-for="(dict, index) in deptList"
+                  :key="index"
+                  :label="dict.deptName"
+                  :value="index"
+                ></el-option>
+              </el-select> -->
+              <select-tree
+                    ref="selectTree"
+                    :placeholder="'请选择企业'"
+                    :modelValue="form.enterpriseName"
+                    @setNodeValue="handleNodeClick"
+                  />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="供应商类型(三种)" prop="providerType">
+              <el-select
+                v-model="form.providerType"
+                placeholder="请选择供应商类型(三种) "
+                filterable
+              >
+                <el-option
+                  v-for="dict in tyleLabel"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="供应商名称" prop="providerName" width="120px">
+              <el-input
+                placeholder="供应商名称 "
+                v-model="form.providerName"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -143,12 +191,40 @@
 </template>
 
 <script>
-import { listENTERPRISESCREENDATA, getENTERPRISESCREENDATA, delENTERPRISESCREENDATA, addENTERPRISESCREENDATA, updateENTERPRISESCREENDATA } from "@/api/portal/ENTERPRISESCREENDATA/ENTERPRISESCREENDATA";
+import {
+  listENTERPRISESCREENDATA,
+  getENTERPRISESCREENDATA,
+  delENTERPRISESCREENDATA,
+  addENTERPRISESCREENDATA,
+  updateENTERPRISESCREENDATA,
+} from "@/api/portal/ENTERPRISESCREENDATA/ENTERPRISESCREENDATA";
+import { checkPermi } from "@/utils/permission.js";
+import { getUserProfile } from "@/api/system/user.js";
+import { listDept } from "@/api/system/dept.js";
+import selectTree from "@/components/selectTree";
 
 export default {
   name: "ENTERPRISESCREENDATA",
+  components: { selectTree },
   data() {
     return {
+      // 供应商类型
+      tyleLabel: [
+        {
+          label: "上游供应商",
+          value: "上游供应商",
+        },
+        {
+          label: "下游供应商",
+          value: "下游供应商",
+        },
+        {
+          label: "供应链服务商",
+          value: "供应链服务商",
+        },
+      ],
+      // 部门列表
+      deptList: [],
       // 根路径
       baseURL: process.env.VUE_APP_BASE_API,
       // 遮罩层
@@ -181,41 +257,66 @@ export default {
         createBy: null,
         updateTime: null,
         updateBy: null,
-        deeptId: null
+        deptId: null,
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
         id: [
-          { required: true, message: "企业大屏所需数据主键不能为空", trigger: "blur" }
+          {
+            required: true,
+            message: "企业大屏所需数据主键不能为空",
+            trigger: "blur",
+          },
         ],
         enterpriseName: [
-          { required: true, message: "企业名称不能为空", trigger: "blur" }
+          { required: true, message: "企业名称不能为空", trigger: "blur" },
         ],
         providerName: [
-          { required: true, message: "供应商名称 不能为空", trigger: "blur" }
+          { required: true, message: "供应商名称 不能为空", trigger: "blur" },
         ],
         providerType: [
-          { required: true, message: "供应商类型(三种) 不能为空", trigger: "change" }
+          {
+            required: true,
+            message: "供应商类型(三种) 不能为空",
+            trigger: "change",
+          },
+        ],
+        deptId: [
+          { required: true, message: "部门主键不能为空", trigger: "blur" },
         ],
-        deeptId: [
-          { required: true, message: "部门主键不能为空", trigger: "blur" }
-        ]
-      }
+      },
+
+      // 用户数据
+      userData: {},
     };
   },
   created() {
     this.getList();
+    getUserProfile().then((res) => {
+      this.userData = res.data;
+      listDept().then((data) => {
+        this.deptList = data.data;
+      });
+    });
   },
   methods: {
+    checkPermi,
+
+    // 企业选择
+    handleNodeClick(data) {
+      this.$set(this.form, "deptId", data.deptId);
+      this.$set(this.form, "enterpriseName", data.deptName);
+    },
+
     /** 查询企业大屏所需供应商数据列表 */
     getList() {
-      this.loading = true;
-      listENTERPRISESCREENDATA(this.queryParams).then(response => {
+      // this.loading = true;
+      listENTERPRISESCREENDATA(this.queryParams).then((response) => {
         this.ENTERPRISESCREENDATAList = response.rows;
         this.total = response.total;
-        this.loading = false;
+        // this.loading = false;
       });
     },
     // 取消按钮
@@ -223,14 +324,18 @@ export default {
       this.open = false;
       this.reset();
     },
+
+    selectDept(i) {
+      this.form.enterpriseName = this.deptList[i].deptName;
+      this.form.deptId = this.deptList[i].deptId;
+    },
     // 表单重置
     reset() {
       this.form = {
-        id: null,
         enterpriseName: null,
         providerName: null,
         providerType: null,
-        deeptId: null
+        deptId: null,
       };
       this.resetForm("form");
     },
@@ -246,21 +351,24 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
-      this.multiple = !selection.length
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
     },
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
       this.open = true;
       this.title = "添加企业大屏所需供应商数据";
+      this.$nextTick(() => {
+        this.$refs.selectTree.init(this.deptList);
+      });
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const id = row.id || this.ids
-      getENTERPRISESCREENDATA(id).then(response => {
+      const id = row.id || this.ids;
+      getENTERPRISESCREENDATA(id).then((response) => {
         this.form = response.data;
         this.open = true;
         this.title = "修改企业大屏所需供应商数据";
@@ -268,16 +376,17 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
-      this.$refs["form"].validate(valid => {
+      this.$refs["form"].validate((valid) => {
+        // this.form.deptId = this.userData.deptId;
         if (valid) {
           if (this.form.id != null) {
-            updateENTERPRISESCREENDATA(this.form).then(response => {
+            updateENTERPRISESCREENDATA(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addENTERPRISESCREENDATA(this.form).then(response => {
+            addENTERPRISESCREENDATA(this.form).then((response) => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
               this.getList();
@@ -289,19 +398,29 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除企业大屏所需供应商数据编号为"' + ids + '"的数据项?').then(function() {
-        return delENTERPRISESCREENDATA(ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
+      this.$modal
+        .confirm(
+          '是否确认删除企业大屏所需供应商数据编号为"' + ids + '"的数据项?'
+        )
+        .then(function () {
+          return delENTERPRISESCREENDATA(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
     },
     /** 导出按钮操作 */
     handleExport() {
-      this.download('business/ENTERPRISESCREENDATA/export', {
-        ...this.queryParams
-      }, `ENTERPRISESCREENDATA_${new Date().getTime()}.xlsx`)
-    }
-  }
+      this.download(
+        "business/ENTERPRISESCREENDATA/export",
+        {
+          ...this.queryParams,
+        },
+        `ENTERPRISESCREENDATA_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
 };
 </script>

+ 289 - 257
src/views/ENTERPRISETRADEPERFORMANCE/index.vue

@@ -1,308 +1,232 @@
 <template>
   <div class="app-container">
-    <!-- <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="企业" prop="deptName">
+        <!-- <el-select v-model="form.deptName" @change="deptSelect" placeholder="请选择">
+          <el-option v-for="(item, index) in deptList" :key="index" :label="item.deptName" :value="index">
+          </el-option>
+        </el-select> -->
+         <!-- 树状结构组件引用 -->
+         <select-tree ref="selectTree" :placeholder="'请选择企业'" :modelValue="searchDeptName" @setNodeValue="handleNodeClick" />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
-    </el-form> -->
+    </el-form>
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:add']"
-          >新增</el-button
-        >
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:add']">新增</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:edit']"
-          >修改</el-button
-        >
+        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
+          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:edit']">修改</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:remove']"
-          >删除</el-button
-        >
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
+          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:remove']">删除</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:export']"
-          >导出</el-button
-        >
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:export']">导出</el-button>
       </el-col>
-      <right-toolbar
-        :showSearch.sync="showSearch"
-        @queryTable="getList"
-      ></right-toolbar>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table
-      :data="ENTERPRISETRADEPERFORMANCEList"
-      @selection-change="handleSelectionChange"
-    >
+    <el-table :data="ENTERPRISETRADEPERFORMANCEList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <!-- <el-table-column label="企业贸易绩效数据" align="center" prop="id">
       </el-table-column> -->
       <!-- <el-table-column label="部门id" align="center" prop="deptId">
       </el-table-column> -->
-      <el-table-column label="部门名称" align="center" prop="deptName">
-      </el-table-column>
-      <el-table-column label="规模以上工业产值" align="center" prop="gmysgycz">
-      </el-table-column>
-      <el-table-column label="固定资产投资" align="center" prop="gdzctz">
-      </el-table-column>
-      <el-table-column label="资产分类 " align="center" prop="zcfl">
-      </el-table-column>
-      <el-table-column label="主要贸易国家 " align="center" prop="zymygj">
+
+      <el-table-column label="企业名称" width="220" show-overflow-tooltip align="center" prop="deptName">
       </el-table-column>
-      <el-table-column label="电子账册分类 " align="center" prop="dzzcfl">
+      <el-table-column label="规模以上工业产值(万元)" width="200" show-overflow-tooltip  align="center" prop="gmysgycz">
       </el-table-column>
-      <el-table-column label="进、出口总值" align="center" prop="jckzz">
+      <el-table-column label="固定资产投资(万元)" width="160" show-overflow-tooltip  align="center" prop="gdzctz">
       </el-table-column>
-      <el-table-column label="进口总值" align="center" prop="jkzz">
+      <el-table-column label="资产分类 " width="220" show-overflow-tooltip  align="center" prop="zcfl">
       </el-table-column>
-      <el-table-column label="出口总值" align="center" prop="ckzz">
+      <el-table-column label="主要贸易国家 " width="220" show-overflow-tooltip  align="center" prop="zymygj">
       </el-table-column>
-      <el-table-column label="加工贸易进出口值 " align="center" prop="jgmyjckz">
+      <el-table-column label="电子账册分类 "  width="220" show-overflow-tooltip   align="center" prop="dzzcfl">
       </el-table-column>
-      <el-table-column label="物流货物进出口值 " align="center" prop="wlhwjckz">
+
+      <el-table-column label="进、出口总值(万元)"  width="160" show-overflow-tooltip   align="center" prop="jckzz">
       </el-table-column>
-      <el-table-column label="一般贸易口值 " align="center" prop="ybmyjckz">
+      <el-table-column label="进口(万元)"  width="140" show-overflow-tooltip   align="center" prop="jkzz">
       </el-table-column>
-      <el-table-column label="海关税收" align="center" prop="hgss">
+      <el-table-column label="出口总值(万元)"  width="140" show-overflow-tooltip   align="center" prop="ckzz">
       </el-table-column>
-      <el-table-column label="税务部门税收" align="center" prop="swbmss">
+      <el-table-column label="加工贸易进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="jgmyjckz">
       </el-table-column>
-      <el-table-column label="期末企业从业人员" align="center" prop="qmqycyry">
+      <el-table-column label="物流货物进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="wlhwjckz">
       </el-table-column>
-      <el-table-column label="实际使用外资金额" align="center" prop="sjsywzje">
+      <el-table-column label="一般贸易进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="ybmyjckz">
       </el-table-column>
-      <el-table-column label="维修业务进出口值 " align="center" prop="wxyejckz">
+      <el-table-column label="海关税收(万元)"  width="140" show-overflow-tooltip   align="center" prop="hgss">
       </el-table-column>
-      <el-table-column label="研发业务进出口值 " align="center" prop="yfywjckz">
+      <el-table-column label="税务部门税收(万元)"  width="220" show-overflow-tooltip   align="center" prop="swbmss">
       </el-table-column>
-      <el-table-column label="租赁贸易进出口值 " align="center" prop="zlmyjckz">
+      <el-table-column label="期末企业从业人员(人)"  width="220" show-overflow-tooltip   align="center" prop="qmqycyry">
       </el-table-column>
-      <el-table-column
-        label="跨境电商业务进出口值 "
-        align="center"
-        prop="kjdsywjckz"
-      >
+      <el-table-column label="实际使用外资金额(万美元)"  width="220" show-overflow-tooltip   align="center" prop="sjsywzje">
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
+      <el-table-column label="维修业务进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="wxyejckz">
       </el-table-column>
-      <el-table-column label="创建人" align="center" prop="createBy">
+      <el-table-column label="研发业务进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="yfywjckz">
       </el-table-column>
-      <el-table-column label="更新时间" align="center" prop="updateTime">
+      <el-table-column label="租赁贸易进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="zlmyjckz">
       </el-table-column>
-      <el-table-column label="更信任" align="center" prop="updateBy">
+      <el-table-column label="跨境电商业务进出口值(万元) "  width="220" show-overflow-tooltip   align="center" prop="kjdsywjckz">
       </el-table-column>
-      <el-table-column
-        fixed="right"
-        label="操作"
-        align="center"
-        class-name="small-padding fixed-width"
-      >
+      <el-table-column fixed="right" label="操作" width="120" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:edit']"
-            >修改</el-button
-          >
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:remove']"
-            >删除</el-button
-          >
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:edit']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['business:ENTERPRISETRADEPERFORMANCE:remove']">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
 
     <!-- 添加或修改企业贸易绩效数据(每个月填报)对话框 -->
-    <el-dialog
-      :title="title"
-      :visible.sync="open"
-      :close-on-click-modal="false"
-      width="40%"
-      append-to-body
-    >
+    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="60%" append-to-body>
       <el-tabs v-model="activeName">
         <el-tab-pane label="基本信息" name="first">
-          <el-form ref="forms" :model="form" :rules="rules" label-width="180px">
-            <el-form-item label="部门" prop="deptName">
-              <el-select
-                v-model="form.deptName"
-                @change="deptSelect"
-                placeholder="请选择"
-              >
-                <el-option
-                  v-for="(item, index) in deptList"
-                  :key="index"
-                  :label="item.deptName"
-                  :value="index"
-                >
-                </el-option>
-              </el-select>
-            </el-form-item>
+          <el-form ref="forms" :model="form" :rules="rules" label-width="190px">
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="企业名称" prop="deptName">
+                  <el-select v-model="form.deptName" @change="deptSelect" placeholder="请选择">
+                    <el-option v-for="(item, index) in deptList" :key="index" :label="item.deptName" :value="index">
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
 
-            <el-form-item label="固定资产投资" prop="gdzctz">
-              <el-input
-                v-model="form.gdzctz"
-                placeholder="请输入固定资产投资"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="资产分类 " prop="zcfl">
-              <el-input
-                v-model="form.zcfl"
-                placeholder="请输入资产分类 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="主要贸易国家 " prop="zymygj">
-              <el-input
-                v-model="form.zymygj"
-                placeholder="请输入主要贸易国家 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="电子账册分类 " prop="dzzcfl">
-              <el-input
-                v-model="form.dzzcfl"
-                placeholder="请输入电子账册分类 "
-              ></el-input>
-            </el-form-item>
+              <el-col :span="12">
+                <el-form-item label="年月" prop="dateValue">
+                  <el-date-picker v-model="form.dateValue" type="month" @change="changeDate" value-format="yyyy-MM"
+                    format="yyyy 年 MM 月" placeholder="选择年月">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
 
-            <el-form-item label="海关税收" prop="hgss">
-              <el-input
-                v-model="form.hgss"
-                placeholder="请输入海关税收"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="税务部门税收" prop="swbmss">
-              <el-input
-                v-model="form.swbmss"
-                placeholder="请输入税务部门税收"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="期末企业从业人员" prop="qmqycyry">
-              <el-input
-                v-model="form.qmqycyry"
-                placeholder="请输入期末企业从业人员"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="实际使用外资金额" prop="sjsywzje">
-              <el-input
-                v-model="form.sjsywzje"
-                placeholder="请输入实际使用外资金额"
-              ></el-input>
-            </el-form-item>
+              <el-col :span="12">
+                <el-form-item label="资产分类 " prop="zcfl">
+                  <el-input v-model="form.zcfl" placeholder="请输入资产分类 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="主要贸易国家 " prop="zymygj">
+                  <el-input v-model="form.zymygj" placeholder="请输入主要贸易国家 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="电子账册分类 " prop="dzzcfl">
+                  <el-input v-model="form.dzzcfl" placeholder="请输入电子账册分类 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="海关税收(万元)" prop="hgss">
+                  <el-input v-model="form.hgss" placeholder="请输入海关税收"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="税务部门税收(万元)" prop="swbmss">
+                  <el-input v-model="form.swbmss" placeholder="请输入税务部门税收"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="期末企业从业人员(万元)" prop="qmqycyry">
+                  <el-input v-model="form.qmqycyry" placeholder="请输入期末企业从业人员"></el-input>
+                </el-form-item>
+              </el-col>
+             
+              <el-col :span="12">
+                <el-form-item label="经营总收入(万元)" prop="jysr">
+                  <el-input v-model="form.jysr" placeholder="请输入经营总收入"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="固定资产投资(万元)" prop="gdzctz">
+                  <el-input v-model="form.gdzctz" placeholder="请输入固定资产投资"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item  label="实际使用外资金额(万美元)" prop="sjsywzje">
+                  <el-input v-model="form.sjsywzje" placeholder="请输入实际使用外资金额"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
           </el-form>
         </el-tab-pane>
         <el-tab-pane label="进出口信息" name="second">
           <el-form ref="form" :model="form" :rules="rules" label-width="180px">
-            <el-form-item label="规模以上工业产值" prop="gmysgycz">
-              <el-input
-                v-model="form.gmysgycz"
-                placeholder="请输入规模以上工业产值"
-              ></el-input>
-            </el-form-item>
-
-            <el-form-item label="进出口总值" prop="jckzz">
-              <el-input
-                v-model="form.jckzz"
-                placeholder="请输入进出口总值"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="进口总值" prop="jkzz">
-              <el-input
-                v-model="form.jkzz"
-                placeholder="请输入进口总值"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="出口总值" prop="ckzz">
-              <el-input
-                v-model="form.ckzz"
-                placeholder="请输入出口总值"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="加工贸易进出口值 " prop="jgmyjckz">
-              <el-input
-                v-model="form.jgmyjckz"
-                placeholder="请输入加工贸易进出口值 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="物流货物进出口值 " prop="wlhwjckz">
-              <el-input
-                v-model="form.wlhwjckz"
-                placeholder="请输入物流货物进出口值 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="一般贸易进出口值 " prop="ybmyjckz">
-              <el-input
-                v-model="form.ybmyjckz"
-                placeholder="请输入一般贸易进出口值 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="维修业务进出口值 " prop="wxyejckz">
-              <el-input
-                v-model="form.wxyejckz"
-                placeholder="请输入维修业务进出口值 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="研发业务进出口值 " prop="yfywjckz">
-              <el-input
-                v-model="form.yfywjckz"
-                placeholder="请输入研发业务进出口值 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="租赁贸易进出口值 " prop="zlmyjckz">
-              <el-input
-                v-model="form.zlmyjckz"
-                placeholder="请输入租赁贸易进出口值 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="跨境电商业务进出口值 " prop="kjdsywjckz">
-              <el-input
-                v-model="form.kjdsywjckz"
-                placeholder="请输入跨境电商业务进出口值 "
-              ></el-input>
-            </el-form-item>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="规模以上工业产值(万元)" prop="gmysgycz">
+                  <el-input type="number" v-model="form.gmysgycz" placeholder="请输入规模以上工业产值"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="进出口总值(万元)" prop="jckzz">
+                  <el-input type="number" v-model="form.jckzz" placeholder="请输入进出口总值"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="进口总值(万元)" prop="jkzz">
+                  <el-input type="number" v-model="form.jkzz" placeholder="请输入进口总值"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="出口总值(万元)" prop="ckzz">
+                  <el-input type="number" v-model="form.ckzz" placeholder="请输入出口总值"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="加工贸易进出口值(万元)" prop="jgmyjckz">
+                  <el-input type="number" v-model="form.jgmyjckz" placeholder="请输入加工贸易进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="物流货物进出口值(万元)" prop="wlhwjckz">
+                  <el-input type="number" v-model="form.wlhwjckz" placeholder="请输入物流货物进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="一般贸易进出口值(万元)" prop="ybmyjckz">
+                  <el-input type="number" v-model="form.ybmyjckz" placeholder="请输入一般贸易进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="维修业务进出口值(万元)" prop="wxyejckz">
+                  <el-input type="number" v-model="form.wxyejckz" placeholder="请输入维修业务进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="研发业务进出口值(万元)" prop="yfywjckz">
+                  <el-input type="number" v-model="form.yfywjckz" placeholder="请输入研发业务进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="租赁贸易进出口值(万元)" prop="zlmyjckz">
+                  <el-input type="number" v-model="form.zlmyjckz" placeholder="请输入租赁贸易进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="跨境电商业务进出口值(万元)" prop="kjdsywjckz">
+                  <el-input type="number" v-model="form.kjdsywjckz" placeholder="请输入跨境电商业务进出口值 "></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
           </el-form>
         </el-tab-pane>
       </el-tabs>
@@ -318,19 +242,22 @@
 <script>
 import {
   listENTERPRISETRADEPERFORMANCE,
-  getDeptList,
+  getBaseDeptList,
   getENTERPRISETRADEPERFORMANCE,
   delENTERPRISETRADEPERFORMANCE,
   addENTERPRISETRADEPERFORMANCE,
   updateENTERPRISETRADEPERFORMANCE,
 } from "@/api/portal/ENTERPRISETRADEPERFORMANCE/ENTERPRISETRADEPERFORMANCE";
+import selectTree from '@/components/selectTree'
 
 export default {
   name: "ENTERPRISETRADEPERFORMANCE",
+  components: { selectTree },
   data() {
     return {
       // 部门列表
       deptList: [],
+      searchDeptName: '',
       // 根路径
       baseURL: process.env.VUE_APP_BASE_API,
       // 遮罩层
@@ -396,19 +323,35 @@ export default {
         deptId: [
           { required: true, message: "部门id不能为空", trigger: "blur" },
         ],
+        dateValue: [
+          { required: true, message: "年月不能为空", trigger: "blur" },
+        ],
         gmysgycz: [
           {
             required: true,
             message: "规模以上工业产值不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         deptName: [
-          { required: true, message: "部门信息不能为空", trigger: "blur" },
+          { required: true, message: "企业名称不能为空", trigger: "blur" },
         ],
         gdzctz: [
           { required: true, message: "固定资产投资不能为空", trigger: "blur" },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
+        jysr: [
+          { required: true, message: "经营总收入不能为空", trigger: "blur" },
+          ],
         zcfl: [
           { required: true, message: "资产分类 不能为空", trigger: "blur" },
         ],
@@ -420,12 +363,27 @@ export default {
         ],
         jckzz: [
           { required: true, message: "进、出口总值不能为空", trigger: "blur" },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         jkzz: [
           { required: true, message: "进口总值不能为空", trigger: "blur" },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         ckzz: [
           { required: true, message: "出口总值不能为空", trigger: "blur" },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         jgmyjckz: [
           {
@@ -433,6 +391,11 @@ export default {
             message: "加工贸易进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         wlhwjckz: [
           {
@@ -440,6 +403,11 @@ export default {
             message: "物流货物进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         ybmyjckz: [
           {
@@ -447,12 +415,27 @@ export default {
             message: "一般贸易进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         hgss: [
           { required: true, message: "海关税收不能为空", trigger: "blur" },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         swbmss: [
           { required: true, message: "税务部门税收不能为空", trigger: "blur" },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         qmqycyry: [
           {
@@ -467,6 +450,11 @@ export default {
             message: "实际使用外资金额不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         wxyejckz: [
           {
@@ -474,6 +462,11 @@ export default {
             message: "维修业务进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         yfywjckz: [
           {
@@ -481,6 +474,11 @@ export default {
             message: "研发业务进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         zlmyjckz: [
           {
@@ -488,6 +486,11 @@ export default {
             message: "租赁贸易进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
         kjdsywjckz: [
           {
@@ -495,15 +498,21 @@ export default {
             message: "跨境电商业务进出口值 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$/,
+            message: "数值需为整数 或 负数 或 小数",
+            trigger: "blur"
+          }
         ],
       },
     };
   },
   created() {
     this.getList();
-    getDeptList().then((res) => {
-      this.deptList = res.data;
-    });
+    getBaseDeptList().then((res) => {
+      this.deptList = res.rows;
+      this.$refs.selectTree.init(this.deptList)
+    })
   },
   methods: {
     /** 查询企业贸易绩效数据(每个月填报)列表 */
@@ -515,6 +524,15 @@ export default {
         this.loading = false;
       });
     },
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.deptId
+      this.searchDeptName = data.deptName
+      // this.$set(this.form, 'deptId', data.deptId)
+      // this.$set(this.form, 'deptName', data.deptName)
+    },
+    // setSelectTreeData(){
+    //   this.$refs.selectTree.init(this.deptList)
+    // },
     // 取消按钮
     cancel() {
       this.open = false;
@@ -544,6 +562,9 @@ export default {
         yfywjckz: null,
         zlmyjckz: null,
         kjdsywjckz: null,
+        dateValue: null,
+        year: null,
+        month: null
       };
       this.resetForm("form");
     },
@@ -554,6 +575,8 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
+      this.queryParams.deptId = null;
+      this.searchDeptName = ''
       this.resetForm("queryForm");
       this.handleQuery();
     },
@@ -563,6 +586,10 @@ export default {
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
+    changeDate(val) {
+      this.form.year = this.form.dateValue.slice(0, 4)
+      this.form.month = this.form.dateValue.slice(5)
+    },
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
@@ -571,10 +598,13 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      this.activeName = "first";
       this.reset();
       const id = row.id || this.ids;
       getENTERPRISETRADEPERFORMANCE(id).then((response) => {
         this.form = response.data;
+        this.$set(this.form,'dateValue',this.form.year + '-' + this.form.month);
+        // this.form.dateValue = this.form.year + '-' + this.form.month
         this.open = true;
         this.title = "修改企业贸易绩效数据(每个月填报)";
       });
@@ -595,7 +625,9 @@ export default {
         }
       });
       if (is) return;
-      
+
+      this.form.jysr = +this.form.jysr;
+
       this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.form.id != null) {
@@ -611,7 +643,7 @@ export default {
               this.getList();
             });
           }
-        }else{
+        } else {
           this.$message.error("请补全进出口信息");
         }
       });
@@ -622,8 +654,8 @@ export default {
       this.$modal
         .confirm(
           '是否确认删除企业贸易绩效数据(每个月填报)编号为"' +
-            ids +
-            '"的数据项?'
+          ids +
+          '"的数据项?'
         )
         .then(function () {
           return delENTERPRISETRADEPERFORMANCE(ids);
@@ -632,7 +664,7 @@ export default {
           this.getList();
           this.$modal.msgSuccess("删除成功");
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     /** 导出按钮操作 */
     handleExport() {

+ 562 - 151
src/views/GARDENBASEDATA/index.vue

@@ -8,20 +8,38 @@
       v-show="showSearch"
       label-width="88px"
     >
-      <el-form-item label="部门名称" prop="deptId">
-        <el-select v-model="queryParams.deptId" placeholder="请选择">
+      <el-form-item label="企业名称" prop="deptName">
+        <!-- <el-select filterable v-model="queryParams.deptId" placeholder="请选择">
+          <el-option v-for="item in deptList" :key="item.value" :label="item.deptName" :value="item.deptId">
+          </el-option>
+        </el-select> -->
+        <el-input
+          v-model="queryParams.deptName"
+          placeholder="请输入企业名称"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="法定代表人" prop="fddbr">
+        <el-input
+          v-model="queryParams.fddbr"
+          placeholder="请输入法定代表人"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="保税区" prop="parentId">
+        <el-select
+          clearable
+          v-model="queryParams.parentId"
+          placeholder="请选择保税区"
+          style="width: 100%"
+        >
           <el-option
-            v-for="item in detpList"
-            :key="item.value"
+            v-for="item in bsqList"
+            :key="item.deptId"
             :label="item.deptName"
             :value="item.deptId"
           >
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="法定代表人" prop="fddbr">
-        <el-input v-model="queryParams.fddbr" placeholder="请输入"></el-input>
-      </el-form-item>
       <el-form-item>
         <el-button
           type="primary"
@@ -72,6 +90,18 @@
           >删除</el-button
         >
       </el-col>
+
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleImport"
+          >导入</el-button
+        >
+      </el-col>
+
       <el-col :span="1.5">
         <el-button
           type="warning"
@@ -94,82 +124,259 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="园区内企业基础数据主键" align="center" prop="id">
+
+      <el-table-column
+        label="企业名称"
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="deptName"
+      >
       </el-table-column>
-      <el-table-column label="部门主键" align="center" prop="deptId">
+      <el-table-column
+        label="综合保税区"
+        align="center"
+        width="180"
+        show-overflow-tooltip
+        prop="parentId_dictText"
+      >
+      </el-table-column>
+      <el-table-column
+        label="法定代表人 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="fddbr"
+      >
       </el-table-column>
-      <el-table-column label="部门名称" align="center" prop="deptName">
+      <el-table-column
+        label="企业代表联系方式 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="qydblxfs"
+      >
       </el-table-column>
-      <el-table-column label="法定代表人 " align="center" prop="fddbr">
+      <el-table-column
+        label="控股企业 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="kgqy"
+      >
       </el-table-column>
-      <el-table-column label="企业代表联系方式 " align="center" prop="qydblxfs">
+      <el-table-column
+        label="注册资金(万元)"
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="zczj"
+      >
       </el-table-column>
-      <el-table-column label="控股企业 " align="center" prop="kgqy">
+      <el-table-column
+        label="行业大类 "
+        align="center"
+        width="160"
+        show-overflow-tooltip
+        prop="hydl"
+      >
       </el-table-column>
-      <el-table-column label="注册资金" align="center" prop="zczj">
+      <el-table-column
+        label="行业小类 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="hyxl"
+      >
       </el-table-column>
-      <el-table-column label="行业大类 " align="center" prop="hydl">
+      <el-table-column
+        label="企业类型 "
+        align="center"
+        width="140"
+        show-overflow-tooltip
+        prop="qylx"
+      >
       </el-table-column>
-      <el-table-column label="行业小类 " align="center" prop="hyxl">
+      <el-table-column
+        label="是否外资企业 "
+        align="center"
+        width="130"
+        show-overflow-tooltip
+        prop="sfwzqy"
+      >
       </el-table-column>
-      <el-table-column label="企业类型 " align="center" prop="qylx">
+      <el-table-column
+        label="经营状态 "
+        align="center"
+        width="130"
+        show-overflow-tooltip
+        prop="jyzt"
+      >
       </el-table-column>
-      <el-table-column label="是否外资企业 " align="center" prop="sfwzqy">
+      <el-table-column
+        label="统一社会信用代码 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="shtyxydm"
+      >
       </el-table-column>
-      <el-table-column label="经营状态 " align="center" prop="jyzt">
+      <el-table-column
+        label="企业海关编码 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="qyhgbm"
+      >
       </el-table-column>
-      <el-table-column label="统一社会信用代码 " align="center" prop="shtyxydm">
+      <el-table-column
+        label="人员规模"
+        align="center"
+        width="100"
+        show-overflow-tooltip
+        prop="rygm"
+      >
       </el-table-column>
-      <el-table-column label="企业海关编码 " align="center" prop="qyhgbm">
+      <el-table-column
+        label="成立日期 "
+        align="center"
+        width="120"
+        show-overflow-tooltip
+        prop="clrq"
+      >
       </el-table-column>
-      <el-table-column label="人员规模" align="center" prop="rygm">
+      <el-table-column
+        label="投产时间 "
+        align="center"
+        width="120"
+        show-overflow-tooltip
+        prop="tcsj"
+      >
       </el-table-column>
-      <el-table-column label="成立日期 " align="center" prop="clrq">
+      <el-table-column
+        label="经营期限自 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="jyqxz"
+      >
       </el-table-column>
-      <el-table-column label="投产时间 " align="center" prop="tcsj">
+      <el-table-column
+        label="经营期限至 "
+        align="center"
+        width="120"
+        show-overflow-tooltip
+        prop="jyqxz1"
+      >
       </el-table-column>
-      <el-table-column label="经营期限自 " align="center" prop="jyqxz">
+      <el-table-column
+        label="注册地址 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="zcdz"
+      >
       </el-table-column>
-      <el-table-column label="经营期限至 " align="center" prop="jyqxz1">
+      <el-table-column
+        label="主营业务 "
+        align="center"
+        width="140"
+        show-overflow-tooltip
+        prop="zyyw"
+      >
       </el-table-column>
-      <el-table-column label="注册地址 " align="center" prop="zcdz" show-overflow-tooltip>
+      <el-table-column
+        label="经营范围 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="jyfw"
+      >
       </el-table-column>
-      <el-table-column label="主营业务 " align="center" prop="zyyw" show-overflow-tooltip>
+      <el-table-column
+        label="外汇等级 "
+        align="center"
+        width="90"
+        show-overflow-tooltip
+        prop="grade"
+      >
+        <template slot-scope="scope">
+          <span v-if="scope.row.grade == 1">A</span>
+          <span v-if="scope.row.grade == 2">B</span>
+          <span v-if="scope.row.grade == 3">C</span>
+          <span v-if="scope.row.grade == 4">D</span>
+        </template>
       </el-table-column>
-      <el-table-column label="经营范围 " align="center" prop="jyfw" show-overflow-tooltip>
+      <el-table-column
+        label="企业结构 "
+        align="center"
+        width="90"
+        show-overflow-tooltip
+        prop="enterpriseStructureValue"
+      >
+        <template slot-scope="scope">
+          <span>{{
+            selectDictLabel(
+              dict.type.enterprise_structure,
+              scope.row.enterpriseStructureValue
+            )
+          }}</span>
+        </template>
       </el-table-column>
-      <el-table-column label="企业资质 " align="center" prop="qyzz">
+      <el-table-column
+        label="企业资质 "
+        align="center"
+        width="100"
+        show-overflow-tooltip
+        prop="qyzz"
+      >
       </el-table-column>
-      <el-table-column label="主要市场 " align="center" prop="zysc">
+      <el-table-column
+        label="主要市场 "
+        align="center"
+        width="220"
+        show-overflow-tooltip
+        prop="zysc"
+      >
       </el-table-column>
-      <el-table-column label="一般纳税人情况 " align="center" prop="ybnsrqk">
+      <el-table-column
+        label="一般纳税人情况 "
+        align="center"
+        width="160"
+        show-overflow-tooltip
+        prop="ybnsrqk"
+      >
       </el-table-column>
       <el-table-column
         label="国家级奖项、发明专利 "
         align="center"
+        width="200"
+        show-overflow-tooltip
         prop="gjjjxfmzl"
       >
       </el-table-column>
-      <el-table-column label="AEO情况 " align="center" prop="aeoqk">
+      <el-table-column
+        label="AEO情况 "
+        align="center"
+        width="100"
+        show-overflow-tooltip
+        prop="aeoqk"
+      >
       </el-table-column>
       <el-table-column
         label="检测、服务外包、文化服务创新 "
         align="center"
+        width="230"
+        show-overflow-tooltip
         prop="jcfwwbwhfwcx"
       >
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
-      </el-table-column>
-      <el-table-column label="创建人" align="center" prop="createBy">
-      </el-table-column>
-      <el-table-column label="更新时间" align="center" prop="updateTime">
-      </el-table-column>
-      <el-table-column label="更新人" align="center" prop="updateBy">
-      </el-table-column>
+
       <el-table-column
         fixed="right"
         label="操作"
         align="center"
+        width="120"
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
@@ -181,6 +388,7 @@
             v-hasPermi="['business:GARDENBASEDATA:edit']"
             >修改</el-button
           >
+
           <el-button
             size="mini"
             type="text"
@@ -206,7 +414,7 @@
       :title="title"
       :visible.sync="open"
       :close-on-click-modal="false"
-      width="35%"
+      width="65%"
       append-to-body
     >
       <el-tabs v-model="tabMsg" type="border-card">
@@ -222,21 +430,14 @@
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="部门" prop="deptName">
-                  <el-select
-                    filterable
-                    v-model="form.deptName"
-                    @change="deptSelect"
-                    placeholder="请选择部门"
-                  >
-                    <el-option
-                      v-for="(item, index) in detpList"
-                      :key="index"
-                      :label="item.deptName"
-                      :value="index"
-                    >
-                    </el-option>
-                  </el-select>
+                <el-form-item label="企业" prop="deptName">
+                  <!-- 树状结构组件引用 -->
+                  <select-tree
+                    ref="selectTree"
+                    :placeholder="'请选择企业'"
+                    :modelValue="form.deptName"
+                    @setNodeValue="handleNodeClick"
+                  />
                 </el-form-item>
               </el-col>
             </el-row>
@@ -250,7 +451,7 @@
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="注册资金" prop="zczj">
+                <el-form-item label="注册资金(万元)" prop="zczj">
                   <el-input
                     v-model="form.zczj"
                     placeholder="请输入注册资金"
@@ -299,6 +500,7 @@
                 <el-form-item label="成立日期 " prop="clrq">
                   <!-- <el-input  v-model="form.clrq" placeholder="请输入成立日期 "></el-input> -->
                   <el-date-picker
+                    style="width: 100%"
                     value-format="yyyy-MM-dd"
                     @change="setUpTimeSelect"
                     v-model="form.clrq"
@@ -318,85 +520,73 @@
               </el-col>
             </el-row>
 
-            <el-form-item label="部门" prop="deptName">
-              <el-select
-                filterable
-                v-model="form.deptName"
-                @change="deptSelect"
-                placeholder="请选择部门"
-              >
-                <el-option
-                  v-for="(item, index) in detpList"
-                  :key="index"
-                  :label="item.deptName"
-                  :value="index"
-                >
-                </el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item label="企业代表联系方式 " prop="qydblxfs">
-              <el-input
-                v-model="form.qydblxfs"
-                placeholder="请输入企业代表联系方式 "
-              ></el-input>
-            </el-form-item>
-
-            <el-form-item label="注册资金" prop="zczj">
-              <el-input
-                v-model="form.zczj"
-                placeholder="请输入注册资金"
-              ></el-input>
-            </el-form-item>
-
-            <el-form-item label="企业类型 " prop="qylx">
-              <el-input
-                v-model="form.qylx"
-                placeholder="请输入企业类型 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="经营状态 " prop="jyzt">
-              <el-input
-                v-model="form.jyzt"
-                placeholder="请输入经营状态 "
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="统一社会信用代码 " prop="shtyxydm">
-              <el-input
-                v-model="form.shtyxydm"
-                placeholder="请输入统一社会信用代码 "
-              ></el-input>
-            </el-form-item>
-
-            <el-form-item label="人员规模" prop="rygm">
-              <el-input
-                v-model="form.rygm"
-                placeholder="请输入人员规模"
-              ></el-input>
-            </el-form-item>
-            <el-form-item label="成立日期 " prop="clrq">
-              <!-- <el-input  v-model="form.clrq" placeholder="请输入成立日期 "></el-input> -->
-              <el-date-picker
-                value-format="yyyy-MM-dd"
-                @change="setUpTimeSelect"
-                v-model="form.clrq"
-                type="date"
-                placeholder="选择日期"
-              >
-              </el-date-picker>
-            </el-form-item>
-            <el-form-item label="注册地址 " prop="zcdz">
-              <el-input
-                v-model="form.zcdz"
-                placeholder="请输入注册地址 "
-              ></el-input>
-            </el-form-item>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="经营范围  " prop="jyfw">
+                  <el-input
+                    v-model="form.jyfw"
+                    placeholder="请输入经营范围  "
+                  ></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="外汇等级" prop="grade">
+                  <el-select
+                    v-model="form.grade"
+                    placeholder="请选择"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="item in options"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
 
-            <el-form-item label="经营范围  " prop="jyfw">
-              <el-input
-                v-model="form.jyfw"
-                placeholder="请输入经营范围  "
-              ></el-input>
-            </el-form-item>
+            <el-row>
+              <el-col :span="12">
+                <el-form-item
+                  label="企业结构  "
+                  prop="enterpriseStructureValue"
+                >
+                  <el-select
+                    v-model="form.enterpriseStructureValue"
+                    multiple
+                    placeholder="请选择"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="dict in dict.type.enterprise_structure"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="业务构成  " prop="businessEventsValue">
+                  <el-select
+                    v-model="form.businessEventsValue"
+                    multiple
+                    placeholder="请选择"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="dict in dict.type.business_events"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
           </el-form>
         </el-tab-pane>
 
@@ -551,15 +741,61 @@
           </el-form>
         </el-tab-pane>
       </el-tabs>
-      <!-- <el-form>
-        <h1>123</h1>
-      </el-form> -->
-
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+
+    <!-- 导入 -->
+    <el-dialog
+      title="企业数据导入"
+      :visible.sync="isImport"
+      :close-on-click-modal="false"
+      width="35%"
+      append-to-body
+    >
+      <el-form :rules="importRules" :model="formParams" ref="formParams">
+        <el-form-item label="保税区" label-width="100px" prop="deptId">
+          <el-select v-model="formParams.deptId" placeholder="请选择保税区">
+            <el-option
+              v-for="item in bsqList"
+              :key="item.value"
+              :label="item.deptName"
+              :value="item.deptId"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="附件" label-width="100px" prop="file">
+          <el-upload
+            class="upload-demo"
+            :http-request="httprequest"
+            ref="upload"
+            :on-change="fileChange"
+            :file-list="fileList"
+            :limit="1"
+            :before-upload="uploadFile"
+            drag
+            :auto-upload="false"
+            action="#"
+            multiple
+          >
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text">
+              将文件拖到此处,或<em>点击上传</em>
+            </div>
+          </el-upload>
+        </el-form-item>
+        <el-form-item label="下载模板" label-width="100px">
+          <el-button @click="downloadModul">下载模板</el-button>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitUpload">导 入</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -571,17 +807,36 @@ import {
   addGARDENBASEDATA,
   updateGARDENBASEDATA,
   getEnterprise,
+  importGARDENBASEDATA,
+  fileDownloadFun,
 } from "@/api/portal/GARDENBASEDATA/GARDENBASEDATA";
+import {
+  getDept
+} from "@/api/portal/CONFERENCEREPLY/CONFERENCEREPLY";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import selectTree from "@/components/selectTree";
+import { saveAs } from "file-saver";
 
 export default {
   name: "GARDENBASEDATA",
+  components: { selectTree },
+  dicts: ["enterprise_structure", "business_events"],
   data() {
     return {
+      formParams: {
+        deptId: null,
+        file: [],
+      },
+      // 保税区列表
+      bsqList: [],
+      // 文件列表
+      fileList: [],
+      // 导入
+      isImport: false,
       // 新增标签索引
       tabMsg: "basicMsg",
       // 部门列表
-      detpList: [],
-
+      deptList: [],
       // 根路径
       baseURL: process.env.VUE_APP_BASE_API,
       // 遮罩层
@@ -651,7 +906,7 @@ export default {
           },
         ],
         deptName: [
-          { required: true, message: "部门不能为空", trigger: "blur" },
+          { required: true, message: "企业不能为空", trigger: "blur" },
         ],
         fddbr: [
           { required: true, message: "法定代表人 不能为空", trigger: "blur" },
@@ -668,6 +923,11 @@ export default {
         ],
         zczj: [
           { required: true, message: "注册资金不能为空", trigger: "blur" },
+          {
+            pattern: /^[+]?(?:\d+(?:\.\d*)?|\.\d+)$/,
+            message: "不能为负数",
+            trigger: "blur",
+          },
         ],
         hydl: [
           { required: true, message: "行业大类 不能为空", trigger: "blur" },
@@ -696,6 +956,11 @@ export default {
         ],
         rygm: [
           { required: true, message: "人员规模不能为空", trigger: "blur" },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "请输入正整数",
+            trigger: "blur",
+          },
         ],
         clrq: [
           { required: true, message: "成立日期 不能为空", trigger: "blur" },
@@ -748,22 +1013,99 @@ export default {
             trigger: "blur",
           },
         ],
+        grade: [
+          { required: true, message: "外汇等级 不能为空", trigger: "blur" },
+        ],
+        enterpriseStructureValue: [
+          { required: true, message: "企业结构 不能为空", trigger: "blur" },
+        ],
+        businessEventsValue: [
+          { required: true, message: "业务构成 不能为空", trigger: "blur" },
+        ],
       },
+      importRules: {
+        deptId: [
+          { required: true, message: "保税区不能为空", trigger: "blur" },
+        ],
+        file: [{ required: true, message: "附件不能为空", trigger: "blur" }],
+      },
+      options: [
+        {
+          value: 1,
+          label: "A",
+        },
+        {
+          value: 2,
+          label: "B",
+        },
+        {
+          value: 3,
+          label: "C",
+        },
+      ],
+      value: "",
     };
   },
   created() {
     this.getList();
-    getEnterprise().then((res) => {
-      this.detpList = res.data;
+    getEnterprise({ type: 3 }).then((res) => {
+      this.deptList = res.data;
+    });
+
+    getDept(2).then((res) => {
+      this.bsqList = res.data;
     });
   },
   methods: {
+    httprequest() {},
+    fileChange(file) {
+      this.formParams.file.push(file);
+    },
+    // 导入
+    uploadFile(file) {
+      let formData = new FormData();
+      formData.append("file", file);
+      formData.append("deptId", this.formParams.deptId);
+      importGARDENBASEDATA(formData).then((res) => {
+        if (res.code == 200) {
+          this.$message.success("导入成功");
+          this.isImport = false;
+          this.getList();
+        }
+      });
+    },
+    // 点击文件下载
+    downloadFile(file) {
+      let ip = process.env.VUE_APP_BASE_IP;
+      let path = ip + file.name;
+      let name = file.name;
+      fileDownloadFun({ fileName: path, delete: false }).then((res) => {
+        let bolb = new Blob([file.raw]);
+        saveAs(bolb, name);
+      });
+    },
+    // 确定上传附件
+    submitUpload() {
+      this.$refs.formParams.validate((valid) => {
+        if (valid) {
+          this.$refs.upload.submit();
+        }
+      });
+    },
+    // 下载模板
+    downloadModul() {
+      fileDownloadFun().then((res) => {
+        let bolb = new Blob([res]);
+        saveAs(bolb, "企业基础数据模板.xlsx");
+      });
+    },
+
     changeIsShowStatus(val) {
       this.isShowStatus = val;
     },
-    deptSelect(val) {
-      this.form.deptId = this.detpList[val].deptId;
-      this.form.deptName = this.detpList[val].deptName;
+    handleNodeClick(data) {
+      this.$set(this.form, "deptId", data.deptId);
+      this.$set(this.form, "deptName", data.deptName);
     },
     setUpTimeSelect(val) {
       this.form.clrq = val;
@@ -782,6 +1124,7 @@ export default {
     },
     // 取消按钮
     cancel() {
+      this.isImport = false;
       this.open = false;
       this.reset();
     },
@@ -817,6 +1160,10 @@ export default {
         aeoqk: null,
         jcfwwbwhfwcx: null,
       };
+      this.formParams = {
+        file: [],
+        deptId: null,
+      };
       this.resetForm("form");
       this.resetForm("forms");
     },
@@ -827,6 +1174,9 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
+      this.queryParams.deptName = "";
+      this.queryParams.fddbr = "";
+
       this.queryParams.deptId = null;
       this.resetForm("queryForm");
       this.handleQuery();
@@ -839,25 +1189,39 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
+      let that = this;
       this.reset();
       this.open = true;
       this.title = "添加园区内企业基础数据";
+      this.$nextTick(() => {
+        that.$refs.selectTree.init(that.deptList);
+      });
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
+      let that = this;
       const id = row.id || this.ids;
       getGARDENBASEDATA(id).then((response) => {
         this.form = response.data;
+        this.form.enterpriseStructureValue =
+          this.form.enterpriseStructureValue?.split(",") || [];
+        this.form.businessEventsValue =
+          this.form.businessEventsValue?.split(",") || [];
         this.open = true;
         this.title = "修改园区内企业基础数据";
+
+        this.$nextTick(() => {
+          that.$refs.selectTree.init(that.deptList);
+        });
       });
     },
     /** 提交按钮 */
     submitForm() {
       let is;
       this.$refs["forms"].validate((valid) => {
-        if (!valid) {
+        if (valid) {
+        } else {
           this.$message.error("请补齐企业基本信息");
           is = true;
           return;
@@ -868,6 +1232,44 @@ export default {
 
       this.$refs["form"].validate((valid) => {
         if (valid) {
+          /*
+              以下处理建立在  字典值的  value  和  sort 值排序顺序一致
+          */
+          // 获取选中的企业结构 获取 label数据和 sort排序数据
+          let currentEnterpriseStructure =
+            this.dict.type.enterprise_structure?.filter(({ value }) =>
+              this.form.enterpriseStructureValue
+                .sort((a, b) => a - b)
+                .includes(value)
+            );
+          this.form.enterpriseStructure = currentEnterpriseStructure
+            ?.map(({ label }) => label)
+            .join();
+          this.form.enterpriseStructureSort = currentEnterpriseStructure
+            ?.map(({ raw }) => raw?.dictSort)
+            .join();
+
+          // 获取选中的业务结构
+          let currentBusinessEvents = this.dict.type.business_events?.filter(
+            ({ value }) =>
+              this.form.businessEventsValue
+                .sort((a, b) => a - b)
+                .includes(value)
+          );
+          this.form.businessEvents = currentBusinessEvents
+            ?.map(({ label }) => label)
+            .join();
+          this.form.businessEventsSort = currentBusinessEvents
+            ?.map(({ raw }) => raw?.dictSort)
+            .join();
+
+          // 将选中的label数据数组转换为字符串
+          this.form.enterpriseStructureValue =
+            this.form.enterpriseStructureValue.sort((a, b) => a - b).join();
+          this.form.businessEventsValue = this.form.businessEventsValue
+            .sort((a, b) => a - b)
+            .join();
+
           if (this.form.id != null) {
             updateGARDENBASEDATA(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
@@ -901,10 +1303,14 @@ export default {
         })
         .catch(() => {});
     },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.isImport = true;
+    },
     /** 导出按钮操作 */
     handleExport() {
       this.download(
-        "business/GARDENBASEDATA/export",
+        "/GARDENBASEDATA/export",
         {
           ...this.queryParams,
         },
@@ -916,5 +1322,10 @@ export default {
 </script>
 
 <style>
-.el-tooltip__popper{font-size: 14px; max-width:40% }/* 设置显示隐藏部分内容,按40%显示 */
+.el-tooltip__popper {
+  font-size: 14px;
+  max-width: 40%;
+}
+
+/* 设置显示隐藏部分内容,按40%显示 */
 </style>

+ 8 - 5
src/views/GARDENDATA/index.vue

@@ -118,6 +118,13 @@
            </el-option>
          </el-select>
        </el-form-item>
+        <el-form-item prop="year" label="年份">
+          <el-date-picker
+            v-model="form.year"
+            type="year"
+            placeholder="选择日期">
+          </el-date-picker>
+        </el-form-item>
 
         <el-form-item label="数值类型" prop="type">
           <el-select v-model="form.type" placeholder="请选择数值类型" filterable>
@@ -129,10 +136,7 @@
           </el-select>
         </el-form-item>
         <el-form-item prop="value" label="数值">
-          <el-input  v-model="form.value" placeholder="请输入数值" ></el-input>
-        </el-form-item>
-        <el-form-item prop="year"label="年份">
-          <el-input  v-model="form.year" placeholder="请输入年份" ></el-input>
+          <el-input type="number"  v-model="form.value" placeholder="请输入数值" ></el-input>
         </el-form-item>
       </el-form>
 
@@ -234,7 +238,6 @@ export default {
         this.deptList = data.filter(item => {
           return item.type === 2 || item.type === 3;
         })
-        console.log(this.deptList)
         this.loading = false;
       });
     },

+ 169 - 17
src/views/GARDENTRADEDATA/edit.vue

@@ -1,7 +1,29 @@
 <template>
   <div class="cmain">
     <el-form ref="form" :model="form" :rules="rules" label-width="200px">
-      <el-form-item label="企业出口退税额" prop="companyDrawback">
+
+      <el-form-item label="保税区" prop="gardenWaterElectric">
+        <!-- @change="selectDept" -->
+        <el-select
+          v-model="form.cbId"
+          placeholder="请选择保税区 "
+          filterable
+        >
+          <el-option
+            v-for="(dict, index) in deptList"
+            :key="index"
+            :label="dict.deptName"
+            :value="dict.deptId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="年月" prop="dateValue">
+        <el-date-picker v-model="form.dateValue" @change="setDateSelect"  format="yyyy-MM" value-format="yyyy-MM"  type="month" placeholder="选择年份">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item label="企业出口退税额(万元)" prop="companyDrawback">
         <el-input
           type="number"
           v-model="form.companyDrawback"
@@ -9,7 +31,7 @@
         ></el-input>
       </el-form-item>
 
-      <el-form-item label="园区出口退税总额" prop="gardenDrawback">
+      <el-form-item label="园区出口退税总额(万元)" prop="gardenDrawback">
         <el-input
           type="number"
           v-model="form.gardenDrawback"
@@ -17,7 +39,7 @@
         ></el-input>
       </el-form-item>
 
-      <el-form-item label="园区运营单位缴税总额" prop="gardenTax">
+      <el-form-item label="园区运营单位缴税总额(万元)" prop="gardenTax">
         <el-input
           type="number"
           v-model="form.gardenTax"
@@ -57,19 +79,39 @@
         ></el-input>
       </el-form-item>
 
-      <el-form-item label="企业工业用水、用电量" prop="companyWaterElectric">
+
+
+
+      <el-form-item label="企业工业用水(吨)" prop="companyWaterElectric">
         <el-input
           type="number"
           v-model="form.companyWaterElectric"
-          placeholder="请输入企业工业用水、用电量"
+          placeholder="请输入企业工业用水"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="企业工业用电(度)" prop="companyElectric">
+        <el-input
+          type="number"
+          v-model="form.companyElectric"
+          placeholder="请输入企业工业用电"
         ></el-input>
       </el-form-item>
 
-      <el-form-item label="园区工业用水、用电总量" prop="gardenWaterElectric">
+      <el-form-item label="园区工业用水(吨)" prop="gardenWaterElectric">
         <el-input
           type="number"
           v-model="form.gardenWaterElectric"
-          placeholder="请输入园区工业用水、用电总量"
+          placeholder="请输入园区工业用水"
+        ></el-input>
+      </el-form-item>
+
+
+
+      <el-form-item label="园区工业用电(度)" prop="gardenElectric">
+        <el-input
+          type="number"
+          v-model="form.gardenElectric"
+          placeholder="请输入园区工业用电"
         ></el-input>
       </el-form-item>
     </el-form>
@@ -90,11 +132,62 @@ import {
   addGARDENTRADEDATA,
   updateGARDENTRADEDATA,
 } from "@/api/portal/GARDENTRADEDATA/GARDENTRADEDATA.js";
+import { listDept } from "@/api/system/dept.js";
 export default {
   data() {
     return {
+      monthOpt: [
+        {
+          value: "1",
+          label: "1月",
+        },
+        {
+          value: "2",
+          label: "2月",
+        },
+        {
+          value: "3",
+          label: "3月",
+        },
+        {
+          value: "4",
+          label: "4月",
+        },
+        {
+          value: "5",
+          label: "5月",
+        },
+        {
+          value: "6",
+          label: "6月",
+        },
+        {
+          value: "7",
+          label: "7月",
+        },
+        {
+          value: "8",
+          label: "8月",
+        },
+        {
+          value: "9",
+          label: "9月",
+        },
+        {
+          value: "10",
+          label: "10月",
+        },
+        {
+          value: "11",
+          label: "11月",
+        },
+        {
+          value: "12",
+          label: "12月",
+        },
+      ],
       deptList: [],
-      form: {},
+      form: {dateValue:""},
       deptId: "",
       rules: {
         gardenId: [
@@ -103,40 +196,90 @@ export default {
         deptId: [
           { required: true, message: "保税区ID不能为空", trigger: "blur" },
         ],
+        dateValue: [{ required: true, message: "年月不能为空", trigger: "blur" }],
+        companyElectric: [
+          {
+            required: true,
+            message: "企业工业用电量不能为空",
+            trigger: "blur",
+          },
+        ],
+        gardenElectric: [
+          {
+            required: true,
+            message: "园区工业用电总量不能为空",
+            trigger: "blur",
+          },
+        ],
         companyDrawback: [
-          { required: true, message: "企业出口退税额 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "企业出口退税额 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "企业出口退税额年龄必须为整数值" },
         ],
         gardenDrawback: [
-          { required: true, message: "园区出口退税总额 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "园区出口退税总额 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "园区出口退税总额必须为整数值" },
         ],
         gardenTax: [
-          { required: true, message: "园区运营单位缴税总额 不能为空", trigger: "blur", },
-          { pattern: /^[1-9]\d*$/, message: "园区运营单位缴税总额必须为整数值" },
+          {
+            required: true,
+            message: "园区运营单位缴税总额 不能为空",
+            trigger: "blur",
+          },
+          {
+            pattern: /^[1-9]\d*$/,
+            message: "园区运营单位缴税总额必须为整数值",
+          },
         ],
         companyLists: [
           { required: true, message: "企业承接单量 不能为空", trigger: "blur" },
           { pattern: /^[1-9]\d*$/, message: "企业承接单量必须为整数值" },
         ],
         gardenLits: [
-          { required: true, message: "园区承接单总量 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "园区承接单总量 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "园区承接单总量年龄必须为整数值" },
         ],
         companyInnovative: [
-          { required: true, message: "企业创新获奖量 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "企业创新获奖量 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "企业创新获奖量必须为整数值" },
         ],
         gardenInnovative: [
-          { required: true, message: "园区内创新获奖总量 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "园区内创新获奖总量 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "园区内创新获奖总量必须为整数值" },
         ],
         companyWaterElectric: [
-          { required: true, message: "企业工业用水、用电量 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "企业工业用水、用电量 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "必须为整数值" },
         ],
         gardenWaterElectric: [
-          { required: true, message: "园区工业用水、用电总量 不能为空", trigger: "blur", },
+          {
+            required: true,
+            message: "园区工业用水、用电总量 不能为空",
+            trigger: "blur",
+          },
           { pattern: /^[1-9]\d*$/, message: "必须为整数值" },
         ],
       },
@@ -154,9 +297,14 @@ export default {
     },
   },
   mounted() {
+    listDept({type:2}).then(res=>{
+      this.deptList = res.data;
+    })
     if (this.param.id) {
       getGARDENTRADEDATA(this.param.id).then((response) => {
         this.form = response.data;
+        this.form.cbId = +this.form.cbId;
+        this.$set(this.form,"dateValue",this.form.year + '-' + this.form.month)
       });
     } else {
       //如果没传ID过来那就是新增,需要获取当前用户deptId
@@ -166,6 +314,10 @@ export default {
     }
   },
   methods: {
+    setDateSelect(){
+      this.form.year = this.form.dateValue.slice(0, 4);
+      this.form.month = this.form.dateValue.slice(5);
+    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate((valid) => {

+ 19 - 7
src/views/GARDENTRADEDATA/index.vue

@@ -67,22 +67,22 @@
 
     <el-table :data="GARDENTRADEDATAList" @selection-change="handleSelectionChange" fixed>
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="园区名称" align="center" prop="gardenName" width="130">
+      <el-table-column label="园区名称" align="center"   show-overflow-tooltip  prop="gardenName" width="220">
         <template slot-scope="scope">
           {{scope.row.gardenName}}
         </template>
       </el-table-column>
-      <el-table-column label="企业出口退税额" align="center" prop="companyDrawback" width="130">
+      <el-table-column label="企业出口退税额(万元)"  align="center" prop="companyDrawback" width="180">
         <template slot-scope="scope">
           {{scope.row.companyDrawback}}
         </template>
       </el-table-column>
-      <el-table-column label="园区出口退税总额" align="center" prop="gardenDrawback" width="140">
+      <el-table-column label="园区出口退税总额(万元)"  align="center" prop="gardenDrawback" width="190">
         <template slot-scope="scope">
           {{scope.row.gardenDrawback}}
         </template>
       </el-table-column>
-      <el-table-column label="园区运营单位缴税总额" align="center" prop="gardenTax" width="170">
+      <el-table-column label="园区运营单位缴税总额(万元)"  align="center" prop="gardenTax" width="220">
         <template slot-scope="scope">
           {{scope.row.gardenTax}}
         </template>
@@ -107,17 +107,29 @@
           {{scope.row.gardenInnovative}}
         </template>
       </el-table-column>
-      <el-table-column label="企业工业用水、用电量" align="center" prop="companyWaterElectric" width="170">
+      <el-table-column label="企业工业用水(吨)" align="center" prop="companyWaterElectric" width="170">
         <template slot-scope="scope">
           {{scope.row.companyWaterElectric}}
         </template>
       </el-table-column>
-      <el-table-column label="园区工业用水、用电总量" align="center" prop="gardenWaterElectric" width="190">
+      <el-table-column label="企业工业用电(度)" align="center" prop="companyElectric" width="170">
+        <template slot-scope="scope">
+          {{scope.row.companyElectric}}
+        </template>
+      </el-table-column>
+      <el-table-column label="园区工业用水(吨)" align="center" prop="gardenWaterElectric" width="170">
         <template slot-scope="scope">
           {{scope.row.gardenWaterElectric}}
         </template>
       </el-table-column>
-      <el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="园区工业用电(度)" align="center" prop="gardenElectric" width="190">
+        <template slot-scope="scope">
+          {{scope.row.gardenElectric}}
+        </template>
+      </el-table-column>
+
+     
+      <el-table-column fixed="right" label="操作" width="140" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
             size="mini"

+ 25 - 5
src/views/GATHER/importFile.vue

@@ -1,12 +1,25 @@
 <template>
-  <div>
-    <template>
+  <div style="width: 100%;">
+    <el-image 
+    v-if="param.mark == 1"
+    style="width: 100%; height: 100px"
+    :src="portion" 
+    :preview-src-list="[portion]">
+  </el-image>
+  <el-image 
+    v-if="param.mark == 2"
+    style="width: 100%; height: 100px"
+    :src="sum" 
+    :preview-src-list="[sum]">
+  </el-image>
+  <p style="text-align: center; color: #545555;">请点击上图查看导入说明</p>
+    <!-- <template>
       <div class="tips-text">
         <span class="tit">提示</span>
         <p>1.请检查保税区名称是否一致或者统一!</p>
         <p>2.上传前,请先检查excel文件内容的严谨性!</p>
       </div>
-    </template>
+    </template> -->
     <div class="cmain" style="display: flex;justify-content: center;align-items: center;">
       <el-upload class="upload-demo" drag action="#" :http-request="AvatarUpload" multiple :auto-upload="true">
         <i class="el-icon-upload"></i>
@@ -23,7 +36,11 @@
 import { importUpload } from "@/api/portal/GARDENTRADEDATA/GARDENTRADEDATA.js";
 export default {
   data() {
-    return {};
+    return {
+      sum:require("@/assets/images/sum.png"),
+      portion:require("@/assets/images/portion.png"),
+
+    };
   },
   props: {
     layerid: {
@@ -36,6 +53,8 @@ export default {
       },
     },
   },
+  created() {
+  },
   methods: {
     AvatarUpload(file) {
       let formData = new FormData()
@@ -55,4 +74,5 @@ export default {
 };
 </script>
   
-<style></style>
+<style lang="scss" scoped>
+</style>

File diff suppressed because it is too large
+ 444 - 364
src/views/GATHER/index.vue


+ 173 - 68
src/views/GATHERWARNING/index.vue

@@ -8,36 +8,56 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="数据类型" prop="type">
+      <el-form-item label="指标名称" prop="gatherFeeName">
+        <el-input
+          v-model="queryParams.gatherFeeName"
+          placeholder="请输入指标名称"
+          clearable
+          filterable
+        >
+        </el-input>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
         <el-select
-          v-model="queryParams.type"
-          placeholder="请选择数据类型"
+          v-model="queryParams.status"
+          placeholder="请选择状态"
           clearable
           filterable
         >
           <el-option
-            v-for="dict in typeList"
-            :key="dict.value + 'typeList'"
+            v-for="dict in statusList"
+            :key="dict.value + 'statusList'"
             :label="dict.label"
             :value="dict.value"
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item label="年份" prop="year">
+        <el-date-picker
+          v-model="queryParams.year"
+          type="year"
+          format="yyyy"
+          value-format="yyyy"
+          placeholder="请选择年份"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="月份" prop="month">
         <el-select
-          v-model="queryParams.status"
-          placeholder="请选择状态"
+          v-model="queryParams.month"
+          placeholder="请选择月份"
           clearable
           filterable
         >
           <el-option
-            v-for="dict in statusList"
-            :key="dict.value + 'statusList'"
+            v-for="dict in monthist"
+            :key="dict.value + 'monthist'"
             :label="dict.label"
             :value="dict.value"
           />
         </el-select>
       </el-form-item>
+
       <el-form-item>
         <el-button
           type="primary"
@@ -65,18 +85,33 @@
     >
       <!-- <el-table-column type="selection" width="55" align="center" /> -->
 
-      <el-table-column label="数据类型" align="center" prop="type">
+      <el-table-column label="数据类型"  width="120" align="center" prop="type">
         <template slot-scope="scope">
           <span v-if="scope.row.type == 0">量化指标数据</span>
           <span v-else-if="scope.row.type == 1">月报表数据</span>
         </template>
       </el-table-column>
-      <el-table-column label="指标名称" align="center" prop="gatherFeeName">
+      <el-table-column label="综保区" width="140"  align="center" prop="deptId_dictText">
+        <template slot-scope="scope">
+          {{ scope.row.deptId_dictText }}
+        </template>
+      </el-table-column>
+      <el-table-column label="年份" align="center" prop="year">
+        <template slot-scope="scope">
+          {{ scope.row.year }}
+        </template>
+      </el-table-column>
+      <el-table-column label="月份" align="center" prop="month">
+        <template slot-scope="scope">
+          {{ scope.row.month }}
+        </template>
+      </el-table-column>
+      <el-table-column label="指标名称" width="200" show-overflow-tooltip align="center" prop="gatherFeeName">
         <template slot-scope="scope">
           {{ scope.row.gatherFeeName }}
         </template>
       </el-table-column>
-      <el-table-column label="采集参考值" align="center" prop="gatherFeeName">
+      <el-table-column label="采集参考值" width="130" align="center" prop="collValue">
         <template slot-scope="scope">
           <span v-if="scope.row.collValue">{{ scope.row.collValue }}</span>
           <span v-else>无</span>
@@ -87,12 +122,12 @@
           {{ scope.row.errValue }}
         </template>
       </el-table-column>
-      <el-table-column label="处置人" align="center" prop="dealBy">
+      <el-table-column label="处置人" width="200" align="center" prop="dealBy">
         <template slot-scope="scope">
           {{ scope.row.dealBy }}
         </template>
       </el-table-column>
-      <el-table-column label="处置时间" align="center" prop="dealTime">
+      <el-table-column label="处置时间" width="160" align="center" prop="dealTime">
         <template slot-scope="scope">
           {{ scope.row.dealTime }}
         </template>
@@ -100,79 +135,86 @@
       <el-table-column label="状态" align="center" prop="cancelBy">
         <template slot-scope="scope">
           <el-tag v-if="scope.row.status == 0" type="danger">预警</el-tag>
-          <el-tag v-else-if="scope.row.status == 1" type="success">已解除</el-tag>
+          <el-tag v-else-if="scope.row.status == 1" type="success"
+            >已解除</el-tag
+          >
           <el-tag v-else-if="scope.row.status == 2" type="info">已取消</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="取消人" align="center" prop="cancelBy">
+      <el-table-column label="取消人" width="160"  align="center" prop="cancelBy">
         <template slot-scope="scope">
           {{ scope.row.cancelBy }}
         </template>
       </el-table-column>
-      <el-table-column label="取消时间" align="center" prop="cancelTime">
+      <el-table-column label="取消时间"  width="160" align="center" prop="cancelTime">
         <template slot-scope="scope">
           {{ scope.row.cancelTime }}
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="remark">
+      <!-- <el-table-column label="备注"  width="160" show-overflow-tooltip align="center" prop="remark">
         <template slot-scope="scope">
           {{ scope.row.remark }}
         </template>
-      </el-table-column>
+      </el-table-column> -->
       <el-table-column
+        width="160" 
+        fixed="right"
         label="操作"
         align="center"
         class-name="small-padding fixed-width"
+        prop="status"
       >
         <!-- 状态是“已解除”时不显示 -->
 
-        <template slot-scope="scope" v-if="scope.row.status != '1'">
+        <template slot-scope="scope" v-if="scope.row.status !=1">
           <el-button
             size="mini"
             type="text"
+            
+            v-if="checkPermi(['gather:GATHERWARNING:deal'])"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:GATHERWARNING:edit']"
-          >处理</el-button
-          >
+            >处理</el-button
+            >
           <el-popconfirm
             title="确定取消吗?"
             @confirm="handleCancel(scope.row)"
           >
             <el-button
-              style="margin-left: 5px;"
+              v-if="checkPermi(['gather:GATHERWARNING:cancel'])"
+              style="margin-left: 5px"
               size="mini"
               type="text"
               slot="reference"
-              v-hasPermi="['business:GATHERWARNING:remove']"
-            >取消</el-button
-            >
+              >取消</el-button
+              >
+              <!-- v-hasPermi="['business:GATHERWARNING:remove']" -->
           </el-popconfirm>
         </template>
-<!--        <template slot-scope="scope" v-if="scope.row.status != '1'">-->
-<!--          <el-popconfirm title="确定处理吗?" @confirm="handleDeal(scope.row)">-->
-<!--            <el-button-->
-<!--              size="mini"-->
-<!--              type="text"-->
-<!--              slot="reference"-->
-<!--              v-hasPermi="['business:GATHERWARNING:edit']"-->
-<!--              >处理</el-button-->
-<!--            >-->
-<!--          </el-popconfirm>-->
+        <!--        <template slot-scope="scope" v-if="scope.row.status != '1'">-->
+        <!--          <el-popconfirm title="确定处理吗?" @confirm="handleDeal(scope.row)">-->
+        <!--            <el-button-->
+        <!--              size="mini"-->
+        <!--              type="text"-->
+        <!--              slot="reference"-->
+        <!--              v-hasPermi="['business:GATHERWARNING:edit']"-->
+        <!--              >处理</el-button-->
+        <!--            >-->
+        <!--          </el-popconfirm>-->
 
-<!--          <el-popconfirm-->
-<!--            title="确定取消吗?"-->
-<!--            @confirm="handleCancel(scope.row)"-->
-<!--          >-->
-<!--            <el-button-->
-<!--            style="margin-left: 5px;"-->
-<!--              size="mini"-->
-<!--              type="text"-->
-<!--              slot="reference"-->
-<!--              v-hasPermi="['business:GATHERWARNING:remove']"-->
-<!--              >取消</el-button-->
-<!--            >-->
-<!--          </el-popconfirm>-->
-<!--        </template>-->
+        <!--          <el-popconfirm-->
+        <!--            title="确定取消吗?"-->
+        <!--            @confirm="handleCancel(scope.row)"-->
+        <!--          >-->
+        <!--            <el-button-->
+        <!--            style="margin-left: 5px;"-->
+        <!--              size="mini"-->
+        <!--              type="text"-->
+        <!--              slot="reference"-->
+        <!--              v-hasPermi="['business:GATHERWARNING:remove']"-->
+        <!--              >取消</el-button-->
+        <!--            >-->
+        <!--          </el-popconfirm>-->
+        <!--        </template>-->
       </el-table-column>
     </el-table>
 
@@ -185,18 +227,24 @@
     />
 
     <!-- 添加或修改数据采集预警对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="500px" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="500px"
+      append-to-body
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="150px">
-<!--        <el-form-item label="数据类型(0=量化指标数据,1=月报表数据)" prop="type">-->
-<!--          <el-select v-model="form.type" placeholder="请选择数据类型(0=量化指标数据,1=月报表数据)" filterable>-->
-<!--            <el-option-->
-<!--              v-for="dict in dict.type.${dictType}"-->
-<!--              :key="dict.value"-->
-<!--              :label="dict.label"-->
-<!--:value="dict.value"-->
-<!--            ></el-option>-->
-<!--          </el-select>-->
-<!--        </el-form-item>-->
+        <!--        <el-form-item label="数据类型(0=量化指标数据,1=月报表数据)" prop="type">-->
+        <!--          <el-select v-model="form.type" placeholder="请选择数据类型(0=量化指标数据,1=月报表数据)" filterable>-->
+        <!--            <el-option-->
+        <!--              v-for="dict in dict.type.${dictType}"-->
+        <!--              :key="dict.value"-->
+        <!--              :label="dict.label"-->
+        <!--:value="dict.value"-->
+        <!--            ></el-option>-->
+        <!--          </el-select>-->
+        <!--        </el-form-item>-->
         <el-form-item label="数据类型">
           <template slot-scope="scope">
             <span v-if="form.type == 0">量化指标数据</span>
@@ -204,9 +252,9 @@
           </template>
         </el-form-item>
         <el-form-item label="异常数据名称">
-          {{form.gatherFeeName}}
+          {{ form.gatherFeeName }}
         </el-form-item>
-        <el-form-item label="采集参考值">
+        <el-form-item label="采集参考值" >
           <template slot-scope="scope">
             <span v-if="form.collValue">{{ form.collValue }}</span>
             <span v-else>无</span>
@@ -225,6 +273,8 @@
 </template>
 
 <script>
+import { checkPermi } from "@/utils/permission"; // 权限判断函数
+
 import {
   listGATHERWARNING,
   getGATHERWARNING,
@@ -239,6 +289,56 @@ export default {
   name: "GATHERWARNING",
   data() {
     return {
+      monthist: [
+        {
+          label: "01月",
+          value: "01月",
+        },
+        {
+          label: "02月",
+          value: "02月",
+        },
+        {
+          label: "03月",
+          value: "03月",
+        },
+        {
+          label: "04月",
+          value: "04月",
+        },
+        {
+          label: "05月",
+          value: "05月",
+        },
+        {
+          label: "06月",
+          value: "06月",
+        },
+        {
+          label: "07月",
+          value: "07月",
+        },
+        {
+          label: "08月",
+          value: "08月",
+        },
+        {
+          label: "09月",
+          value: "09月",
+        },
+        {
+          label: "10月",
+          value: "10月",
+        },
+        {
+          label: "11月",
+          value: "11月",
+        },
+        {
+          label: "12月",
+          value: "12月",
+        },
+      ],
       typeList: [
         { label: "量化指标数据", value: "0" },
         { label: "月报表数据", value: "1" },
@@ -273,6 +373,8 @@ export default {
       queryParams: {
         pageNum: 1,
         pageSize: 10,
+        year: null,
+        month: null,
         id: null,
         createTime: null,
         createBy: null,
@@ -338,7 +440,9 @@ export default {
           { required: true, message: "取消时间不能为空", trigger: "blur" },
         ],
         remark: [{ required: true, message: "备注不能为空", trigger: "blur" }],
-        collValue:[{ required: true, message: "修改值不能为空", trigger: "blur" }],
+        collValue: [
+          { required: true, message: "修改值不能为空", trigger: "blur" },
+        ],
       },
     };
   },
@@ -346,6 +450,7 @@ export default {
     this.getList();
   },
   methods: {
+    checkPermi,
     /** 查询数据采集预警列表 */
     getList() {
       this.loading = true;
@@ -358,8 +463,8 @@ export default {
     //处理预警
     handleDeal(row) {
       this.title = "处理预警";
-        // 是否显示弹出层
-      this.open =  true;
+      // 是否显示弹出层
+      this.open = true;
       // deal(row.id).then((res) => {
       //   this.$modal.msgSuccess("处理成功");
       //   this.getList();

+ 2 - 16
src/views/GXZZQ/index.vue

@@ -62,22 +62,6 @@
 
     <el-table :data="GXZZQList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <!-- <el-table-column label="主键" align="center" prop="id">
-        
-      </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
-    
-      </el-table-column>
-      <el-table-column label="创建人" align="center" prop="createBy">
-       
-      </el-table-column>
-      <el-table-column label="修改时间" align="center" prop="updateTime">
-       
-      </el-table-column>
-      <el-table-column label="修改人" align="center" prop="updateBy">
-        
-      </el-table-column>
-      -->
       <el-table-column label="年份" align="center" prop="year">
       </el-table-column>
       <el-table-column label="月份" align="center" prop="month">
@@ -167,6 +151,8 @@ import {
   addGXZZQ,
   updateGXZZQ,
 } from "@/api/portal/GXZZQ/GXZZQ";
+import { checkPermi } from "@/utils/permission.js";
+
 
 export default {
   name: "GXZZQ",

+ 119 - 106
src/views/IMPORTANTPROJECT/index.vue

@@ -81,83 +81,65 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <!-- <el-table-column label="重点项目数据	主键" align="center" prop="id"> -->
-        <!-- <template slot-scope="scope">
+      <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.id"/>
         </template> -->
       <!-- </el-table-column> -->
-      <el-table-column label="项目名称 " align="center" prop="xmmc">
+      <el-table-column label="项目名称 " width="280" show-overflow-tooltip align="center" prop="xmmc">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.xmmc"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="建设单位 " align="center" prop="jsdw">
+      <el-table-column label="建设单位 " width="240" show-overflow-tooltip  align="center" prop="jsdw_dictText">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.jsdw"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="承建单位 " align="center" prop="cjdw">
+      <el-table-column label="承建单位 " width="240" show-overflow-tooltip align="center" prop="cjdw_dictText">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.cjdw"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="建设规模 " align="center" prop="jsgm">
+      <el-table-column label="建设规模 " width="220" show-overflow-tooltip align="center" prop="jsgm">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.jsgm"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="建设内容 " align="center" prop="jsnr">
+      <el-table-column label="建设内容 " width="240" show-overflow-tooltip align="center" prop="jsnr">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.jsnr"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="年度投资计划 " align="center" prop="ndtzjh">
+      <el-table-column label="年度投资计划 " width="240" show-overflow-tooltip align="center" prop="ndtzjh">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.ndtzjh"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="实际完成投资额 " align="center" prop="sjwctze">
+      <el-table-column label="实际完成投资额 " width="240" show-overflow-tooltip align="center" prop="sjwctze">
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.sjwctze"/>
         </template> -->
       </el-table-column>
       <el-table-column
         label="年度投资完成百分比 "
-        align="center"
+        width="220" align="center" show-overflow-tooltip
         prop="ndtzwcbfb"
       >
         <!-- <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.ndtzwcbfb"/>
         </template> -->
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime">
-        <!-- <template slot-scope="scope">
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.createTime"/>
-        </template> -->
-      </el-table-column>
-      <el-table-column label="创建人" align="center" prop="createBy">
-        <!-- <template slot-scope="scope">
+      <!-- <el-table-column label="创建人" align="center" prop="createBy_dictText">
+        <template slot-scope="scope">
           <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.createBy"/>
-        </template> -->
-      </el-table-column>
-      <el-table-column label="修改时间" align="center" prop="updateTime">
-        <!-- <template slot-scope="scope">
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.updateTime"/>
-        </template> -->
-      </el-table-column>
-      <el-table-column label="修改人" align="center" prop="updateBy">
-        <!-- <template slot-scope="scope">
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.updateBy"/>
-        </template> -->
-      </el-table-column>
-      <!-- <el-table-column label="部门主键" align="center" prop="deptId"> -->
-        <!-- <template slot-scope="scope">
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.deptId"/>
-        </template> -->
-      <!-- </el-table-column> -->
+        </template>
+      </el-table-column> -->
+      
       <el-table-column
         fixed="right"
         label="操作"
         align="center"
+        show-overflow-tooltip
         class-name="small-padding fixed-width"
         width="130"
       >
@@ -191,81 +173,103 @@
     />
 
     <!-- 添加或修改重点项目数据							 对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="35%" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="50%"
+      append-to-body
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="180px">
-        <el-form-item label="项目名称" prop="xmmc">
-          <el-input v-model="form.xmmc" placeholder="请输入项目名称"></el-input>
-        </el-form-item>
-
-        <el-form-item label="建设单位" prop="jsdw">
-          <el-select
-            v-model="buildValue"
-            @change="selectBuild"
-            placeholder="请选择"
-          >
-            <el-option
-              v-for="(item, index) in deptList"
-              :key="index"
-              :label="item.deptName"
-              :value="item.deptId"
-            >
-            </el-option>
-          </el-select>
-        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="项目名称" prop="xmmc">
+              <el-input
+                v-model="form.xmmc"
+                placeholder="请输入项目名称"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="建设规模 " prop="jsgm">
+              <el-input
+                v-model="form.jsgm"
+                placeholder="请输入建设规模 "
+              ></el-input>
+            </el-form-item>
+          </el-col>
 
-        <el-form-item label="承设单位" prop="cjdw">
-          <!-- {{ buildValue  }} -->
-          <el-select
-            v-model="deptValue"
-            @change="selectDept"
-            placeholder="请选择"
-          >
-            <el-option
-              v-for="(item, index) in deptList"
-              :key="index"
-              :label="item.deptName"
-              :value="item.deptId"
-            >
-            </el-option>
-          </el-select>
-        </el-form-item>
+          <el-col :span="12">
+            <el-form-item label="建设内容 " prop="jsnr">
+              <el-input
+                v-model="form.jsnr"
+                placeholder="请输入建设内容 "
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="年度投资计划 " prop="ndtzjh">
+              <el-input
+                type="number"
+                v-model="form.ndtzjh"
+                placeholder="请输入年度投资计划 "
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="实际完成投资额 " prop="sjwctze">
+              <el-input
+                type="number"
+                v-model="form.sjwctze"
+                placeholder="请输入实际完成投资额 "
+              ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="年度投资完成百分比 " prop="ndtzwcbfb">
+              <el-input
+                type="number"
+                v-model="form.ndtzwcbfb"
+                placeholder="请输入年度投资完成百分比 "
+              ></el-input>
+            </el-form-item>
+          </el-col>
 
-        <el-form-item label="建设规模 " prop="jsgm">
-          <el-input
-            v-model="form.jsgm"
-            placeholder="请输入建设规模 "
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="建设内容 " prop="jsnr">
-          <el-input
-            v-model="form.jsnr"
-            placeholder="请输入建设内容 "
-          ></el-input>
-        </el-form-item>
-
-        <el-form-item label="年度投资计划 " prop="ndtzjh">
-          <el-input
-            type="number"
-            v-model="form.ndtzjh"
-            placeholder="请输入年度投资计划 "
-          ></el-input>
-        </el-form-item>
-
-        <el-form-item label="实际完成投资额 " prop="sjwctze">
-          <el-input
-            type="number"
-            v-model="form.sjwctze"
-            placeholder="请输入实际完成投资额 "
-          ></el-input>
-        </el-form-item>
-
-        <el-form-item label="年度投资完成百分比 " prop="ndtzwcbfb">
-          <el-input
-            type="number"
-            v-model="form.ndtzwcbfb"
-            placeholder="请输入年度投资完成百分比 "
-          ></el-input>
-        </el-form-item>
+          <el-col :span="12">
+            <el-form-item label="建设单位" prop="jsdw">
+              <el-select
+                v-model="form.jsdw"
+                @change="selectBuild"
+                placeholder="请选择建设单位"
+              >
+                <el-option
+                  v-for="(item, index) in deptList"
+                  :key="index"
+                  :label="item.deptName"
+                  :value="item.deptId+''"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="承建单位" prop="deptId">
+              <el-select
+                v-model="form.deptId"
+                @change="selectDept"
+                placeholder="请选择承设单位"
+              >
+                <el-option
+                  v-for="(item, index) in deptList"
+                  :key="index"
+                  :label="item.deptName"
+                  :value="item.deptId+''"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -369,6 +373,11 @@ export default {
             message: "实际完成投资额 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^[+]?(?:\d+(?:\.\d*)?|\.\d+)$/,
+            message: "不能为负数",
+            trigger: "blur"
+          }
         ],
         ndtzwcbfb: [
           {
@@ -376,6 +385,11 @@ export default {
             message: "年度投资完成百分比 不能为空",
             trigger: "blur",
           },
+          {
+            pattern: /^(?:0(?:\.\d+)?|1(?:\.0+)?)$/,
+            message: "请输入正确的百分比数值",
+            trigger: "blur"
+          },
         ],
         deptId: [
           {
@@ -395,7 +409,6 @@ export default {
           this.deptList.push(item);
         }
       });
-      console.log(this.deptList);
     });
   },
   methods: {

+ 191 - 130
src/views/JOINTCONFERENCE/add.vue

@@ -1,46 +1,99 @@
 <template>
   <div class="cmain">
     <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-      <el-form-item label="会议标题" prop="conferenceTitle">
+      <el-form-item label="标题" prop="conferenceTitle">
         <el-input
+          :disabled="param.edit"
           v-model="form.conferenceTitle"
           placeholder="请输入会议标题"
+          maxlength="500"
+          show-word-limit
         ></el-input>
       </el-form-item>
 
-      <el-form-item label="会议内容" prop="conferenceContent">
+      <el-form-item label="内容" prop="conferenceContent">
         <el-input
+          :disabled="param.edit"
           type="textarea"
           rows="4"
-          placeholder="请输入会议会议内容"
+          maxlength="1000"
+          show-word-limit
+          placeholder="请输入会议内容"
           v-model="form.conferenceContent"
         ></el-input>
       </el-form-item>
-
-      <el-form-item label="协作单位" prop="dept">
-        <!-- <el-select
-          v-model="deptId"
-          multiple
+      <p style="display: none" v-html="form.conferenceContent" ref="test"></p>
+      <!-- <p  v-for="(item, i) in deptList"> {{ item.deptId  + '----' + item.deptName }} </p> -->
+      <el-form-item label="协作单位" prop="cooperativeUnitId">
+        <el-select
+          clearable
+          filterable
+          :multiple="user.type == 1"
+          v-model="form.cooperativeUnitId"
           placeholder="请选择协作单位"
-          @change="selectChange"
-          style="width: 100%"
+          @change="handleChange"
+          no-data-text="超管无法指派单位"
         >
+          <!-- style="width: 100%" -->
           <el-option
-            v-for="item in deptList"
+            :disabled="item.type == user.type && item.deptId == user.deptId"
+            v-for="(item, i) in deptList"
             :key="item.deptId"
             :label="item.deptName"
             :value="item.deptId"
           >
           </el-option>
-        </el-select> -->
-        <el-cascader
-          clearable
-          v-model="seleValue"
-          :options="deptListSele"
-          :props="propOpt"
-          @change="handleChange"
+        </el-select>
+      </el-form-item>
+      <el-form-item label="协作要求" prop="collaborativeContent">
+        <el-input
+          :disabled="!(user.deptId == 100 && user.type == 1)"
+          type="textarea"
+          rows="4"
+          placeholder="请输入协作要求"
+          v-model="form.collaborativeContent"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="状态" prop="type">
+        <template>
+          <el-radio
+            @input="radioChange"
+            :disabled="!(user.deptId == 100 && user.type == 1)"
+            v-model="form.type"
+            label="1"
+            >完结</el-radio
+          >
+          <el-radio
+            @input="radioChange"
+            :disabled="!(user.deptId == 100 && user.type == 1)"
+            v-model="form.type"
+            label="2"
+            >长期</el-radio
+          >
+          <el-radio
+            @input="radioChange"
+            :disabled="!(user.deptId == 100 && user.type == 1)"
+            v-model="form.type"
+            label="3"
+            >限期</el-radio
+          >
+        </template>
+      </el-form-item>
+      <el-form-item
+        v-if="isShowDate"
+        style="padding-bottom: 20px"
+        label="限期日期"
+        prop="date"
+      >
+        <el-date-picker
+          :picker-options="pickerOptions"
+          :disabled="!(user.deptId == 100 && user.type == 1)"
+          v-model="form.date"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择日期"
         >
-        </el-cascader>
+        </el-date-picker>
       </el-form-item>
     </el-form>
     <div class="mfooter">
@@ -53,6 +106,7 @@
 <script>
 import { getDept } from "@/api/portal/CONFERENCEREPLY/CONFERENCEREPLY.js";
 import { listDept } from "@/api/system/dept";
+import { getInfo } from "@/api/login";
 
 import {
   addJOINTCONFERENCE,
@@ -72,155 +126,158 @@ export default {
     },
   },
   data() {
-    var checkDeptId = (rule, value, callback) => {
-      if (this.seleValue.length == 0) {
-        return callback(new Error("协作单位不能为空"));
-      } else {
-        callback();
-      }
-    };
     return {
-      propOpt: {
-        value: "value",
-        label: "label",
-        children: "children",
-        multiple: true,
-        checkStrictly: true,
-        emitPath: false,
+      // 时间日期格式选择限制
+      pickerOptions: {
+        disabledDate(time) {
+          const date = new Date();
+          return time.getTime() < Date.now() - 8.64e7; //禁止选取当天之后的日期(不包括静止当天)
+        },
+      },
+      isShowDate: false,
+      user: {
+        type: 1,
       },
+      // 状态选择
+      status: null,
+      // 限期日期
+      date: null,
 
       deptId: [],
       deptList: [],
-      form: {},
+      form: {
+        conferenceContent: "",
+        cooperativeUnitId: null,
+      },
       rules: {
         conferenceTitle: [
-          { required: true, message: "会议标题不能为空", trigger: "blur" },
+          { required: true, message: "标题不能为空", trigger: "blur" },
         ],
         conferenceContent: [
-          { required: true, message: "会议内容不能为空", trigger: "blur" },
+          { required: true, message: "内容不能为空", trigger: "blur" },
+        ],
+        cooperativeUnitId: [
+          { required: true, message: "协作单位不能为空", trigger: "blur" },
+        ],
+
+        // type: [{ required: true, message: "状态不能为空", trigger: "blur" }],
+        // collaborativeContent: [
+        //   { required: true, message: "协作要求不能为空", trigger: "blur" },
+        // ],
+        date: [
+          { required: true, message: "限期时间不能为空", trigger: "blur" },
         ],
-        dept: [{ validator: checkDeptId, trigger: "blur" }],
       },
 
       deptListSele: [],
-      seleValue: [],
     };
   },
   created() {
     if (this.param.id) {
       getJOINTCONFERENCE(this.param.id).then((response) => {
         this.form = response.data;
-        this.seleValue = this.form.deptIds;
         let arr = eval("(" + this.form.deptIds + ")");
-        this.seleValue = arr;
         this.deptId = JSON.parse(this.form.deptIds);
       });
     }
 
-    listDept(this.queryParams).then((response) => {
-      this.deptListSele = this.handleTrees(response.data, "deptId");
-      this.deptListSele.forEach((item, index) => {
-        if (item.children) {
-          item.children.forEach((it, i) => {
-            it.children = null;
+    getInfo().then((res) => {
+      this.user = res.user.dept;
+      if (res.user.dept.type == 1 && res.user.userId == 14) {
+        listDept().then((res) => {
+          res.data.forEach((item) => {
+            if (item.type != 3) {
+              this.deptList.push(item);
+            }
           });
-        }
-      });
-    });
-
-    getDept(2).then((res) => {
-      this.deptList = res.data;
+        });
+      } else if (res.user.dept.type == 2) {
+        this.deptList = [
+          {
+            searchValue: null,
+            createBy: "admin",
+            createTime: "2023-07-20 14:40:52",
+            updateBy: "admin",
+            updateTime: "2023-09-18 18:46:44",
+            params: {},
+            deptId: 100,
+            parentId: 0,
+            ancestors: "0",
+            deptName: "广西壮族自治区北部湾办公室",
+            type: 1,
+            orderNum: 0,
+            leader: "XXX",
+            phone: "15888888888",
+            biaoCang: "23",
+            email: "ry@qq.com",
+            status: "0",
+            delFlag: "0",
+            parentName: null,
+            industryOrientation: null,
+            planningArea: null,
+            acceptanceArea: null,
+            useArea: null,
+            usageRate: null,
+            warehouse: null,
+            oilDepot: null,
+            refrigeratory: null,
+            workshop: null,
+            approvalTime: null,
+            children: [],
+            createBy_dictText: "管理员",
+          },
+        ];
+      }
     });
   },
-  mounted() {},
+  updated() {
+    this.form.conferenceContent = this.$refs["test"].innerText;
+  },
 
   methods: {
-    handleTrees(data, id, parentId, children) {
-      let config = {
-        id: id || "id",
-        parentId: parentId || "parentId",
-        childrenList: children || "children",
-      };
-
-      var childrenListMap = {};
-      var nodeIds = {};
-      var tree = [];
-
-      for (let d of data) {
-        let parentId = d[config.parentId];
-        if (childrenListMap[parentId] == null) {
-          childrenListMap[parentId] = [];
-        }
-        nodeIds[d[config.id]] = d;
-        d.label = d.deptName;
-        d.value = d.deptId;
-        childrenListMap[parentId].push(d);
-      }
-
-      for (let d of data) {
-        let parentId = d[config.parentId];
-        if (nodeIds[parentId] == null) {
-          tree.push(d);
-        }
-      }
-
-      for (let t of tree) {
-        adaptToChildrenList(t);
+    radioChange(val) {
+      if (val == 1 || val == 2) {
+        this.isShowDate = false;
+        return;
       }
-
-      function adaptToChildrenList(o) {
-        if (childrenListMap[o[config.id]] !== null) {
-          o[config.childrenList] = childrenListMap[o[config.id]];
-        }
-        if (o[config.childrenList]) {
-          for (let c of o[config.childrenList]) {
-            adaptToChildrenList(c);
-          }
-        }
-      }
-      return tree;
-    },
-    selectChange(val) {
-      // console.log(val);
-    },
-    handleChange(val) {
-      console.log(val);
+      this.isShowDate = true;
     },
+
+    handleChange(val) {},
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate((valid) => {
+        let cooperativeUnitId;
         if (valid) {
-          if (this.form.id != null) {
-            this.form.cooperativeUnitId = this.seleValue;
-            this.form.deptNum = this.form.cooperativeUnitId.length;
-            updateJOINTCONFERENCE(this.form).then((response) => {
-              this.$modal.msgSuccess("修改成功");
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
+          if (typeof this.form.cooperativeUnitId == "object") {
+            cooperativeUnitId = this.form.cooperativeUnitId;
           } else {
+            cooperativeUnitId = [this.form.cooperativeUnitId];
+          }
+          if (this.user.type == 1 && this.user.deptId == 100)
+            cooperativeUnitId.push(100);
 
-            // this.form.deptName = [];
-            // for (const index in this.form.deptId) {
-            //   for (const i in this.deptList) {
-            //     if (this.form.deptId[index] == this.deptList[i].deptId) {
-            //       console.log(
-            //         this.form.deptId[index],
-            //         this.deptList[i].deptName
-            //       );
-            //       this.form.deptName[index] = this.deptList[i].deptName;
-            //     }
-            //   }
-            // }
+          if (this.form.id != null) {
+            this.form.deptNum = 1;
+            updateJOINTCONFERENCE({ ...this.form, cooperativeUnitId }).then(
+              (response) => {
+                this.$modal.msgSuccess("修改成功");
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              }
+            );
+          } else {
             //俊豪像甲方一样,老是让我改传参
             //↑好家伙你还改错了,是seleValue不是deptId
-            this.form.cooperativeUnitId = this.seleValue;
-            this.form.deptNum = this.form.cooperativeUnitId.length;
-            addJOINTCONFERENCE(this.form).then((response) => {
-              this.$modal.msgSuccess("发布成功");
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
+            //↑啥玩意?
+            this.form.deptNum = cooperativeUnitId.length;
+            addJOINTCONFERENCE({ ...this.form, cooperativeUnitId }).then(
+              (response) => {
+                this.$modal.msgSuccess("发布成功");
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              }
+            );
           }
         }
       });
@@ -229,4 +286,8 @@ export default {
 };
 </script>
 
-<style></style>
+<style lang="scss" scoped>
+p {
+  margin: 0;
+}
+</style>

+ 69 - 16
src/views/JOINTCONFERENCE/callback.vue

@@ -1,24 +1,55 @@
 <template>
   <div class="cmain">
-    <div class="detail_item">
-      <div class="title">会议标题:</div>
-      <p>{{ form.conference.conferenceTitle }}</p>
-    </div>
-    <div class="detail_item">
-      <div class="title">会议内容:</div>
-      <p>{{ form.conference.conferenceContent }}</p>
+
+
+    <el-descriptions border :labelStyle="{ width: '120px' }">
+      <el-descriptions-item label="标题">
+        <span v-text="form.conference.conferenceTitle"></span>
+      </el-descriptions-item>
+    </el-descriptions>
+
+
+
+    <div>
+      <div
+        class="call_title"
+      >
+        内 容
+      </div>
+      <div
+        class="test"
+        style="
+          background-color: #f5f7fa;
+          border: 1px solid #dfe4ed;
+          color: #c0c4cc;
+          padding: 10px;
+          min-height: 150px;
+          margin-bottom: 20px;
+        "
+        v-html="form.conference.conferenceContent"
+      ></div>
     </div>
 
-    <div class="detail_item">
-      <div class="title">回 复:</div>
+    <div class="detail_item_reply">
+      <div class="call_title">回 复</div>
       <textarea
+      class="textarea"
         v-model="queryData.reply"
-        style="width: 60%; height: 200px"
       ></textarea>
     </div>
 
     <div class="detail_item">
-      <div class="title">附 件:</div>
+      <div
+        class="call_title"
+        style="
+          font-size: 14px;
+          color: #606266;
+          font-weight: 600;
+          line-height: 40px;
+        "
+      >
+        附 件:
+      </div>
       <el-upload
         class="upload-demo"
         ref="upload"
@@ -103,7 +134,6 @@ export default {
     if (this.param.id) {
       getAttendMeetingDetail(this.param.id).then((response) => {
         this.form = response.data;
-        console.log(this.form);
       });
     }
   },
@@ -173,21 +203,44 @@ export default {
 </script>
 
 <style scoped lang="scss">
+::v-deep p {
+  margin: 0 !important;
+}
+
 .cmain .detail_item {
   display: flex;
   align-items: flex-start;
+  justify-content: start;
   margin-bottom: 20px;
   color: #333333;
   font-size: 16px;
 }
-.detail_item .title {
+.content {
+  align-items: center;
+}
+.call_title {
+  margin-top: 10px;
   width: 100px;
+  font-size: 14px;
+  font-weight: 600;
+  color: #606266;
+}
+.textarea{
+  padding: 4px;
+  width: 100%;
+  min-height: 200px;
+  border-color: #c7cad1;
+  border-radius: 4px;
 }
+
 .cmain .detail_item p {
   margin: 0;
 }
+.detail_item_reply{
+  margin-bottom: 20px;
+}
 
-textarea:focus{
-   outline: none;
- }
+textarea:focus {
+  outline: none;
+}
 </style>

+ 146 - 42
src/views/JOINTCONFERENCE/detail.vue

@@ -1,46 +1,138 @@
 <template>
   <div class="cmain">
-    <div class="detail_item">
+    <el-descriptions size="medium" border :labelStyle="{ width: '120px' }" :column="2">
+      <el-descriptions-item label="标题"  :span="2" >
+        <span v-html="form.conference.conferenceTitle"></span>
+      </el-descriptions-item>
+
+
+      <el-descriptions-item cetent  label="限期日期" >
+        <span v-if="form.conference.type != 1 && form.conference.date!=null" v-text="form.conference.date"></span>
+        <span v-else>---</span>
+      </el-descriptions-item>
+      <el-descriptions-item label="状态" >
+        <div class="status">
+          {{
+            form.conference.type == 1
+              ? "完结"
+              : form.conference.type == 2
+              ? "长期"
+              : "限期"
+          }}</div
+        >
+      </el-descriptions-item>
+
+      <el-descriptions-item label="协作单位" :span="2" >
+        <span v-text="form.conference.cooperativeUnit"></span>
+      </el-descriptions-item>
+    </el-descriptions>
+
+    <!-- <div class="detail_item">
       <div class="title">会议标题:</div>
       <p>{{ form.conference.conferenceTitle }}</p>
-    </div>
-    <div class="detail_item">
-      <div class="title">会议内容:</div>
-      <p>{{ form.conference.conferenceContent }}</p>
-    </div>
-
-    <div class="dept_list" v-for="(item, index) in form.reply" :key="index">
-      <div class="title">{{ item.deptName }}:</div>
-      <p>{{ item.reply }}</p>
-    </div>
-
-    <div class="detail_item wire">
-      <div class="title ">附件:</div>
-      <div class="item">
-        <div class="item_file" @click="downloadFile(fileList[index], index)" v-for="(item, index) in imgList" :key="index">
-          <img
-            class="file"
-            :src="
-              item.substring(item.lastIndexOf('.') + 1) == 'doc' ||
-              item.substring(item.lastIndexOf('.') + 1) == 'docx'
-                ? word
-                : excel
+    </div> -->
+    <el-form v-model="form">
+      <div >
+        <div
+          style="
+            font-size: 14px;
+            color: #606266;
+            font-weight: 600;
+            line-height: 40px;
             "
-            alt=""
-            
-          />
-          <p
-            class="img_text"
-            :title="imgList[index].replace('/profile/upload/', '')"
+        >
+          内容
+        </div>
+        <div
+          class="test"
+          style="
+            background-color: #f5f7fa;
+            border: 1px solid #dfe4ed;
+            color: #c0c4cc;
+            padding: 10px;
+            min-height: 150px;
+          "
+          v-html="form.conference.conferenceContent"
+        ></div>
+      </div>
+
+      <el-form-item label="协作要求" prop="collaborativeContent">
+        <el-input
+          :disabled="true"
+          type="textarea"
+          rows="4"
+          placeholder="请输入协作要求"
+          v-model="form.conference.collaborativeContent"
+        ></el-input>
+      </el-form-item>
+
+      <!-- <el-form-item label="状态" prop="type">
+        <template>
+          <el-radio disabled v-model="form.conference.type" label="1"
+            >完结</el-radio
+          >
+          <el-radio disabled v-model="form.conference.type" label="2"
+            >长期</el-radio
+          >
+          <el-radio disabled v-model="form.conference.type" label="3"
+            >限期</el-radio
+          >
+        </template>
+      </el-form-item> -->
+
+      <!-- <el-form-item  label="限期日期" prop="date">
+        <el-date-picker
+          :disabled="true"
+          v-model="form.conference.date"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择日期"
+        >
+        </el-date-picker>
+      </el-form-item> -->
+
+      <el-form-item v-for="(item, index) in form.reply" :key="index" :label="item.deptName + ' ' + ' 回复:'" >
+        <el-input
+          :disabled="true"
+          type="textarea"
+          rows="2"
+          v-model="item.reply"
+        ></el-input>
+      </el-form-item>
+
+      <div class="detail_item wire">
+        <div class="title">附件:</div>
+        <div class="item">
+          <div
+            class="item_file"
+            @click="downloadFile(fileList[index], index)"
+            v-for="(item, index) in imgList"
+            :key="index"
           >
-            {{ imgList[index].replace("/profile/upload/", "") }}
-          </p>
+            <img
+              class="file"
+              :src="
+                item.substring(item.lastIndexOf('.') + 1) == 'doc' ||
+                item.substring(item.lastIndexOf('.') + 1) == 'docx'
+                  ? word
+                  : excel
+              "
+              alt=""
+            />
+            <p
+              class="img_text"
+              :title="imgList[index].replace('/profile/upload/', '')"
+            >
+              {{ imgList[index].replace("/profile/upload/", "") }}
+            </p>
+          </div>
         </div>
       </div>
-    </div>
-    <div class="mfooter">
-      <el-button @click="$layer.close(layerid)">返 回</el-button>
-    </div>
+
+      <div class="mfooter">
+        <el-button @click="$layer.close(layerid)">返 回</el-button>
+      </div>
+    </el-form>
   </div>
 </template>
 
@@ -91,7 +183,6 @@ export default {
   },
   methods: {
     downloadFile(item, index) {
-      console.log(item);
       let path = this.imgList[index].replace("/profile", "");
       let name = this.imgList[index].replace("/profile/upload/", "");
       fileDownloadFun({ fileName: path, delete: false }).then((res) => {
@@ -104,6 +195,9 @@ export default {
 </script>
 
 <style scoped lang="scss">
+p{
+  margin: 0;
+}
 .cmain {
   color: #333333;
   font-size: 16px;
@@ -111,14 +205,25 @@ export default {
 .cmain .detail_item {
   display: flex;
   align-items: flex-start;
-  margin-bottom: 50px;
+  margin-top: 20px;
+  margin-bottom: 20px;
 }
-.wire{
 
-}
 .detail_item .title {
-  width: 100px;
+  // width: 100px;
   margin: 0;
+  font-size: 14px;
+  font-weight: 600;
+  color: #606266;
+}
+
+.status {
+  width: 60px;
+  text-align: center;
+  color: #409eff;
+  padding: 4px 8px;
+  border: 1px solid #409eff;
+  border-radius: 4px;
 }
 .cmain .detail_item p {
   margin: 0;
@@ -130,8 +235,7 @@ export default {
   margin-right: 10px;
 }
 
-
-.item_file{
+.item_file {
   cursor: pointer;
   display: flex;
   align-items: center;

+ 28 - 14
src/views/JOINTCONFERENCE/index.vue

@@ -47,7 +47,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['business:JOINTCONFERENCE:add']"
+          v-if="checkPermi(['business:JOINTCONFERENCE:add'])"
           >发起会议</el-button
         >
       </el-col>
@@ -59,7 +59,7 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['business:JOINTCONFERENCE:edit']"
+          v-if="checkPermi(['business:JOINTCONFERENCE:edit'])"
           >修改</el-button
         >
       </el-col> -->
@@ -71,7 +71,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['business:JOINTCONFERENCE:remove']"
+          v-if="checkPermi(['business:JOINTCONFERENCE:remove'])"
           >删除</el-button
         >
       </el-col>
@@ -87,19 +87,19 @@
     >
       <el-table-column type="selection" width="55" align="center" />
 
-      <el-table-column label="会议标题" align="center" prop="conferenceTitle">
+      <el-table-column label="会议标题" width="360" align="center" show-overflow-tooltip prop="conferenceTitle">
         <template slot-scope="scope">
           {{ scope.row.conferenceTitle }}
         </template>
       </el-table-column>
 
-      <el-table-column label="协作单位" align="center" prop="cooperativeUnit">
+      <el-table-column label="协作单位" width="500" align="center" show-overflow-tooltip prop="cooperativeUnit">
         <template slot-scope="scope">
           {{ scope.row.cooperativeUnit }}
         </template>
       </el-table-column>
 
-      <el-table-column label="会议状态" align="center" prop="status">
+      <el-table-column label="会议状态" width="100" align="center" prop="status">
         <template slot-scope="scope">
           <el-tag v-if="scope.row.status == 1">未指派</el-tag>
           <el-tag v-else-if="scope.row.status == 2" type="success"
@@ -109,6 +109,13 @@
         </template>
       </el-table-column>
 
+      <el-table-column label="提交人" width="140" align="center" show-overflow-tooltip prop="createByName">
+      
+      </el-table-column>
+      <el-table-column label="提交时间" width="160" align="center" show-overflow-tooltip prop="updateTime">
+    
+      </el-table-column>
+
       <el-table-column label="已回复单位数量" align="center" prop="replied">
         <template slot-scope="scope">
           {{ scope.row.replied }}
@@ -117,7 +124,8 @@
 
       <el-table-column
         label="操作"
-        align="center"
+        fixed="right"
+        width="140" align="center" show-overflow-tooltip 
         class-name="small-padding fixed-width"
       >
         <template slot-scope="scope">
@@ -125,14 +133,15 @@
             size="mini"
             type="text"
             @click="goDetail(scope.row)"
-            v-hasPermi="['business:JOINTCONFERENCE:query']"
+            v-if="checkPermi(['business:ARTICLE:query'])"
             >会议详情</el-button
           >
+
           <el-button
             size="mini"
             type="text"
             @click="handleUnit(scope.row)"
-            v-hasPermi="['business:JOINTCONFERENCE:add']"
+            v-if="scope.row.condition !=1 && scope.row.status != 3 && checkPermi(['business:JOINTCONFERENCE:edit'])"
             >单位指派</el-button
           >
         </template>
@@ -158,6 +167,7 @@ import {
   updateJOINTCONFERENCE,
 } from "@/api/portal/JOINTCONFERENCE/JOINTCONFERENCE.js";
 import { getInfo } from "@/api/login";
+import { checkPermi } from "@/utils/permission.js";
 
 import add from "./add.vue";
 import detail from "./detail.vue";
@@ -166,6 +176,7 @@ export default {
   name: "JOINTCONFERENCE",
   data() {
     return {
+
       statusList: [
         { label: "未指派", value: 1 },
         { label: "进行中", value: 2 },
@@ -248,25 +259,26 @@ export default {
   },
   created() {
     getInfo().then((res) => {
-      this.queryParams.createBy = res.user.createBy;
+      this.queryParams.createBy = res.user.userName;
       this.getList();
     });
   },
   methods: {
+    checkPermi,
     goDetail(row) {
       this.iframe({
         obj: detail,
         param: { id: row.id },
-        title: "单位指派",
+        title: "会议详情",
         width: "750px",
-        height: "60%",
+        height: "70%",
       });
     },
     handleUnit(row) {
       const id = row.id || this.ids;
       this.iframe({
         obj: add,
-        param: { id: id },
+        param: { id: id,edit:true },
         title: "单位指派",
         width: "750px",
         height: "60%",
@@ -321,7 +333,9 @@ export default {
     handleAdd() {
       this.iframe({
         obj: add,
-        param: {},
+        param: {
+          edit:false
+        },
         title: "发起会议",
         width: "750px",
         height: "60%",

+ 7 - 5
src/views/LEAVEMESSAGE/index.vue

@@ -29,12 +29,12 @@
         <el-button type="primary" icon="el-icon-edit" :disabled="single" @click="handleUpdate(scope.row)" v-hasPermi="['business:LEAVEMESSAGE:edit']">查看</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button type="danger" icon="el-icon-delete" :disabled="multiple" @click="handleDelete(scope.row)" v-hasPermi="['business:LEAVEMESSAGE:remove']">删除</el-button>
+        <el-button type="danger" icon="el-icon-delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['business:LEAVEMESSAGE:remove']">删除</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table  :data="LEAVEMESSAGEList" @selection-change="handleSelectionChange">
+    <el-table  ref="multipleTable"  :data="LEAVEMESSAGEList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="创建人" align="center" prop="createBy" />
       <el-table-column label="留言人姓名" align="center" prop="ansName" />
@@ -252,9 +252,9 @@ export default {
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const ids = row.id || this.ids;
+      const ids = row ? row.id : this.ids;
       this.$modal
-        .confirm('是否确认删除留言反馈编号为"' + ids + '"的数据项?')
+        .confirm('是否确认删除所选留言?')
         .then(function () {
           return delLEAVEMESSAGE(ids);
         })
@@ -262,7 +262,9 @@ export default {
           this.getList();
           this.$modal.msgSuccess('删除成功');
         })
-        .catch(() => {});
+        .catch(() => {
+          this.$refs.multipleTable.clearSelection();
+        });
     },
     /** 导出按钮操作 */
     handleExport() {

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

@@ -27,7 +27,7 @@
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="单位名称" align="left" prop="depName" />
       <el-table-column label="单位编码" align="center" prop="deptId" width="90" />
-      <el-table-column label="位置" align="center" prop="location" />
+      <el-table-column label="位置" width="260" show-overflow-tooltip  align="center" prop="location" />
       <el-table-column label="电话" align="center" prop="telphone" />
       <el-table-column label="邮箱" align="center" prop="email" />
     </el-table>
@@ -125,15 +125,15 @@ export default {
       rules: {
         id: [{ required: true, message: '主键不能为空', trigger: 'blur' }],
         delFlag: [{ required: true, message: '删除标志不能为空', trigger: 'blur' }],
-        deptId: [{ required: true, message: '单位编码不能为空', trigger: 'blur' },
-                 { pattern: /^[1-9a-zA-Z]{1,}$/, message: '单位编码只能输入数字和字母', trigger: 'blur' }
-                ],
+        // deptId: [{ required: true, message: '单位编码不能为空', trigger: 'blur' },
+        //          { pattern: /^[1-9a-zA-Z]{1,}$/, message: '单位编码只能输入数字和字母', trigger: 'blur' }
+        //         ],
         depName: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }],
         telphone: [{ required: true, message: '单位电话不能为空', trigger: 'blur' },
                   {validator: this.validateMobile, trigger: "blur"}],
         location: [{ required: true, message: '单位地址不能为空', trigger: 'blur' }],
-        email: [{ required: true, message: '单位邮箱不能为空', trigger: 'blur' },
-                { validator: this.validEmailFun, trigger: 'blur' }],
+        //email: [{ required: true, message: '单位邮箱不能为空', trigger: 'blur' },
+        //        { validator: this.validEmailFun, trigger: 'blur' }],
         introduction:[{ required: true, message: '简介不能为空', trigger: 'blur' }]
       }
     };

+ 1 - 1
src/views/QUESTION/edit.vue

@@ -55,7 +55,7 @@
         </el-select>
       </el-form-item>
     </el-form>
-    <div slot="footer" class="dialog-footer">
+    <div slot="footer" class="dialog-footer" style="display: flex; justify-content: center;">
       <el-button type="primary" @click="submitForm">确 定</el-button>
       <el-button @click="$layer.close(layerid)">取 消</el-button>
     </div>

+ 15 - 12
src/views/QUESTION/index.vue

@@ -98,7 +98,7 @@
               <div class="clear_p" v-html="props.row.expertAnswer"></div>
             </el-form-item>
             <el-form-item label="提问详情">
-              {{ props.row.detail }}
+              <span v-html="props.row.detail"></span>
             </el-form-item>
           </el-form>
         </template>
@@ -128,10 +128,10 @@
           {{ scope.row.detail }}
         </template>
       </el-table-column> -->
-      <el-table-column label="评价状态" align="center" prop="status">
+      <el-table-column label="回复状态" align="center" prop="status">
         <template slot-scope="scope">
-          <el-tag v-if="scope.row.status == 0">未回复</el-tag>
-          <el-tag v-else-if="scope.row.status == 1" type="success"
+          <!-- <el-tag v-if="scope.row.status == 0">未回复</el-tag> -->
+          <el-tag v-if="scope.row.status == 1" type="success"
             >已回复</el-tag
           >
         </template>
@@ -148,26 +148,29 @@
       </el-table-column>
       <el-table-column label="审核状态" align="center" prop="checkStatus" width="100px">
         <template slot-scope="scope">
-          <el-tag v-if="scope.row.checkStatus == 0">待审核</el-tag>
-          <el-tag v-else-if="scope.row.checkStatus == 1" type="success"
-            >审核</el-tag
+          <el-tag v-if="scope.row.checkStatus == 0" type="info">草稿</el-tag>
+          <el-tag v-else-if="scope.row.checkStatus == 1" 
+            >审核</el-tag
           >
-          <el-tag v-else-if="scope.row.checkStatus == 2" type="danger"
+          <el-tag v-else-if="scope.row.checkStatus == 2" type="success"
+            >审核通过</el-tag
+          >
+          <el-tag v-else-if="scope.row.checkStatus == 3" type="danger"
             >审核拒绝</el-tag
           >
         </template>
       </el-table-column>
       <el-table-column label="评价" align="center" prop="judge">
         <template slot-scope="scope">
-          <el-tag v-if="scope.row.judge == 0">未评价</el-tag>
-          <el-tag v-else-if="scope.row.judge == 1" type="success">好评</el-tag>
+          <!-- <el-tag v-if="scope.row.judge == 0">未评价</el-tag> -->
+          <el-tag v-if="scope.row.judge == 1" type="success">好评</el-tag>
           <el-tag v-else-if="scope.row.judge == 2" type="warning">中评</el-tag>
           <el-tag v-else-if="scope.row.judge == 3" type="danger">差评</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="回复时间" align="center" prop="responseTime">
+      <el-table-column label="回复时间" align="center" prop="replyTime">
         <template slot-scope="scope">
-          {{ scope.row.responseTime }}
+          {{ parseTime(scope.row.replyTime, '{y}-{m}-{d} {h}:{i}') }}
         </template>
       </el-table-column>
 

+ 66 - 32
src/views/RANK/index.vue

@@ -1,15 +1,21 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="保税区名称" prop="type" label-width="110">
-        <el-select v-model="queryParams.deptId" placeholder="请选择保税区" clearable filterable class="se">
+      <el-form-item label="综合保税区名称" prop="type" label-width="110">
+        <el-select v-model="queryParams.deptId" placeholder="请选择综合保税区" clearable filterable class="se">
           <el-option v-for="item in deptList" :key="item.id" :label="item.deptName" :value="item.deptId" />
         </el-select>
       </el-form-item>
       <el-form-item label="年份" prop="type" label-width="110">
-        <el-select v-model="queryParams.year" placeholder="请选择年份" clearable filterable class="se">
+        <!-- <el-select v-model="queryParams.year" placeholder="请选择年份" clearable filterable class="se">
           <el-option v-for="item in nearYearList" :key="item" :label="item" :value="item" />
-        </el-select>
+        </el-select> -->
+        <el-date-picker
+          v-model="queryParams.year"
+          type="year"
+          value-format="yyyy"
+          placeholder="选择年">
+        </el-date-picker>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -65,7 +71,7 @@
 
     <el-table  :data="RANKList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="保税区" align="center" prop="deptName">
+      <el-table-column label="综合保税区" align="center" prop="deptName">
         <template slot-scope="scope">
           {{scope.row.deptName}}
         </template>
@@ -75,9 +81,19 @@
           {{scope.row.year}}
         </template>
       </el-table-column>
-      <el-table-column label="排名" align="center" prop="ranking">
+      <el-table-column label="全国进出口值排名" align="center" prop="ranking">
+        <template slot-scope="scope">
+          {{scope.row.ranking == 0 || scope.row.ranking==null?'-':scope.row.ranking}}
+        </template>
+      </el-table-column>
+      <el-table-column label="中西部绩效排名" align="center" prop="midwestRanking">
+        <template slot-scope="scope">
+          {{scope.row.midwestRanking==0 || scope.row.midwestRanking==null?'-':scope.row.midwestRanking}}
+        </template>
+      </el-table-column>
+      <el-table-column label="全国绩效排名" align="center" prop="nationalPerformanceRanking">
         <template slot-scope="scope">
-          {{scope.row.ranking}}
+          {{scope.row.nationalPerformanceRanking==0|| scope.row.nationalPerformanceRanking==null?'-':scope.row.nationalPerformanceRanking}}
         </template>
       </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -110,9 +126,9 @@
 
     <!-- 添加或修改广西保税区排名对话框 -->
     <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item prop="deptId"  label-width="100px" label="保税区名称">
-          <el-select v-model="form.deptId" filterable default-first-option clearable placeholder="请选择保税区">
+      <el-form ref="form" :model="form" :rules="rules" label-width="140px">
+        <el-form-item prop="deptId" label="综合保税区名称">
+          <el-select v-model="form.deptId" filterable default-first-option clearable placeholder="请选择综合保税区">
             <el-option
               v-for="item in deptList"
               :key="item.deptId"
@@ -121,7 +137,7 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item prop="year" label-width="100px" label="年份">
+        <el-form-item prop="year" label="年份">
           <el-select v-model="form.year" filterable default-first-option clearable placeholder="请选择年份">
             <el-option
               v-for="(item,i) in nearYearList"
@@ -132,10 +148,18 @@
           </el-select>
         </el-form-item>
 
-        <el-form-item prop="ranking" label-width="100px" label="排名">
+        <el-form-item prop="ranking" label="全国进出口值排名">
           <el-input  v-model="form.ranking" placeholder="请输入排名" ></el-input>
         </el-form-item>
 
+        <el-form-item prop="midwestRanking" label="中西部绩效排名">
+          <el-input  v-model="form.midwestRanking" placeholder="请输入排名" ></el-input>
+        </el-form-item>
+
+        <el-form-item prop="nationalPerformanceRanking" label="全国绩效排名">
+          <el-input  v-model="form.nationalPerformanceRanking" placeholder="请输入排名" ></el-input>
+        </el-form-item>
+
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -193,15 +217,23 @@ export default {
       // 表单校验
       rules: {
         deptId: [
-          { required: true, message: "保税区ID不能为空", trigger: "blur" }
+          { required: true, message: "综合保税区ID不能为空", trigger: "blur" }
         ],
         year: [
           { required: true, message: "年份不能为空", trigger: "blur" }
         ],
         ranking: [
-          { required: true, message: "排名不能为空", trigger: "blur" },
-          { trigger: 'blur', validator: this.validatorFloatNum }
+          { required: true, message: "全国进出口值排名不能为空", trigger: "blur" },
+          { trigger: 'blur', validator: this.validateNumber }
         ],
+        midwestRanking: [
+          { required: true, message: "中西部绩效排名不能为空", trigger: "blur" },
+          { trigger: 'blur', validator: this.validateNumber }
+        ],
+        nationalPerformanceRanking: [
+          { required: true, message: "全国绩效排名不能为空", trigger: "blur" },
+          { trigger: 'blur', validator: this.validateNumber }
+        ]
       }
     };
   },
@@ -231,17 +263,17 @@ export default {
     },
     // 获取近年年份
     getNearYear() {
-      let currentDate = new Date();
-      let curYear = currentDate.getFullYear();
+      // let currentDate = new Date();
+      // let curYear = currentDate.getFullYear();
 
-      // 获取近三年
-      let nearYearArr = [];
-      nearYearArr.push(curYear)
-      for (let i = 1; i <= 4; i++) {
-        nearYearArr.push(curYear - i + '');
-      }
+      // // 获取近三年
+      // let nearYearArr = [];
+      // nearYearArr.push(curYear)
+      // for (let i = 1; i <= 10; i++) {
+      //   nearYearArr.push(curYear - i + '');
+      // }
 
-      this.nearYearList = nearYearArr
+      // this.nearYearList = nearYearArr
 
     },
     // 取消按钮
@@ -266,6 +298,9 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
+      this.queryParams.deptId = '';
+      this.queryParams.year = '';
+
       this.resetForm("queryForm");
       this.handleQuery();
     },
@@ -329,14 +364,13 @@ export default {
       }, `RANK_${new Date().getTime()}.xlsx`)
     },
     // 校验参数
-    validatorFloatNum(rule, value, callback) {
-      let reg = /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g;
-      if (!reg.test(value)) {
-        callback(new Error('请输入数字和正确格式的数字'));
-      } else if (value.split('.').length > 1) {
-        callback(new Error('请输入正确格式的数字')); //防止输入多个小数点
-      } else if (value.indexOf('.') != -1 && value.split('.')[1].length > 6) {
-        callback(new Error('最多只能输入两位小数')); //小数点后两位
+    validateNumber(rule, value, callback) {
+      if (value === '') {
+        callback(new Error('请输入整数'));
+      } else if (!Number.isInteger(Number(value))) {
+        callback(new Error('请输入整数'));
+      } else if (Number(value) < 0) {
+        callback(new Error('不能小于0'));
       } else {
         callback();
       }

+ 18 - 12
src/views/RightDistribution/index.vue

@@ -45,7 +45,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['business:NORMROLE:add']"
+          v-if="checkPermi(['norm:NORMROLE:add'])"
           >新增</el-button
         >
       </el-col>
@@ -57,7 +57,7 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          v-hasPermi="['business:NORMROLE:edit']"
+          v-if="checkPermi(['norm:NORMROLE:edit'])"
           >修改</el-button
         >
       </el-col>
@@ -69,7 +69,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['business:NORMROLE:remove']"
+          v-if="checkPermi(['norm:NORMROLE:remove'])"
           >删除</el-button
         >
       </el-col>
@@ -103,9 +103,7 @@
           <!-- </el-link> -->
         </template>
       </el-table-column>
-      <el-table-column label="指标编号" align="center" prop="feeId">
-      </el-table-column>
-      <el-table-column label="排序" align="center" prop="senId">
+      <el-table-column label="角色名称" align="center" prop="senId_dictText">
       </el-table-column>
       <el-table-column label="是否启用" align="center" prop="status">
         <template slot-scope="scope">
@@ -128,7 +126,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['business:NORMROLE:edit']"
+            v-if="checkPermi(['norm:NORMROLE:edit'])"
             >修改</el-button
           >
           <el-button
@@ -136,7 +134,7 @@
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['business:NORMROLE:remove']"
+            v-if="checkPermi(['norm:NORMROLE:remove'])"
             >删除</el-button
           >
         </template>
@@ -155,12 +153,12 @@
     <el-dialog :title="title" :visible.sync="open" width="35%" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="选择角色" prop="senId">
-          <el-select filterable v-model="form.senId" placeholder="请选择">
+          <el-select filterable multiple v-model="form.senId" placeholder="请选择">
             <el-option
               v-for="item in roleList"
               :key="item.value"
               :label="item.roleName"
-              :value="item.roleId"
+              :value="item.roleId + ''"
             >
             </el-option>
           </el-select>
@@ -182,7 +180,6 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-    
   </div>
 </template>
 
@@ -200,6 +197,7 @@ import {
 } from "@/api/portal/RightDistribution/RightDistribution";
 
 import { listRole } from "@/api/system/role";
+import { checkPermi } from "@/utils/permission.js";
 
 export default {
   name: "NORMROLE",
@@ -243,6 +241,7 @@ export default {
         pageNum: 1,
         pageSize: 10,
         id: null,
+        nsType: 1,
         createTime: null,
         createBy: null,
         updateTime: null,
@@ -292,6 +291,7 @@ export default {
     this.getRoleList();
   },
   methods: {
+    checkPermi,
     statusChange(val) {
       if (val.status == 0) {
         setNORMROLEStart(val.id).then((res) => {
@@ -312,7 +312,6 @@ export default {
     tableBdClick(data) {
       this.queryParams.id = data.senId;
       listNORMROLE(this.pageParams).then((res) => {
-        console.log(res);
       });
     },
 
@@ -332,6 +331,7 @@ export default {
     /** 查询指标采集权限配置列表 */
     getList() {
       this.loading = true;
+      // this.queryParams.nsType = 2;
       listNORMROLE(this.queryParams).then((response) => {
         response.rows.forEach((item, index) => {
           response.rows[index].status = item.status == 0 ? false : true;
@@ -389,6 +389,10 @@ export default {
       const id = row.id || this.ids;
       getNORMROLE(id).then((response) => {
         this.form = response.data;
+        this.form.senId = this.form.senId.split(",");
+        this.form.senId.forEach((item,i)=>{
+          this.form.senId[i] = item;
+        });
         this.open = true;
         this.title = "修改指标采集权限配置";
       });
@@ -397,6 +401,7 @@ export default {
     submitForm() {
       this.$refs["form"].validate((valid) => {
         if (valid) {
+          this.form.senId = this.form.senId.toString();
           if (this.form.id != null) {
             updateNORMROLE(this.form).then((response) => {
               this.$modal.msgSuccess("修改成功");
@@ -404,6 +409,7 @@ export default {
               this.getList();
             });
           } else {
+            this.form.nsType = 1;
             this.form.status = 1;
             addNORMROLE(this.form).then((response) => {
               this.$modal.msgSuccess("新增成功");

+ 0 - 2
src/views/TOTEXP/index.vue

@@ -406,7 +406,6 @@ export default {
     },
     // 部门选择器
     formDeptSelect() {
-      console.log('部门id', this.form.deptId)
       // 寻找deptId 对应的部门
       let dept = this.deptList.filter(item => item.deptId === this.form.deptId)[0]
       // 根据部门 的 type 赋值给level
@@ -469,7 +468,6 @@ export default {
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate((valid) => {
-        console.log(valid);
         if (valid) {
           if (this.form.id != null) {
             updateTOTEXP(this.form).then((response) => {

+ 122 - 192
src/views/TQSJ/index.vue

@@ -1,227 +1,116 @@
 <template>
   <div class="app-container">
-    
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
-      
       <el-form-item label="保税区">
-        <el-select v-model="queryParams.cbIdArr" multiple placeholder="请选择保税区">
-          <el-option
-            v-for="item in regionList"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
+        <el-select v-model="queryParams.cbIdArr" multiple collapse-tags placeholder="请选择保税区">
+          <el-option @change="selectBsqHandle" v-for="item in regionList" :key="item.value" :label="item.label" :value="item.value"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="指标名称">
         <el-select v-model="queryParams.normFeeId" placeholder="请选择指标名称">
-          <el-option
-            v-for="item in normFeelistAll"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-       </el-select>
+          <el-option v-for="item in normFeelistAll" :key="item.value" :label="item.label" :value="item.value"></el-option>
+        </el-select>
       </el-form-item>
-
       <el-form-item label="时间类型">
-
         <el-select v-model="queryParams.dateType" placeholder="请选择" clearable filterable class="se" @change="selectChange">
           <el-option v-for="t in datelist" :key="t.value" :label="t.label" :value="t.value" />
         </el-select>
-
-        <el-date-picker v-if="queryParams.dateType == 1" v-model="queryParams.yearVlue" type="year" placeholder="选择年" value-format="yyyy" format="yyyy 年" style="margin-left: 10px;"></el-date-picker>
-
-        <el-select v-if="queryParams.dateType == 1" v-model="formatY" placeholder="选择月" clearable filterable class="se" style="margin-left: 10px;">
+        <el-date-picker v-if="queryParams.dateType == 1" v-model="queryParams.yearVlue" type="year" placeholder="选择年" value-format="yyyy" format="yyyy 年" style="margin-left: 10px"></el-date-picker>
+        <el-select v-if="queryParams.dateType == 1" v-model="formatY" placeholder="选择月" clearable filterable class="se" style="margin-left: 10px">
           <el-option v-for="t in 12" :key="t.value" :label="t + '月'" :value="t" />
         </el-select>
-
-        <el-select v-if="queryParams.dateType == 2" v-model="queryParams.dateValue" placeholder="选择季度" clearable filterable class="se" style="margin-left: 10px;">
-          <el-option v-for="t in jdlist" :key="t.value" :label="t.label" :value="t.value"/>
+        <el-select v-if="queryParams.dateType == 2" v-model="queryParams.dateValue" placeholder="选择季度" clearable filterable class="se" style="margin-left: 10px">
+          <el-option v-for="t in jdlist" :key="t.value" :label="t.label" :value="t.value" />
         </el-select>
-
-        <el-date-picker v-if="queryParams.dateType == 3" v-model="queryParams.dateValue" type="year" placeholder="选择年" value-format="yyyy" format="yyyy 年" style="margin-left: 10px;"></el-date-picker>
-
+        <el-date-picker v-if="queryParams.dateType == 3" v-model="queryParams.dateValue" type="year" placeholder="选择年" value-format="yyyy" format="yyyy 年" style="margin-left: 10px"></el-date-picker>
       </el-form-item>
-
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
-
-      <!-- <el-form-item label="图形类型">
-        <el-select v-model="contentType" placeholder="请选择图形类型">
-          <el-option
-            v-for="item in contentTypelist"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-       </el-select>
-      </el-form-item> -->
     </el-form>
-
     <el-row :gutter="10" class="mb8">
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-
-    <el-table :data="dataList" height="500px">
+    <el-table :data="dataList" :span-method="objectSpanMethod">
       <el-table-column label="保税区名称" align="center" prop="cbName" width="150px">
-        <template slot-scope="scope">
-          {{ scope.row.cbName }}
-        </template> 
+        <template slot-scope="scope">{{ scope.row.cbName }}</template>
       </el-table-column>
       <el-table-column label="指标名称" align="center" prop="colName">
-        <template slot-scope="scope">
-          {{ scope.row.colName }}
-        </template>
+        <template slot-scope="scope">{{ scope.row.feeName }}({{ scope.row.funit }})</template>
       </el-table-column>
-
-      <!-- <el-table-column  v-for="item in datails" :key="Math.random()"  :label="item[0].timeValue" align="center" prop="colName">
-        <template slot="header" slot-scope="scope">
-          {{ scope.row.$index }}
-        </template>
-          <el-table-column label="对比值" align="center" prop="colName">
-            <template slot-scope="scope">
-              1
-            </template>
-          </el-table-column>
-          <el-table-column label="当前" align="center" prop="colName">
-            <template slot-scope="scope">
-              2
-            </template>
-          </el-table-column>
-          <el-table-column label="浮动" align="center" prop="colName">
-            <template slot-scope="scope">
-             3
-            </template>
-          </el-table-column>
-      </el-table-column> -->
-          
-
-     <el-table-column align="center" prop="colName" v-if=" queryParams.dateType == ''">
+      <el-table-column align="center" prop="colName" v-if="queryParams.dateType == '1' || queryParams.dateType == ''">
         <template slot="header" slot-scope="scope">
-          {{ (timeValue[0]?timeValue[0]:'月份').replace('-', '年111111') }}
+          {{ timeValue[0] ? timeValue[0] : '月份' }}
         </template>
-          <el-table-column label="对比值(去年)" align="center" prop="colName" width="120px">
+        <el-table-column label="对比值(去年)" align="center" prop="colName" width="150px">
           <template slot-scope="scope">
-            {{ scope.row.datails[0].oldValue }}
+            {{ scope.row.oldCollValue }}
           </template>
         </el-table-column>
         <el-table-column label="当前" align="center" prop="colName">
           <template slot-scope="scope">
-            {{ scope.row.datails[0].nowValue }}
+            {{ scope.row.collValue }}
           </template>
         </el-table-column>
         <el-table-column label="同比%" align="center" prop="colName">
           <template slot-scope="scope">
-            <!-- {{ scope.row.datails[0].redio==0?'持平':scope.row.datails[0].redio+'%'}} -->
-            <el-tag v-if="scope.row.datails[0].redio==0">持平</el-tag>
-            <el-tag type="success" v-else-if="scope.row.datails[0].redio >0">{{scope.row.datails[0].redio+'%'}}</el-tag>
-            <el-tag type="danger" v-else-if="scope.row.datails[0].redio <0">{{scope.row.datails[0].redio+'%'}}</el-tag>
+            <el-tag v-if="scope.row.tbValue == 0">持平</el-tag>
+            <el-tag type="success" v-else-if="scope.row.tbValue > 0">{{ scope.row.tbValue + '%' }}</el-tag>
+            <el-tag type="danger" v-else-if="scope.row.tbValue < 0">{{ scope.row.tbValue + '%' }}</el-tag>
           </template>
         </el-table-column>
       </el-table-column>
-
-      <el-table-column align="center" prop="colName" v-if="queryParams.dateType == '1'">
-        <template slot="header" slot-scope="scope">
-          {{ (timeValue[0]?timeValue[0]:'月份').replace('-', '年111111') }}
-        </template>
-          <el-table-column label="对比值(去年)" align="center" prop="colName" width="120px">
-          <template slot-scope="scope">
-            {{ scope.row.datails[0].oldValue }}
-          </template>
-        </el-table-column>
-        <el-table-column label="当前" align="center" prop="colName">
-          <template slot-scope="scope">
-            {{ scope.row.datails[0].nowValue }}
-          </template>
-        </el-table-column>
-        <el-table-column label="同比%" align="center" prop="colName">
-          <template slot-scope="scope">
-            <!-- {{ scope.row.datails[0].redio==0?'持平':scope.row.datails[0].redio+'%'}} -->
-            <el-tag v-if="scope.row.datails[0].redio==0">持平</el-tag>
-            <el-tag type="success" v-else-if="scope.row.datails[0].redio >0">{{scope.row.datails[0].redio+'%'}}</el-tag>
-            <el-tag type="danger" v-else-if="scope.row.datails[0].redio <0">{{scope.row.datails[0].redio+'%'}}</el-tag>
-          </template>
-        </el-table-column>
-      </el-table-column> 
-
-       <el-table-column align="center" prop="colName" v-if="queryParams.dateType == '2' || queryParams.dateType == ''">
-        <template slot="header" slot-scope="scope">
-          {{ (timeValue[1]?timeValue[1] + '季度':'季度').replace('-','年222222第') }}
-        </template>
-        <el-table-column label="对比值(去年)" align="center" prop="colName" width="120px">
-          <template slot-scope="scope">
-            {{ scope.row.datails[1].oldValue }}
-          </template>
-        </el-table-column>
-        <el-table-column label="当前" align="center" prop="colName">
-          <template slot-scope="scope">
-            {{ scope.row.datails[1].nowValue }}
-          </template>
-        </el-table-column>
-        <el-table-column label="同比%" align="center" prop="colName">
-          <template slot-scope="scope">
-            <el-tag v-if="scope.row.datails[1].redio==0">持平</el-tag>
-            <el-tag type="success" v-else-if="scope.row.datails[1].redio >0">{{scope.row.datails[1].redio+'%'}}</el-tag>
-            <el-tag type="danger" v-else-if="scope.row.datails[1].redio <0">{{scope.row.datails[1].redio+'%'}}</el-tag>
-          </template>
-        </el-table-column>
-      </el-table-column>
-
       <el-table-column align="center" prop="colName" v-if="queryParams.dateType == '3' || queryParams.dateType == ''">
         <template slot="header" slot-scope="scope">
-          {{ timeValue[2]?timeValue[2] + '年度':'年度' }}
+          {{ timeValue[0] ? timeValue[0] : '年度' }}
         </template>
-        <el-table-column label="对比值(去年)" align="center" prop="colName" width="120px">
+        <el-table-column label="对比值(去年)" align="center" prop="colName" width="150px">
           <template slot-scope="scope">
-            {{ scope.row.datails[2].oldValue }}
+            {{ scope.row.oldCollValue }}
           </template>
         </el-table-column>
         <el-table-column label="当前" align="center" prop="colName">
           <template slot-scope="scope">
-            {{ scope.row.datails[2].nowValue }}
+            {{ scope.row.collValue }}
           </template>
         </el-table-column>
         <el-table-column label="同比%" align="center" prop="colName">
           <template slot-scope="scope">
-            <el-tag v-if="scope.row.datails[2].redio==0">持平</el-tag>
-            <el-tag type="success" v-else-if="scope.row.datails[2].redio >0">{{scope.row.datails[2].redio+'%'}}</el-tag>
-            <el-tag type="danger" v-else-if="scope.row.datails[2].redio <0">{{scope.row.datails[2].redio+'%'}}</el-tag>
+            <el-tag v-if="scope.row.tbValue == 0">持平</el-tag>
+            <el-tag type="success" v-else-if="scope.row.tbValue > 0">{{ scope.row.tbValue + '%' }}</el-tag>
+            <el-tag type="danger" v-else-if="scope.row.tbValue < 0">{{ scope.row.tbValue + '%' }}</el-tag>
           </template>
         </el-table-column>
-      </el-table-column> 
-
+      </el-table-column>
     </el-table>
-
   </div>
 </template>
 
 <script>
-import { getTQSJ,normFeelistAll,bondedList } from '@/api/portal/figure/figure.js';
+import { getTQSJ, normFeelistAll, bondedList } from '@/api/portal/figure/figure.js';
 export default {
   name: 'TQSJ',
   data() {
     return {
-      formatY:'',
+      formatY: '',
       categoryChartData: {},
-      contentType:'1',
-      contentTypelist:[
+      contentType: '1',
+      contentTypelist: [
         { label: '列表', value: '1' },
         { label: '柱状图', value: '2' },
-        { label: '雷达图', value: '3' },
+        { label: '雷达图', value: '3' }
       ],
-      datelist:[
+      datelist: [
         { label: '月', value: '1' },
-        { label: '季度', value: '2' },
-        { label: '年', value: '3' },
+        // { label: '季度', value: '2' },
+        { label: '年', value: '3' }
       ],
-      jdlist:[
+      jdlist: [
         { label: '第一季度', value: '1' },
         { label: '第二季度', value: '2' },
         { label: '第三季度', value: '3' },
-        { label: '第四季度', value: '4' },
+        { label: '第四季度', value: '4' }
       ],
       dialogVisible: false,
       fileList: [],
@@ -235,82 +124,123 @@ export default {
       dataList: [],
       // 查询参数
       queryParams: {
-        cbIdArr:[],  //保税区id集合
-        dateType:'',  //查询时间类型(1=月,2=季度,3=年)
-        dateValue:'', //查询时间值
-        normFeeId:'',  //指标明细id
-        yearVlue:'',//如果选了月  那这里接收年的值 选的年还是传的dateValue
+        cbIdArr: [], //保税区id集合
+        dateType: '', //查询时间类型(1=月,2=季度,3=年)
+        dateValue: '', //查询时间值
+        normFeeId: '', //指标明细id
+        yearVlue: '' //如果选了月  那这里接收年的值 选的年还是传的dateValue
       },
-      normFeelistAll:[],  //指标列表
-      regionList:[],  //保税区列表
-      timeValue:[],
+      normFeelistAll: [], //指标列表
+      regionList: [], //保税区列表
+      timeValue: []
     };
   },
   created() {
-    this.bondedList()
-    this.getNormFeelistAll()
+    this.bondedList();
+    // this.getNormFeelistAll()
   },
   methods: {
-    selectChange(val){
-      this.queryParams.dateValue = ''
-      this.queryParams.yearVlue = ''
+    selectBsqHandle() {
+      this.getList();
+    },
+    selectChange(val) {
+      this.queryParams.dateValue = '';
+      this.queryParams.yearVlue = '';
     },
     getList() {
-      this.timeValue = []
+      this.timeValue = [];
+      this.dataList = [];
       this.loading = true;
-      if(this.queryParams.dateType == '1'){
-        if(this.formatY >= 10){
-          this.queryParams.dateValue = this.formatY + '月'
-        }else{
-          this.queryParams.dateValue = '0'+this.formatY + '月'
+      if (this.queryParams.dateType == '1') {
+        if (this.formatY >= 10) {
+          this.queryParams.dateValue = this.formatY + '月';
+        } else {
+          this.queryParams.dateValue = '0' + this.formatY + '月';
         }
       }
-      getTQSJ(this.queryParams).then(response => {
-        this.dataList = []
-        this.dataList = response.data;
-        if(this.dataList){
-          for (const i in this.dataList[0].datails) {
-            this.timeValue.push(this.dataList[0].datails[i].timeValue)
+      getTQSJ(this.queryParams).then((response) => {
+        response.data.forEach((item) => {
+          if (item.data) {
+            item.data.forEach((child) => {
+              child.cbName = this.dict(item.deptId).label;
+              child.collValue = Number(child.collValue.toString().replace(/(.d*?)0+$/, '$1'));
+              this.timeValue.push(this.queryParams.dateType == 1 ? child.year + '年' + child.month : child.year);
+              this.dataList.push(child);
+            });
           }
-        }
+        });
         this.loading = false;
       });
     },
-    bondedList(){
-      this.regionList = []
-      bondedList().then(res=>{
+    dict(deptId) {
+      return this.regionList.filter((item) => item.value == deptId)[0];
+    },
+    bondedList() {
+      this.regionList = [];
+      bondedList().then((res) => {
         for (const i in res.data) {
-          this.regionList.push({ 
-            label:res.data[i].deptName,
-            value:res.data[i].deptId,
-           })
+          this.regionList.push({
+            label: res.data[i].deptName,
+            value: res.data[i].deptId
+          });
         }
-      })
+      });
     },
-    getNormFeelistAll(){
-      this.normFeelistAll = []
-      normFeelistAll().then(res=>{
+    getNormFeelistAll() {
+      this.normFeelistAll = [];
+      normFeelistAll().then((res) => {
         for (const i in res.data) {
-          this.normFeelistAll.push({ 
-            label:res.data[i].fname,
-            value:res.data[i].id,
-           })
+          this.normFeelistAll.push({
+            label: res.data[i].fname,
+            value: res.data[i].id
+          });
         }
         this.getList();
-      })
+      });
     },
     handleQuery() {
       this.getList();
     },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      //列合并
+      if (columnIndex === 0) {
+        // 只合并第一行
+        if (this.dataList.filter(({ cbName }) => cbName == row.cbName).length > 1) {
+          // 只合并相同名字下行数大于1的(废话,不然没有合并的必要)
+          if (rowIndex == this.dataList.findIndex(({ cbName }) => cbName == row.cbName)) {
+            // 找到第一个同名的索引,从第一个开始合并,其他隐藏)
+            return {
+              // 合并长度就是数组的长度  宽度是表头的宽度
+              rowspan: this.dataList.filter(({ cbName }) => cbName == row.cbName).length,
+              colspan: column.colSpan
+            };
+          } else {
+            // 只保留第一行其他的隐藏
+            return {
+              rowspan: 0,
+              colspan: 0
+            };
+          }
+        } else {
+          return {
+            rowspan: 1,
+            colspan: 1
+          };
+        }
+      }
+    },
     /** 重置按钮操作 */
     resetQuery() {
+      this.timeValue = [];
+      this.dataList = [];
       this.queryParams.cbIdArr = [];
       this.queryParams.dateType = '';
       this.queryParams.dateValue = '';
       this.queryParams.normFeeId = '';
       this.queryParams.yearVlue = '';
+      this.formatY = '';
       this.resetForm('queryForm');
-    },
+    }
   }
 };
 </script>

+ 0 - 1
src/views/ZBCS/index.vue

@@ -143,7 +143,6 @@ export default {
       this.ChartData =[]
       getZBCS(this.queryParams).then(response => {
         this.dataList = response.data;
-        console.log(this.dataList);
         for (const i in response.data) {
           this.ChartData.push({ 
             name: response.data[i].colName,

+ 93 - 80
src/views/dashboard/BarChart.vue

@@ -74,95 +74,108 @@ export default {
           seriesData.push(item.value);
         });
       }
-      this.chart.setOption({
-        color: ['rgba(37, 97, 239, 1)'],
-        tooltip: {
-          trigger: 'axis',
-          axisPointer: {
-            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
-          },
-          formatter: '{b} : {c}' + this.tag
-        },
-        grid: {
-          top: '13%',
-          left: '2%',
-          right: '2%',
-          bottom: '2%',
-          containLabel: true,
-          show: false
-        },
-        xAxis: [
-          {
-            type: 'category',
-            data: xAxisData,
-            axisTick: {
-              show: false
-            },
-            axisLine: {
-              lineStyle: {
-                color: '#e6e6e6'
-              }
-            },
-            axisLabel: {
-              show: true,
-              textStyle: {
-                color: '#545555',
-                fontSize: '13'
-              }
-            }
-          }
-        ],
-        yAxis: [
-          {
-            type: 'value',
-            minInterval: 1,
-            axisTick: {
-              show: false
+        this.chart.setOption({
+            color: ['rgba(37, 97, 239, 1)'],
+            tooltip: {
+              trigger: 'axis',
+              axisPointer: {
+                type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
+              },
+              formatter: '{b} : {c}' + this.tag
             },
-            splitArea: {
+            grid: {
+              top: '13%',
+              left: '2%',
+              right: '2%',
+              bottom: '2%',
+              containLabel: true,
               show: false
             },
-            splitLine: {
-              lineStyle: {
-                color: '#e6e6e6',
-                width: 0.7
-              }
-            },
-            axisLine: {
-              lineStyle: {
-                color: '#e6e6e6'
-              }
-            },
-            axisLabel: {
-              textStyle: {
-                color: '#545555'
-              }
-            }
-          }
-        ],
-        series: [
-          {
-            type: 'bar',
-            barWidth: '30%',
-            data: seriesData,
-            animationDuration,
-            itemStyle: {
-              normal: {
-                opacity: 1,
-                barBorderRadius: [3, 3, 0, 0],
-                label: {
+            xAxis: [
+              {
+                type: 'category',
+                data: xAxisData,
+                axisTick: {
+                  show: false
+                },
+                axisLine: {
+                  lineStyle: {
+                    color: '#e6e6e6'
+                  }
+                },
+                axisLabel: {
                   show: true,
-                  position: 'top',
                   textStyle: {
                     color: '#545555',
-                    fontSize: 14
+                    fontSize: '13'
+                  }
+                }
+              }
+            ],
+            yAxis: [
+              {
+                type: 'value',
+                minInterval: 1,
+                axisTick: {
+                  show: false
+                },
+                splitArea: {
+                  show: false
+                },
+                splitLine: {
+                  lineStyle: {
+                    color: '#e6e6e6',
+                    width: 0.7
+                  }
+                },
+                axisLine: {
+                  lineStyle: {
+                    color: '#e6e6e6'
+                  }
+                },
+                axisLabel: {
+                  textStyle: {
+                    color: '#545555'
+                  }
+                }
+              }
+            ],
+            series: [
+              {
+                type: 'bar',
+                barWidth: '30%',
+                data: seriesData,
+                animationDuration,
+                itemStyle: {
+                  normal: {
+                    opacity: 1,
+                    barBorderRadius: [3, 3, 0, 0],
+                    label: {
+                      show: true,
+                      position: 'top',
+                      textStyle: {
+                        color: '#545555',
+                        fontSize: 14
+                      }
+                    }
                   }
                 }
               }
-            }
-          }
-        ]
-      });
+            ],
+            graphic: {
+			        	type: 'text',
+			        	left: 'center',
+			        	top: 'center',
+			        	silent: true,
+			        	invisible: seriesData.length > 0,
+			        	style: {
+			        		fill: '#9d9d9d',
+			        		fontWeight: 'bold',
+			        		text: '暂无数据',
+			        		fontSize: 25
+			        	}
+			        }
+          });
     }
   }
 };

+ 56 - 43
src/views/dashboard/PieChart.vue

@@ -72,51 +72,64 @@ export default {
     },
     setOptions(chartData) {
       let data = chartData;
-      this.chart.setOption({
-        tooltip: {
-          trigger: 'item',
-          formatter: '{b} : {d}%'
-        },
-        color: ['#fddb78', '#2561ef', '#3ed59f', '#fa746b', '#666ee8'],
-        legend: {
-          orient: 'vertical',
-          top: '18%',
-          x: 'left',
-          itemWidth: 12,
-          itemGap: 16,
-          icon: 'circle',
-          textStyle: {
-            color: '#545555',
-            fontSize: 12
-          },
-          formatter: function (name) {
-            let total = 0;
-            for (let i = 0; i < data.length; i++) {
-              total += data[i].value;
-            }
-            for (let i = 0; i < data.length; i++) {
-              if (data[i].name === name) {
-                let percent = ((data[i].value / total) * 100).toFixed(2); // 计算百分比并保留两位小数
-                return name + ' (' + data[i].value + '亿,' + percent + '%)';
+        this.chart.setOption({
+            tooltip: {
+              trigger: 'item',
+              formatter: '{b} : {d}%'
+            },
+            color: ['#fddb78', '#2561ef', '#3ed59f', '#fa746b', '#aa6ee8'],
+            legend: {
+              orient: 'vertical',
+              top: '18%',
+              x: 'left',
+              itemWidth: 12,
+              itemGap: 16,
+              icon: 'circle',
+              textStyle: {
+                color: '#545555',
+                fontSize: 12
+              },
+              formatter: function (name) {
+                let total = 0;
+                for (let i = 0; i < data.length; i++) {
+                  total += +data[i].value;
+                }
+                for (let i = 0; i < data.length; i++) {
+                  if (data[i].name === name) {
+                    let percent = ((data[i].value / total) * 100).toFixed(2); // 计算百分比并保留两位小数
+                    return name + ' (' + data[i].value + '亿,' + percent + '%)';
+                  }
+                }
               }
-            }
-          }
-        },
-        series: [
-          {
-            type: 'pie',
-            radius: ['20%', '40%'],
-            center: ['70%', '45%'],
-            data: data,
-            show: true,
-            label: {
-              normal: {
-                show: false
+            },
+            series: [
+              {
+                type: 'pie',
+                radius: ['20%', '40%'],
+                center: ['70%', '45%'],
+                data: data,
+                show: true,
+                label: {
+                  normal: {
+                    show: false
+                  }
+                }
               }
-            }
-          }
-        ]
-      });
+            ],
+            graphic: {
+			      	type: 'text',
+			      	left: 'center',
+			      	top: 'center',
+			      	silent: true,
+			      	invisible: data.length > 0,
+			      	style: {
+			      		fill: '#9d9d9d',
+			      		fontWeight: 'bold',
+			      		text: '暂无数据',
+			      		fontSize: 25
+			      	}
+			      }
+          });
     }
   }
 };

+ 0 - 1
src/views/dashboard/circleChart.vue

@@ -66,7 +66,6 @@ export default {
       }, 300);
     },
     setOptions(chartData) {
-      console.log(chartData);
       let seriesData = [];
       if (chartData) {
         chartData.forEach((item, index) => {

+ 77 - 45
src/views/index.vue

@@ -77,64 +77,40 @@
     </div>
     <div class="row" style="width: 60%; float: left; margin-top: 15px; padding-left: 20px">
       <div class="cbox">
-        <div class="lable">2023年广西综合保税区进出口总值(亿元)</div>
+        <div class="lable">{{ year }}广西综合保税区进出口总值(亿元)</div>
         <BarChart :chartData="chartData.bar" tag="(亿元)" style="width: 100%"></BarChart>
       </div>
     </div>
     <div class="row" style="width: 25%; float: left; margin-top: 15px">
       <div class="cbox">
-        <div class="lable omit">各综合保税区进出口总值占比(%)</div>
+        <div class="lable omit">{{ year }}各综合保税区进出口总值占比(%)</div>
         <PieChart
-          :chartData="[
-            { name: '凭祥', value: 716.33 },
-            { name: '钦州', value: 265.73 },
-            { name: '南宁', value: 215.48 },
-            { name: '北海', value: 34.49 },
-            { name: '梧州', value: 0 }
-          ]"
+          :chartData="chartData.bar"
         ></PieChart>
       </div>
     </div>
     <div class="row" style="width: 25%; float: left; padding-left: 15px; margin-top: 15px">
       <div class="cbox">
-        <div class="lable omit">各综合保税区加工贸易进出口值占比(%)</div>
+        <div class="lable omit">{{ year }}各综合保税区加工贸易进出口值占比(%)</div>
         <PieChart
-          :chartData="[
-            { name: '南宁', value: 140.09 },
-            { name: '北海', value: 31.17 },
-            { name: '梧州', value: 0.3 },
-            { name: '钦州', value: 10.06 },
-            { name: '凭祥', value: '2' }
-          ]"
+          :chartData="chartData.pie1"
           tag="亿"
         ></PieChart>
       </div>
     </div>
     <div class="row" style="width: 25%; float: left; padding-left: 15px; margin-top: 15px">
       <div class="cbox">
-        <div class="lable omit">各综合保税区物流货物进出口值占比(%)</div>
+        <div class="lable omit">{{ year }}各综合保税区物流货物进出口值占比(%)</div>
         <PieChart
-          :chartData="[
-            { name: '南宁', value: 28.82 },
-            { name: '北海', value: 0.91 },
-            { name: '梧州', value: 1 },
-            { name: '钦州', value: 227.36 },
-            { name: '凭祥', value: 708.94 }
-          ]"
+          :chartData="chartData.pie2"
         ></PieChart>
       </div>
     </div>
     <div class="row" style="width: 25%; float: left; padding-left: 15px; margin-top: 15px">
       <div class="cbox">
-        <div class="lable omit">各综合保税区一般贸易进出口值占比(%)</div>
+        <div class="lable omit">{{ year }}各综合保税区一般贸易进出口值占比(%)</div>
         <PieChart
-          :chartData="[
-            { name: '南宁', value: 46.55 },
-            { name: '北海', value: 2.39 },
-            { name: '梧州', value: 2 },
-            { name: '钦州', value: 28.3 },
-            { name: '凭祥', value: 7.2 }
-          ]"
+          :chartData="chartData.pie3"
         ></PieChart>
       </div>
     </div>
@@ -148,6 +124,7 @@ import RaddarChart from './dashboard/RaddarChart';
 import PieChart from './dashboard/PieChart';
 import BarChart from './dashboard/BarChart';
 import { constantRoutes } from '@/router';
+import axios from 'axios'
 export default {
   name: 'Index',
   components: {
@@ -159,24 +136,79 @@ export default {
   },
   data() {
     return {
+      year: new Date().getFullYear(),
+      nameList: ['南宁', '梧州', '北海', '钦州', '凭祥'],
+      dataNameList: ['加工贸易进出口值', '物流货物进出口值', '一般贸易进出口值'],
       chartData: {
         bar: [
-          { name: '凭祥', value: 716.33 },
-          { name: '钦州', value: 265.73 },
-          { name: '南宁', value: 215.48 },
-          { name: '北海', value: 34.49 },
-          { name: '梧州', value: 0 }
+          // { name: '凭祥', value: 716.33 },
+          // { name: '钦州', value: 265.73 },
+          // { name: '南宁', value: 215.48 },
+          // { name: '北海', value: 34.49 },
+          // { name: '梧州', value: 0 }
         ],
-        pie: [
-          { name: '南宁保税区', value: '1' },
-          { name: '北海保税区', value: '2' },
-          { name: '梧州保税区', value: '2' },
-          { name: '钦州保税区', value: '2' },
-          { name: '凭祥保税区', value: '2' }
-        ]
+        pie1: [
+          // { name: '南宁保税区', value: '1' },
+          // { name: '北海保税区', value: '2' },
+          // { name: '梧州保税区', value: '2' },
+          // { name: '钦州保税区', value: '2' },
+          // { name: '凭祥保税区', value: '2' }
+        ],
+        pie2: [],
+        pie3: []
       }
     };
   },
+  mounted() {
+    axios({
+      // url: process.env.VUE_APP_BASE_API + '/gather/statistics/wb/comprehensive/GxzhbsqsdzzjckzbVo',
+      url: process.env.VUE_APP_BASE_API + '/gather/statistics/wb/comprehensive/total/value/deptId/list',
+      method: 'POST',
+      data: {
+        year: new Date().getFullYear()
+      },
+      header: {
+        "Content-Type": "application/json;charset=UTF-8"
+      }
+    }).then((res) => {
+      
+      if(res.data.code >= 200 && res.data.code <= 300) {
+         this.year = (res?.data?.data?.year ||  this.year) + (res?.data?.data?.month ? '年' +  res?.data?.data?.month.replace(/^0+/, '') + '月' : '年 ')
+         
+         let dataObj = res.data.data.date
+         // 获取各地区总值
+         this.chartData.bar = Object.values(dataObj)?.map((item, index) => {
+          return { 
+			         name: this.nameList[index], 
+			         value: Object.values(item)[0] ? Object.values(item)[0].map(pitem => {
+			        		if(pitem?.feeName == '进出口总值') {
+			        			return pitem.collValue
+			        		}
+			        	}).find(value => !!value) : 0.00
+			        }
+	        })
+        // 将数据按dataNameList顺序组成数组
+        let valueList = [[], [], []]
+        this.dataNameList.map((name, index) => {
+          Object.values(dataObj).map(obj => {
+            (obj[Object.keys(obj)[0]] || [{feeName: this.dataNameList[0]},{feeName: this.dataNameList[1]}, {feeName: this.dataNameList[2]}]).map((item) => {
+              if(item.feeName == name) {
+               valueList[index] = [...valueList[index], item.collValue || 0]
+              }
+            })
+          })
+        })
+        valueList.map((item, pindex) => {
+          this.chartData[`pie${pindex+1}`] = this.nameList.map((name,index) => {
+            return {
+              name,
+              value:item[index]
+            }
+          })
+        })
+      }
+    })
+  },
   computed: {
     theme() {
       return this.$store.state.settings.theme;

+ 23 - 9
src/views/login.vue

@@ -34,7 +34,10 @@
     </el-form>
     <!--  底部  -->
     <div class="el-login-footer">
-      <span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span>
+      <!-- <span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span> -->
+      <div>主办单位:广西壮族自治区北部湾经济区规划建设管理办公室</div> 
+      <div>地址: 广西南宁市青秀区中泰路11号北部湾大厦北塔 </div>
+      <div>备案号:桂ICP备09002920号-2</div>
     </div>
   </div>
 </template>
@@ -43,6 +46,8 @@
 import { getCodeImg, getSYSTEM } from '@/api/login';
 import Cookies from 'js-cookie';
 import { encrypt, decrypt } from '@/utils/jsencrypt';
+import {getPublicKey} from "@/api/login.js"
+import {sm2Encrypt} from '@/utils/crypt.js'
 
 export default {
   name: 'Login',
@@ -50,8 +55,8 @@ export default {
     return {
       codeUrl: '',
       loginForm: {
-        username: 'admin',
-        password: 'admin123',
+        username: '',
+        password: '',
         rememberMe: false,
         code: '',
         uuid: ''
@@ -108,7 +113,13 @@ export default {
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
       };
     },
-    handleLogin() {
+    async handleLogin() {
+      let data = {...this.loginForm};
+        await getPublicKey().then(res=>{
+        let pwdEncrypt = sm2Encrypt(this.loginForm.password, res.msg,0);
+        data.password = pwdEncrypt;
+      })
+      // return;
       this.$refs.loginForm.validate(valid => {
         if (valid) {
           this.loading = true;
@@ -121,8 +132,11 @@ export default {
             Cookies.remove('password');
             Cookies.remove('rememberMe');
           }
+
+          
+
           this.$store
-            .dispatch('Login', this.loginForm)
+            .dispatch('Login', data)
             .then(() => {
               this.$router.push({ path: this.redirect || '/' }).catch(() => {});
             })
@@ -194,13 +208,13 @@ export default {
   }
 }
 .el-login-footer {
-  height: 40px;
-  line-height: 40px;
+  // height: 40px;
+  line-height: 30px;
   position: fixed;
-  bottom: 0;
+  bottom: 1vh;
   width: 100%;
   text-align: center;
-  color: #fff;
+  color: #000;
   font-family: Arial;
   font-size: 12px;
   letter-spacing: 1px;

+ 13 - 3
src/views/news/detail.vue

@@ -117,10 +117,14 @@ export default {
       getNEWS(this.param.id).then((response) => {
         this.form = response.data;
         this.form.type = parseInt(this.form.type);
-        this.form.content = response.data.content.replace(
+        if(this.form.content.includes(process.env.VUE_APP_BASE_API)){
+          this.form.content = response.data.content
+        }else{
+          this.form.content = response.data.content.replace(
           new RegExp("/profile/upload/", "g"),
-          this.baseUrl + "/profile/upload/"
-        );
+          this.baseUrl + "/profile/upload/")
+        }
+        
       });
     }
   },
@@ -149,4 +153,10 @@ export default {
   },
 };
 </script>
+
+<style scoped>
+::v-deep img{
+  max-width: 100%;
+}
+</style>
   

+ 104 - 41
src/views/news/edit.vue

@@ -5,13 +5,22 @@
         <el-input v-model="form.title" placeholder="请输入标题"></el-input>
       </el-form-item>
       <el-row>
-        <el-col :span="12">
+        <!-- <el-col :span="12">
           <el-form-item label="新闻类型" prop="type">
-            <el-select v-model="form.type" placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in typeList" :key="item.value + 'typeList'" :label="item.label" :value="item.value"></el-option>
+            <el-select
+              v-model="form.type"
+              placeholder="请选择"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in typeList"
+                :key="item.value + 'typeList'"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
             </el-select>
           </el-form-item>
-        </el-col>
+        </el-col> -->
         <el-col :span="12">
           <el-form-item label="新闻来源">
             <el-input v-model="form.source" placeholder="请输入来源"></el-input>
@@ -26,34 +35,66 @@
       </el-form-item>
     </el-form>
     <div class="mfooter">
-      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button
+        v-if="checkPermi(['business:NEWS:confirm'])"
+        type="primary"
+        @click="submitForm('add')"
+        >提交审核</el-button
+      >
+      <el-button
+        v-if="checkPermi(['business:NEWS:confirm'])"
+        type="warning"
+        @click="submitForm('draft')"
+        >暂存草稿</el-button
+      >
       <el-button @click="$layer.close(layerid)">取 消</el-button>
     </div>
   </div>
 </template>
 
 <script>
-import { listNEWS, getNEWS, delNEWS, addNEWS, updateNEWS, upload, setTop, newCommit, updateAndex, downloadpic } from '@/api/portal/news/NEWS.js';
+import { checkPermi } from "@/utils/permission";
+import {
+  listNEWS,
+  getNEWS,
+  delNEWS,
+  addNEWS,
+  updateNEWS,
+  upload,
+  setTop,
+  newCommit,
+  updateAndex,
+  downloadpic,
+} from "@/api/portal/news/NEWS.js";
 export default {
   data() {
     return {
       typeList: [
-        { label: '要闻动态', value: 1 },
-        { label: '政策文件', value: 2 },
-        { label: '通知公告', value: 3 },
-        { label: '政策解读', value: 4 },
-        { label: '投资导航', value: 5 }
+        { label: "要闻动态", value: 1 },
+        { label: "政策文件", value: 2 },
+        { label: "通知公告", value: 3 },
+        { label: "政策解读", value: 4 },
+        { label: "投资导航", value: 5 },
       ],
-      form: {type:2},
+      form: { type: 2 },
       rules: {
-        title: [{ required: true, message: '标题不能为空', trigger: 'blur' }],
-        content: [{ required: true, message: '内容不能为空', trigger: 'blur' }],
-        fileUrl: [{ required: true, message: '附件不能为空', trigger: 'blur' }],
-        type: [{ required: true, message: '类型不能为空', trigger: 'change' }],
-        typeName: [{ required: true, message: '字典类型名称不能为空', trigger: 'blur' }],
-        picture: [{ required: true, message: '图片不能为空', trigger: 'blur' }],
-        status: [{ required: true, message: '状态(0.草稿,1.下架,2.审核中,3.审核驳回,4.已发布,5.已上报)不能为空', trigger: 'blur' }]
-      }
+        title: [{ required: true, message: "标题不能为空", trigger: "blur" }],
+        content: [{ required: true, message: "内容不能为空", trigger: "blur" }],
+        fileUrl: [{ required: true, message: "附件不能为空", trigger: "blur" }],
+        // type: [{ required: true, message: "类型不能为空", trigger: "change" }],
+        typeName: [
+          { required: true, message: "字典类型名称不能为空", trigger: "blur" },
+        ],
+        picture: [{ required: true, message: "图片不能为空", trigger: "blur" }],
+        status: [
+          {
+            required: true,
+            message:
+              "状态(0.草稿,1.下架,2.审核中,3.审核驳回,4.已发布,5.已上报)不能为空",
+            trigger: "blur",
+          },
+        ],
+      },
     };
   },
   props: {
@@ -61,47 +102,69 @@ export default {
       type: Object,
       default: () => {
         return {};
-      }
+      },
     },
     layerid: {
-      type: String
-    }
+      type: String,
+    },
   },
   mounted() {
-    console.log('asd:' + this.param.type);
     if (this.param.type) {
-      this.form.type =parseInt(this.param.type);
+      this.form.type = parseInt(this.param.type);
     }
     if (this.param.id) {
-      getNEWS(this.param.id).then(response => {
+      getNEWS(this.param.id).then((response) => {
         this.form = response.data;
-        this.form.type=parseInt(this.form.type);
-        this.form.content = response.data.content.replace(new RegExp('/profile/upload/', 'g'), this.baseUrl + '/profile/upload/');
+        this.form.type = parseInt(this.form.type);
+        if(this.form.content.includes(process.env.VUE_APP_BASE_API)){
+          this.form.content = response.data.content
+        }else{
+          this.form.content = response.data.content.replace(
+          new RegExp("/profile/upload/", "g"),
+          this.baseUrl + "/profile/upload/")
+        }
       });
     }
   },
   methods: {
+    checkPermi,
     /** 提交按钮 */
-    submitForm() {
-      this.$refs['form'].validate(valid => {
+    submitForm(type) {
+      this.$refs["form"].validate((valid) => {
         if (valid) {
-          if (this.form.id != null) {
-            updateAndex(this.form).then(response => {
-              this.$modal.msgSuccess('修改成功');
+          this.form.status = 1;
+          if (this.form.id != null && type == "add") {
+            updateAndex(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
               this.$layer.close(this.layerid);
               this.$parent.getList();
             });
           } else {
-            this.form.status = '1';
-            addNEWS(this.form).then(response => {
-              this.$modal.msgSuccess('新增成功');
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
+            if (this.form.id != null && type == "draft") {
+              this.form.status = 0;
+              updateNEWS(this.form).then((response) => {
+                this.$modal.msgSuccess("修改成功");
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              });
+            } else if (type == "add") {
+              addNEWS(this.form).then((response) => {
+                this.$modal.msgSuccess("新增成功");
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              });
+            } else if (type == "draft") {
+              this.form.status = 0;
+              addNEWS(this.form).then((response) => {
+                this.$modal.msgSuccess("操作成功");
+                this.$layer.close(this.layerid);
+                this.$parent.getList();
+              });
+            }
           }
         }
       });
-    }
-  }
+    },
+  },
 };
 </script>

+ 19 - 14
src/views/news/index.vue

@@ -21,13 +21,13 @@
     </el-form>
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" icon="el-icon-plus" @click="handleAdd" v-hasPermi="['business:NEWS:add']">新增新闻</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleAdd" v-if="checkPermi(['business:NEWS:add'])">新增</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-table :data="NEWSList" @selection-change="handleSelectionChange">
       <el-table-column type="selection"></el-table-column>
-      <el-table-column label="标题" align="left" prop="title" width="220">
+      <el-table-column label="标题" align="left" prop="title" width="220" show-overflow-tooltip>
         <template slot-scope="scope">
           <div class="omit">{{ scope.row.title }}</div>
         </template>
@@ -58,15 +58,17 @@
           <span v-if="scope.row.status == 6"><el-tag>已置顶</el-tag></span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" fixed="right" width="170">
+      <el-table-column label="操作" align="center" fixed="right" width="190">
         <template slot-scope="scope">
-          <el-button v-if="scope.row.status == 4" size="mini" type="text" @click="handleDownOrUp(scope.row)" v-hasPermi="['business:NEWS:edit']">下架</el-button>
-          <el-button v-if="scope.row.status == 0 || scope.row.status == 2" size="mini" type="text" v-hasPermi="['business:NEWS:audit']" @click="handleCommit(scope.row)">提交审核</el-button>
-          <el-button v-if="scope.row.status == 0 || scope.row.status == 2 || scope.row.status == 5" size="mini" type="text" @click="handleUpdate(scope.row)" v-hasPermi="['business:NEWS:audit']">修改</el-button>
-          <el-button v-if="scope.row.status == 5 || scope.row.status == 3" size="mini" type="text" @click="handleDownOrUp(scope.row)" v-hasPermi="['business:NEWS:top']">发布</el-button>
-          <el-button v-if="scope.row.status == 6" size="mini" type="text" @click="hanleTop(scope.row)" v-hasPermi="['business:NEWS:edit']">取消置顶</el-button>
-          <el-button v-else-if="scope.row.status == 4" size="mini" type="text" @click="hanleTop(scope.row)" v-hasPermi="['business:NEWS:edit']">置顶</el-button>
+          <el-button v-if="scope.row.status == 4 && checkPermi(['business:NEWS:edit'])" size="mini" type="text" @click="handleDownOrUp(scope.row)" >下架</el-button>
+          <el-button v-if="(scope.row.status == 0 || scope.row.status == 2) && checkPermi(['business:NEWS:audit'])" size="mini" type="text"  @click="handleCommit(scope.row)">提交审核</el-button>
+          <el-button v-if="(scope.row.status == 0 || scope.row.status == 2 || scope.row.status == 5) && checkPermi(['business:NEWS:audit'])" size="mini" type="text" @click="handleUpdate(scope.row)">修改</el-button>
+          <el-button v-if="(scope.row.status == 5 || scope.row.status == 3) && checkPermi(['business:NEWS:top'])" size="mini" type="text" @click="handleDownOrUp(scope.row)">发布</el-button>
+
+          <el-button v-if="(scope.row.status == 6)&& checkPermi(['business:NEWS:edit'])" size="mini" type="text" @click="hanleTop(scope.row)" >取消置顶</el-button>
+          <el-button v-if="scope.row.status == 4 && checkPermi(['business:NEWS:edit'])" size="mini" type="text" @click="hanleTop(scope.row)" >置顶</el-button>
           <el-button type="text" size="mini" @click="showDetail(scope.row)">详情</el-button>
+          <el-button v-if="checkPermi(['business:NEWS:remove'])" type="text" size="mini" @click="handleDelete(scope.row)" >删除</el-button>
 
         </template>
       </el-table-column>
@@ -79,7 +81,9 @@
 </template>
 
 <script>
-import { listNEWS, getNEWS, delNEWS, addNEWS, updateNEWS, upload, setTop, newCommit, updateAndex, downloadpic } from '@/api/portal/news/NEWS.js';
+import { listNEWS,getNEWS, delNEWS, addNEWS, updateNEWS, upload, setTop, newCommit, updateAndex, downloadpic } from '@/api/portal/news/NEWS.js';
+import { checkPermi } from "@/utils/permission"; // 权限判断函数
+
 import edit from './edit';
 import detail from './detail.vue'
 export default {
@@ -133,9 +137,10 @@ export default {
     this.getList();
   },
   methods: {
+    checkPermi,
     showDetail(row){
       const id = row.id || this.ids;
-      this.iframe({ obj: detail, param: { id: id }, title: '网站新闻详情', width: '1050px', height: '750px' });
+      this.iframe({ obj: detail, param: { id: id }, title: '详情', width: '1050px', height: '750px' });
     },
     hanleTop(row) {
       row = { ...row };
@@ -198,12 +203,12 @@ export default {
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.iframe({ obj: edit, param: {type:this.queryParams.type}, title: '添加网站新闻', width: '1050px', height: '750px' });
+      this.iframe({ obj: edit, param: {type:this.queryParams.type}, title: `新增`, width: '1050px', height: '750px' });
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       const id = row.id || this.ids;
-      this.iframe({ obj: edit, param: { id: id }, title: '修改网站新闻', width: '1050px', height: '750px' });
+      this.iframe({ obj: edit, param: { id: id }, title: '修改', width: '1050px', height: '750px' });
     },
     handleCommit(row) {
       let CbNewsVo = row;
@@ -224,7 +229,7 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$modal
-        .confirm('是否确认删除网站新闻编号为"' + ids + '"的数据项?')
+        .confirm('是否确认删除网站新闻 "' + row.title + '" 的数据项?')
         .then(function () {
           return delNEWS(ids);
         })

+ 0 - 1
src/views/news/task/index.vue

@@ -130,7 +130,6 @@ export default {
       });
       // downloadpic(this.taskList.formobj.picture).then((res) => {
 
-      //   console.log('下载转换后:',this.fileList[0])
       // });
     }
     //this.taskList.form.content = this.taskList.form.content.replace(new RegExp('/profile/upload/', 'g'), this.baseUrl + '/profile/upload/');

+ 115 - 123
src/views/norm/feeindex.vue

@@ -1,8 +1,8 @@
 <template>
   <el-dialog
-    title="指标权重明细"
+    title="指标管理"
     :visible.sync="isShowNormDialog"
-    :width="'80%'"
+    width="1280px"
     :close-on-click-modal="false"
     :before-close="closeHandler"
   >
@@ -70,27 +70,29 @@
           @queryTable="getList"
         ></right-toolbar>
       </el-row>
-
       <el-table :data="normData" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="分类占比" align="center" prop="normRatio" />
         <el-table-column
+        fixed
           label="指标参数名称"
-          align="center"
+          align="left"
           prop="fname"
-          width="150"
+          width="250"
+          show-overflow-tooltip
         />
+<!--        <el-table-column label="分类占比" width="80" show-overflow-tooltip align="center" prop="normRatio" />-->
         <el-table-column
           label="指标编码"
           align="center"
           prop="fcode"
-          width="150"
+          width="120"
         />
         <el-table-column
           label="计算公式"
           align="center"
           prop="formula"
-          width="150"
+          width="120"
+          show-overflow-tooltip
         >
           <template slot-scope="scope">
             <el-link style="text-decoration: underline;color: #36aafd" @click="formulaDialog(scope.row.id,scope.row.formula)">{{scope.row.formula}}</el-link>
@@ -99,32 +101,58 @@
         <el-table-column
           label="计量单位"
           align="center"
-          prop="funit_dictText"
+          prop="funit"
           width="100"
-        />
+        >
+        <template slot-scope="scope">
+          <span>{{
+            selectDictLabel(
+              dict.type.norm_uint,
+              scope.row.funit
+            )
+          }}</span>
+        </template>
+      </el-table-column>
         <el-table-column
-          label="权数"
+          label="数"
           align="center"
           prop="fnumber"
-          width="90"
+          width="80"
         />
+
+        <el-table-column
+          label="是否启用"
+          align="center"
+          prop="status"
+          width="100"
+        >
+          <template slot-scope="scope">
+            <el-switch
+              v-model="scope.row.status"
+              @change="changeSwitchHandler(scope.row)"
+              active-color="#13ce66"
+              inactive-color="#ff4949"
+            ></el-switch>
+          </template>
+        </el-table-column>
         <el-table-column
           label="排序"
           align="center"
           prop="sort"
-          width="90"
+          width="80"
         />
         <el-table-column
-          label="绩效公差上下公差占比"
+          label="绩效公差上下公差(%)"
           align="center"
           prop="msRetio"
-          width="130"
+          width="180"
+          show-overflow-tooltip
         />
         <el-table-column
-          label="采集公差上下公差占比"
+          label="采集公差上下公差(%)"
           align="center"
           prop="dfRetio"
-          width="130"
+          width="180"
         />
         <el-table-column
           label="采集参考值"
@@ -138,38 +166,14 @@
           prop="meritsValue"
           width="130"
         />
-
-        <el-table-column
-          label="是否启用"
-          align="center"
-          prop="status"
-          width="100"
-        >
-          <template slot-scope="scope">
-            <el-switch
-              v-model="scope.row.status"
-              @change="changeSwitchHandler(scope.row)"
-              active-color="#13ce66"
-              inactive-color="#ff4949"
-            ></el-switch>
-          </template>
-        </el-table-column>
-        <!-- <el-table-column label="启用时间" align="center" prop="startTime" />
-        <el-table-column label="停用时间" align="center" prop="stopTime" /> -->
-        <el-table-column
-          label="备注"
-          align="center"
-          prop="remark"
-          width="150"
-        />
-        <el-table-column label="操作" align="center" fixed="right" width="150">
+        <el-table-column label="操作" align="center" fixed="right" width="220">
           <template slot-scope="scope">
             <el-button
               size="mini"
               type="text"
               icon="el-icon-edit"
               @click="handleUpdate(scope.row)"
-              v-hasPermi="['business:NORMFEE:edit']"
+              v-hasPermi="['business:NORM:edit']"
               >修改</el-button
             >
             <el-button
@@ -177,7 +181,7 @@
               type="text"
               icon="el-icon-delete"
               @click="handleDelete(scope.row)"
-              v-hasPermi="['business:NORMFEE:remove']"
+              v-hasPermi="['business:NORM:remove']"
               >删除</el-button
             >
             <el-button
@@ -185,7 +189,7 @@
               type="text"
               icon="el-icon-edit"
               @click="formulaDialog(scope.row.id,scope.row.formula)"
-              v-hasPermi="['business:NORMFEE:edit']"
+              v-hasPermi="['business:NORM:edit']"
             >计算公式</el-button>
           </template>
         </el-table-column>
@@ -203,67 +207,73 @@
       <el-dialog
         :title="title"
         :visible.sync="open"
-        width="600px"
+        width="1080px"
         :close-on-click-modal="false"
         append-to-body
       >
         <el-form ref="form" :model="form" :rules="rules" label-width="170px">
-          <el-form-item label="权数" prop="fnumber">
-            <el-input
-              v-model="form.fnumber"
-              aria-placeholder="请输入数值"
-            ></el-input>
-          </el-form-item>
-          <el-form-item label="排序" prop="sort">
-            <el-input
-              v-model="form.sort"
-              aria-placeholder="请输入数值"
-            ></el-input>
-          </el-form-item>
-
-          <el-form-item label="分类占比" prop="normRatio">
-            <el-input v-model="form.normRatio"></el-input>
-          </el-form-item>
+          <el-row>
+            <el-col span="12">
+              <el-form-item label="指标参数名称" prop="fname">
+                <el-input v-model="form.fname" ></el-input>
+              </el-form-item>
+              <el-form-item label="指标编码" prop="fcode">
+                <el-input v-model="form.fcode" :disabled="title.indexOf('修改')!==-1"></el-input>
+              </el-form-item>
+              <el-form-item label="分数" prop="fnumber">
+                <el-input
+                  v-model="form.fnumber"
+                  aria-placeholder="请输入数值"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="计量单位" prop="funit">
+                <el-select
+                  v-model="form.funit"
+                  @change="selUnitHandler"
+                  placeholder="请选择"
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="dict in unitSel"
+                    :key="dict.dictCode"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="排序" prop="sort">
+                <el-input
+                  v-model="form.sort"
+                  aria-placeholder="请输入数值"
+                ></el-input>
+              </el-form-item>
+              <el-form-item label="分类占比" prop="normRatio">
+                <el-input v-model="form.normRatio"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col span="12">
 
-          <el-form-item label="计量单位" prop="funit">
-            <el-select
-              v-model="form.funit"
-              @change="selUnitHandler"
-              placeholder="请选择"
-              style="width: 100%"
-            >
-              <el-option
-                v-for="dict in unitSel"
-                :key="dict.dictCode"
-                :label="dict.dictLabel"
-                :value="dict.dictValue"
-              ></el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="指标参数名称" prop="fname">
-            <el-input v-model="form.fname"></el-input>
-          </el-form-item>
-
-          <el-form-item label="采集公差上下公差占比" prop="dfRetio">
-            <el-input v-model="form.dfRetio"></el-input>
-          </el-form-item>
+              <el-form-item label="采集参考值" prop="collValue">
+                <el-input v-model="form.collValue"></el-input>
+              </el-form-item>
 
-          <el-form-item label="绩效公差上下公差占比" prop="dfRetio">
-            <el-input v-model="form.msRetio"></el-input>
-          </el-form-item>
+              <el-form-item label="绩效参考值" prop="meritsValue">
+                <el-input v-model="form.meritsValue"></el-input>
+              </el-form-item>
+              <el-form-item label="采集公差上下公差(%)" prop="dfRetio">
+                <el-input v-model="form.dfRetio"></el-input>
+              </el-form-item>
 
-          <el-form-item label="采集参考值" prop="collValue">
-            <el-input v-model="form.collValue"></el-input>
-          </el-form-item>
+              <el-form-item label="绩效公差上下公差(%)" prop="dfRetio">
+                <el-input v-model="form.msRetio"></el-input>
+              </el-form-item>
 
-          <el-form-item label="绩效参考值" prop="meritsValue">
-            <el-input v-model="form.meritsValue"></el-input>
-          </el-form-item>
 
-          <el-form-item label="备注">
-            <el-input type="textarea" v-model="form.remark"></el-input>
-          </el-form-item>
+              <el-form-item label="备注">
+                <el-input type="textarea" v-model="form.remark"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
         </el-form>
         <div slot="footer" class="dialog-footer">
           <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -272,7 +282,7 @@
       </el-dialog>
     </div>
 
-    <formula @closeFormulaHandler="closeFormulaHandler" @dataFormulaHandler="dataFormulaHandler" :id="id" :normId="normId" reset :isShowFormulaDialog="isShowFormulaDialog" />
+    <formula @closeFormulaHandler="closeFormulaHandler" ref="formula" @dataFormulaHandler="dataFormulaHandler"  :id="id" :normId="normId" reset :isShowFormulaDialog="isShowFormulaDialog" />
 
   </el-dialog>
 </template>
@@ -296,6 +306,7 @@ export default {
   components: {
     formula
   },
+  dicts: ["norm_uint"],
   props: {
     isShowNormDialog: {
       type: Boolean,
@@ -322,11 +333,6 @@ export default {
   },
   data() {
     return {
-      dict: {
-        type: {
-          dictType: "",
-        },
-      },
       // 根路径
       baseURL: process.env.VUE_APP_BASE_API,
       // 遮罩层
@@ -352,27 +358,12 @@ export default {
         pageNum: 1,
         pageSize: 10,
         id: null,
-        // createTime: null,
-        // createBy: null,
-        // updateTime: null,
-        // updateBy: null,
-        // delFlag: null,
-        // deptId: null,
-        // normId: null,
-        // normRatio: null,
-        // fname: null,
-        // funit: null,
-        // fnumber: null,
-        // fvalue: null,
-        // status: null,
-        // startTime: null,
-        // stopTime: null,
-        // remark: null
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
+        fcode: [{ required: true, message: "指标编码不能为空", trigger: "blur" },],
         fnumber: [{ required: true, message: "权数为数值", trigger: "blur" }],
         sort: [{ required: true, message: "排序为数值", trigger: "blur" }],
         normRatio: [
@@ -422,12 +413,13 @@ export default {
     formulaDialog(id,formula) {
       this.isShowFormulaDialog = true;
       this.id = id;
+      // formula使用props传值有延迟,使用ref传入
+      this.$refs.formula.init(formula)
+
     },
     dataFormulaHandler(data) {
       this.isShowFormulaDialog = false;
-      console.log("dataHandler111",data)
       this.queryParams.normId = data;
-      console.log("11111111111",this.queryParams)
       listNORMFEE(this.queryParams).then((response) => {
         response.rows.forEach((item, index) => {
           response.rows[index].status = item.status == 0 ? false : true;
@@ -439,7 +431,6 @@ export default {
     getList() {
       this.loading = true;
       this.queryParams.normId = this.normId;
-      console.log("11111111111",this.queryParams)
       listNORMFEE(this.queryParams).then((response) => {
         response.rows.forEach((item, index) => {
           response.rows[index].status = item.status == 0 ? false : true;
@@ -462,6 +453,7 @@ export default {
         deptId: null,
         normId: null,
         normRatio: null,
+        fcode: null,
         fname: null,
         funit: null,
         fnumber: null,
@@ -504,7 +496,7 @@ export default {
         this.form = response.data;
         this.open = true;
         // this.form = row;
-        this.title = "修改指标权重明细";
+        this.title = "修改指标";
       });
     },
     /** 提交按钮 */

+ 11 - 8
src/views/norm/formula.vue

@@ -112,7 +112,7 @@
 
     <div slot="footer" class="dialog-footer">
       <el-button type="primary" @click="submit">确 定</el-button>
-      <el-button @click="cancel">取 消</el-button>
+      <el-button @click="closeFormulaHandler">取 消</el-button>
     </div>
   </el-dialog>
 </template>
@@ -178,6 +178,7 @@
         default: () => {
           return null;
         },
+
       },
     },
     mounted() {
@@ -187,8 +188,17 @@
         });
         this.NORMFEEList = response.rows;
       });
+      
     },
     methods: {
+      // formula使用props传值有延迟,使用ref传入
+      init(formula) {
+        if(formula) {
+          this.number_input = formula
+        }else {
+          this.number_input = ''
+        }
+      },
       close () {
         this.addMetadataSelect = [];
         this.no_show_number_input = '';
@@ -197,9 +207,6 @@
       closeFormulaHandler() {
         this.$emit("closeFormulaHandler");
       },
-      cancel() {
-        this.isShowFormulaDialog = false;
-      },
       // 回删功能
       number_input_delete() {
         this.number_input = this.number_input.replace(/.$/, '')
@@ -207,7 +214,6 @@
       },
       // 指标元素下拉框的改变方法
       metadataSelect(val) {
-        console.log("111111111",val)
         let metadataCode = ''
         let metadataName = ''
         let metadataId = ''
@@ -235,7 +241,6 @@
       },
       // 新增选择下拉框对应的按钮方法
       cell(data) {
-        console.log("22222222",data)
         // 拿到对应的编码
         let select_data_code = ''
         // 拿到对应的名称
@@ -269,9 +274,7 @@
         this.$refs['add_metadata_form'].validate(valid => {
           if (valid) {
             // 拿到下拉框的全部数据
-            console.log("33333",this.addMetadataSelect)
             //拿到输入框的数据
-            console.log("444444",this.no_show_number_input,"555555",this.id)
             updateFormulaById({formula: this.no_show_number_input, id: this.id}).then((response) => {
               this.$emit("dataFormulaHandler",this.normId);
               this.$modal.msgSuccess("修改成功");

+ 24 - 10
src/views/norm/index.vue

@@ -25,7 +25,7 @@
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table  :data="NORMList" @selection-change="handleSelectionChange">
+    <el-table ref="multipleTable"  :data="NORMList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="指标分类名称" align="center">
         <template slot-scope="scope">
@@ -44,6 +44,8 @@
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:NORM:edit']">修改</el-button>
           <el-button v-if="scope.row.status != 1" size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['business:NORM:remove']">删除</el-button>
+          <el-button size="mini" type="text"  @click="tableBdClick(scope.row)" v-hasPermi="['business:NORM:query']">指标</el-button>
+        
         </template>
       </el-table-column>
     </el-table>
@@ -99,6 +101,8 @@ export default {
       loading: true,
       // 选中数组
       ids: [],
+      // 要删除的数据项
+      delList:[],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -217,6 +221,7 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
+      this.delList=selection;
       this.ids = selection.map(item => item.id);
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
@@ -229,7 +234,6 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      console.log(row);
       this.reset();
       const id = row.id || this.ids;
       getNORM(id).then(response => {
@@ -260,17 +264,27 @@ export default {
     },
     /** 删除按钮操作 */
     handleDelete(row) {
+      let that = this;
       const ids = row.id || this.ids;
       this.$modal
         .confirm('是否确认删除?')
         .then(function () {
-          return delNORM(ids);
-        })
-        .then(() => {
-          this.getList();
-          this.$modal.msgSuccess('删除成功');
+          let is = false;
+          that.delList.forEach(item=>{
+            if(item.status == true){
+              is = true
+            }
+          })
+          if(!is){
+             delNORM(ids);
+             that.$modal.msgSuccess('删除成功');
+             that.getList();
+          }
+          that.$refs.multipleTable.clearSelection();
+          that.$message.error('指标正在启用,无法删除!');
         })
-        .catch(() => {});
+        .catch(() => {
+        });
     },
     /** 导出按钮操作 */
     handleExport() {
@@ -300,14 +314,14 @@ export default {
     // 表格行点击事件处理
     tableBdClick(row) {
       this.normId = row.id;
-      listNORMFEE({ normId: this.normId, ...this.pageParams }).then(res => {
+      listNORMFEE({ normId: row.id, ...this.pageParams }).then(res => {
         res.rows.forEach((item, index) => {
           res.rows[index].status = item.status == 0 ? false : true;
         });
         this.totalNum = res.total
         this.normData = res.rows;
+        this.isShowNormDialog = !this.isShowNormDialog;
       });
-      this.isShowNormDialog = !this.isShowNormDialog;
     },
 
     // 启动开关事件处理

+ 0 - 1
src/views/norm/quota.vue

@@ -209,7 +209,6 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      console.log(row);
       this.reset();
       const id = row.id || this.ids;
       getQUOTA(id).then(response => {

File diff suppressed because it is too large
+ 520 - 350
src/views/norm/quotaBonded.vue


+ 27 - 24
src/views/norm/quotafee.vue

@@ -22,7 +22,7 @@
             type="primary"
             icon="el-icon-plus"
             @click="handleAdd"
-            v-hasPermi="['business:QUOTAFEE:add']"
+            v-hasPermi="['business:QUOTA:add']"
           >新增</el-button>
         </el-col>
         <el-col :span="1.5">
@@ -31,7 +31,7 @@
             icon="el-icon-edit"
             :disabled="single"
             @click="handleUpdate"
-            v-hasPermi="['business:QUOTAFEE:edit']"
+            v-hasPermi="['business:QUOTA:edit']"
           >修改</el-button>
         </el-col>
         <el-col :span="1.5">
@@ -40,7 +40,7 @@
             icon="el-icon-delete"
             :disabled="multiple"
             @click="handleDelete"
-            v-hasPermi="['business:QUOTAFEE:remove']"
+            v-hasPermi="['business:QUOTA:remove']"
           >删除</el-button>
         </el-col>
         <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@@ -49,35 +49,33 @@
       <el-table :data="QUOTAFEEList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
 
-        <el-table-column label="指标分类" width="85" align="center" prop="normName">
+        <el-table-column label="指标分类"  align="center" prop="normName">
         </el-table-column>
         <!--<el-table-column label="保税区id" align="center" prop="bondedId">
         </el-table-column>-->
-        <el-table-column label="指标名称" width="250" align="center" prop="quotaName">
+        <el-table-column label="指标名称"  align="center" width="240" show-overflow-tooltip prop="quotaName">
         </el-table-column>
-        <el-table-column label="指标内容" width="400" align="center" prop="content">
+        <el-table-column label="指标内容" width="300" show-overflow-tooltip align="center" prop="content">
         </el-table-column>
-        <el-table-column label="得分" width="85" align="center" prop="score">
+        <el-table-column label="得分"  align="center" prop="score">
         </el-table-column>
-        <el-table-column label="确认方式" width="200" align="center" prop="confirmWay">
+        <el-table-column label="确认方式" align="center" prop="confirmWay">
         </el-table-column>
-        <el-table-column label="项次" width="85" align="center" prop="sort">
-        </el-table-column>
-        <el-table-column label="操作" align="center" fixed="right" width="150">
+        <el-table-column label="操作" align="center"  width="150">
           <template slot-scope="scope">
             <el-button
               size="mini"
               type="text"
               icon="el-icon-edit"
               @click="handleUpdate(scope.row)"
-              v-hasPermi="['business:QUOTAFEE:edit']"
+              v-hasPermi="['business:QUOTA:edit']"
             >修改</el-button>
             <el-button
               size="mini"
               type="text"
               icon="el-icon-delete"
               @click="handleDelete(scope.row)"
-              v-hasPermi="['business:QUOTAFEE:remove']"
+              v-hasPermi="['business:QUOTA:remove']"
             >删除</el-button>
           </template>
         </el-table-column>
@@ -101,21 +99,27 @@
               <el-radio label="2">减分项</el-radio>
             </el-radio-group>
           </el-form-item>
-          <el-form-item label-width="100px" prop="sort" label="项次">
-            <el-input v-model="form.sort"></el-input>
-          </el-form-item>
           <el-form-item label-width="100px" prop="quotaName" label="指标名称">
             <el-input v-model="form.quotaName"></el-input>
           </el-form-item>
           <el-form-item label-width="100px" prop="content" label="指标内容">
-            <!--<editor v-model="form.content" :min-height="20"/>-->
             <el-input type="textarea" v-model="form.content" rows="5"></el-input>
           </el-form-item>
           <el-form-item label-width="100px" prop="score" label="分值">
             <el-input v-model="form.score"></el-input>
           </el-form-item>
-          <el-form-item label-width="100px" prop="confirmWay" label="确认方式">
-            <el-input v-model="form.confirmWay"></el-input>
+          <el-form-item label-width="100px" label="确认方式" prop="confirmWay">
+            <el-select
+              v-model="form.confirmWay"
+              placeholder="请选择确认方式"
+              clearable
+              filterable
+              style="width: 100%"
+            >
+              <el-option value="附件">附件</el-option>
+              <el-option value="文字说明">文字说明</el-option>
+              <el-option value="数值">数值</el-option>
+            </el-select>
           </el-form-item>
         </el-form>
         <div slot="footer" class="dialog-footer">
@@ -171,9 +175,9 @@ export default {
         normId: [
           { required: true, message: "指标分类不能为空", trigger: "blur" }
         ],
-        sort: [
+        /*sort: [
           { required: true, message: "项次为数值", trigger: "blur" }
-        ],
+        ],*/
         quotaName: [
           { required: true, message: "指标名称不能为空", trigger: "blur" }
         ],
@@ -222,7 +226,6 @@ export default {
         content: null,
         score: null,
         confirmWay: null,
-        sort: null,
         status: "0",
         startTime: null,
         stopTime: null
@@ -265,10 +268,10 @@ export default {
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          if (!(parseInt(this.form.sort) == this.form.sort)) {
+          /*if (!(parseInt(this.form.sort) == this.form.sort)) {
             this.$message.error("项次必须为整数");
             return;
-          }
+          }*/
           if (!(parseInt(this.form.score) == this.form.score)) {
             this.$message.error("得分必须为整数");
             return;

+ 295 - 75
src/views/system/dept/index.vue

@@ -1,6 +1,12 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+    >
       <el-form-item label="部门名称" prop="deptName">
         <el-input
           v-model="queryParams.deptName"
@@ -10,7 +16,11 @@
         />
       </el-form-item>
       <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="部门状态" clearable>
+        <el-select
+          v-model="queryParams.status"
+          placeholder="部门状态"
+          clearable
+        >
           <el-option
             v-for="dict in dict.type.sys_normal_disable"
             :key="dict.value"
@@ -20,8 +30,16 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
       </el-form-item>
     </el-form>
 
@@ -34,7 +52,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:dept:add']"
-        >新增</el-button>
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -43,32 +62,55 @@
           icon="el-icon-sort"
           size="mini"
           @click="toggleExpandAll"
-        >展开/折叠</el-button>
+          >展开/折叠</el-button
+        >
       </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
     <el-table
       v-if="refreshTable"
-      
       :data="deptList"
       row-key="deptId"
       :default-expand-all="isExpandAll"
-      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
     >
-      <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
-      <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
+      <el-table-column
+        prop="deptName"
+        label="部门名称"
+        width="260"
+      ></el-table-column>
+      <el-table-column
+        prop="orderNum"
+        label="排序"
+        width="200"
+      ></el-table-column>
       <el-table-column prop="status" label="状态" width="100">
         <template slot-scope="scope">
-          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
+          <dict-tag
+            :options="dict.type.sys_normal_disable"
+            :value="scope.row.status"
+          />
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="200">
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="200"
+      >
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -76,14 +118,16 @@
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:dept:edit']"
-          >修改</el-button>
+            >修改</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-plus"
             @click="handleAdd(scope.row)"
             v-hasPermi="['system:dept:add']"
-          >新增</el-button>
+            >新增</el-button
+          >
           <el-button
             v-if="scope.row.parentId != 0"
             size="mini"
@@ -91,18 +135,30 @@
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['system:dept:remove']"
-          >删除</el-button>
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
 
     <!-- 添加或修改部门对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="600px" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="600px"
+      append-to-body
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="24" v-if="form.parentId !== 0">
             <el-form-item label="上级部门" prop="parentId">
-              <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级部门" />
+              <treeselect
+                v-model="form.parentId"
+                :options="deptOptions"
+                :normalizer="normalizer"
+                placeholder="选择上级部门"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -114,26 +170,42 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="显示排序" prop="orderNum">
-              <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
+              <el-input-number
+                v-model="form.orderNum"
+                controls-position="right"
+                :min="0"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="负责人" prop="leader">
-              <el-input v-model="form.leader" placeholder="请输入负责人" maxlength="20" />
+              <el-input
+                v-model="form.leader"
+                placeholder="请输入负责人"
+                maxlength="20"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="联系电话" prop="phone">
-              <el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
+              <el-input
+                v-model="form.phone"
+                placeholder="请输入联系电话"
+                maxlength="11"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+            <el-form-item label="机构代码" prop="email">
+              <el-input
+                v-model="form.email"
+                placeholder="机构代码"
+                maxlength="50"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -143,11 +215,59 @@
                   v-for="dict in dict.type.sys_normal_disable"
                   :key="dict.value"
                   :label="dict.value"
-                >{{dict.label}}</el-radio>
+                  >{{ dict.label }}</el-radio
+                >
               </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
+        <el-form-item label="部门类型" prop="type">
+          <el-select v-model="form.type" placeholder="请选择">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-col :span="24">
+          <el-form-item label="附件">
+            <el-upload
+              class="upload-demo"
+              ref="upload"
+              :headers="{
+                Authorization: 'Bearer ' + token,
+              }"
+              name="file"
+              list-type="picture"
+              :action="ip + '/common/upload'"
+              :show-file-list="changeShow"
+              :on-change="handleSelect"
+              :on-remove="handleRemove"
+              :on-success="handleSuccess"
+              :before-upload="handleBeforeUpload"
+              :file-list="fileList"
+              :auto-upload="false"
+            >
+              <el-button slot="trigger" size="small" type="primary"
+                >选取文件</el-button
+              >
+              <!-- <el-button
+          style="margin-left: 10px"
+          size="small"
+          type="success"
+          @click="submitUpload"
+          >上传到服务器</el-button
+        > -->
+              <div slot="tip" class="el-upload__tip">
+                只能上传 jpg / png 文件
+              </div>
+            </el-upload>
+          </el-form-item>
+        </el-col>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -158,16 +278,51 @@
 </template>
 
 <script>
-import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept";
+import {
+  listDept,
+  getDept,
+  delDept,
+  addDept,
+  updateDept,
+  listDeptExcludeChild,
+} from "@/api/system/dept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 export default {
   name: "Dept",
-  dicts: ['sys_normal_disable'],
+  dicts: ["sys_normal_disable"],
   components: { Treeselect },
   data() {
     return {
+      fileName: "",
+      changeShow: false,
+      // 文件列表
+      fileList: [],
+      uploadIs: false,
+
+      ip: null,
+      token: null,
+
+      options: [
+        {
+          value: 1,
+          label: "一级单位(湾办)",
+        },
+        {
+          value: 2,
+          label: "二级单位(保税区)",
+        },
+        {
+          value: 3,
+          label: "三级单位(企业)",
+        },
+        {
+          value: 4,
+          label: "市级单位(地级市)",
+        },
+      ],
+      value: "",
       // 遮罩层
       loading: true,
       // 显示搜索条件
@@ -187,46 +342,107 @@ export default {
       // 查询参数
       queryParams: {
         deptName: undefined,
-        status: undefined
+        status: undefined,
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
         parentId: [
-          { required: true, message: "上级部门不能为空", trigger: "blur" }
+          { required: true, message: "上级部门不能为空", trigger: "blur" },
         ],
         deptName: [
-          { required: true, message: "部门名称不能为空", trigger: "blur" }
+          { required: true, message: "部门名称不能为空", trigger: "blur" },
         ],
         orderNum: [
-          { required: true, message: "显示排序不能为空", trigger: "blur" }
+          { required: true, message: "显示排序不能为空", trigger: "blur" },
+        ],
+        type: [
+          { required: true, message: "部门类型不能为空", trigger: "blur" },
         ],
         email: [
           {
-            type: "email",
-            message: "请输入正确的邮箱地址",
-            trigger: ["blur", "change"]
-          }
+           //type: "email",
+           // message: "请输入正确的邮箱地址",
+           // trigger: ["blur", "change"],
+          },
         ],
-        phone: [
-          {
-            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-            message: "请输入正确的手机号码",
-            trigger: "blur"
-          }
-        ]
-      }
+
+      },
     };
   },
   created() {
+    this.token = this.$store.state.user.token;
+    this.ip = process.env.VUE_APP_BASE_IP;
     this.getList();
   },
   methods: {
+    // 文件上传选择
+    handleSelect(file, list) {
+      this.fileList = list;
+      this.$nextTick(() => {
+        this.$refs["upload"].submit();
+      })
+    },
+    // 文件移除
+    handleRemove(file, fileList) {
+    },
+    // 文件上传成功
+    handleSuccess(response, file, fileList) {
+      let imgList = [];
+      fileList.forEach((i) => {
+        if (i.response.fileName) {
+          imgList.push(i.response.fileName + "");
+        }
+      });
+      this.form.sinfo03 = imgList.toString();
+
+      // this.submitData()
+    },
+    submitData() {
+      return new Promise((resolve, reject) => {
+        this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.deptId != undefined) {
+            updateDept(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addDept(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+          resolve()
+        }else {
+          reject()
+        }
+      });
+      })
+      
+    },
+    // handlePreview(file) {
+    // },
+    // 文件上传之前
+    handleBeforeUpload(file) {
+      // 截取上传文件的后缀名
+      let fileType = file.name.substring(file.name.lastIndexOf(".") + 1);
+      // 判断文件名的类型,允许多种就判断多个
+      if (fileType == "jpg" || fileType == "png") {
+      } else {
+        this.$message.error("文件类型必须为 jpg / png 格式");
+        // 返回false 就不会执行上传操作了
+        return false;
+      }
+    },
+
     /** 查询部门列表 */
     getList() {
       this.loading = true;
-      listDept(this.queryParams).then(response => {
+      listDept(this.queryParams).then((response) => {
         this.deptList = this.handleTree(response.data, "deptId");
         this.loading = false;
       });
@@ -239,7 +455,7 @@ export default {
       return {
         id: node.deptId,
         label: node.deptName,
-        children: node.children
+        children: node.children,
       };
     },
     // 取消按钮
@@ -257,8 +473,9 @@ export default {
         leader: undefined,
         phone: undefined,
         email: undefined,
-        status: "0"
+        status: "0",
       };
+      this.fileList = [];
       this.resetForm("form");
     },
     /** 搜索按钮操作 */
@@ -278,7 +495,7 @@ export default {
       }
       this.open = true;
       this.title = "添加部门";
-      listDept().then(response => {
+      listDept().then((response) => {
         this.deptOptions = this.handleTree(response.data, "deptId");
       });
     },
@@ -292,45 +509,48 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      this.changeShow = true;
       this.reset();
-      getDept(row.deptId).then(response => {
+      getDept(row.deptId).then((response) => {
+        if (response.data.sinfo03 != null) {
+          let imgList = response.data.sinfo03.split(",");
+          imgList.forEach((item, i) => {
+            let obj = {
+              name: item.slice(item.lastIndexOf("/") + 1),
+              url: this.ip + item,
+            };
+            imgList[i] = obj;
+          });
+          this.fileName = imgList[0].url;
+          this.fileList = imgList;
+        }
+
         this.form = response.data;
         this.open = true;
         this.title = "修改部门";
       });
-      listDeptExcludeChild(row.deptId).then(response => {
+      listDeptExcludeChild(row.deptId).then((response) => {
         this.deptOptions = this.handleTree(response.data, "deptId");
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.deptId != undefined) {
-            updateDept(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addDept(this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
+    submitForm: function () {
+        
+      this.submitData()
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      this.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function() {
-        return delDept(row.deptId);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
-    }
-  }
+      this.$modal
+        .confirm('是否确认删除名称为"' + row.deptName + '"的数据项?')
+        .then(function () {
+          return delDept(row.deptId);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+  },
 };
 </script>

+ 150 - 54
src/views/system/notice/index.vue

@@ -1,6 +1,14 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+   
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
       <el-form-item label="公告标题" prop="noticeTitle">
         <el-input
           v-model="queryParams.noticeTitle"
@@ -18,7 +26,11 @@
         />
       </el-form-item>
       <el-form-item label="类型" prop="noticeType">
-        <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable>
+        <el-select
+          v-model="queryParams.noticeType"
+          placeholder="公告类型"
+          clearable
+        >
           <el-option
             v-for="dict in dict.type.sys_notice_type"
             :key="dict.value"
@@ -28,8 +40,16 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
       </el-form-item>
     </el-form>
 
@@ -42,7 +62,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:notice:add']"
-        >新增</el-button>
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -53,7 +74,8 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['system:notice:edit']"
-        >修改</el-button>
+          >修改</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -64,37 +86,71 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:notice:remove']"
-        >删除</el-button>
+          >删除</el-button
+        >
       </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <el-table  :data="noticeList" @selection-change="handleSelectionChange">
+    <el-table :data="noticeList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="序号" align="center" prop="noticeId" width="100" />
+      <el-table-column
+        label="序号"
+        align="center"
+        prop="noticeId"
+        width="100"
+      />
       <el-table-column
         label="公告标题"
         align="center"
         prop="noticeTitle"
         :show-overflow-tooltip="true"
       />
-      <el-table-column label="公告类型" align="center" prop="noticeType" width="100">
+      <el-table-column
+        label="公告类型"
+        align="center"
+        prop="noticeType"
+        width="100"
+      >
         <template slot-scope="scope">
-          <dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType"/>
+          <dict-tag
+            :options="dict.type.sys_notice_type"
+            :value="scope.row.noticeType"
+          />
         </template>
       </el-table-column>
       <el-table-column label="状态" align="center" prop="status" width="100">
         <template slot-scope="scope">
-          <dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status"/>
+          <dict-tag
+            :options="dict.type.sys_notice_status"
+            :value="scope.row.status"
+          />
         </template>
       </el-table-column>
-      <el-table-column label="创建者" align="center" prop="createBy" width="100" />
-      <el-table-column label="创建时间" align="center" prop="createTime" width="100">
+      <el-table-column
+        label="创建者"
+        align="center"
+        prop="createBy"
+        width="100"
+      />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="100"
+      >
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          <span>{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -102,20 +158,22 @@
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:notice:edit']"
-          >修改</el-button>
+            >修改</el-button
+          >
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['system:notice:remove']"
-          >删除</el-button>
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
 
     <pagination
-      v-show="total>0"
+      v-show="total > 0"
       :total="total"
       :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
@@ -123,12 +181,21 @@
     />
 
     <!-- 添加或修改公告对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="780px" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="780px"
+      append-to-body
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="12">
             <el-form-item label="公告标题" prop="noticeTitle">
-              <el-input v-model="form.noticeTitle" placeholder="请输入公告标题" />
+              <el-input
+                v-model="form.noticeTitle"
+                placeholder="请输入公告标题"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -150,13 +217,14 @@
                   v-for="dict in dict.type.sys_notice_status"
                   :key="dict.value"
                   :label="dict.value"
-                >{{dict.label}}</el-radio>
+                  >{{ dict.label }}</el-radio
+                >
               </el-radio-group>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="内容">
-              <editor v-model="form.noticeContent" :min-height="192"/>
+              <editor v-model="form.noticeContent" :min-height="50" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -170,11 +238,17 @@
 </template>
 
 <script>
-import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice";
+import {
+  listNotice,
+  getNotice,
+  delNotice,
+  addNotice,
+  updateNotice,
+} from "@/api/system/notice";
 
 export default {
   name: "Notice",
-  dicts: ['sys_notice_status', 'sys_notice_type'],
+  dicts: ["sys_notice_status", "sys_notice_type"],
   data() {
     return {
       // 遮罩层
@@ -201,29 +275,33 @@ export default {
         pageSize: 10,
         noticeTitle: undefined,
         createBy: undefined,
-        status: undefined
+        status: undefined,
       },
       // 表单参数
-      form: {},
+      form: {
+        noticeContent: "",
+      },
       // 表单校验
       rules: {
         noticeTitle: [
-          { required: true, message: "公告标题不能为空", trigger: "blur" }
+          { required: true, message: "公告标题不能为空", trigger: "blur" },
         ],
         noticeType: [
-          { required: true, message: "公告类型不能为空", trigger: "change" }
-        ]
-      }
+          { required: true, message: "公告类型不能为空", trigger: "change" },
+        ],
+      },
+      IP: "",
     };
   },
   created() {
+    this.IP = process.env.VUE_APP_BASE_IP;
     this.getList();
   },
   methods: {
     /** 查询公告列表 */
     getList() {
       this.loading = true;
-      listNotice(this.queryParams).then(response => {
+      listNotice(this.queryParams).then((response) => {
         this.noticeList = response.rows;
         this.total = response.total;
         this.loading = false;
@@ -240,8 +318,8 @@ export default {
         noticeId: undefined,
         noticeTitle: undefined,
         noticeType: undefined,
-        noticeContent: undefined,
-        status: "0"
+        noticeContent: "",
+        status: "0",
       };
       this.resetForm("form");
     },
@@ -257,9 +335,9 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.noticeId)
-      this.single = selection.length!=1
-      this.multiple = !selection.length
+      this.ids = selection.map((item) => item.noticeId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
     },
     /** 新增按钮操作 */
     handleAdd() {
@@ -270,25 +348,39 @@ export default {
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const noticeId = row.noticeId || this.ids
-      getNotice(noticeId).then(response => {
+      const noticeId = row.noticeId || this.ids;
+      getNotice(noticeId).then((response) => {
+        this.title = "修改公告";
+        let str = response.data.noticeContent;
         this.form = response.data;
+        this.$set(this.form, "noticeContent");
+
+        if (str) {
+          const pattern = /\\&quot;\/dev-api/;
+          const result = str.replace(pattern, this.IP);
+
+          const pattern1 = /\\&quot;/g;
+          const res = result.replace(pattern1, "");
+          this.form.noticeContent = res;
+        }
+
         this.open = true;
-        this.title = "修改公告";
+        this.form.noticeContent = response.data.noticeContent;
       });
     },
     /** 提交按钮 */
-    submitForm: function() {
-      this.$refs["form"].validate(valid => {
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
         if (valid) {
           if (this.form.noticeId != undefined) {
-            updateNotice(this.form).then(response => {
+            this.form.noticeContent = JSON.stringify(this.form.noticeContent);
+            updateNotice(JSON.stringify(this.form)).then((response) => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addNotice(this.form).then(response => {
+            addNotice(JSON.stringify(this.form)).then((response) => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
               this.getList();
@@ -299,14 +391,18 @@ export default {
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const noticeIds = row.noticeId || this.ids
-      this.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?').then(function() {
-        return delNotice(noticeIds);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
-    }
-  }
+      const noticeIds = row.noticeId || this.ids;
+      this.$modal
+        .confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?')
+        .then(function () {
+          return delNotice(noticeIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+  },
 };
 </script>

+ 1 - 1
src/views/system/user/index.vue

@@ -20,7 +20,7 @@
             :expand-on-click-node="false"
             :filter-node-method="filterNode"
             ref="tree"
-            default-expand-all
+            :default-expand-all="false"
             highlight-current
             @node-click="handleNodeClick"
           />

+ 52 - 126
src/views/task/index.vue

@@ -1,157 +1,79 @@
 <template>
   <div class="app-container">
-    <el-form
-      :model="queryParams"
-      ref="queryForm"
-      :inline="true"
-      v-show="showSearch"
-    >
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
       <el-form-item label="活动名称" prop="acname">
-        <el-input
-          v-model="queryParams.acname"
-          placeholder="请输入活动名称"
-        ></el-input>
+        <el-input v-model="queryParams.acname" placeholder="请输入活动名称"></el-input>
       </el-form-item>
       <el-form-item label="审核状态" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="请选择审核状态"
-          clearable
-          filterable
-        >
-          <el-option
-            v-for="dict in statusList"
-            :key="dict.value + 'statusList'"
-            :label="dict.label"
-            :value="dict.value"
-          />
+        <el-select v-model="queryParams.status" placeholder="请选择审核状态" clearable filterable>
+          <el-option v-for="dict in statusList" :key="dict.value + 'statusList'" :label="dict.label"
+            :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="el-icon-search" @click="handleQuery"
-          >搜索</el-button
-        >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
 
-    <el-table
-      :data="INSTACTIONTASKList"
-      @selection-change="handleSelectionChange"
-    >
+    <el-table v-hasPermi="['business:INSTACTIONTASK:byUser']" :data="INSTACTIONTASKList" @selection-change="handleSelectionChange">
       <!-- <el-table-column type="selection" width="55" align="center" /> -->
-      <el-table-column label="活动名称" align="center" prop="acname">
+      <el-table-column label="活动名称" width="180" show-overflow-tooltip align="center" prop="acname">
         <template slot-scope="scope">
           {{ scope.row.acname }}
         </template>
       </el-table-column>
-      <el-table-column label="标题" align="center" prop="fromKeyword ">
+      <el-table-column label="标题" width="220" show-overflow-tooltip align="center" prop="fromKeyword ">
         <template slot-scope="scope">
           {{ scope.row.fromKeyword }}
         </template>
       </el-table-column>
-      <el-table-column label="流程名称" align="center" prop="proname">
+      <el-table-column label="流程名称" width="180" show-overflow-tooltip align="center" prop="proname">
         <template slot-scope="scope">
           {{ scope.row.proname }}
         </template>
       </el-table-column>
-      <el-table-column label="递交时间" align="center" prop="beginTime">
+      <el-table-column label="递交时间" width="160" show-overflow-tooltip align="center" prop="beginTime">
         <template slot-scope="scope">
           {{ scope.row.beginTime }}
         </template>
       </el-table-column>
       <el-table-column label="审核状态" align="center" prop="status">
         <template slot-scope="scope">
-          <el-tag v-if="scope.row.status == '1'" type="success">同意</el-tag>
-          <el-tag v-else-if="scope.row.status == '2'" type="danger"
-            >驳回</el-tag
-          >
+          <el-tag v-if="scope.row.status == '1'" type="success">审核通过</el-tag>
+          <el-tag v-else-if="scope.row.status == '2'" type="danger">驳回</el-tag>
           <el-tag v-else-if="scope.row.status == '3'" type="info">退回</el-tag>
           <el-tag v-else-if="scope.row.status == '0'">待审核</el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="审核意见" align="center" prop="comments">
+      <el-table-column label="审核意见" width="260" show-overflow-tooltip align="center" prop="comments">
         <template slot-scope="scope">
           {{ scope.row.comments }}
         </template>
       </el-table-column>
-      <el-table-column
-        label="操作"
-        align="center"
-        class-name="small-padding fixed-width"
-      >
+      <el-table-column label="操作" width="80" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button
-            v-if="scope.row.status == '0'"
-            size="mini" type="text"
-            @click="handleExamine(scope.row)"
-            v-hasPermi="['business:INSTACTIONTASK:task']"
-          >详情</el-button>
+          <el-button v-if="scope.row.status == '0' && checkPermi(['business:INSTACTIONTASK:query'])" size="mini" type="text" @click="handleExamine(scope.row)"
+            >审核</el-button>
 
-          <el-button
-            v-if="scope.row.status == '0'"
-            size="mini"
-            type="text"
-            @click="handlePass(scope.row)"
-            v-hasPermi="['business:INSTACTIONTASK:task']"
-            >通过审核</el-button
-          >
-          <el-button
-            v-if="scope.row.status == '0'"
-            size="mini"
-            type="text"
-            @click="handleReject(scope.row)"
-            v-hasPermi="['business:INSTACTIONTASK:task']"
-            >驳回</el-button
-          >
+          <!-- <el-button v-if="scope.row.status == '0'" size="mini" type="text" @click="handlePass(scope.row)"
+            >通过审核</el-button>
+          <el-button v-if="scope.row.status == '0'" size="mini" type="text" @click="handleReject(scope.row)"
+            >驳回</el-button> -->
 
-          <el-button
-            size="mini"
-            type="text"
-            @click="handleDetail(scope.row)"
-            v-hasPermi="['business:INSTACTIONTASK:detail']"
-            v-if="scope.row.status != '0'"
-            >详情</el-button
-          >
+          <el-button size="mini" type="text" @click="handleDetail(scope.row)"
+             v-if="scope.row.status != '0'">审核</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <el-dialog
-      title="审核"
-      :visible.sync="dialogVisible"
-      width="80%"
-      :close-on-click-modal="false"
-      @close="closeDia"
-    >
-      <component
-        :is="componentUrl"
-        :taskList="taskList"
-        ref="componentSH"
-      ></component>
-      <el-dialog
-        width="60%"
-        :title="subTitle + '审核'"
-        :visible.sync="innerVisible"
-        :close-on-click-modal="false"
-        append-to-body
-        center
-        @close="qx()"
-      >
-        <el-form
-          :model="subForm"
-          :rules="subFormRules"
-          label-width="100px"
-          ref="extaskform"
-        >
+    <el-dialog :title="taskList.fromKeyword +'-'+ taskList.proname" :visible.sync="dialogVisible" width="95%" :close-on-click-modal="false" @close="closeDia">
+      <component :is="componentUrl" :taskList="taskList" ref="componentSH"></component>
+      <el-dialog width="60%" :title="subTitle" :visible.sync="innerVisible" :close-on-click-modal="false"
+        append-to-body center @close="qx()">
+        <el-form :model="subForm" :rules="subFormRules" label-width="100px" ref="extaskform">
           <el-form-item label="审核意见">
-            <el-input
-              type="textarea"
-              v-model="subForm.comments"
-              placeholder="请输入审核意见"
-            ></el-input>
+            <el-input type="textarea" v-model="subForm.comments" placeholder="请输入审核意见"></el-input>
           </el-form-item>
         </el-form>
         <div slot="footer" class="dialog-footer">
@@ -161,22 +83,17 @@
       </el-dialog>
 
       <span slot="footer" class="dialog-footer" v-if="taskList.status == 0">
-        <el-button type="primary" @click="submitBtn('同意')">同意</el-button>
-        <el-button type="warning" @click="submitBtn('驳回')">驳回</el-button>
-        <el-button type="danger" @click="submitBtn('退回')">退回</el-button>
+        <el-button v-if="checkPermi(['task:instaction:approve'])" type="primary" @click="submitBtn('审核通过')">审核通过</el-button>
+        <el-button  v-if="checkPermi(['task:instaction:reject'])"  type="warning" @click="submitBtn('驳回')">驳回</el-button>
+        <!-- <el-button  v-if="checkPermi(['task:instaction:goback'])"  type="danger" @click="submitBtn('退回')">退回</el-button> -->
       </span>
       <span slot="footer" class="dialog-footer" v-else>
         <el-button type="primary" @click="backDia">返回</el-button>
       </span>
     </el-dialog>
 
-    <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
   </div>
 </template>
 
@@ -185,8 +102,15 @@
 import newsTask from "@/views/news/task/index.vue";
 import couTask from "@/views/COUNSELINGMESSAGE/task/index.vue";
 import ModifyCompanyUserService from "@/views/REGISTERTASK/index.vue";
+import CompanyUserService from "@/views/CompanyUserService/index.vue";
 import questionService from "@/views/QUESTION/questionService.vue";
 import articleTask from "@/views/ARTICLE/task/index.vue";
+import dataAcquisition from "@/components/DataAcquisition";
+import auxiliaryAudit from "@/components/AuxiliaryAudit";
+
+import { checkPermi } from "@/utils/permission.js";
+
+
 
 import {
   listINSTACTIONTASK,
@@ -208,6 +132,10 @@ export default {
     ModifyCompanyUserService,
     questionService,
     articleTask,
+    dataAcquisition,
+    CompanyUserService,
+    auxiliaryAudit,
+
   },
   data() {
     return {
@@ -304,7 +232,7 @@ export default {
         status: [
           {
             required: true,
-            message: "审核状态(1=同意,2=驳回)不能为空",
+            message: "审核状态(1=审核通过,2=驳回)不能为空",
             trigger: "blur",
           },
         ],
@@ -315,7 +243,7 @@ export default {
       statusList: [
         { value: null, label: "全部" },
         { value: "0", label: "待审核" },
-        { value: "1", label: "同意" },
+        { value: "1", label: "审核通过" },
         { value: "2", label: "驳回" },
         { value: "3", label: "退回" },
       ],
@@ -325,8 +253,8 @@ export default {
     this.getList();
   },
   methods: {
+    checkPermi,
     closeDia() {
-      // console.log('关闭');
     },
     extask() {
       this.$refs["extaskform"].validate((valid) => {
@@ -335,7 +263,8 @@ export default {
             comments: this.subForm.comments,
             taskId: this.taskList.id,
           };
-          if (this.subTitle == "同意") {
+
+          if (this.subTitle == "审核通过") {
             approve(data).then((res) => {
               this.dialogVisible = false;
               this.qx();
@@ -379,7 +308,6 @@ export default {
     //     this.componentUrl = res.data.infoUrl;
     //     downloadpic(res.data.formobj.picture).then((res) => {
     //       this.taskList.formobj.picture = window.URL.createObjectURL(res);
-    //       console.log('下载转换后:',this.taskList.formobj.picture)
     //       this.dialogVisible = true;
     //     });
     //   });
@@ -411,7 +339,6 @@ export default {
     handleExamine(row) {
       // this.taskList = []
       getINSTACTIONTASK(row.id).then((res) => {
-        console.log('111111',res);
         this.taskList = res.data;
         this.componentUrl = res.data.infoUrl;
         this.dialogVisible = true;
@@ -420,7 +347,6 @@ export default {
     //点击查看详细
     handleDetail(row) {
       getINSTACTIONTASK(row.id).then((res) => {
-        console.log('666',res);
         this.taskList = res.data;
         this.componentUrl = res.data.infoUrl;
         downloadpic(this.taskList.formobj.picture).then((res) => {
@@ -523,7 +449,7 @@ export default {
           this.getList();
           this.$modal.msgSuccess("删除成功");
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     /** 导出按钮操作 */
     handleExport() {

+ 128 - 81
src/views/wf/index.vue

@@ -8,23 +8,24 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-col :span="8">
-        <el-form-item label="流程名称" prop="proname">
-          <el-input v-model="queryParams.proname" />
-        </el-form-item>
-      </el-col>
-      <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
-          >搜索</el-button
-        >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
-      </el-form-item>
+    
+          <el-form-item label="流程名称" prop="proname">
+            <el-input v-model="queryParams.proname" />
+          </el-form-item>
+      
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >搜索</el-button
+            >
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+              >重置</el-button
+            >
+          </el-form-item>
+       
     </el-form>
 
     <el-row :gutter="10" style="margin-bottom: 8px">
@@ -71,8 +72,9 @@
 
     <el-table :data="PROTEMPLATEList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="保税区"  width="200" align="center" prop="cbId_dictText" />
       <el-table-column label="流程编码" align="center" prop="procode" />
-      <el-table-column label="流程名称" align="center" prop="proname">
+      <el-table-column label="流程名称"  width="160" align="center" prop="proname">
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -84,11 +86,11 @@
         </template>
       </el-table-column>
       <el-table-column label="版本" align="center" prop="version" />
-      <el-table-column label="关键字" align="center" prop="keyword" />
+      <el-table-column label="关键字" width="220" align="center" prop="keyword" />
       <el-table-column label="排序" align="center" prop="seqno" />
-      <el-table-column label="流程说明" align="center" prop="pronotes" />
-      <el-table-column label="服务层地址" align="center" prop="serviceUrl" />
-      <el-table-column label="前端查看页面地址" align="center" prop="infoUrl" />
+      <el-table-column label="流程说明" show-overflow-tooltip  width="200"  align="center" prop="pronotes" />
+      <el-table-column label="服务层地址" show-overflow-tooltip  width="200"  align="center" prop="serviceUrl" />
+      <el-table-column label="前端查看页面地址" show-overflow-tooltip  width="200"  align="center" prop="infoUrl" />
       <el-table-column label="是否启用" align="center" prop="status">
         <template slot-scope="scope">
           <el-switch
@@ -101,7 +103,9 @@
         </template>
       </el-table-column>
       <el-table-column
+        fixed="right"
         label="操作"
+        width="220" 
         align="center"
         class-name="small-padding fixed-width"
       >
@@ -135,53 +139,92 @@
     />
 
     <!-- 添加或修改流程模板对话框 -->
-    <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="60%" append-to-body>
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      :close-on-click-modal="false"
+      width="60%"
+      append-to-body
+    >
       <el-form ref="form" :model="form" :rules="rules" label-width="140px">
-        <el-form-item label="流程编码" prop="procode">
-          <el-input
-            v-model="form.procode"
-            placeholder="请输入流程编码"
-            type="text"
-          />
-        </el-form-item>
-        <el-form-item label="流程名称" prop="proname">
-          <el-input
-            v-model="form.proname"
-            placeholder="请输入流程名称"
-            type="text"
-          />
-        </el-form-item>
-        <el-form-item label="关键字" prop="keyword">
-          <el-input
-            v-model="form.keyword"
-            placeholder="请输入关键字"
-            type="text"
-          />
-        </el-form-item>
-        <el-form-item label="排序" prop="seqno">
-          <el-input v-model="form.seqno" placeholder="排序" type="number" />
-        </el-form-item>
-        <el-form-item label="流程说明" prop="pronotes">
-          <el-input
-            v-model="form.pronotes"
-            placeholder="请输入流程说明"
-            type="text"
-          />
-        </el-form-item>
-        <el-form-item label="服务层地址" prop="serviceUrl">
-          <el-input
-            v-model="form.serviceUrl"
-            placeholder="请输入服务层地址"
-            type="text"
-          />
-        </el-form-item>
-        <el-form-item label="前端页面地址" prop="infoUrl">
-          <el-input
-            v-model="form.infoUrl"
-            placeholder="请输入前端页面地址"
-            type="text"
-          />
-        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="所属保税区" prop="cbId">
+              <el-select
+                filterable
+                v-model="form.cbId"
+                placeholder="请选择保税区"
+              >
+                <el-option
+                  v-for="item in cbList"
+                  :key="item.deptId"
+                  :label="item.deptName"
+                  :value="item.deptId"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="流程编码" prop="procode">
+              <el-input
+                v-model="form.procode"
+                placeholder="请输入流程编码"
+                type="text"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="流程名称" prop="proname">
+              <el-input
+                v-model="form.proname"
+                placeholder="请输入流程名称"
+                type="text"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="关键字" prop="keyword">
+              <el-input
+                v-model="form.keyword"
+                placeholder="请输入关键字"
+                type="text"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="排序" prop="seqno">
+              <el-input v-model="form.seqno" placeholder="排序" type="number" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="流程说明" prop="pronotes">
+              <el-input
+                v-model="form.pronotes"
+                placeholder="请输入流程说明"
+                type="text"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="服务层地址" prop="serviceUrl">
+              <el-input
+                v-model="form.serviceUrl"
+                placeholder="请输入服务层地址"
+                type="text"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="前端页面地址" prop="infoUrl">
+              <el-input
+                v-model="form.infoUrl"
+                placeholder="请输入前端页面地址"
+                type="text"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -274,7 +317,7 @@
       :title="Protitle"
       :visible.sync="openProAddOrEdit"
       :close-on-click-modal="false"
-      width="60%"
+      width="40%"
       append-to-body
     >
       <el-form ref="form2" :model="Proform" label-width="140px">
@@ -320,11 +363,7 @@
           <el-radio v-model="Proform.remessage" label="2">不提醒</el-radio>
         </el-form-item>
         <el-form-item label="活动顺序" prop="seqno">
-          <el-input
-            v-model="Proform.seqno"
-            placeholder="请输入活动顺序"
-            type="text"
-          />
+          <el-input-number v-model="Proform.seqno"  :min="1" :max="10" label=""></el-input-number>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -348,9 +387,11 @@ import {
   addPro,
   updatePro,
   getUser,
-  enableOrDisable
+  enableOrDisable,
 } from "@/api/wf/PROTEMPLATE";
 
+import { listDeptByCb } from "@/api/system/dept";
+
 export default {
   name: "PROTEMPLATE",
   data() {
@@ -405,11 +446,11 @@ export default {
       // 表单参数
       form: {},
       Proform: {},
+      cbList: [], //保税区数据
       // 表单校验
       rules: {
-        id: [{ required: true, message: "$comment不能为空", trigger: "blur" }],
-        delFlag: [
-          { required: true, message: "删除标识不能为空", trigger: "blur" },
+        cbId: [
+          { required: true, message: "保税区信息不能为空", trigger: "blur" },
         ],
         procode: [
           { required: true, message: "流程编码不能为空", trigger: "blur" },
@@ -440,10 +481,16 @@ export default {
   },
   created() {
     this.getList();
+    this.getCbList();
   },
   methods: {
-    handleStatus(row){
-      enableOrDisable(row)
+    getCbList() {
+      listDeptByCb("").then((res) => {
+        this.cbList = res.data;
+      });
+    },
+    handleStatus(row) {
+      enableOrDisable(row);
       this.getList();
     },
     searchUserName(id) {
@@ -498,7 +545,7 @@ export default {
         for (const i in res.data) {
           this.user.push({
             value: res.data[i].userId,
-            label: res.data[i].username,
+            label: res.data[i].nickName,
           });
         }
       });

+ 3 - 3
vue.config.js

@@ -18,7 +18,7 @@ module.exports = {
   // 部署生产环境和开发环境下的URL。
   // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
   // 如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
-  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+  publicPath: process.env.NODE_ENV === "production" ? "/admin/" : "/admin/",
   // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
   outputDir: 'admin',
   // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
@@ -64,7 +64,7 @@ module.exports = {
       // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
       new CompressionPlugin({
         cache: false, // 不启用文件缓存
-        test: /\.(js|css|html)?$/i, // 压缩文件格式
+        test: /\.(css|html)?$/i, // 压缩文件格式
         filename: '[path].gz[query]', // 压缩后的文件名
         algorithm: 'gzip', // 使用gzip压缩
         minRatio: 0.8 // 压缩率小于1才会压缩
@@ -134,4 +134,4 @@ module.exports = {
         }
       )
   }
-}
+}

Some files were not shown because too many files changed in this diff