Tang 1 year ago
parent
commit
9aa034e97a
100 changed files with 5024 additions and 376 deletions
  1. 8 3
      .env.development
  2. 14 0
      .env.pre
  3. 5 1
      .env.production
  4. 9 6
      .env.staging
  5. 2 0
      .gitignore
  6. 16 3
      package.json
  7. 8 2
      public/index.html
  8. 15 11
      src/App.vue
  9. 16 1
      src/api/api.js
  10. 28 0
      src/api/education/classManageMent.js
  11. 41 4
      src/api/login.js
  12. 114 0
      src/api/resource/good.js
  13. 39 0
      src/api/resource/videoManagement.js
  14. 47 0
      src/api/resource/volumeManagement.js
  15. 33 0
      src/api/salesman/act.js
  16. 25 0
      src/api/salesman/commission.js
  17. 84 0
      src/api/salesman/user.js
  18. BIN
      src/assets/images/ContractAmount.png
  19. BIN
      src/assets/images/NumberOfOrders.png
  20. BIN
      src/assets/images/NumberOfOrders2.png
  21. BIN
      src/assets/images/OutstandingPayment.png
  22. BIN
      src/assets/images/PaymentHasBeenReceived.png
  23. BIN
      src/assets/images/PendingOrder.png
  24. BIN
      src/assets/images/PendingRefund.png
  25. BIN
      src/assets/images/Refunded.png
  26. BIN
      src/assets/images/cbje.png
  27. BIN
      src/assets/images/ddrs.png
  28. BIN
      src/assets/images/dds.png
  29. BIN
      src/assets/images/defhead.png
  30. BIN
      src/assets/images/docx.png
  31. BIN
      src/assets/images/htje.png
  32. BIN
      src/assets/images/idcardF.png
  33. BIN
      src/assets/images/idcardZ.png
  34. BIN
      src/assets/images/left@2x.png
  35. BIN
      src/assets/images/left_slices/left@2x.png
  36. BIN
      src/assets/images/peopleImg.png
  37. BIN
      src/assets/images/sjk.png
  38. BIN
      src/assets/images/wsk.png
  39. BIN
      src/assets/images/xlsx.png
  40. BIN
      src/assets/images/yk.png
  41. BIN
      src/assets/images/ysk.png
  42. BIN
      src/assets/images/ytk.png
  43. BIN
      src/assets/images/zip.png
  44. BIN
      src/assets/model_images/model1.png
  45. BIN
      src/assets/model_images/model2.png
  46. BIN
      src/assets/model_images/model3.png
  47. BIN
      src/assets/model_images/model4.png
  48. BIN
      src/assets/model_images/示例.png
  49. 1 1
      src/assets/styles/variables.scss
  50. 156 0
      src/components/BaseDialog.vue
  51. 265 0
      src/components/Comon/batchImportDialog.vue
  52. 99 0
      src/components/Comon/pictureList.vue
  53. 30 1
      src/components/Editor/index.vue
  54. 302 0
      src/components/Study/StudentInfo.vue
  55. 13 1
      src/components/busIns.vue
  56. 353 0
      src/components/goodsList/index.vue
  57. 280 0
      src/components/modelView/index.vue
  58. 24 12
      src/components/questionBank.vue
  59. 194 0
      src/components/salesmanInfo/index.vue
  60. 95 39
      src/components/searchBoxNew.vue
  61. 300 0
      src/components/subjectCy/index.vue
  62. 263 241
      src/components/tableList.vue
  63. 38 17
      src/components/testPaperPreview/index.vue
  64. 18 0
      src/directive/common/throttle.js
  65. 7 0
      src/directive/filter/index.js
  66. 5 1
      src/directive/index.js
  67. 26 0
      src/fxApi/check.js
  68. 42 0
      src/fxApi/poster.js
  69. 176 0
      src/fxApi/temp.js
  70. 358 3
      src/layout/components/Navbar.vue
  71. 1 0
      src/layout/components/Sidebar/Item.vue
  72. 3 3
      src/layout/components/Sidebar/Logo.vue
  73. 8 0
      src/main.js
  74. 298 0
      src/mixin/fpFile.js
  75. 89 1
      src/newApi/applicationData.js
  76. 60 0
      src/newApi/appuser.js
  77. 176 0
      src/newApi/archives.js
  78. 28 1
      src/newApi/business.js
  79. 100 0
      src/newApi/classTab.js
  80. 16 0
      src/newApi/colleges.js
  81. 72 0
      src/newApi/course.js
  82. 79 0
      src/newApi/examapply.js
  83. 16 0
      src/newApi/festival.js
  84. 61 0
      src/newApi/goods.js
  85. 44 2
      src/newApi/handout.js
  86. 8 0
      src/newApi/mockSub.js
  87. 8 0
      src/newApi/modules.js
  88. 31 0
      src/newApi/notificationFL.js
  89. 9 0
      src/newApi/order.js
  90. 112 0
      src/newApi/orderInvoice.js
  91. 24 0
      src/newApi/paperquestion.js
  92. 8 0
      src/newApi/studentList.js
  93. 55 0
      src/newApi/systemExam.js
  94. 25 0
      src/newApi/systemRemind.js
  95. 23 0
      src/newApi/userInformationManagement.js
  96. 104 16
      src/permission.js
  97. 0 5
      src/router/index.js
  98. 1 1
      src/settings.js
  99. 9 0
      src/store/getters.js
  100. 7 0
      src/store/modules/dict.js

+ 8 - 3
.env.development

@@ -2,11 +2,16 @@
 VUE_APP_TITLE =中正云教育管理后台
 
 # 开发环境配置
-ENV = 'development'
+NODE_ENV = 'development'
 
 # 中正云教育管理后台/开发环境
-VUE_APP_BASE_API = 'http://192.168.1.222:5030/'
+VUE_APP_BASE_API = 'http://120.79.166.78:19013/'
+VUE_APP_BASE_API_QP = 'http://192.168.1.7:9090'
+# VUE_APP_BASE_API = 'http://192.168.1.24:5030/'
 VUE_APP_IMG_API = 'https://file-dev.xyyxt.net'
 
 # 路由懒加载
-VUE_CLI_BABEL_TRANSPILE_MODULES = true
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+#端口号
+port = 80

+ 14 - 0
.env.pre

@@ -0,0 +1,14 @@
+# 页面标题
+VUE_APP_TITLE = 中正云教育管理后台
+
+# 预发布环境配置
+NODE_ENV = 'pre'
+
+# 中正云教育管理后台/预发布环境
+# 预发布
+VUE_APP_BASE_API = 'http://120.79.166.78:19007/'
+VUE_APP_BASE_API_QP = 'https://attach.xyyxt.net'
+VUE_APP_IMG_API = 'https://file.xyyxt.net'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 5 - 1
.env.production

@@ -2,8 +2,12 @@
 VUE_APP_TITLE = 中正云教育管理后台
 
 # 生产环境配置
-ENV = 'production'
+NODE_ENV = 'production'
 
 # 中正云教育管理后台/生产环境
 VUE_APP_BASE_API = 'https://cloud.xyyxt.net/'
+VUE_APP_BASE_API_QP = 'https://attach.xyyxt.net'
 VUE_APP_IMG_API = 'https://file.xyyxt.net'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 9 - 6
.env.staging

@@ -1,11 +1,14 @@
 # 页面标题
 VUE_APP_TITLE = 中正云教育管理后台
 
-NODE_ENV = production
+# 测试环境配置
+NODE_ENV = 'staging'
 
-# 预发布环境配置
-ENV = 'staging'
-
-# 中正云教育管理后台/预发布环境
-VUE_APP_BASE_API = 'http://120.79.166.78:19007/'
+# 中正云教育管理后台
+# 测试
+VUE_APP_BASE_API = 'http://120.79.166.78:19013/'
+VUE_APP_BASE_API_QP = 'http://192.168.1.7:9090'
 VUE_APP_IMG_API = 'https://file-dev.xyyxt.net'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 2 - 0
.gitignore

@@ -1,4 +1,5 @@
 .DS_Store
+.history
 node_modules/
 dist/
 npm-debug.log*
@@ -9,6 +10,7 @@ yarn-error.log*
 tests/**/coverage/
 tests/e2e/reports
 selenium-debug.log
+/dist.rar
 
 # Editor directories and files
 .idea

+ 16 - 3
package.json

@@ -4,10 +4,12 @@
   "description": "中正高校端管理系统",
   "author": "中正高校端",
   "license": "MIT",
+  "sideEffects": true,
   "scripts": {
     "dev": "vue-cli-service serve",
-    "build:prod": "vue-cli-service build",
+    "build:prod": "vue-cli-service build --mode production",
     "build:stage": "vue-cli-service build --mode staging",
+    "build:pre": "vue-cli-service build --mode pre",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src"
   },
@@ -41,12 +43,17 @@
     "af-table-column": "^1.0.3",
     "axios": "0.21.0",
     "clipboard": "2.0.6",
+    "compression-webpack-plugin": "^6.1.1",
     "core-js": "3.8.1",
     "echarts": "4.9.0",
-    "element-ui": "2.15.6",
+    "element-ui": "^2.15.13",
+    "exif-js": "^2.3.0",
     "file-saver": "^2.0.5",
     "fuse.js": "6.4.3",
+    "gsap": "^3.11.4",
     "highlight.js": "9.18.5",
+    "html2canvas": "^1.4.1",
+    "iconv-lite": "^0.6.3",
     "js-beautify": "1.13.0",
     "js-cookie": "2.2.1",
     "js-md5": "^0.7.3",
@@ -57,11 +64,15 @@
     "quill-image-resize-module": "^3.0.0",
     "screenfull": "5.0.2",
     "sortablejs": "1.10.2",
+    "spark-md5": "^3.0.2",
     "v-fit-columns": "^0.2.0",
     "vue": "2.6.12",
+    "vue-canvas-poster": "^1.2.1",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",
+    "vue-draggable-resizable": "^2.3.0",
     "vue-meta": "^2.4.0",
+    "vue-qr": "^4.0.9",
     "vue-router": "3.4.9",
     "vuedraggable": "2.24.3",
     "vuex": "3.6.0"
@@ -71,6 +82,7 @@
     "@vue/cli-plugin-eslint": "4.4.6",
     "@vue/cli-service": "4.4.6",
     "babel-eslint": "10.1.0",
+    "babel-plugin-dynamic-import-node": "2.3.3",
     "chalk": "4.1.0",
     "connect": "3.6.6",
     "eslint": "7.15.0",
@@ -83,7 +95,8 @@
     "sass-loader": "10.1.1",
     "script-ext-html-webpack-plugin": "2.1.5",
     "svg-sprite-loader": "5.1.1",
-    "vue-template-compiler": "2.6.12"
+    "vue-template-compiler": "2.6.12",
+    "webpack-bundle-analyzer": "^4.9.0"
   },
   "engines": {
     "node": ">=8.9",

+ 8 - 2
public/index.html

@@ -11,8 +11,9 @@
     <%= webpackConfig.name %>
   </title>
   <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
-
-  <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.4/gsap.min.js"></script>
+  <!-- <script src="https://manage.xyyxt.net/static/js/gsap.min.js"></script> -->
+  <!-- 使用CDN的CSS文件 -->
+  <link rel="stylesheet" href="https://file.xyyxt.net/web/static/js/index.min.css">
   <style>
     html,
     body,
@@ -213,6 +214,11 @@
       <div class="load_title">正在加载系统资源,请耐心等待</div>
     </div>
   </div>
+  <!-- 使用CDN的JS文件 -->
+  <script src="https://file.xyyxt.net/web/static/js/vue.min.js"></script>
+  <script src="https://file.xyyxt.net/web/static/js/index.min.js"></script>
+  <script src="https://file.xyyxt.net/web/static/js/axios.min.js"></script>
+  <script src="https://file.xyyxt.net/web/static/js/vue-router.min.js"></script>
 </body>
 
 </html>

+ 15 - 11
src/App.vue

@@ -5,15 +5,19 @@
 </template>
 
 <script>
-export default  {
-  name:  'App',
-    metaInfo() {
-        return {
-            title: this.$store.state.settings.dynamicTitle && this.$store.state.settings.title,
-            titleTemplate: title => {
-                return title ? `${title} - ${process.env.VUE_APP_TITLE}` : process.env.VUE_APP_TITLE
-            }
-        }
-    }
-}
+export default {
+  name: "App",
+  metaInfo() {
+    return {
+      title:
+        this.$store.state.settings.dynamicTitle &&
+        this.$store.state.settings.title,
+      titleTemplate: (title) => {
+        return title
+          ? `${title} - ${this.$store.state.user.companyName}`
+          : this.$store.state.user.companyName;
+      },
+    };
+  },
+};
 </script>

+ 16 - 1
src/api/api.js

@@ -100,11 +100,25 @@ import homeApi from '../newApi/homeApi'//控制台学员数据
 import studyAccountStatus from '../newApi/studyAccountStatus'//学习账号标记
 import mock from '../newApi/mock'//模考管理
 import mockSub from '../newApi/mockSub'//预约模考管理
+import systemExam from '../newApi/systemExam'//模考活动列表
+import archives from '../newApi/archives'//档案管理
+import orderInvoice from '../newApi/orderInvoice'//订单发票管理
+
+//分销相关
+
+import poster from '../fxApi/poster'//海报列表
+import temp from '../fxApi/temp'//分销活动列表
+import check from '../fxApi/check'//分销审核
 
 
 
 // 导入对应模块------------------------
 export default {
+    ...orderInvoice,
+    ...archives,
+    ...poster,
+    ...temp,
+    ...check,
     ...courseEducationType,
     ...courseProjectType,
     ...applyAreas,
@@ -179,7 +193,8 @@ export default {
     ...homeApi,
     ...studyAccountStatus,
     ...mock,
-    ...mockSub
+    ...mockSub,
+    ...systemExam,
 
     // ...login,
     // ...profession,

+ 28 - 0
src/api/education/classManageMent.js

@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+
+// 通过打回二审状态
+export function rollBackPeriod(data) {
+    return request({
+        url: `/grade/grade/confirm/rollbackPeriod`,
+        method: 'post',
+        data
+    })
+}
+
+// 商品关联的班级
+export function getListGoods(query) {
+    return request({
+        url: `/grade/grade/listGoods`,
+        method: 'GET',
+        params: query
+    })
+}
+
+// 更换班级
+export function changeGradeFree(data) {
+    return request({
+        url: `/grade/grade/changeGradeFree`,
+        method: 'post',
+        data
+    })
+}

+ 41 - 4
src/api/login.js

@@ -1,20 +1,54 @@
 import request from '@/utils/request'
 
 // 登录方法
-export function login(username, password, code, uuid) {
+export function login(username, password, code, uuid, phonenumber, smsCode) {
   const data = {
     username,
     password,
     code,
-    uuid
+    uuid, phonenumber, smsCode
   }
   return request({
     url: '/login',
     method: 'post',
-    data: data
+    data: data,
+    headers: {
+      isToken: false
+    },
+  })
+}
+
+// 免登API
+export function oldlogin(data) {
+  return request({
+    url: '/old/login',
+    method: 'post',
+    data: data,
+    headers: {
+      isToken: false
+    },
   })
 }
 
+// 双重等保
+export function commondual_auth() {
+  return request({
+    url: '/common/free/dual_auth',
+    method: 'get',
+    timeout: 20000
+  })
+}
+// 获取登入短信
+export function commonsms_login(data) {
+  return request({
+    url: '/app/common/sms/login',
+    method: 'post',
+    data: data,
+    headers: {
+      isToken: false
+    },
+  })
+}
 // 注册方法
 export function register(data) {
   return request({
@@ -48,6 +82,9 @@ export function getCodeImg() {
   return request({
     url: '/captchaImage',
     method: 'get',
-    timeout: 20000
+    timeout: 20000,
+    headers: {
+      isToken: false
+    },
   })
 }

+ 114 - 0
src/api/resource/good.js

@@ -0,0 +1,114 @@
+import request from '@/utils/request'
+
+// 查询模板列表
+export function getSpecList(query) {
+    return request({
+        url: '/system/template/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 企业列表
+export function getTenantList(query) {
+    return request({
+        url: '/common/tenant/list',
+        method: 'get',
+        params: query
+    })
+}
+// 商品复制
+export function goodsCopy(data) {
+    return request({
+        url: `/goods/batch/copy/add`,
+        method: 'post',
+        data
+    })
+}
+
+// 新增或修改模板
+export function changeSpec(data) {
+    return request({
+        url: `/system/template/${data.specTemplateId ? 'edit' : 'addSpec'}`,
+        method: 'post',
+        data
+    })
+}
+
+
+// 删除规格模板
+export function delSpec(id) {
+    return request({
+        url: '/system/template/del/' + id,
+        method: 'get',
+    })
+}
+
+// 模板详情
+export function getSpecDetail(id) {
+    return request({
+        url: '/system/template/detail/' + id,
+        method: 'get',
+    })
+}
+
+// 新增规格属性关联
+export function relation(data, b) {
+    return request({
+        url: `/system/relation/${b ? 'edit' : ''}`,
+        method: 'post',
+        data
+    })
+}
+
+// 获得商品模板列表
+export function getGoodsSpecList(id) {
+    return request({
+        url: '/goods/spec/list/' + id,
+        method: 'get',
+    })
+}
+
+// 修改商品默认规格模板
+export function goodsUpdateSpec(data) {
+    return request({
+        url: `/goods/update/spec`,
+        method: 'post',
+        data
+    })
+}
+
+// 商品批量上下架
+export function goodsUpdateStatus(data) {
+    return request({
+        url: `/goods/batch/updateStatus`,
+        method: 'post',
+        data
+    })
+}
+
+// 商品批量删除
+export function goodsDel(data) {
+    return request({
+        url: `/goods/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+// 商品取消绑定规格模板
+export function goodCancelBind(data) {
+    return request({
+        url: `/goods/cancel/spec`,
+        method: 'post',
+        data
+    })
+}
+// 新增每日一练试卷时间
+export function addExamTime(data) {
+    return request({
+        url: `/goods/addExamTime`,
+        method: 'post',
+        data
+    })
+}

+ 39 - 0
src/api/resource/videoManagement.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+// 课程批量删除
+export function courseBatchDel(data) {
+    return request({
+        url: `/course/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+
+// 模块批量删除
+export function moduleBatchDel(data) {
+    return request({
+        url: `/course/module/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+// 章批量删除
+export function chapterBatchDel(data) {
+    return request({
+        url: `/course/chapter/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+
+// 节批量删除
+export function sectionBatchDel(data) {
+    return request({
+        url: `/course/section/batch/del`,
+        method: 'post',
+        data
+    })
+}

+ 47 - 0
src/api/resource/volumeManagement.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 模块卷批量删除
+export function moduleVolumeBatchDel(data) {
+    return request({
+        url: `/bank/module/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+// 章批量删除
+export function chapterVolumeBatchDel(data) {
+    return request({
+        url: `/bank/chapter/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+
+// 试卷批量删除
+export function paperBatchDel(data) {
+    return request({
+        url: `/bank/exam/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+// 题目批量删除
+export function questionBatchDel(data) {
+    return request({
+        url: `/bank/question/batch/del`,
+        method: 'post',
+        data
+    })
+}
+
+// 知识点列表
+export function knowledgeList(query) {
+    return request({
+        url: `/exam/knowledge/list`,
+        method: 'get',
+        params: query
+    })
+}

+ 33 - 0
src/api/salesman/act.js

@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+//登录短信
+export function getActList(query) {
+  return request({
+    url: "/distribution/activity/list",
+    method: "get",
+    params: query
+  });
+}
+// 下载海报
+export function makePoster(query) {
+  return request({
+    url: "/distribution/poster/makePoster",
+    method: "get",
+    params: query
+  });
+}
+// 活动详情
+export function getActDetail(id) {
+  return request({
+    url: "/distribution/activity/" + id,
+    method: "get",
+  });
+}
+
+// 获得链条吗
+export function getLinkCode(query) {
+  return request({
+    url: "/distribution/poster/linkCode",
+    method: "get",
+    params: query
+  });
+}

+ 25 - 0
src/api/salesman/commission.js

@@ -0,0 +1,25 @@
+import request from "@/utils/request";
+//登录短信
+export function getCashList(query) {
+  return request({
+    url: "/distribution/seller/cash/list",
+    method: "get",
+    params: query
+  });
+}
+
+export function cancelApply(data) {
+  return request({
+    url: "/distribution/withdrawal/cancelApply",
+    method: "post",
+    data,
+  });
+}
+
+export function getWxCodeUrl(query) {
+  return request({
+    url: "/distribution/poster/wxCodeUrl",
+    method: "get",
+    params: query
+  });
+}

+ 84 - 0
src/api/salesman/user.js

@@ -0,0 +1,84 @@
+import request from "@/utils/request";
+//修改信息
+export function sellerEdit(data) {
+  return request({
+    url: "/distribution/seller/edit",
+    method: "post",
+    data,
+  });
+}
+export function getInfoByShareCode(data) {
+  return request({
+    url: "/app/common/distribution/getInfoByShareCode",
+    method: "get",
+    data: data,
+    noToken: true,
+  });
+}
+
+// 查询用户是否绑定公众号
+export function checkBindGzh(query) {
+  return request({
+    url: "/distribution/seller/checkBindGzh",
+    method: "get",
+    params: query,
+  });
+}
+
+// 获取appid
+export function getWxConfig(data) {
+  return request({
+    url: "/app/common/wx/config",
+    method: "get",
+    data: data,
+    noToken: true,
+  });
+}
+
+//绑定公众号
+export function OfficialLogin(data) {
+  return request({
+    url: "/distribution/seller/gzh_bind",
+    method: "post",
+    data: data,
+  });
+}
+
+// 提现
+export function withdrawal(data) {
+  return request({
+    url: "/distribution/withdrawal",
+    method: "post",
+    data: data,
+  });
+}
+
+// 提现记录
+export function getWithdrawalList(query) {
+  return request({
+    url: "/distribution/withdrawal/list",
+    method: "get",
+    params: query,
+  });
+}
+
+//登录业务员用户信息
+export function getSellerInfo(data) {
+  return request({
+    url: "/distribution/seller/getInfo",
+    method: "get",
+    data: data,
+  });
+}
+
+// 获取分享页面参数
+export function getSharePoster(query) {
+  return request({
+    url: "/app/common/distribution/sharePoster",
+    method: "get",
+    params: query,
+    headers: {
+      isToken: false,
+    },
+  });
+}

BIN
src/assets/images/ContractAmount.png


BIN
src/assets/images/NumberOfOrders.png


BIN
src/assets/images/NumberOfOrders2.png


BIN
src/assets/images/OutstandingPayment.png


BIN
src/assets/images/PaymentHasBeenReceived.png


BIN
src/assets/images/PendingOrder.png


BIN
src/assets/images/PendingRefund.png


BIN
src/assets/images/Refunded.png


BIN
src/assets/images/cbje.png


BIN
src/assets/images/ddrs.png


BIN
src/assets/images/dds.png


BIN
src/assets/images/defhead.png


BIN
src/assets/images/docx.png


BIN
src/assets/images/htje.png


BIN
src/assets/images/idcardF.png


BIN
src/assets/images/idcardZ.png


BIN
src/assets/images/left@2x.png


BIN
src/assets/images/left_slices/left@2x.png


BIN
src/assets/images/peopleImg.png


BIN
src/assets/images/sjk.png


BIN
src/assets/images/wsk.png


BIN
src/assets/images/xlsx.png


BIN
src/assets/images/yk.png


BIN
src/assets/images/ysk.png


BIN
src/assets/images/ytk.png


BIN
src/assets/images/zip.png


BIN
src/assets/model_images/model1.png


BIN
src/assets/model_images/model2.png


BIN
src/assets/model_images/model3.png


BIN
src/assets/model_images/model4.png


BIN
src/assets/model_images/示例.png


+ 1 - 1
src/assets/styles/variables.scss

@@ -36,7 +36,7 @@ $base-sub-menu-background:#000c17;
 $base-sub-menu-hover:#001528;
 */
 
-$base-sidebar-width: 200px;
+$base-sidebar-width: 220px;
 
 // the :export directive is the magic sauce for webpack
 // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass

+ 156 - 0
src/components/BaseDialog.vue

@@ -0,0 +1,156 @@
+<template>
+  <el-dialog
+    :visible.sync="visible"
+    :width="width"
+    :show-close="false"
+    :close-on-click-modal="false"
+    :append-to-body="appendToBody"
+    @closed="close"
+    :fullscreen="fullscreen"
+  >
+    <div slot="title" class="hearders">
+      <div class="leftTitle">{{ title }}</div>
+      <div class="rightBoxs">
+        <i
+          class="el-icon-full-screen full_style"
+          @click="fullscreen = !fullscreen"
+        ></i>
+        <img
+          src="@/assets/images/Close@2x.png"
+          alt=""
+          @click="visible = false"
+        />
+      </div>
+    </div>
+    <slot></slot>
+    <div slot="footer" class="dialog-footer" v-if="isShowFooter">
+      <el-button :loading="disabledBtn" @click="visible = false">{{
+        cancelName
+      }}</el-button>
+      <el-button :loading="disabledBtn" type="primary" @click="confirmBtn">{{
+        confirmName
+      }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: "BaseDialog",
+  props: {
+    title: {
+      type: String,
+      default: "",
+    },
+    isShow: {
+      type: Boolean,
+      default: false,
+    },
+    width: {
+      type: String,
+      default: "600px",
+    },
+    cancelName: {
+      type: String,
+      default: "取 消",
+    },
+    confirmName: {
+      type: String,
+      default: "确 定",
+    },
+    isShowFooter: {
+      type: Boolean,
+      default: true,
+    },
+    appendToBody: {
+      type: Boolean,
+      default: false,
+    },
+    disabledBtn: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      fullscreen: false,
+    };
+  },
+  methods: {
+    confirmBtn() {
+      this.$emit("submit", "123");
+    },
+    close() {
+      this.$emit("close");
+    },
+  },
+  computed: {
+    visible: {
+      get() {
+        return this.isShow;
+      },
+      set(val) {
+        this.$emit("update:isShow", false);
+      },
+    },
+  },
+
+  watch: {
+    visible(val) {
+      // 在此做显示与隐藏的交互
+      if (val === false) {
+        this.fullscreen = false;
+        // 重置操作
+      } else {
+        // 展示时操作
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+</style>

+ 265 - 0
src/components/Comon/batchImportDialog.vue

@@ -0,0 +1,265 @@
+<template>
+  <div>
+    <Base-dialog
+      title="导入"
+      width="660px"
+      :isShow.sync="isShow"
+      :isShowFooter="false"
+    >
+      <div>
+        <div class="swq">
+          <img
+            style="width: 182px; height: 168px"
+            src="@/assets/images/dr.png"
+            alt=""
+          />
+        </div>
+        <div style="padding-left: 100px">
+          <p>第一步:下载导入模板</p>
+          <p style="padding-left: 50px">
+            <i class="el-icon-upload"></i
+            ><span class="dowmStys" @click="getDowm">下载模板</span>
+          </p>
+          <p>第二步:(批量新增):点击“上传{{ type }}”完成导入</p>
+          <div
+            v-loading="loading"
+            element-loading-text="正在处理中"
+            style="margin: 0 0 20px 50px; width: 130px; height: 60px"
+          >
+            <label
+              v-show="!loading"
+              for="mobles"
+              class="el-button el-button--primary"
+              >上传 {{ type }}</label
+            ><input
+              style="display: none"
+              type="file"
+              id="mobles"
+              ref="input1"
+              @change="importMobleadd"
+            />
+          </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="isShow = false">取消</el-button>
+        </span>
+      </div>
+    </Base-dialog>
+    <Base-dialog
+      title="提示"
+      width="660px"
+      :isShow.sync="isShowErr"
+      :isShowFooter="false"
+    >
+      <div>
+        <div>
+          <h4 style="margin-top: 0px; font-weight: bold; text-align: center">
+            导入失败原因
+          </h4>
+          <el-input
+            readonly
+            type="textarea"
+            :autosize="{ minRows: 6, maxRows: 24 }"
+            v-model="errorData"
+          >
+          </el-input>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="isShowErr = false">确定</el-button>
+        </span>
+      </div>
+    </Base-dialog>
+  </div>
+</template>
+
+<script>
+import * as baseUrls from "@/utils/request.js";
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false,
+    },
+    temUrl: {
+      type: String,
+    },
+    apiKey: {
+      type: String,
+    },
+    checkKey: {
+      type: String,
+    },
+    newSujectApis: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    isCheck: {
+      type: Boolean,
+      default: true,
+    },
+    isShowTip: {
+      type: Boolean,
+      default: true,
+    },
+    param: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+    type: {
+      type: String,
+      default: "Excel",
+    },
+    isSuccessBack: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      loading: false,
+      errorData: [],
+      isShowErr: false,
+    };
+  },
+  methods: {
+    getDowm() {
+      let url =
+        baseUrls.BASE_IMG_URL +
+        this.temUrl +
+        `?time=${this.$methodsTools.getNewTime()}`;
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    importMobleadd(e) {
+      var file = e.target.files[0];
+      if (file === undefined) {
+        e.target.value = "";
+        return;
+      }
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      if (this.type == "Excel") {
+        if (type[0] != "xlsx" && type[0] != "xls") {
+          e.target.value = "";
+          this.$message.error("请上传excel文件,且上传格式需为:.xlsx、.xls");
+          return;
+        }
+      } else {
+        if (type[0] != "docx") {
+          e.target.value = "";
+          this.$message.error("请上传word文件,且上传格式需为:.docx");
+          return;
+        }
+      }
+      this.loading = true;
+      let formData = new FormData();
+      formData.append("file", file);
+      for (const key in this.param) {
+        formData.append(key, this.param[key]);
+      }
+      this.$api[this.apiKey](formData)
+        .then((res) => {
+          if (res.code === 200) {
+            this.isCheck && this.getFestivalList(res.data);
+            this.getErrorData(res.data || res);
+          }
+        })
+        .finally(() => {
+          e.target.value = "";
+          this.loading = false;
+        });
+    },
+    /**
+     *
+     * @param {Strings} ids 查询编码
+     * @param {Number} type 1为成功2为失败
+     * @remards 失败时也需查询是否有成功的数据导入数据库,如存在 则加列队列同时提示
+     */
+    getFestivalList({ importNo, errorLog }) {
+      this.$api[this.checkKey]({ importNo })
+        .then((res) => {
+          if (res.rows.length) {
+            errorLog &&
+              this.$message({
+                type: "success",
+                message: `成功导入${res.rows.length}条数据,`,
+                customClass: "myMessageClass",
+              });
+            this.$emit("success", res.rows);
+          }
+        })
+        .catch(() => {});
+    },
+    getErrorData(data) {
+      this.isShow = false;
+      let { errorLog } = data;
+      if (errorLog) {
+        let ary = errorLog.split("\r\n");
+        ary = ary
+          .filter((item) => {
+            return item.length > 0;
+          })
+          .reverse();
+        this.$message({
+          message: `${ary.length}条数据导入失败,请查看失败原因`,
+          customClass: "myMessageClass",
+        });
+        ary = ary.join("\r\n");
+        this.errorData = ary;
+        this.isShowErr = true;
+      } else {
+        this.isShowTip &&
+          this.$message({
+            type: "success",
+            message: `添加成功`,
+            customClass: "myMessageClass",
+          });
+      }
+      if (!errorLog || this.isSuccessBack) {
+        this.$emit("success", data);
+      }
+    },
+  },
+  computed: {
+    isShow: {
+      get() {
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+  },
+};
+</script>
+
+<style  lang="less" scoped>
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.dowmStys {
+  color: blue;
+  cursor: pointer;
+}
+/deep/.el-dialog {
+  .el-dialog__body {
+    padding: 30px 20px 0;
+  }
+  .dialog-footer {
+    height: 80px;
+    border-top: 1px solid #e2e2e2;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
+}
+</style>

+ 99 - 0
src/components/Comon/pictureList.vue

@@ -0,0 +1,99 @@
+<template>
+  <div class="dis_flex_order_li">
+    <div class="list" v-for="(item, index) in list" :key="index" @click="backFunc(item)">
+      <img :src="backFullSrc(item.img)" alt="" />
+      <div class="right">
+        <h4>
+          {{ item.label }}
+          <span
+            v-if="item.label === '盈亏' && info[item.prop] !== 0"
+            :style="info[item.prop] > 0 ? 'color:rgb(99,93,247)' : 'color:red'"
+            >【{{ info[item.prop] > 0 ? "盈" : "亏" }}】</span
+          >
+        </h4>
+        <p v-if="item.num" :style="{ color: item.color || '#000' }">
+          {{ item.value || info[item.prop] || 0 }}
+        </p>
+        <p v-else :style="{ color: item.color || '#000'  }">
+          ¥{{ (item.value || info[item.prop] || 0) | formatPrice }}
+        </p>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "SaasMasterPlatformPictureList",
+  props: {
+    list: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    info: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+    };
+  },
+
+  methods: {
+    backFunc(item){
+      this.$emit('backFunc',item)
+    },
+    backFullSrc(name) {
+      return require(`@/assets/images/${name}.png`);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.dis_flex_order_li {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  & > .list {
+    user-select: none;
+    cursor: pointer;
+    background-color: rgb(243, 249, 255);
+    padding: 4px;
+    width: 170px;
+    height: 60px;
+    border-radius: 3px;
+    display: flex;
+    align-items: center;
+    flex-shrink: 0;
+    margin-right: 10px;
+    margin-bottom: 15px;
+    & > img {
+      margin-left: 10px;
+      width: 36px;
+      height: 36px;
+    }
+    & > .right {
+      padding-top: 4px;
+      flex: 1;
+      padding-left: 4px;
+      & > h4 {
+        color: #7f7f7f;
+        margin: 0px 0px 4px 0px;
+        font-size: 14px;
+      }
+      & > p {
+        font-weight: bold;
+        font-size: 14px;
+        color: #333;
+        margin: 0;
+      }
+    }
+  }
+}
+</style>

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

@@ -73,7 +73,7 @@ export default {
         modules: {
           clipboard: {
             // 粘贴版,处理粘贴时候带图片
-            matchers: [[Node.ELEMENT_NODE, this.handleCustomMatcher]],
+            // matchers: [[Node.ELEMENT_NODE, this.handleCustomMatcher]],
           },
           // 工具栏配置
           toolbar: [
@@ -138,18 +138,21 @@ export default {
       };
       this.$api.getPolicy(datats).then((res) => {
         this.datas = res.data.resultContent;
+        console.log(res.data.resultContent.host);
         this.uploadUrl = res.data.resultContent.host;
         resolve();
       });
     }).then(() => {
       this.init();
     });
+    this.paste();
   },
   beforeDestroy() {
     this.Quill = null;
   },
   methods: {
     handleCustomMatcher(node, Delta) {
+      console.log("handleCustomMatcher", node);
       let ops = [];
       Delta.ops.forEach((op) => {
         if (op.insert && typeof op.insert === "string") {
@@ -185,6 +188,7 @@ export default {
       return Delta;
     },
     base64ToFile(base64, fileName) {
+      console.log("base64ToFile");
       return new Promise((resolve, reject) => {
         let arr = base64.split(",");
         let mime = arr[0].match(/:(.*?);/)[1];
@@ -201,6 +205,7 @@ export default {
       });
     },
     init() {
+      console.log("init");
       const editor = this.$refs.editor;
       this.Quill = new Quill(editor, this.options);
       // 如果设置了上传地址则自定义图片上传事件
@@ -253,6 +258,7 @@ export default {
       };
     },
     imageChange(param, type) {
+      console.log("imageChange");
       this.$upload
         .upload(param.file, this.uploadStatus)
         .then((res) => {
@@ -275,6 +281,29 @@ export default {
     handleUploadError() {
       this.$message.error("图片插入失败");
     },
+    paste() {
+      window.addEventListener(
+        "paste",
+        (evt) => {
+          if (
+            evt.clipboardData &&
+            evt.clipboardData.files &&
+            evt.clipboardData.files.length
+          ) {
+            evt.preventDefault();
+            [].forEach.call(evt.clipboardData.files, (file) => {
+              if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) {
+                return;
+              }
+              this.imageChange({
+                file: file,
+              });
+            });
+          }
+        },
+        false
+      );
+    },
   },
 };
 </script>

+ 302 - 0
src/components/Study/StudentInfo.vue

@@ -0,0 +1,302 @@
+<template>
+  <div class="studyInfo">
+    <header>
+      <div class="left"><i></i><span>学员信息</span></div>
+      <div class="goods_info">
+        <span v-for="(item, i) in headList" :key="i">
+          <strong>「{{ i + 1 }}」</strong>
+          <span style="padding-left: 0px">{{ item.label }}</span>
+          <!-- <span v-if="item.key != 'num' && item.key != 'time'">{{
+            userData[item.key]
+          }}</span> -->
+          <span v-if="item.key == 'officialName'">{{
+            userData[item.key]
+          }}</span>
+          <span v-else-if="item.key == 'className'">{{
+            userData[item.key]
+          }}</span>
+          <span
+            v-else-if="item.key == 'classHours'"
+            style="color: red; font-weight: bold; font-size: 18px"
+            >{{
+              (userData["finishSectionDuration"] / 60 / 45).toFixed(0)
+            }}</span
+          ><span
+            v-else-if="item.key == 'secTotalTime'"
+            style="color: red; font-weight: bold; font-size: 18px"
+            >{{ (secTotalTime / 60 / 45).toFixed(0) }}</span
+          >
+          <span v-else-if="item.key == 'num'"
+            >完成{{ userData.stuAllNum + userData.recordNum }}节的内容学习</span
+          >
+          <span v-else-if="item.key == 'classTimes'" style="padding-right: 50px"
+            >{{ $methodsTools.onlyForma(userData.classStartTime, false) }} -
+            {{ $methodsTools.onlyForma(userData.classEndTime, false) }}</span
+          >
+          <span v-else-if="item.key == 'time'"
+            >{{ $methodsTools.onlyForma(totalTimes[0]) }} -
+            {{ $methodsTools.onlyForma(totalTimes[1]) }}</span
+          ><span v-else>{{
+            userData[item.key]
+          }}</span>
+        </span>
+      </div>
+
+      <el-button class="btn" type="primary" size="mini" @click="packUp">{{
+        showBox ? "收起" : "展开"
+      }}</el-button>
+    </header>
+
+    <div class="info_img" v-show="showBox">
+      <ul>
+        <li>学员编码:{{ userData.studentCode }}</li>
+        <li>学员姓名:{{ userData.realName }}</li>
+        <li>学员身份证号码:{{ userData.idCard }}</li>
+        <!-- <li>绑定手机号码:{{ userData.telPhone }}</li> -->
+      </ul>
+      <div class="img_by">
+        <div class="photoSty1">
+          <img
+            v-if="!userData.oneInchPhotos"
+            src="@/assets/images/peopleImg.png"
+            alt=""
+          />
+          <el-image
+            v-else
+            style="width: 100%; height: 100%"
+            :src="$methodsTools.splitImgHost(userData.oneInchPhotos)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(userData.oneInchPhotos),
+            ]"
+          >
+          </el-image>
+          <div class="pos_bottom">一寸头像图</div>
+        </div>
+        <div class="photoSty2">
+          <img
+            v-if="!userData.idCardImg1"
+            src="@/assets/images/idcardF.png"
+            alt=""
+          />
+          <el-image
+            v-else
+            style="width: 100%; height: 100%"
+            :src="$methodsTools.splitImgHost(userData.idCardImg1)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(userData.idCardImg1),
+            ]"
+          >
+          </el-image>
+          <div class="pos_bottom">身份证头像照</div>
+        </div>
+        <div class="photoSty2" style="margin-right: 0px">
+          <img
+            v-if="!userData.idCardImg2"
+            src="@/assets/images/idcardZ.png"
+            alt=""
+          />
+          <el-image
+            v-else
+            style="width: 100%; height: 100%"
+            :src="$methodsTools.splitImgHost(userData.idCardImg2)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(userData.idCardImg2),
+            ]"
+          >
+          </el-image>
+          <div class="pos_bottom">身份证国徽照</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { get } from "http";
+
+export default {
+  props: {
+    userData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+    totalTime: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    numTotal: {
+      type: Number,
+      default: 0,
+    },
+    all: {
+      type: Boolean,
+      default: true,
+    },
+  },
+  data() {
+    return {
+      showBox: true,
+    };
+  },
+  methods: {
+    packUp() {
+      this.showBox = !this.showBox;
+      this.$emit("change");
+    },
+  },
+  computed: {
+    headList() {
+      let list = [
+        { label: "所在班级:", key: "className" },
+        { label: "课程总学时:", key: "secTotalTime" },
+        { label: "完成学时:", key: "classHours" },
+        // { label: "", key: "num" },
+        { label: "学习时间:", key: "time" },
+      ];
+      if (
+        !(
+          this.userData.supervise &&
+          this.userData.fullName === "考前培训施工现场专业人员七大员"
+        )
+      ) {
+        list.push({ label: "班级有效期:", key: "classTimes" });
+      }
+      if(this.userData.sevenYear){
+        list.unshift({ label: "学习年份:", key: "sevenYear" });
+      }
+      if (this.all) {
+        list.unshift({ label: "所购商品:", key: "goodsName" });
+      } else {
+        if (this.userData.fullName !== "考前培训施工现场专业人员七大员") {
+          list.splice(1, 0, { label: "班号:", key: "officialName" });
+        }
+      }
+      return list;
+    },
+    totalTimes: {
+      get() {
+        return this.totalTime;
+      },
+    },
+    secTotalTime: {
+      get() {
+        return this.numTotal;
+      },
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.studyInfo {
+  background: #ffffff;
+  box-shadow: 0px 0px 8px 0px rgba(217, 217, 217, 0.8);
+  border-radius: 8px;
+  padding: 8px 16px;
+  overflow: hidden;
+  & > header {
+    display: flex;
+    position: relative;
+    flex-wrap: wrap;
+    // height: 48px;
+    line-height: 48px;
+    & > .left {
+      display: flex;
+      align-items: center;
+      white-space: nowrap;
+      margin-right: 40px;
+      i {
+        display: inline-block;
+        width: 2px;
+        height: 18px;
+        background: #0c5dfb;
+        margin-right: 8px;
+      }
+      span {
+        color: #666;
+        font-weight: bold;
+      }
+    }
+    & > .goods_info {
+      display: flex;
+      flex-wrap: wrap;
+      span {
+        font-size: 16px;
+        padding-left: 10px;
+        white-space: nowrap;
+      }
+    }
+    .btn {
+      position: absolute;
+      right: 0;
+      top: 10px;
+    }
+  }
+  & > .info_img {
+    display: flex;
+    height: 210px;
+    ul {
+      width: 320px;
+      li {
+        margin-bottom: 12px;
+        font-size: 14px;
+      }
+    }
+    .img_by {
+      flex: 1;
+      display: flex;
+      align-items: center;
+      .pos_bottom {
+        position: absolute;
+        z-index: 1;
+        bottom: 0px;
+        width: 100%;
+        height: 32px;
+        background-color: rgba(53, 53, 53, 0.6);
+        text-align: center;
+        color: #fff;
+        font-size: 16px;
+        line-height: 32px;
+      }
+      & > .photoSty1 {
+        width: 152px;
+        height: 208px;
+        position: relative;
+        overflow: hidden;
+        border-radius: 8px;
+        background-color: #f5f5f5;
+        margin-right: 75px;
+        & > img {
+          width: 106px;
+          height: 150px;
+          margin: 29px auto 0px;
+          display: block;
+        }
+      }
+      & > .photoSty2 {
+        width: 328px;
+        height: 208px;
+        position: relative;
+        overflow: hidden;
+        border-radius: 8px;
+        background-color: #f5f5f5;
+        margin-right: 75px;
+        & > img {
+          width: 243px;
+          height: 154px;
+          margin: 27px auto 0px;
+          display: block;
+        }
+        &:last-of-type {
+          margin-right: 0px;
+        }
+      }
+    }
+  }
+}
+</style>
+>

+ 13 - 1
src/components/busIns.vue

@@ -186,12 +186,24 @@ export default {
     },
     newSujectApisTable: {
       handler(newVal, oldVal) {
-        console.log(newVal, 2);
         this.newSujectApis = newVal;
       },
       // 立即处理 进入页面就触发
       immediate: true,
     },
+    newSujectApis: {
+      handler(newVal, oldVal) {
+        if (newVal && newVal.length > 0) {
+          const finds = newVal.findIndex((item) => {
+            return item.businessName === "安管三类";
+          });
+          this.$emit("disableType", finds);
+        }else{
+          this.$emit("disableType", -1);
+        }
+      },
+      immediate: true,
+    },
   },
   created() {
     this.localData = this.$methodsTools.getBusinessList();

+ 353 - 0
src/components/goodsList/index.vue

@@ -0,0 +1,353 @@
+<template>
+  <div id="">
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="1088px"
+      :show-close="false"
+      :close-on-click-modal="false"
+      destroy-on-close
+      @closed="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">选择商品</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialogVisible = false"
+          />
+        </div>
+      </div>
+      <search-box-new
+        ref="searchBox"
+        :formData="formData"
+        :formList="formList"
+        @search="search"
+        @init="search(2)"
+        :topType="topType"
+      />
+      <el-table
+        ref="table"
+        row-key="goodsId"
+        :data="tableData"
+        v-loading="loading"
+        border
+        style="width: 100%"
+        @selection-change="selectionChange"
+      >
+        <el-table-column
+          type="selection"
+          width="55"
+          align="center"
+          reserve-selection
+          :selectable="dis_active"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          type="index"
+          :disabled="true"
+        ></el-table-column>
+        <template v-for="(item, index) in tableSet">
+          <el-table-column
+            header-align="center"
+            :align="item.align ? item.align : 'center'"
+            :prop="item.prop"
+            :label="item.label"
+            :width="item.width || ''"
+            ><template slot-scope="scope"
+              ><div v-if="item.scope === 'options'">
+                <template v-for="(itemt, indext) in item.options">
+                  <span v-if="itemt.value === scope.row[item.prop]">{{
+                    itemt.label
+                  }}</span>
+                </template>
+              </div>
+              <span v-else-if="item.scope === 'leftCh'"
+                >{{ item.ch }}{{ scope.row[item.prop] }}</span
+              >
+              <span v-else>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
+        </template>
+      </el-table>
+      <div style="margin-top: 10px; text-align: center">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="formData.pageNum"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="formData.pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+        >
+        </el-pagination>
+      </div>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitTable" :loading="disbtn"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+export default {
+  components: { searchBoxNew },
+  data() {
+    return {
+      topType: true,
+      disbtn: false,
+      dialogVisible: false,
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "schoolId",
+          placeholder: "院校",
+          scope: "schoolList",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "subjectId",
+          placeholder: "科目",
+          scope: "sujectType",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "status",
+          placeholder: "商品状态",
+          scope: "select",
+          noClear: false,
+          options: [
+            {
+              label: "全部状态",
+              value: "0,1",
+            },
+            {
+              label: "有效",
+              value: 1,
+            },
+            {
+              label: "无效",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "goodsStatus",
+          placeholder: "前台可售状态",
+          scope: "select",
+          options: [
+            {
+              label: "已上架",
+              value: 1,
+            },
+            {
+              label: "未上架",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          placeholder1: "商品有效期开始时间",
+          placeholder2: "商品有效期结束时间",
+          scope: "moreDataPicker",
+        },
+        // {
+        //   prop: "orderGoodsStatus",
+        //   placeholder: "退款状态",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已退款",
+        //       value: 1,
+        //     },
+        //     {
+        //       label: "退款中",
+        //       value: 2,
+        //     },
+        //     {
+        //       label: "拒绝退款",
+        //       value: 3,
+        //     },
+        //   ],
+        // },
+        {
+          prop: "goodsName",
+          placeholder: "请输入商品名称",
+        },
+      ],
+      formData: {
+        goodsType: "",
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "科目",
+          prop: "subjectNames",
+          hidden: true,
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: true,
+        },
+        {
+          label: "商品价格",
+          prop: "standPrice",
+          hidden: true,
+          scope: "leftCh",
+          ch: "¥",
+        },
+        {
+          label: "商品划线价",
+          prop: "linePrice",
+          hidden: true,
+          scope: "leftCh",
+          ch: "¥",
+        },
+        {
+          label: "可售状态",
+          prop: "goodsStatus",
+          hidden: true,
+          scope: "options",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "关闭",
+              value: 0,
+            },
+          ],
+        },
+      ],
+      tableData: [],
+      loading: false,
+      total: 0,
+      outActive: [], //置灰列表
+      active: [], //当前选中
+    };
+  },
+  methods: {
+    selectionChange(e) {
+      this.active = e;
+    },
+    showBox(e) {
+      if (e && e.length > 0) {
+        this.outActive = e;
+      }
+      this.search(2);
+      this.dialogVisible = true;
+    },
+    dis_active(e) {
+      return this.outActive.includes(e.goodsId) ? false : true;
+    },
+    search(int) {
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+          goodsType: "",
+          status: "0,1",
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.validityStartTime) {
+        data.validityStartTime = data.validityStartTime / 1000;
+      }
+      if (this.formData.validityEndTime) {
+        data.validityEndTime = data.validityEndTime / 1000;
+      }
+      this.loading = true;
+      this.$api
+        .inquireGoods(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    submitTable() {
+      if (this.active.length === 0) {
+        this.$message.warning("请勾选商品");
+        return;
+      }
+      this.disbtn = true;
+      const array = this.active.map((item) => {
+        return {
+          goodsId: item.goodsId,
+          goodsName: item.goodsName,
+          goodsPrice: item.standPrice,
+          profitMax: "",
+          profitType: 1,
+          profitOne: "",
+          profitTwo: "",
+          profitThree: "",
+        };
+      });
+      this.dialogVisible = false;
+      this.$emit("backGoodsList", array);
+    },
+    close() {
+      this.disbtn = false;
+      this.$refs.table.clearSelection();
+      this.outActive = [];
+      this.active = [];
+    },
+    handleSizeChange(e) {
+      this.formData.pageSize = e;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(e) {
+      this.formData.pageNum = e;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 280 - 0
src/components/modelView/index.vue

@@ -0,0 +1,280 @@
+<template>
+  <div
+    id="left"
+    class="left"
+    ref="modelView"
+    :style="IMGSHOW ? '' : 'border:none'"
+  >
+    <img
+      :style="modelData.background.css"
+      v-if="modelData.background.checked"
+      :src="$methodsTools.splitImgHost(modelData.background.name)"
+      alt=""
+      crossorigin="anonymous"
+    />
+    <!-- 标题 -->
+    <vue-draggable-resizable
+      @dragstop="onDragstop1"
+      @resizestop="onResizeStop1"
+      :w="modelData.title.width"
+      :h="modelData.title.height"
+      :x="modelData.title.left"
+      :y="modelData.title.top"
+      :parent="true"
+      v-if="modelData.title.checked"
+    >
+      <p :style="modelData.title.css">{{ modelData.title.name }}</p>
+    </vue-draggable-resizable>
+    <!-- 商品图 -->
+    <vue-draggable-resizable
+      @dragstop="onDragstop2"
+      @resizestop="onResizeStop2"
+      :w="modelData.goods.width"
+      :h="modelData.goods.height"
+      :x="modelData.goods.left"
+      :y="modelData.goods.top"
+      :parent="true"
+      v-if="modelData.goods.checked"
+      :style="
+        modelData.goods.name ? '' : 'border: 1px dotted rgba(225,225,225,.4)'
+      "
+    >
+      <img
+        crossorigin="anonymous"
+        v-if="modelData.goods.name"
+        :style="modelData.goods.css"
+        :src="$methodsTools.splitImgHost(modelData.goods.name)"
+        alt=""
+      />
+    </vue-draggable-resizable>
+    <!-- 分销码 -->
+    <vue-draggable-resizable
+      @dragstop="onDragstop3"
+      @resizestop="onResizeStop3"
+      :w="modelData.distribution.width"
+      :h="modelData.distribution.height"
+      :x="modelData.distribution.left"
+      :y="modelData.distribution.top"
+      :parent="true"
+      v-if="modelData.distribution.checked"
+      v-show="IMGSHOW"
+      style="border: 1px solid skyblue"
+      :lock-aspect-ratio="true"
+    >
+      <!-- <img
+        :style="modelData.distribution.css"
+        :src="modelData.distribution.name"
+        alt=""
+      /> -->
+    </vue-draggable-resizable>
+    <vue-draggable-resizable
+      @dragstop="onDragstop7"
+      @resizestop="onResizeStop7"
+      :w="modelData.distributionText.width"
+      :h="modelData.distributionText.height"
+      :x="modelData.distributionText.left"
+      :y="modelData.distributionText.top"
+      :parent="true"
+      v-if="modelData.distributionText.checked"
+    >
+      <p style="white-space: pre-wrap" :style="modelData.distributionText.css">
+        {{ modelData.distributionText.name }}
+      </p>
+    </vue-draggable-resizable>
+    <!-- 电子名片码 -->
+    <vue-draggable-resizable
+      @dragstop="onDragstop4"
+      @resizestop="onResizeStop4"
+      :w="modelData.cardCode.width"
+      :h="modelData.cardCode.height"
+      :x="modelData.cardCode.left"
+      :y="modelData.cardCode.top"
+      :parent="true"
+      v-if="modelData.cardCode.checked"
+      v-show="IMGSHOW"
+      style="border: 1px solid skyblue"
+      :lock-aspect-ratio="true"
+    >
+      <!-- <img
+        :style="modelData.cardCode.css"
+        :src="modelData.cardCode.name"
+        alt=""
+      /> -->
+    </vue-draggable-resizable>
+    <vue-draggable-resizable
+      @dragstop="onDragstop8"
+      @resizestop="onResizeStop8"
+      :w="modelData.cardCodeText.width"
+      :h="modelData.cardCodeText.height"
+      :x="modelData.cardCodeText.left"
+      :y="modelData.cardCodeText.top"
+      :parent="true"
+      v-if="modelData.cardCodeText.checked"
+    >
+      <p style="white-space: pre-wrap" :style="modelData.cardCodeText.css">
+        {{ modelData.cardCodeText.name }}
+      </p>
+    </vue-draggable-resizable>
+    <!-- 广告语 -->
+    <vue-draggable-resizable
+      @dragstop="onDragstop5"
+      @resizestop="onResizeStop5"
+      :w="modelData.advertise.width"
+      :h="modelData.advertise.height"
+      :x="modelData.advertise.left"
+      :y="modelData.advertise.top"
+      :parent="true"
+      v-if="modelData.advertise.checked"
+    >
+      <p style="white-space: pre-wrap" :style="modelData.advertise.css">
+        {{ modelData.advertise.name }}
+      </p>
+    </vue-draggable-resizable>
+    <!-- 机构 -->
+    <vue-draggable-resizable
+      @dragstop="onDragstop6"
+      @resizestop="onResizeStop6"
+      :w="modelData.mechanism.width"
+      :h="modelData.mechanism.height"
+      :x="modelData.mechanism.left"
+      :y="modelData.mechanism.top"
+      :parent="true"
+      v-if="modelData.mechanism.checked"
+    >
+      <p :style="modelData.mechanism.css">{{ modelData.mechanism.name }}</p>
+    </vue-draggable-resizable>
+  </div>
+</template>
+
+<script>
+import html2Canvas from "html2canvas";
+import VueDraggableResizable from "vue-draggable-resizable";
+import "vue-draggable-resizable/dist/VueDraggableResizable.css";
+export default {
+  components: { VueDraggableResizable },
+  props: {
+    modelData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      IMGSHOW: true, //截图过程先隐藏二维码窗口
+    };
+  },
+  methods: {
+    //标签转oss图片路径
+    changeFile() {
+      return new Promise((resolve, reject) => {
+        this.IMGSHOW = false;
+        this.$nextTick(() => {
+          html2Canvas(this.$refs.modelView, { useCORS: true, allowTaint: true })
+            .then((canvas) => {
+              const jpeg = canvas.toDataURL("image/jpeg", 1.0);
+              this.$upload
+                .upload(this.base64ToFile(jpeg), 0)
+                .then((res) => {
+                  resolve(res);
+                })
+                .catch(() => {
+                  reject();
+                });
+            })
+            .catch(() => {
+              reject();
+            })
+            .finally(() => {
+              this.IMGSHOW = true;
+            });
+        });
+      });
+    },
+    //格式转换
+    base64ToFile(urlData) {
+      const arr = urlData.split(",");
+      const mime = arr[0].match(/:(.*?);/)[1];
+      const bytes = atob(arr[1]);
+      let n = bytes.length;
+      const ia = new Uint8Array(n);
+      while (n--) {
+        ia[n] = bytes.charCodeAt(n);
+      }
+      return new File([ia], "jpeg", { type: mime });
+    },
+    onDragstop1(left, top) {
+      this.backData("title", left, top);
+    },
+    onResizeStop1(left, top, width, height) {
+      this.backData("title", left, top, width, height);
+    },
+    onDragstop2(left, top) {
+      this.backData("goods", left, top);
+    },
+    onResizeStop2(left, top, width, height) {
+      this.backData("goods", left, top, width, height);
+    },
+    onDragstop3(left, top) {
+      this.backData("distribution", left, top);
+    },
+    onResizeStop3(left, top, width, height) {
+      this.backData("distribution", left, top, width, height);
+    },
+    onDragstop4(left, top) {
+      this.backData("cardCode", left, top);
+    },
+    onResizeStop4(left, top, width, height) {
+      this.backData("cardCode", left, top, width, height);
+    },
+    onDragstop5(left, top) {
+      this.backData("advertise", left, top);
+    },
+    onResizeStop5(left, top, width, height) {
+      this.backData("advertise", left, top, width, height);
+    },
+    onDragstop6(left, top) {
+      this.backData("mechanism", left, top);
+    },
+    onResizeStop6(left, top, width, height) {
+      this.backData("mechanism", left, top, width, height);
+    },
+    onDragstop7(left, top) {
+      this.backData("distributionText", left, top);
+    },
+    onResizeStop7(left, top, width, height) {
+      this.backData("distributionText", left, top, width, height);
+    },
+    onDragstop8(left, top) {
+      this.backData("cardCodeText", left, top);
+    },
+    onResizeStop8(left, top, width, height) {
+      this.backData("cardCodeText", left, top, width, height);
+    },
+
+    backData(name, left, top, width, height) {
+      this.$emit("changeModelData", { name, left, top, width, height });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+#left {
+  position: relative;
+  width: 375px;
+  height: 667px;
+  border: 1px solid #333;
+  margin-right: 20px;
+  flex-shrink: 0;
+  box-sizing: content-box;
+  overflow: hidden;
+}
+.vdr {
+  border-color: transparent;
+}
+.active {
+  border: 1px dashed #000;
+}
+</style>

+ 24 - 12
src/components/questionBank.vue

@@ -23,11 +23,15 @@
       <el-col :span="20" class="contentMore">
         <div class="marg_play">
           <span class="spans">题目类型:</span>
-          <el-radio-group v-model="dingForm.type" @change="changeTypes">
+          <el-radio-group
+            v-model="dingForm.type"
+            @change="changeTypes"
+            :disabled="noStudent"
+          >
             <el-radio
-              :disabled="statusPop === 2 || statusPop === 0"
               v-for="(item, index) in radioArrays"
               :key="index"
+              :disabled="computedDisabled(item)"
               :label="item.value"
               >{{ item.label }}</el-radio
             >
@@ -75,9 +79,7 @@
         </div> -->
         <div
           class="marg_play"
-          v-if="
-            dingForm.type === 1 || dingForm.type === 2
-          "
+          v-if="dingForm.type === 1 || dingForm.type === 2"
         >
           <span class="spans"
             ><span style="color: red" v-if="dingForm.type !== 5">* </span
@@ -199,7 +201,7 @@
                     v-for="(tng, nindex) in radioArray"
                     :key="nindex"
                     :label="tng.value"
-                    :disabled="statusPop === 2"
+                    :disabled="computedDisabled(tng)"
                     >{{ tng.label }}</el-radio
                   >
                 </el-radio-group>
@@ -245,10 +247,7 @@
                   </p>
                 </div>
               </div> -->
-              <div
-                class="marg_play"
-                v-if="ans.type === 1 || ans.type === 2"
-              >
+              <div class="marg_play" v-if="ans.type === 1 || ans.type === 2">
                 <span class="spans"
                   ><span style="color: red" v-if="ans.type !== 5">* </span
                   >选项:</span
@@ -487,7 +486,7 @@ import Editor from "@/components/Editor";
 export default {
   components: { Editor },
   name: "questionBank",
-  props: ["nums", "dingFormInfo"],
+  props: ["nums", "dingFormInfo", "disableTypeStatus", "noStudent"],
   data() {
     return {
       dingForm: {},
@@ -548,13 +547,26 @@ export default {
   watch: {
     dingFormInfo: {
       handler(newVal, oldVal) {
-        console.log(newVal)
+        console.log(newVal);
         this.dingForm = newVal;
       },
       // 立即处理 进入页面就触发
       immediate: true,
     },
   },
+  computed: {
+    computedDisabled: function () {
+      return function (item) {
+        if (this.statusPop === 2 || this.statusPop === 0) {
+          return true;
+        } else if (this.disableTypeStatus && item.value === 5) {
+          return true;
+        } else {
+          return false;
+        }
+      };
+    },
+  },
   methods: {
     changeTypes(int) {
       var data = {

+ 194 - 0
src/components/salesmanInfo/index.vue

@@ -0,0 +1,194 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="1000px"
+      :isShow.sync="isShow"
+      title="业务员分销订单"
+      @close="close"
+      @submit="submit"
+      :isShowFooter="false"
+    >
+      <template>
+        <table-list
+          rowKey="orderGoodsId"
+          ref="tableList"
+          :tableSets="tableSet"
+          :tableData="tableData"
+          :navText="navText"
+          :loading="loading"
+        >
+          <template slot="btn" slot-scope="props">
+            <el-button type="text" @click="editClick(props.scope.row)"
+              >详情</el-button
+            >
+          </template>
+        </table-list>
+        <pagination
+          :total="total"
+          :pageSize="formData.pageSize"
+          :currentPage="formData.pageNum"
+          @handleSizeChange="handleSizeChange"
+          @handleCurrentChange="handleCurrentChange"
+        />
+      </template>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  components: { tableList, pagination },
+  data() {
+    return {
+      isShow: false,
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        tableHide: true,
+        title: "业务员分销订单",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: true,
+        openCheckMore: true,
+        changeWidth: "100px",
+        backFatherBtn: {
+          status: false,
+          title: "配置下单填选模板",
+        },
+      },
+      tableSet: [
+        {
+          label: "订单号",
+          prop: "orderSn",
+          width: "180",
+          hidden: true,
+        },
+        {
+          label: "订单金额",
+          prop: "orderPrice",
+          hidden: true,
+        },
+        {
+          label: "订单时间",
+          prop: "orderTime",
+          scope: "aTimeList",
+          width: "160",
+          hidden: true,
+        },
+        {
+          label: "所属活动",
+          prop: "distributionName",
+          width: "180",
+          hidden: true,
+        },
+        {
+          label: "下单人",
+          prop: "orderUserName",
+          hidden: true,
+        },
+        {
+          label: "佣金类型",
+          prop: "cashType",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "百分比",
+              value: 1,
+            },
+            {
+              label: "固定金额",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "佣金比例",
+          prop: "cashRatio",
+          hidden: true,
+          scope:"cashRatio"
+        },
+        {
+          label: "佣金金额(元)",
+          prop: "cash",
+          hidden: true,
+        },
+        {
+          label: "佣金结算时间",
+          prop: "cashTime",
+          hidden: true,
+          scope: "aTimeList",
+          width: "160",
+        },
+        {
+          label: "佣金状态",
+          prop: "cashStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "冻结",
+              value: 1,
+            },
+            {
+              label: "正常",
+              value: 2,
+            },
+            {
+              label: "退款",
+              value: 3,
+            },
+          ],
+        },
+      ],
+      tableData: [],
+      formData: {
+        sellerId: "",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      total: 0,
+    };
+  },
+  methods: {
+    showBox(id) {
+      this.formData.sellerId = id;
+      this.search(2);
+      this.isShow = true;
+    },
+    search(e) {
+      this.loading = true;
+      if (e === 2) {
+        this.formData.pageSiz = 10;
+        this.formData.pageNum = 1;
+      }
+      this.$api
+        .distributionactivitysellerorder(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    close() {},
+    submit() {},
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 95 - 39
src/components/searchBoxNew.vue

@@ -91,11 +91,16 @@
       <div
         class="fon_s"
         style="padding-top: 10px; width: 70px; text-align: end"
-        v-else
+        v-else-if="!remarkStatus"
       >
         筛选:
       </div>
-      <el-form :inline="true" :model="formData" class="tsxnz demo-form-inline">
+      <el-form
+        @submit.native.prevent="() => {}"
+        :inline="true"
+        :model="formData"
+        class="tsxnz demo-form-inline"
+      >
         <el-form-item
           v-for="(item, index) in formListComput(formList)"
           :key="index"
@@ -111,6 +116,10 @@
           >
             <el-option
               v-for="(items, indexs) in educationType"
+              v-show="
+                !item.filter ||
+                (item.filter && items.educationName === '继续教育')
+              "
               :key="indexs"
               :label="items.educationName"
               :value="items.id"
@@ -141,6 +150,13 @@
             <el-option
               v-for="(items, indexs) in newBusinessLevel"
               :key="indexs"
+              v-show="
+                !item.filter ||
+                (item.filter &&
+                  (items.projectName === '造价师' ||
+                    items.projectName === '建造师') &&
+                  items.businessName === '二级')
+              "
               :label="items.projectName + '-' + items.businessName"
               :value="items.id"
             ></el-option>
@@ -159,6 +175,20 @@
               :value="items.id"
             ></el-option>
           </el-select>
+          <el-select
+            v-else-if="item.scope === 'distributionList'"
+            clearable
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in distributionList"
+              :key="indexs"
+              :label="items.name"
+              :value="items.distributionId"
+            ></el-option>
+          </el-select>
 
           <!-- 专业-根据教育类型筛选 -->
           <el-select
@@ -346,29 +376,39 @@
             ></el-option>
           </el-select>
           <div v-else-if="item.scope === 'numList'">
-            <el-input-number
-              :controls="false"
+            <el-select
+              clearable
+              filterable
+              style="width: 120px"
               v-model="formData[item.prop1]"
-              controls-position="right"
-              :min="0"
-              :max="100"
-              :size="size"
-              @change="
-                handleChanges(formData[item.prop1], formData[item.prop2])
-              "
-            ></el-input-number
-            >~
-            <el-input-number
-              :controls="false"
+              :placeholder="item.placeholder1"
+            >
+              <el-option
+                v-for="(items, index) in 101"
+                :key="index"
+                :label="index"
+                :value="index"
+                :disabled="comNum(index, formData[item.prop2], true)"
+              >
+              </el-option>
+            </el-select>
+            -
+            <el-select
+              clearable
+              filterable
+              style="width: 120px"
               v-model="formData[item.prop2]"
-              controls-position="right"
-              :min="0"
-              :max="100"
-              :size="size"
-              @change="
-                handleChanges(formData[item.prop1], formData[item.prop2])
-              "
-            ></el-input-number>
+              :placeholder="item.placeholder2"
+            >
+              <el-option
+                v-for="(items, index) in 101"
+                :key="index"
+                :label="index"
+                :value="index"
+                :disabled="comNum(index, formData[item.prop1])"
+              >
+              </el-option>
+            </el-select>
           </div>
           <el-input-number
             v-else-if="item.scope === 'inputNumber'"
@@ -431,7 +471,7 @@
             v-model="formData[item.prop]"
             type="datetime"
             :size="size"
-            placeholder="选择日期时间"
+            :placeholder="item.placeholder"
             value-format="timestamp"
           >
           </el-date-picker>
@@ -456,13 +496,15 @@
             >
             </el-date-picker>
           </div>
+          <slot v-else-if="item.scope === 'slot'" :name="item.slotName"></slot>
           <el-input
             :style="item.prop === 'searchKey' ? 'width:260px;' : ''"
             v-else-if="!item.scope"
             clearable
-            v-model="formData[item.prop]"
+            v-model.trim="formData[item.prop]"
             :placeholder="item.placeholder"
             :size="size"
+            @keyup.enter.native="search"
           ></el-input>
         </el-form-item>
         <el-form-item>
@@ -499,6 +541,7 @@ export default {
     "advanced",
     "advancedName",
     "classStatus",
+    "remarkStatus"
   ], //参考文档 component.md
   data() {
     return {
@@ -548,6 +591,14 @@ export default {
           label: "复审",
           value: "1,2",
         },
+        {
+          label: "不通过",
+          value: "-1,-2",
+        },
+        {
+          label: "已通过",
+          value: 3,
+        },
       ],
       lists5: [
         {
@@ -678,7 +729,25 @@ export default {
       "beforeLists",
       "applySiteAddress",
       "certificate",
+      "distributionList",
     ]),
+    comNum: function () {
+      return function (index, num, status) {
+        if (status) {
+          if (index > num) {
+            return true;
+          } else {
+            return false;
+          }
+        } else {
+          if (index < num) {
+            return true;
+          } else {
+            return false;
+          }
+        }
+      };
+    },
     /**
      * @remarks 过滤选择器列表
      */
@@ -882,19 +951,6 @@ export default {
     init() {
       this.$emit("init");
     },
-    /**
-     *
-     * @param {int} int1
-     * @param {int} int2
-     * @remark 数值取值范围选择器
-     */
-    handleChanges(int1, int2) {
-      if (int1 !== undefined && int2 !== undefined) {
-        if (int1 > int2) {
-          this.$message.error("请规范输入取值范围");
-        }
-      }
-    },
     /**
      *
      * @param {int} id
@@ -1014,4 +1070,4 @@ export default {
     margin-bottom: 0px;
   }
 }
-</style>
+</style>

+ 300 - 0
src/components/subjectCy/index.vue

@@ -0,0 +1,300 @@
+<template>
+  <div id="">
+    <el-cascader
+      :disabled="disabled"
+      v-model="value"
+      placeholder="请选择业务层次"
+      :options="options(educationType, businessLevel)"
+      :props="{ label: 'name', value: 'id', emitPath: false }"
+      @change="handleChange"
+    ></el-cascader>
+    <el-popover
+      v-if="value"
+      ref="popovers"
+      placement="bottom"
+      trigger="click"
+      :disabled="disabled"
+    >
+      <ul class="checkboxSty">
+        <li
+          class="li_sty"
+          v-for="(item, index) in nowSujectArray"
+          :key="index"
+          @click="activeSubject(item)"
+        >
+          <div class="i_box">
+            <i
+              :class="
+                activeArray.findIndex((i) => i.onlyId == item.onlyId) !== -1
+                  ? 'suc'
+                  : null
+              "
+            ></i>
+          </div>
+          <span>{{ item.subjectName }}</span>
+        </li>
+      </ul>
+      <el-button slot="reference" style="margin-left: 12px"
+        >请选择科目</el-button
+      >
+    </el-popover>
+    <div style="margin-top: 10px">
+      <div :class="changeHeight ? 'ach' : 'clh'">
+        <div
+          v-for="(item, index) in activeArray"
+          :key="index"
+          class="listBoxStys"
+        >
+          {{
+            item.educationName +
+            " - " +
+            item.projectName +
+            " - " +
+            item.businessName +
+            " - " +
+            item.subjectName
+          }}
+          <i
+            v-if="!disabled"
+            class="el-icon-error closeIcons"
+            @click="activeArray.splice(index, 1)"
+          ></i>
+        </div>
+      </div>
+      <el-popover placement="bottom-start" trigger="hover" :close-delay="50">
+        <ul style="margin: 0; max-width: 600px">
+          <li
+            class="copyDataLi"
+            :class="changeSty(itemT)"
+            v-for="(itemT, indexT) in localData"
+            :key="indexT"
+            @click="unTime(itemT)"
+          >
+            {{
+              `${itemT.educationName}-${itemT.projectName}-${itemT.businessName}-${itemT.subjectName}`
+            }}
+          </li>
+        </ul>
+        <el-button
+          v-show="localData.length && !disabled"
+          type="danger"
+          slot="reference"
+          size="mini"
+          style="margin-right: 10px"
+          >最近选择</el-button
+        >
+      </el-popover>
+      <el-button
+        size="mini"
+        v-if="activeArray.length > 1"
+        @click="changeHeight = !changeHeight"
+        >{{ changeHeight ? "展开" : "关闭" }}</el-button
+      ><el-button
+        size="mini"
+        v-if="activeArray.length > 0 && !disabled"
+        @click="activeArray = []"
+        >清空</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  props: {
+    activeArray: {
+      type: String,
+      default: () => {
+        return [];
+      },
+    },
+    disabled: {
+      type: Boolean,
+      default: () => {
+        return false;
+      },
+    },
+  },
+  data() {
+    return {
+      value: "",
+      changeHeight: true,
+      localData: [],
+      nowSujectArray: [], //当前科目列表
+    };
+  },
+  watch: {
+    activeArray(newVal, oldVal) {
+      this.$emit("update:activeArray", newVal);
+    },
+  },
+  computed: {
+    ...mapGetters(["educationType", "businessLevel", "sujectType"]),
+    options: function () {
+      return function (item1, item2) {
+        if (!item1 || !item2) {
+          return [];
+        } else {
+          let ary = item1.map((i) => {
+            return {
+              id: i.id + "",
+              name: i.educationName,
+              children: [],
+            };
+          });
+          item2.forEach((i) => {
+            for (let k = 0; k < ary.length; k++) {
+              if (ary[k].id == i.educationId) {
+                ary[k].children.push({
+                  id: `${i.educationId}-${i.projectId}-${i.id}`,
+                  name: `${i.projectName} / ${i.businessName}`,
+                });
+                break;
+              }
+            }
+          });
+          return ary;
+        }
+      };
+    },
+  },
+  mounted() {
+    console.log(this.sujectType);
+    let ary = this.$methodsTools.getBusinessList();
+    this.localData = ary.map((i) => {
+      return {
+        ...i,
+        onlyId: `${i.educationTypeId}-${i.projectId}-${i.businessId}-${i.subjectId}`,
+      };
+    });
+  },
+  methods: {
+    activeSubject(item) {
+      const index = this.activeArray.findIndex((i) => i.onlyId == item.onlyId);
+      if (index !== -1) {
+        this.activeArray.splice(index, 1);
+      } else {
+        const ary = {
+          businessId: item.businessId,
+          businessName: item.businessName,
+          educationTypeId: item.educationId,
+          educationName: item.educationName,
+          projectId: item.projectId,
+          projectName: item.projectName,
+          subjectId: item.id,
+          subjectName: item.subjectName,
+          onlyId: item.onlyId,
+        };
+        this.activeArray.push(ary);
+      }
+    },
+    unTime(val) {
+      let str = `${val.educationTypeId}-${val.projectId}-${val.businessId}-${val.subjectId}`;
+      const index = this.activeArray.findIndex((i) => i.onlyId == str);
+      if (index !== -1) {
+        this.activeArray.splice(index, 1);
+      } else {
+        this.activeArray.push(val);
+      }
+    },
+    changeSty(val) {
+      let str = `${val.educationTypeId}-${val.projectId}-${val.businessId}-${val.subjectId}`;
+      if (this.activeArray.findIndex((i) => i.onlyId == str) !== -1) {
+        return "activeStyIcons";
+      } else {
+        return null;
+      }
+    },
+    handleChange(e) {
+      let array = this.computedSujectType(e);
+      array.forEach((i) => {
+        let busId = i.onlyId.split("-")[2];
+        let busItem = this.businessLevel.find((k) => k.id == busId);
+        i.businessId = busItem.id;
+        i.businessName = busItem.businessName;
+        i.projectId = busItem.projectId;
+        i.projectName = busItem.projectName;
+        i.educationId = busItem.educationId;
+        i.educationName = busItem.educationName;
+      });
+      this.nowSujectArray = array;
+    },
+    computedSujectType(value) {
+      if (!value || !this.sujectType) {
+        return [];
+      } else {
+        let proId = value.split("-")[1];
+        let ary = this.sujectType.filter((i) => {
+          if (i.courseProjectTypes.findIndex((k) => k.id == proId) !== -1) {
+            i.onlyId = value + "-" + i.id;
+            return i;
+          }
+        });
+        return ary;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.checkboxSty {
+  max-height: 210px;
+  overflow: auto;
+  display: flex;
+  flex-direction: column;
+}
+.listBoxStys {
+  user-select: none;
+  flex-shrink: 0;
+  padding: 0px 10px;
+  border-radius: 8px;
+  border: 1px solid #eee;
+  margin-right: 10px;
+  margin-bottom: 6px;
+  font-size: 14px;
+  height: 38px;
+  line-height: 38px;
+}
+.closeIcons {
+  color: red;
+  cursor: pointer;
+  margin-left: 6px;
+}
+.ach {
+  display: flex;
+  align-items: center;
+  overflow: hidden;
+}
+.clh {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+.li_sty {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  user-select: none;
+  .i_box {
+    border: 1px solid #eee;
+    width: 14px;
+    height: 14px;
+    margin-right: 6px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 50%;
+    & > .suc {
+      border-radius: 50%;
+      background-color: #409eff;
+      width: 8px;
+      height: 8px;
+    }
+  }
+}
+.copyDataLi {
+  user-select: none;
+}
+</style>

+ 263 - 241
src/components/tableList.vue

@@ -1,8 +1,8 @@
 <template>
   <div id="tableList">
-    <div class="headerNavTool">
+    <div class="headerNavTool" v-if="navText.headShow !== false">
       <div class="leftIndexText">
-        {{ navText.title }} <strong>{{ navText.index }}</strong>
+        {{ navText.title }} <strong>{{ navIndex || navText.index }}</strong>
         {{ navText.ch }}
       </div>
       <div class="rightBtnBox">
@@ -65,7 +65,11 @@
               </div>
             </el-checkbox-group>
           </div>
-          <el-button style="margin-left: 10px" size="medium" slot="reference"
+          <el-button
+            v-if="navText.custom !== false"
+            style="margin-left: 10px"
+            size="medium"
+            slot="reference"
             >自定义列</el-button
           >
         </el-popover>
@@ -73,6 +77,7 @@
     </div>
     <el-table
       :data="tableData"
+      :span-method="objectSpanMethod"
       stripe
       style="width: 100%"
       @select-all="selectAll"
@@ -91,6 +96,23 @@
       }"
       :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
     >
+      <el-table-column
+        v-if="navText.choiceRadio"
+        align="center"
+        type="selection"
+        :fixed="navText.radioFixed"
+        width="55"
+      >
+        <template slot-scope="scope">
+          <el-radio
+            style="margin-left: 10px"
+            v-model="tableRadio"
+            :label="scope.row[navText.radioKey]"
+            @change="radioChange"
+            >{{ "" }}</el-radio
+          >
+        </template>
+      </el-table-column>
       <el-table-column
         v-if="navText.choice"
         :reserve-selection="navText.openCheckMore"
@@ -99,6 +121,7 @@
         width="55"
         header-align="center"
         fixed="left"
+        :selectable="navText.selectableStatus ? navText.selectableFunc : null"
       >
       </el-table-column>
       <!-- v-if="navText.num" ↓ -->
@@ -154,15 +177,28 @@
               @change="blurBackData(scope.row)"
             ></el-input-number>
           </div>
-          <span v-else-if="item.scope === 'status'">{{
-            Number(scope.row[item.prop]) === 1
-              ? "启用"
-              : Number(scope.row[item.prop]) === 0
-              ? "关闭"
-              : Number(scope.row[item.prop]) === -1
-              ? "已删除"
-              : "未知"
-          }}</span>
+          <template
+            v-else-if="
+              item.scope === 'copyTime' && scope.row[item.prop] != null
+            "
+          >
+            <div v-for="(item, index) in scope.row['copyTime']" :key="index">
+              <span>{{ item }}</span>
+            </div>
+          </template>
+
+          <span
+            v-else-if="item.scope === 'status' && scope.row[item.prop] != null"
+            >{{
+              Number(scope.row[item.prop]) === 1
+                ? "启用"
+                : Number(scope.row[item.prop]) === 0
+                ? "关闭"
+                : Number(scope.row[item.prop]) === -1
+                ? "已删除"
+                : "未知"
+            }}</span
+          >
           <span v-else-if="item.scope === 'hasTime'">{{
             Number(scope.row[item.prop]) === 1
               ? "有效"
@@ -170,24 +206,9 @@
               ? "无效"
               : "未知"
           }}</span>
-          <span v-else-if="item.scope === 'statusZpFB'">{{
-            Number(scope.row[item.prop]) === 1
-              ? "未发布"
-              : Number(scope.row[item.prop]) === 2
-              ? "已发布"
-              : Number(scope.row[item.prop]) === 0
-              ? "停用"
-              : Number(scope.row[item.prop]) === -1
-              ? "已删除"
-              : "未知"
-          }}</span>
-          <span v-else-if="item.scope === 'reStatus'">{{
-            Number(scope.row[item.prop]) === 1
-              ? "定时发布"
-              : Number(scope.row[item.prop]) === 0
-              ? "手动发布"
-              : "未知"
-          }}</span>
+          <div v-else-if="item.scope === 'slot'">
+            <slot :name="item.slotName" :scope="scope"></slot>
+          </div>
           <span v-else-if="item.scope === 'fabStatus'">{{
             Number(scope.row[item.prop]) === 1
               ? "发布"
@@ -227,6 +248,17 @@
             >
             <span v-else>{{ scope.row[item.prop] }}</span>
           </div>
+          <span v-else-if="item.scope == 'formatPrice'">
+            ¥{{ scope.row[item.prop] | formatPrice }}
+          </span>
+          <ul v-else-if="item.scope === 'baseInfo'">
+            <li>姓名:{{ scope.row[item.prop1] }}</li>
+            <li>身份证:{{ scope.row[item.prop2] }}</li>
+            <li>公司:{{ scope.row[item.prop3] }}</li>
+          </ul>
+          <span v-else-if="item.scope === 'recordEndTime'">
+            {{ scope.row[item.prop] ? "完成" : "未完成" }}
+          </span>
           <span
             v-else-if="
               item.scope === 'treeWatch' &&
@@ -256,6 +288,13 @@
                 : scope.row[item.prop].split(",").map(Number).length
             }}
           </span>
+          <span
+            v-else-if="item.scope === 'aboutSpec'"
+            style="color: blue; cursor: pointer"
+            @click="openSpec(scope.row['goodsId'])"
+          >
+            {{ scope.row[item.prop] ? "已关联" : "未关联" }}
+          </span>
           <span
             v-else-if="item.scope === 'aboutClassNum'"
             style="color: blue; cursor: pointer"
@@ -291,13 +330,6 @@
               ? scope.row[item.prop2]
               : scope.row[item.prop1]
           }}</span>
-          <span v-else-if="item.scope === 'ggType'">{{
-            Number(scope.row[item.prop]) === 1
-              ? "学习中心"
-              : Number(scope.row[item.prop]) === 2
-              ? "求职中心"
-              : "未知"
-          }}</span>
           <ul v-else-if="item.scope === 'mapTypesTeacher'" class="ulAuto">
             <template v-for="(itm, inds) in scope.row[item.prop]">
               <li :key="inds" v-if="inds < 2">
@@ -578,39 +610,9 @@
               >
             </el-popover>
           </ul>
-          <span v-else-if="item.scope === 'statusRe'">{{
-            Number(scope.row[item.prop]) === 0
-              ? "已删除"
-              : Number(scope.row[item.prop]) === 1 &&
-                Number(scope.row["reStatus"]) === 1
-              ? "待发布"
-              : Number(scope.row[item.prop]) === 1 &&
-                Number(scope.row["reStatus"]) === 0
-              ? "未发布"
-              : Number(scope.row[item.prop]) === 2
-              ? "已撤回"
-              : Number(scope.row[item.prop]) === 3
-              ? "已发布"
-              : Number(scope.row[item.prop]) === 4
-              ? "已到期"
-              : "未知"
-          }}</span>
           <div v-else-if="item.scope === 'htmlInfo'">
             <bankMsg ref="bankMsg" :bankMsg="scope.row" />
           </div>
-          <span v-else-if="item.scope === 'TimeVoBtn'">
-            <el-popover :key="Math.random()" placement="left" trigger="click">
-              <div
-                v-for="(items, indexs) in scope.row[item.prop]"
-                :key="indexs"
-                style="margin-bottom: 6px"
-              >
-                {{ $methodsTools.onlyForma(items.startTime) }} ~
-                {{ $methodsTools.onlyForma(items.endTime) }}
-              </div>
-              <el-button slot="reference" size="mini">查看</el-button>
-            </el-popover>
-          </span>
           <div v-else-if="item.scope === 'subTime'">
             <span style="margin-right: 6px">{{
               $methodsTools.onlyForma(scope.row[item.prop1], false)
@@ -660,64 +662,43 @@
             </a>
             <div>{{ scope.row[item.prop][item.prop2] }}</div>
           </div>
-          <span v-else-if="item.scope === 'Salary'">
-            {{ scope.row[item.prop1] === 1 ? "月薪" : "年薪" }}
-            {{
-              scope.row[item.prop2] === scope.row[item.prop3]
-                ? scope.row[item.prop2]
-                : scope.row[item.prop2] + "~" + scope.row[item.prop3]
-            }}
-          </span>
+          <template v-else-if="item.scope === 'courseAbout'">
+            <div v-for="(item, index) in scope.row[item.prop]" :key="index">
+              {{ item.courseName }} ({{ item.aliasName }})
+            </div>
+          </template>
           <div v-else-if="item.scope === 'changAdress'">
-            <div>{{ scope.row[item.prop1] }}</div>
+            <div>地点:{{ scope.row[item.prop1] }}</div>
             <div>
-              {{ $methodsTools.onlyForma(scope.row[item.prop2], false) }}
+              时间:{{ $methodsTools.onlyForma(scope.row[item.prop2], false) }}
+              <span
+                >{{ scope.row[item.prop3] }}-{{ scope.row[item.prop4] }}</span
+              >
+            </div>
+            <div>准考证号:{{ scope.row[item.prop5] }}</div>
+            <div>座位号:{{ scope.row[item.prop6] }}</div>
+            <div>
+              同步到考场状态:{{
+                scope.row[item.prop7] === 0
+                  ? "未同步"
+                  : scope.row[item.prop7] === 1
+                  ? "成功"
+                  : scope.row[item.prop7] === 2
+                  ? "失败"
+                  : ""
+              }}
+              <!-- <el-button v-if="scope.row[item.prop7] === 2" type="text">原因</el-button> -->
+            </div>
+          </div>
+          <div v-else-if="item.scope === 'changAdressKP'">
+            <div>地点:{{ scope.row[item.prop1] }}</div>
+            <div>
+              时间:{{ $methodsTools.onlyForma(scope.row[item.prop2], false) }}
               <span
                 >{{ scope.row[item.prop3] }}-{{ scope.row[item.prop4] }}</span
               >
             </div>
           </div>
-          <span v-else-if="item.scope === 'activityType'">{{
-            Number(scope.row[item.prop]) === 0
-              ? "优惠券"
-              : Number(scope.row[item.prop]) === 1
-              ? "折扣券"
-              : Number(scope.row[item.prop]) === 2
-              ? "线上直播"
-              : Number(scope.row[item.prop]) === 3
-              ? "定价"
-              : Number(scope.row[item.prop]) === 4
-              ? "优惠"
-              : Number(scope.row[item.prop]) === 5
-              ? "折扣"
-              : Number(scope.row[item.prop]) === 6
-              ? "线下活动"
-              : "未知"
-          }}</span>
-          <span v-else-if="item.scope === 'activityRemarks'">{{
-            Number(scope.row[item.prop]) === 0
-              ? "金额:¥" + scope.row["price"]
-              : Number(scope.row[item.prop]) === 1
-              ? "折扣:" + scope.row["price"] + "折"
-              : Number(scope.row[item.prop]) === 2
-              ? "直播内容:" + scope.row["liveContent"]
-              : Number(scope.row[item.prop]) === 3
-              ? "商品金额:¥" + scope.row["price"]
-              : Number(scope.row[item.prop]) === 4
-              ? "优惠金额:¥" + scope.row["price"]
-              : Number(scope.row[item.prop]) === 5
-              ? "商品折扣:" + scope.row["price"] + "折"
-              : Number(scope.row[item.prop]) === 6
-              ? "活动地点:" + scope.row["liveAdress"]
-              : "未知"
-          }}</span>
-          <span v-else-if="item.scope === 'isUrgent'">{{
-            scope.row[item.prop] === 0
-              ? "不是"
-              : scope.row[item.prop] === 1
-              ? "是"
-              : "未知"
-          }}</span>
           <span v-else-if="item.scope === 'convert'">{{
             $methodsTools.secondToDate(scope.row[item.prop], false)
           }}</span>
@@ -763,9 +744,6 @@
                 : "待审核"
             }}
           </div>
-          <span v-else-if="item.scope === 'peopleNum'">{{
-            scope.row[item.prop] === 0 ? "不限制" : scope.row[item.prop]
-          }}</span>
           <span v-else-if="item.scope === 'address'"
             >{{
               scope.row[item.prop1] +
@@ -773,19 +751,6 @@
               scope.row[item.prop3]
             }}{{ scope.row[item.prop4] ? scope.row[item.prop4] : "" }}</span
           >
-          <span v-else-if="item.scope === 'statusActivity'">{{
-            Number(scope.row[item.prop]) === 0
-              ? "已删除"
-              : Number(scope.row[item.prop]) === 1
-              ? "已结束"
-              : Number(scope.row[item.prop]) === 2
-              ? "已撤回"
-              : Number(scope.row[item.prop]) === 3
-              ? "已开始"
-              : Number(scope.row[item.prop]) === 4
-              ? "未开始"
-              : "未知"
-          }}</span>
           <span v-else-if="item.scope === 'sex'">
             {{
               scope.row[item.prop] == 1
@@ -795,17 +760,6 @@
                 : "未知"
             }}
           </span>
-          <span v-else-if="item.scope === 'statusFB'">{{
-            scope.row[item.prop] === 0
-              ? "删除"
-              : scope.row[item.prop] === 1
-              ? "发布"
-              : scope.row[item.prop] === 2
-              ? "撤回"
-              : scope.row[item.prop] === 3
-              ? "未发布"
-              : "未知"
-          }}</span>
           <span v-else-if="item.scope === 'typeStatus'">{{
             scope.row[item.prop] === 0
               ? "报名指引"
@@ -824,43 +778,6 @@
               ? "真题试卷"
               : "未知"
           }}</span>
-          <span v-else-if="item.scope === 'taskType'">{{
-            scope.row[item.prop] === 0
-              ? "每日签到"
-              : scope.row[item.prop] === 1
-              ? "完善信息"
-              : scope.row[item.prop] === 2
-              ? "邀请好友"
-              : scope.row[item.prop] === 3
-              ? "每日分享"
-              : scope.row[item.prop] === 4
-              ? "视频学习"
-              : scope.row[item.prop] === 5
-              ? "模拟考试"
-              : "未知"
-          }}</span>
-          <span v-else-if="item.scope === 'releaseType'">{{
-            scope.row[item.prop] === 0
-              ? "手动发布"
-              : scope.row[item.prop] === 1
-              ? "定时发布"
-              : "未知"
-          }}</span>
-          <span v-else-if="item.scope === 'releaseStatus'">{{
-            scope.row[item.prop] === 0
-              ? "删除"
-              : scope.row[item.prop] === 1
-              ? "待发布"
-              : scope.row[item.prop] === 2
-              ? "撤回"
-              : scope.row[item.prop] === 3
-              ? "发布成功"
-              : scope.row[item.prop] === 4
-              ? "未发布"
-              : scope.row[item.prop] === 5
-              ? "已结束"
-              : "未知"
-          }}</span>
           <div v-else-if="item.scope === 'knowledge'" class="overSty">
             <el-button
               type="success"
@@ -874,9 +791,6 @@
           <span v-else-if="item.scope === 'numberAll'">{{
             scope.row[item.prop1] + scope.row[item.prop2]
           }}</span>
-          <span v-else-if="item.scope === 'moreLists'">{{
-            scope.row[item.prop1] + " ~ " + scope.row[item.prop2]
-          }}</span>
           <span v-else-if="item.scope === 'resultType'">
             {{ scope.row[item.prop1] }}
             <span
@@ -899,15 +813,21 @@
           </span>
           <span v-else-if="item.scope === 'TimeLists'"
             >{{ $methodsTools.onlyForma(scope.row[item.prop1], item.Diszing) }}
-            至
+            {{ scope.row[item.prop1] ? "" : "" }}
             {{
               $methodsTools.onlyForma(scope.row[item.prop2], item.Diszing)
             }}</span
           >
+          <span v-else-if="item.scope === 'layered'">
+            <div>{{ scope.row[item.prop1] }}</div>
+            <div v-if="scope.row[item.prop2]">
+              ({{ scope.row[item.prop2] }})
+            </div>
+          </span>
           <span v-else-if="item.scope === 'aTimeList'">{{
             scope.row[item.prop] === null
               ? "--"
-              : $methodsTools.onlyForma(scope.row[item.prop])
+              : $methodsTools.onlyForma(scope.row[item.prop], !item.isDiszing)
           }}</span>
           <div v-else-if="item.scope === 'inputs'">
             <el-input-number
@@ -974,6 +894,27 @@
                 : ""
             }}
           </span>
+          <div
+            v-else-if="item.scope === 'RealPrice'"
+            :style="
+              scope.row[item.prop2] != null ? 'color:rgb(132, 0, 255);' : ''
+            "
+          >
+            ¥{{ scope.row[item.prop1] }}
+            <span v-if="scope.row[item.prop2] != null">
+              (实收¥{{ scope.row[item.prop2] }})</span
+            >
+          </div>
+          <ul style="margin: 0" v-else-if="item.scope === 'chance'">
+            <li>总共:{{ scope.row[item.prop1] }}</li>
+            <li>消耗:{{ scope.row[item.prop2] }}</li>
+            <li>剩余:{{ scope.row[item.prop1] - scope.row[item.prop2] }}</li>
+          </ul>
+          <ul style="margin: 0" v-else-if="item.scope === 'studyCount'">
+            <li>总共:{{ scope.row[item.prop1] + scope.row[item.prop2] }}</li>
+            <li>消耗:{{ scope.row[item.prop1] }}</li>
+            <li>剩余:{{ scope.row[item.prop2] }}</li>
+          </ul>
           <span
             v-else-if="item.scope === 'statusPeriod'"
             :style="scope.row[item.prop] === 2 ? 'color:red' : ''"
@@ -992,6 +933,10 @@
                 : ""
             }}
           </span>
+          <span v-else-if="item.scope === 'cashRatio'">
+            {{ scope.row[item.prop]
+            }}{{ scope.row["cashType"] === 1 ? "%" : "" }}
+          </span>
           <div
             v-else-if="item.scope === 'openBox'"
             class="open_style"
@@ -999,6 +944,13 @@
           >
             {{ scope.row[item.prop] }}
           </div>
+          <div
+            v-else-if="item.scope === 'openDialog'"
+            class="open_style"
+            @click="openDialog(scope.row)"
+          >
+            {{ item.name ? item.name : scope.row[item.prop] }}
+          </div>
           <div v-else-if="item.scope === 'changeCLS'">
             <div
               v-if="!scope.row['interfacePushId'] && !scope.row['periodPlush']"
@@ -1067,6 +1019,10 @@
               </div>
             </template>
           </div>
+
+          <span v-else-if="item.scope === 'isgzhOpenId'">{{
+            scope.row[item.prop] ? "是" : "否"
+          }}</span>
           <div v-else-if="item.scope === 'rebuy'">
             <span>{{ scope.row[item.prop] === 1 ? "是" : "" }}</span>
             <span
@@ -1144,19 +1100,6 @@
           >
             {{ scope.row[item.prop1] }} / {{ scope.row[item.prop2] }}
           </div>
-          <span v-else-if="item.scope === 'statusOrder'">{{
-            scope.row[item.prop] === -2
-              ? "超时关闭"
-              : scope.row[item.prop] === -1
-              ? "手动关闭"
-              : scope.row[item.prop] === 0
-              ? "待付款"
-              : scope.row[item.prop] === 1
-              ? "已付款"
-              : scope.row[item.prop] === 3
-              ? "成功"
-              : "未知"
-          }}</span>
           <span v-else-if="item.scope === 'cType'">
             <el-tag
               type="success"
@@ -1194,22 +1137,21 @@
           <span v-else-if="item.scope === 'time'">{{
             numTime(scope.row[item.prop])
           }}</span>
-          <span v-else-if="item.scope === 'timeBtn'"
-            >{{ numTime(scope.row[item.prop]) }}
-            <el-button type="text" @click="getxq(scope.row)">详情</el-button>
-          </span>
           <span
             class="editInfoSty"
             v-else-if="item.scope === 'editInfo'"
             @click="editInfo(scope.row)"
             >{{ scope.row[item.prop] }}
           </span>
-          <span
-            class="editInfoSty"
-            v-else-if="item.scope === 'editInfoMore'"
-            @click="editInfo(scope.row)"
-            >{{ scope.row[item.prop1] }} - {{ scope.row[item.prop2] }}
-          </span>
+          <div v-else-if="item.scope === 'editName'">
+            <span>{{ scope.row[item.prop] }}</span>
+            <el-button
+              style="margin-left: 6px"
+              type="text"
+              @click="editInfo(scope.row, 2)"
+              >修改</el-button
+            >
+          </div>
           <span v-else-if="item.scope === 'InfoMore'"
             >{{ scope.row[item.prop1] }} - {{ scope.row[item.prop2] }}
           </span>
@@ -1232,9 +1174,6 @@
           <div v-else-if="item.scope === 'editInfoHTMLs'">
             {{ getSimpleText(scope.row[item.prop]) }}
           </div>
-          <span v-else-if="item.scope === 'minute'">{{
-            numTimeminute(scope.row[item.prop])
-          }}</span>
           <span
             v-else-if="item.scope === 'jumpPage'"
             @click="jumpPage(scope.row)"
@@ -1340,7 +1279,7 @@
                   .map(Number)"
                 :key="idm"
               >
-                {{ itm === 1 ? "非补考学员" : itm === 2 ? "补考学员" : "" }}
+                {{ itm === 1 ? "考学员" : itm === 2 ? "补考学员" : "" }}
               </span>
             </template>
           </div>
@@ -1375,13 +1314,6 @@
           <span v-else-if="item.scope === 'ptai'">{{
             scope.row[item.prop] == 1 ? "微信小程序" : "未知"
           }}</span>
-          <span v-else-if="item.scope === 'diffTime'"
-            >{{
-              scope.row["sectionType"] === 2
-                ? scope.row[item.prop1]
-                : scope.row[item.prop2]
-            }}分钟</span
-          >
           <div v-else-if="item.scope === 'isOptions'">
             <template v-for="(itemt, indext) in item.options">
               <span
@@ -1398,6 +1330,39 @@
               >
             </template>
           </div>
+          <div v-else-if="item.scope === 'isOptionsDY'">
+            <template v-for="(itemt, indext) in item.options">
+              <div
+                :key="indext"
+                v-if="itemt.value === scope.row[item.prop]"
+                :style="
+                  scope.row[item.prop] == 5 ? 'color:rgb(132, 0, 255);' : ''
+                "
+              >
+                <el-popover
+                  :key="indext"
+                  trigger="hover"
+                  v-if="itemt.popover === true"
+                >
+                  <span
+                    >订单编号(业务系统):{{ scope.row[item.oldOrder] }}</span
+                  >
+                  <el-button type="text" slot="reference">{{
+                    itemt.label
+                  }}</el-button>
+                </el-popover>
+                <span v-else
+                  >{{ itemt.label }}
+                  <el-button
+                    type="text"
+                    v-if="itemt.click"
+                    @click="backFunc(scope.row)"
+                    >查看</el-button
+                  ></span
+                >
+              </div>
+            </template>
+          </div>
           <div v-else-if="item.scope === 'orderGoodsStatus'">
             {{
               scope.row[item.prop] === -1
@@ -1433,29 +1398,47 @@
           <div v-else-if="item.scope === 'priceRed'" style="color: red">
             ¥{{ scope.row[item.prop] ? scope.row[item.prop] : 0 }}
           </div>
-          <span v-else
-            >{{ scope.row[item.prop] }}
+          <div v-else>
+            {{ scope.row[item.prop] }}
             {{
               (scope.row[item.prop] || scope.row[item.prop] === 0) && item.ch
                 ? item.ch
                 : ""
-            }}</span
-          >
+            }}
+          </div>
         </template>
       </af-table-column>
 
       <el-table-column
-        label="官方信息推送状态"
+        label="上报注册中心状态"
         align="center"
         width="180px"
         v-if="navText.gftsStatus"
       >
         <template slot-scope="scope">
-          {{
-            scope.row.officialStatus === 1
-              ? `是(${scope.row.officialStatusNum})`
-              : "否"
-          }}
+          <el-popover width="300" trigger="hover">
+            <p>学时推送结果:{{ scope.row.periodPlushMsg || "无" }}</p>
+            <el-button type="text" slot="reference">{{
+              scope.row.officialStatus === 1
+                ? `是(${scope.row.officialStatusNum})`
+                : "否"
+            }}</el-button>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="学时申报"
+        align="center"
+        width="180px"
+        v-if="navText.xssbStatus"
+      >
+        <template slot-scope="scope">
+          <el-popover width="300" trigger="hover">
+            <p>官方信息推送结果:{{ scope.row.officialStatusMsg || "无" }}</p>
+            <el-button type="text" slot="reference">{{
+              scope.row.periodPlush ? "已上报" : "未上报"
+            }}</el-button>
+          </el-popover>
         </template>
       </el-table-column>
       <el-table-column
@@ -1579,6 +1562,7 @@
       </div>
       <div style="max-height: 600px; overflow: auto">
         <el-tree
+          v-if="diaviosOpen"
           default-expand-all
           :key="Math.random()"
           :props="props1"
@@ -1683,6 +1667,7 @@
       </div>
       <div style="max-height: 600px; overflow: auto">
         <el-tree
+          v-if="diaviosTKOpen"
           default-expand-all
           :key="Math.random()"
           :props="props2"
@@ -1760,7 +1745,17 @@
 import bankMsg from "./bankMsg";
 export default {
   components: { bankMsg },
-  props: ["tableSets", "tableData", "navText", "rowKey", "loading"],
+  props: [
+    "tableSets",
+    "tableData",
+    "navText",
+    "navIndex",
+    "rowKey",
+    "loading",
+    "studentTable",
+    "objectSpanMethod",
+    "radio",
+  ],
   data: function () {
     return {
       diaviosOpen: false,
@@ -1811,6 +1806,14 @@ export default {
     };
   },
   computed: {
+    tableRadio: {
+      get() {
+        return this.radio;
+      },
+      set(val) {
+        this.$emit("update:radio", val);
+      },
+    },
     compTableSet: function () {
       return function (options) {
         var arrays = options.filter((item) => {
@@ -1824,11 +1827,6 @@ export default {
         return Number(res / 3600).toFixed(2);
       };
     },
-    numTimeminute: function () {
-      return function (res) {
-        return Number(res / 60).toFixed(2);
-      };
-    },
     compType: function () {
       return function (res, data) {
         if (data === "POST") {
@@ -1844,10 +1842,17 @@ export default {
     },
   },
   created() {
+    if (this.studentTable) {
+      let data = sessionStorage.getItem("studentTableList");
+      if (data && data !== "") {
+        this.tableSet = JSON.parse(data);
+      }
+    }
     this.inittableSet = JSON.stringify(this.tableSet);
     this.initTR();
   },
   methods: {
+    radioChange(val) {},
     /**
      * 学习账号标记跳转班级
      */
@@ -1937,6 +1942,9 @@ export default {
       }
       this.$emit("openClassNum", id);
     },
+    openSpec(id) {
+      this.$emit("openClassNum", id);
+    },
     /**
      * int: 1 节列表-关联章 2 章列表-关联模块 3 模块列表-关联课程 4 课程列表-关联商品 5 题目列表-关联试卷 6 试卷列表-关联商品 7 章卷列表-关联商品 8 模块列表-关联商品
      */
@@ -2022,7 +2030,7 @@ export default {
       if (int === 4) {
         const jump = () => {
           this.$router.push({
-            path: "/Marketing/goods/commodityManageMentEdit",
+            name: "CommodityManageMentEdit",
             query: {
               id: v.goodsId,
             },
@@ -2240,6 +2248,7 @@ export default {
       }
     },
     diavios(ids) {
+      console.log(ids, "触发");
       this.$api.obtainCourseSgoodsId(ids).then((res) => {
         res.rows.forEach((item) => {
           item.TypeId = "0-" + item.courseId;
@@ -2298,6 +2307,9 @@ export default {
     openBoxData(row) {
       this.$emit("openBoxFun", row);
     },
+    openDialog(row) {
+      this.$emit("openDialog", row);
+    },
     diaviosTK(ids) {
       this.$api.inquireGoodsbanklist({ goodsId: ids }).then((res) => {
         res.data.forEach((item) => {
@@ -2411,6 +2423,9 @@ export default {
       this.tableSet = [];
       this.$nextTick(() => {
         this.tableSet = copyTable;
+        if (this.studentTable) {
+          sessionStorage.setItem("studentTableList", JSON.stringify(copyTable));
+        }
       });
     },
     //自定义列重置
@@ -2591,7 +2606,9 @@ export default {
       this.$emit("load", tree, treeNode, resolve);
     },
     editInfo(option, int) {
-      if (int === 3) {
+      if (int === 2) {
+        this.$emit("editName", option);
+      } else if (int === 3) {
         this.$emit("aboutGoods", option);
       } else {
         this.$emit("editInfo", option);
@@ -2712,7 +2729,7 @@ export default {
 </style>
 <style lang="less" scoped>
 #tableList {
-  padding: 0px 16px 16px;
+  padding: 16px 16px 16px;
   border-radius: 8px;
   box-shadow: 0px 0px 9px 1px rgba(28, 41, 90, 0.1);
   background: #ffffff;
@@ -2721,6 +2738,7 @@ export default {
     display: flex;
     justify-content: space-between;
     align-items: center;
+    margin-top: -16px;
     .rightBtnBox {
       display: flex;
       align-items: center;
@@ -2878,4 +2896,8 @@ export default {
   max-height: 500px;
   overflow-y: auto;
 }
-</style>
+<<<<<<< HEAD
+</style>
+=======
+</style>
+>>>>>>> 3107d971f37e40886a3103e97257095c2935673b

+ 38 - 17
src/components/testPaperPreview/index.vue

@@ -13,6 +13,15 @@
         </div>
       </div>
       <div>
+        <div style="margin-bottom: 14px" v-if="activeIndex !== null">
+          <el-button
+            v-for="(item, index) in examTitleList"
+            :key="index"
+            @click="getData(item.examId, index)"
+            :type="activeIndex === index ? 'primary' : ''"
+            >{{ item.examName }}</el-button
+          >
+        </div>
         <table class="table_style" border>
           <tr>
             <td>当前总分</td>
@@ -205,6 +214,8 @@ export default {
       tableData: [], //题目内容
       topData: {}, //顶部表格数据
       type: "",
+      examTitleList: [],
+      activeIndex: null,
     };
   },
   computed: {
@@ -255,20 +266,32 @@ export default {
      * type = 1时Id获取数据row = ID, 2时直接获取数据row = 数据
      */
     openBox(type, row) {
+      console.log(type,row)
+      this.activeIndex = null;
       const ROWS = JSON.parse(JSON.stringify(row));
       this.type = type;
       if (type === 1) {
-        //搜索Id处理数据
-        this.$api.obtainbankexam(row).then((res) => {
-          console.log(111);
-          this.topData = {
-            answerTime: res.data.answerTime,
-            answerNum: res.data.answerNum,
-            doType: res.data.doType,
-            passScore: res.data.passScore,
-          };
-        });
-        this.$api.inquirebankexamquestionList({ examId: row }).then((res) => {
+        this.examTitleList = row;
+        this.getData(row[0].examId, 0);
+      }
+      if (type === 2) {
+        this.topData = ROWS.topData;
+        this.tableData = ROWS.tableData;
+        this.diavos = true;
+      }
+    },
+    getData(id, index) {
+      if (this.activeIndex === index) return;
+      //搜索Id处理数据
+      this.$api.obtainbankexam(id).then((res) => {
+        this.topData = {
+          answerTime: res.data.answerTime,
+          answerNum: res.data.answerNum,
+          doType: res.data.doType,
+          passScore: res.data.passScore,
+        };
+        this.$api.inquirebankexamquestionList({ examId: id }).then((res) => {
+          this.activeIndex = index;
           res.data.map((item) => {
             item.optionsList = JSON.parse(item.jsonStr);
           });
@@ -279,13 +302,11 @@ export default {
           });
           this.topData.getAllpocis = num;
           this.diavos = true;
+          this.$nextTick(() => {
+            document.getElementsByClassName("bank_style")[0].scrollTop = 0;
+          });
         });
-      }
-      if (type === 2) {
-        this.topData = ROWS.topData;
-        this.tableData = ROWS.tableData;
-        this.diavos = true;
-      }
+      });
     },
     changeDatas(row) {
       this.$parent.addClick(row, 0, row.index, true);

+ 18 - 0
src/directive/common/throttle.js

@@ -0,0 +1,18 @@
+export default {
+    inserted(el, binding) {
+        let throttleTime = binding.value; 
+        if (!throttleTime) {
+            throttleTime = 1000;
+        }
+        let cbFun;
+        el.addEventListener('click', event => {
+            if (!cbFun) { // 第一次执行
+                cbFun = setTimeout(() => {
+                    cbFun = null;
+                }, throttleTime);
+            } else {
+                event && event.stopImmediatePropagation();
+            }
+        }, true);
+    }
+}

+ 7 - 0
src/directive/filter/index.js

@@ -0,0 +1,7 @@
+// 金额格式化
+export function formatPrice(price) {
+  return price?.toLocaleString(
+    "zh-CN",
+    (undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+  );
+}

+ 5 - 1
src/directive/index.js

@@ -3,13 +3,17 @@ import hasPermi from './permission/hasPermi'
 import dialogDrag from './dialog/drag'
 import dialogDragWidth from './dialog/dragWidth'
 import dialogDragHeight from './dialog/dragHeight'
+import throttle from "./common/throttle"
+import { formatPrice } from "./filter";
 
-const install = function(Vue) {
+const install = function (Vue) {
   Vue.directive('hasRole', hasRole)
   Vue.directive('hasPermi', hasPermi)
   Vue.directive('dialogDrag', dialogDrag)
   Vue.directive('dialogDragWidth', dialogDragWidth)
   Vue.directive('dialogDragHeight', dialogDragHeight)
+  Vue.directive('throttle', throttle)
+  Vue.filter("formatPrice", formatPrice);
 }
 
 if (window.Vue) {

+ 26 - 0
src/fxApi/check.js

@@ -0,0 +1,26 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //审核
+    editdistributioncheckhandle(data) {
+        return request({
+            url: '/distribution/check/handle',
+            method: 'post',
+            data
+        })
+    },
+    //审核列表
+    inquiredistributionchecklist(data) {
+        return request({
+            url: '/distribution/check/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //审核详情
+    obtaindistributioncheckdetail(data) {
+        return request({
+            url: `/distribution/check/detail/` + data,
+            method: 'get',
+        })
+    },
+}

+ 42 - 0
src/fxApi/poster.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增海报模板
+    distributionpostersave(data) {
+        return request({
+            url: '/distribution/poster/save', 
+            method: 'post',
+            data
+        })
+    },
+    //修改海报模板
+    editdistributionposter(data) {
+        return request({
+            url: '/distribution/poster/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询海报模板列表
+    inquiredistributionposterlist(data) {
+        return request({
+            url: '/distribution/poster/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取海报模板详细信息
+    obtaindistributionposter(data) {
+        return request({
+            url: `/distribution/poster/` + data,
+            method: 'get',
+        })
+    },
+    //查询海报模板列表
+    inquiredistributionposterimagelist(data) {
+        return request({
+            url: '/distribution/poster/image/list',
+            method: 'get',
+            params: data
+        })
+    },
+}

+ 176 - 0
src/fxApi/temp.js

@@ -0,0 +1,176 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增分销活动模板
+    distributiontempsave(data) {
+        return request({
+            url: '/distribution/activity/save', 
+            method: 'post',
+            data
+        })
+    },
+    //修改分销活动模板
+    editdistributiontemp(data) {
+        return request({
+            url: '/distribution/activity/edit',
+            method: 'post',
+            data
+        })
+    },
+    //启用-禁用
+    editdistributiontempupdatestatus(data) {
+        return request({
+            url: '/distribution/activity/update/status',
+            method: 'post',
+            data
+        })
+    },
+    //拉取商品
+    distributionactivitypullgoods(data) {
+        return request({
+            url: `/distribution/activity/pull/goods/` + data,
+            method: 'get',
+        })
+    },
+    //启用-禁用分销活动
+    editdistributionactivityeditstatus(data) {
+        return request({
+            url: '/distribution/activity/edit/status',
+            method: 'post',
+            data
+        })
+    },
+    //导出【请填写功能名称】列表
+    distributiontempexport(data) {
+        return request({
+            url: '/distribution/activity/export',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询分销活动模板列表
+    distributiontemplist(data) {
+        return request({
+            url: '/distribution/activity/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //活动模板发布
+    distributiontemppublishdata(data) {
+        return request({
+            url: `/distribution/activity/publish/` + data,
+            method: 'get',
+        })
+    },
+    //获取分销活动模板详细信息
+    distributiontempdata(data) {
+        return request({
+            url: `/distribution/activity/` + data,
+            method: 'get',
+        })
+    },
+    //查询系统商户列表
+    systemtenantlist(data) {
+        return request({
+            url: '/system/tenant/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询分销业务员列表
+    distributionsellerlist(data) {
+        return request({
+            url: '/distribution/seller/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取分销业务员详细信息
+    distributionseller(data) {
+        return request({
+            url: '/distribution/seller/' + data,
+            method: 'get',
+        })
+    },
+    //新增分销业务员
+    addDistributionseller(data) {
+        return request({
+            url: '/distribution/seller',
+            method: 'post',
+            data
+        })
+    },
+    //批量新增关联分销业务员
+    distributionsellerbatchAdd(data) {
+        return request({
+            url: '/distribution/seller/batchAdd',
+            method: 'post',
+            data
+        })
+    },
+    //修改分销业务员
+    editDistributionseller(data) {
+        return request({
+            url: '/distribution/seller/sysEdit',
+            method: 'post',
+            data
+        })
+    },
+    //批量新增关联分销业务员
+    distributionsellerbatchAdd(data) {
+        return request({
+            url: '/distribution/seller/batchAdd',
+            method: 'post',
+            data
+        })
+    },
+    
+    //业务员所有分销订单
+    distributionactivitysellerorder(data) {
+        return request({
+            url: '/distribution/activity/seller/order',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询业务员分销排行榜
+    distributionactivitysellersortnotice(data) {
+        return request({
+            url: '/distribution/activity/seller/sort/notice',
+            method: 'get',
+            params: data
+        })
+    },
+    //佣金列表
+    distributionactivitycashlist(data) {
+        return request({
+            url: '/distribution/activity/cash/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //分销订单列表
+    distributionactivityorderlist(data) {
+        return request({
+            url: '/distribution/activity/order/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //打款
+    distributionwithdrawalpayCash(data) {
+        return request({
+            url: '/distribution/withdrawal/payCash',
+            method: 'post',
+            data
+        })
+    },
+    //again打款
+    distributionwithdrawalrePayCash(data) {
+        return request({
+            url: '/distribution/withdrawal/rePayCash',
+            method: 'post',
+            data
+        })
+    },
+}

+ 358 - 3
src/layout/components/Navbar.vue

@@ -64,7 +64,6 @@
           <size-select id="size-select" class="right-menu-item hover-effect" />
         </el-tooltip>
       </template>
-
       <el-dropdown
         class="avatar-container right-menu-item hover-effect"
         trigger="click"
@@ -86,6 +85,48 @@
         </el-dropdown-menu>
       </el-dropdown>
     </div>
+    <el-dialog
+      append-to-body
+      :visible.sync="dialog_haveRead"
+      width="440px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">{{ total }}条未读消息</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="dialog_haveRead = false"
+          />
+        </div>
+      </div>
+      <div class="haveRead_style">
+        <div
+          v-for="(item, index) in tableData"
+          :key="index"
+          class="haveRead_list"
+        >
+          <strong>{{ item.remind }}</strong>
+          <p>
+            {{ item.text }}
+          </p>
+          <p style="time_style">{{ $methodsTools.onlyForma(item.sendTime) }}</p>
+          <div>
+            <el-button type="primary" size="small" @click="newSee(item.id)"
+              >立即查看</el-button
+            >
+            <el-button size="small" @click="changeReadStatus(item.id)"
+              >标记为已读</el-button
+            >
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="seeAllRead">查看所有</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -116,6 +157,9 @@ export default {
   data() {
     return {
       dialogVisible: false,
+      dialog_haveRead: false,
+      tableData: [], //未读列表
+      total: 0, //未读数量
     };
   },
   computed: {
@@ -137,7 +181,190 @@ export default {
       },
     },
   },
+  mounted() {
+    if (this.$route.name !== "StationLetter") {
+      this.$api.inquireinformsys_userinformUnReadSum().then((res) => {
+        if (res.data > 0) {
+          this.getDontReadList();
+        }
+      });
+    }
+    this.getDownList();
+  },
   methods: {
+    /**
+     * 实时获取下载列表
+     */
+    getDownList() {
+      this.$store.dispatch("downloadlist");
+    },
+    /**
+     * 立即查看
+     */
+    newSee(id) {
+      this.$router.push({
+        name: "StationLetter",
+        params: {
+          id: id,
+        },
+      });
+      // this.dialog_haveRead = false;
+    },
+    /**
+     * 获取未读数据列表
+     */
+    getDontReadList() {
+      var self = this;
+      let val = {
+        receiptStatus: 0,
+        systemStatus: 1,
+      };
+      this.$api.inquireinformsys_userlist(val).then((result) => {
+        this.tableData = result.rows;
+        this.total = result.total;
+        if (this.total > 0) {
+          const h = this.$createElement;
+          let arrays = result.rows.map((item, index) => {
+            return h(
+              "div",
+              {
+                style: {
+                  borderBottom:
+                    result.total === index + 1 ? "none" : "1px solid #D9D9D9",
+                  marginTop: "26px",
+                  paddingBottom: "26px",
+                },
+              },
+              [
+                h(
+                  "strong",
+                  {
+                    style: {
+                      fontSize: "16px",
+                      fontWeight: "bold",
+                      color: "#222222",
+                      marginBottom: "12px",
+                    },
+                  },
+                  item.remind
+                ),
+                h(
+                  "p",
+                  {
+                    style: {
+                      fontSize: "14px",
+                      color: "#606266",
+                      marginBottom: "12px",
+                    },
+                  },
+                  item.text
+                ),
+                h(
+                  "p",
+                  {
+                    style: {
+                      fontSize: "12px",
+                      color: "#999999",
+                      marginBottom: "12px",
+                    },
+                  },
+                  this.$methodsTools.onlyForma(item.sendTime)
+                ),
+                h(
+                  "el-button",
+                  {
+                    attrs: {
+                      size: "small",
+                      type: "primary",
+                    },
+                    on: {
+                      click: function () {
+                        self.newSee(item.id);
+                        self.$notify.closeAll();
+                      },
+                    },
+                  },
+                  "立即查看"
+                ),
+                h(
+                  "el-button",
+                  {
+                    attrs: {
+                      size: "small",
+                    },
+                    on: {
+                      click: async function () {
+                        await self.changeReadStatus(item.id);
+                        self.$notify.closeAll();
+                        self.$nextTick(() => {
+                          self.getDontReadList();
+                        });
+                      },
+                    },
+                  },
+                  "标记为已读"
+                ),
+              ]
+            );
+          });
+          this.$notify({
+            title: `${result.total}条未读信息`,
+            position: "bottom-right",
+            dangerouslyUseHTMLString: true,
+            duration: 0,
+            customClass: "notiSty",
+            message: h("div", [
+              h(
+                "div",
+                {
+                  class: "znxStyle",
+                },
+                arrays
+              ),
+              h(
+                "div",
+                {
+                  class: "btn_bottom_style",
+                  on: {
+                    click: function () {
+                      self.seeAllRead();
+                      self.$notify.closeAll();
+                    },
+                  },
+                },
+                "查看所有"
+              ),
+            ]),
+          });
+          // this.dialog_haveRead = true;
+        } else {
+          // this.dialog_haveRead = false;
+        }
+      });
+    },
+    /**
+     * 更新已读状态
+     */
+    changeReadStatus(id) {
+      return new Promise((resolve, reject) => {
+        this.$api
+          .editupdateReadStatusBatch({ ids: [id], receiptStatus: 1 })
+          .then((res) => {
+            this.$message.success("已读成功");
+            resolve();
+            // this.getDontReadList();
+          });
+      });
+    },
+    /**
+     * 查看所有消息
+     */
+    seeAllRead() {
+      this.$router.push({
+        name: "StationLetter",
+      });
+      // this.dialog_haveRead = false;
+    },
     openMsg() {
       this.dialogVisible = true;
     },
@@ -151,17 +378,84 @@ export default {
         type: "warning",
       })
         .then(() => {
+          const tid = sessionStorage.TenantId;
           this.$store.dispatch("LogOut").then(() => {
-            location.href = "/index";
+            location.href = "/index?TenantId=" + tid;
           });
         })
-        .catch(() => {});
+        .catch(() => {
+          // var message: h("div", [
+          //       h("strong", null, item.text),
+          //       h("p", null, this.$methodsTools.onlyForma(item.sendTime)),
+          //       h(
+          //         "el-button",
+          //         {
+          //           attrs: {
+          //             size: "small",
+          //             type: "primary",
+          //           },
+          //           on: {
+          //             click: function () {
+          //               self.newSee(item.id);
+          //               self.$notify.closeAll();
+          //             },
+          //           },
+          //         },
+          //         "立即查看"
+          //       ),
+          //       h(
+          //         "el-button",
+          //         {
+          //           attrs: {
+          //             size: "small",
+          //           },
+          //           on: {
+          //             click: function () {
+          //               self.changeReadStatus(item.id);
+          //               instance[index].close();
+          //             },
+          //           },
+          //         },
+          //         "标记已读"
+          //       ),
+          //       h(
+          //         "el-button",
+          //         {
+          //           attrs: {
+          //             size: "small",
+          //             type: "success",
+          //           },
+          //           on: {
+          //             click: function () {
+          //               self.seeAllRead()
+          //               self.$notify.closeAll();
+          //             },
+          //           },
+          //         },
+          //         "查看全部"
+          //       ),
+          //     ]),
+        });
     },
   },
 };
 </script>
 
 <style lang="scss" scoped>
+.haveRead_list {
+  margin-top: 24px;
+  padding-bottom: 28px;
+  border-bottom: 1px solid #d9d9d9;
+  & > strong {
+    color: #000;
+  }
+  & > .time_style {
+    color: #999999;
+  }
+  &:last-child {
+    border-bottom: none;
+  }
+}
 /deep/.el-button {
   border-radius: 8px;
 }
@@ -349,4 +643,65 @@ export default {
     }
   }
 }
+.znxStyle {
+  max-height: 460px;
+  overflow-y: auto;
+  padding: 0px 28px;
+  &::-webkit-scrollbar {
+    width: 4px;
+  }
+  &::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    -webkit-box-shadow: inset 0 0 5px rgba(165, 165, 165, 0.2);
+    background: rgba(165, 165, 165, 0.2);
+  }
+  &::-webkit-scrollbar-track {
+    -webkit-box-shadow: inset 0 0 5px rgba(165, 165, 165, 0.2);
+    border-radius: 0;
+    background: rgba(226, 225, 225, 0.2);
+  }
+}
+.btn_bottom_style {
+  height: 50px;
+  border-top: 1px solid #d9d9d9;
+  line-height: 50px;
+  text-align: center;
+  color: #222;
+  font-size: 16px;
+  cursor: pointer;
+  transition: all 0.2s;
+  &:hover {
+    background-color: #eee;
+  }
+}
+.btnStyle_s {
+  margin-top: 6px;
+  background-color: skyblue;
+  color: #fff;
+}
+</style>
+<style lang="less">
+.notiSty {
+  width: 400px !important;
+  padding: 0px !important;
+  & > .el-notification__group {
+    width: 100%;
+    margin: 0px;
+    & > .el-notification__title {
+      text-align: center;
+      height: 60px;
+      line-height: 60px;
+      color: #fff;
+      font-size: 18px;
+      font-weight: bold;
+      background-color: #409eff;
+      font-family: OPPOSans-Bold, OPPOSans;
+    }
+    & > .el-notification__closeBtn {
+      color: #fff;
+      font-size: 18px;
+      top: 24px;
+    }
+  }
+}
 </style>

+ 1 - 0
src/layout/components/Sidebar/Item.vue

@@ -39,6 +39,7 @@ export default {
     //     );
     //   }
     // }
+    
     if (title) {
       vnodes.push(<span slot="title">{title}</span>);
     }

+ 3 - 3
src/layout/components/Sidebar/Logo.vue

@@ -3,11 +3,11 @@
     <transition name="sidebarLogoFade">
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="sideTheme === 'theme-dark'? logo : logoYT" class="sidebar-logo" />
-        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ $store.state.user.companyName }} </h1>
       </router-link>
       <router-link v-else key="expand" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="sideTheme === 'theme-dark'? logo : logoYT" class="sidebar-logo" />
-        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ $store.state.user.companyName }} </h1>
       </router-link>
     </transition>
   </div>
@@ -36,7 +36,7 @@ export default {
   },
   data() {
     return {
-      title: '中正云教育',
+      title: '',
       logo: logoImg,
       logoYT:logoYTImg,
     }

+ 8 - 0
src/main.js

@@ -12,7 +12,9 @@ import '@/assets/styles/ruoyi.scss' // ruoyi css
 import App from './App'
 import store from './store'
 import api from '@/api/api'
+import gsap from 'gsap'
 import upload from '@/utils/uploadFile'
+import {checkSession} from '@/utils/spotCheck'
 import router from './router'
 import directive from './directive' //directive
 import plugins from './plugins' // plugins
@@ -21,6 +23,8 @@ import './permission' // permission control
 import { getDicts } from "@/api/system/dict/data";
 import { getConfigKey } from "@/api/system/config";
 import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
+// 通用弹窗
+import BaseDialog from "@/components/BaseDialog";
 // 分页组件
 import Pagination from "@/components/Paginations";
 // 自定义表格工具组件
@@ -54,9 +58,13 @@ Vue.prototype.$api = api
 Vue.prototype.$upload = upload
 Vue.prototype.$methodsTools = methodsTools
 Vue.prototype.$bus = bus
+Vue.prototype.gsap = gsap
+Vue.prototype.checkSession = checkSession
+
 // 全局组件挂载
 Vue.component('DictTag', DictTag)
 Vue.component('Pagination', Pagination)
+Vue.component('BaseDialog', BaseDialog)
 Vue.component('RightToolbar', RightToolbar)
 Vue.component('Editor', Editor)
 Vue.component('FileUpload', FileUpload)

+ 298 - 0
src/mixin/fpFile.js

@@ -0,0 +1,298 @@
+/*
+ * @Description: 大文件上传、分片上传、断点续传、文件秒传
+ * @Author: zhangy
+ * @Date: 2022-05-16 13:10:13
+ * @LastEditors: zhangy
+ * @LastEditTime: 2022-05-19 10:14:33
+ */
+
+const SparkMD5 = require('spark-md5')
+import handoutApi from '@/newApi/handout'
+import axios from 'axios'
+// 切片大小(单位:B)
+const CHUNK_SIZE = 50 * 1024 * 1024
+// const CHUNK_SIZE = 24 * 1024
+
+/**
+ * @description: 分块计算文件的md5值
+ * @param {*} file 文件
+ * @param {*} chunkSize 分片大小
+ * @returns {*}
+ */
+function calculateFileMd5(file, chunkSize) {
+    return new Promise((resolve, reject) => {
+        const blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice
+        const chunks = Math.ceil(file.size / chunkSize)
+        let currentChunk = 0
+        const spark = new SparkMD5.ArrayBuffer()
+        const fileReader = new FileReader()
+
+        fileReader.onload = function (e) {
+            spark.append(e.target.result)
+            currentChunk++
+            if (currentChunk < chunks) {
+                loadNext()
+            } else {
+                const md5 = spark.end()
+                resolve(md5)
+            }
+        }
+
+        fileReader.onerror = function (e) {
+            reject(e)
+        }
+
+        function loadNext() {
+            const start = currentChunk * chunkSize
+            let end = start + chunkSize
+            if (end > file.size) {
+                end = file.size
+            }
+            fileReader.readAsArrayBuffer(blobSlice.call(file, start, end))
+        }
+
+        loadNext()
+    })
+}
+
+/**
+ * @description: 分块计算文件的md5值
+ * @param {*} file 文件
+ * @returns {Promise}
+ */
+function calculateFileMd5ByDefaultChunkSize(file) {
+    return calculateFileMd5(file, CHUNK_SIZE)
+}
+
+/**
+ * @description: 文件切片
+ * @param {*} file
+ * @param {*} size 切片大小
+ * @returns [{file}]
+ */
+function createFileChunk(file, size = CHUNK_SIZE) {
+    const chunks = []
+    let cur = 0
+    while (cur < file.size) {
+        chunks.push({ file: file.slice(cur, cur + size) })
+        cur += size
+    }
+    return chunks
+}
+
+/**
+ * @description: 获取文件的后缀名
+ */
+function getFileType(fileName) {
+    return fileName.substr(fileName.lastIndexOf('.') + 1).toLowerCase()
+}
+
+/**
+ * @description: 根据文件的md5值判断文件是否已经上传过了
+ * @param {*} md5 文件的md5
+ * @param {*} 准备上传的文件
+ * @returns {Promise}
+ */
+function checkMd5(md5, file) {
+    return new Promise(resolve => {
+        getUploadStatus({ md5 })
+            .then(res => {
+                if (res.data.code === 20000) {
+                    // 文件已经存在了,秒传(后端直接返回已上传的文件)
+                    resolve({
+                        uploaded: true,
+                        url: res.data.msg,
+                        code: res.data.code
+                    })
+                } else if (res.data.code === 40004) {
+                    // 文件不存在需要上传
+                    resolve({ uploaded: false, url: '', code: res.data.code })
+                } else {
+                    resolve({ uploaded: false, url: '', code: 500 })
+                }
+            })
+            .catch(() => {
+                resolve({ uploaded: false, url: '', code: 500 })
+            })
+    })
+}
+
+/**
+ * @description: 执行分片上传
+ * @param {*} file 上传的文件
+ * @param {*} i 第几分片,从0开始
+ * @param {*} md5 文件的md5值
+ * @param {*} vm 虚拟 dom 指向组件 this
+ * @returns {Promise}
+ */
+function PostFile(timeSign,file, i, md5, vm) {
+    const name = file.name // 文件名
+    const size = file.size // 总大小
+    const shardCount = Math.ceil(size / CHUNK_SIZE) // 总片数
+    if (i >= shardCount) {
+        return
+    }
+
+    const start = i * CHUNK_SIZE
+    const end = start + CHUNK_SIZE
+    const packet = file.slice(start, end) // 将文件进行切片
+    const param = { "timeSign": timeSign, "shardCount": shardCount, "name": name, "index": i + 1, "fileSign": md5, "fileMd5": md5 }
+    /*  构建form表单进行提交  */
+    const form = new FormData()
+    form.append('file', packet) // slice方法用于切出文件的一部分
+    form.append('param', JSON.stringify(param)) // slice方法用于切出文件的一部分
+    return new Promise((resolve, reject) => {
+        handoutApi.commondecompression(form)
+            .then(res => {
+                if (res.code === 200) {
+                    // 拿到已上传过的切片
+                    resolve({
+                        uploadedList: res.data ? res.data.map(item => {
+                            return item.slice(0, item.lastIndexOf('.'))
+                        }) : []
+                    })
+                } else {
+                    resolve({ uploadedList: [], code: 500 })
+                    // reject()
+                }
+            })
+            .catch(() => {
+                // reject()
+                resolve({ uploadedList: [], code: 500 })
+            })
+    })
+}
+
+/**
+ * @description: 合并文件
+ * @param {*} shardCount 分片数
+ * @param {*} fileName 文件名
+ * @param {*} md5 文件md值
+ * @param {*} fileType 文件类型
+ * @param {*} fileSize 文件大小
+ * @returns {Promise}
+ */
+function merge(timeSign, fileMd5, name) {
+    return new Promise((resolve, reject) => {
+        handoutApi.commonmergefile({ timeSign, fileMd5, name }).then(res => {
+            if (res.code === 200) {
+                resolve(true)
+            } else {
+                resolve(false)
+            }
+        }).catch(() => {
+            resolve(false)
+        })
+    })
+}
+
+export default {
+    data() {
+        return {
+            chunks: [],
+            percent: 0,
+            percentCount: 0,
+            stopUpload: false // 在需要的时机或场合阻止上传
+        }
+    },
+    methods: {
+        /**
+         * @description: 上传文件
+         * @param {*} file 文件
+         * @returns {Object} 包含成功的文件地址、名称等
+        */
+        async chunksUpload(file, timeSign) {
+            this.chunks = []
+            // step1 获取文件切片
+            const initChunks = createFileChunk(file)
+            console.log(initChunks, "initChunks")
+            // step2 获取文件 md5 值
+            const md5 = await calculateFileMd5ByDefaultChunkSize(file)
+
+            // step3 获取文件的上传状态
+            //   const { uploaded, url, code } = await checkMd5(md5, file)
+
+            //   if (uploaded) {
+            //     // step4 如果上传成功
+            //     this.percent = 100
+
+            //     // step5 拿到结果
+            //     return url
+            //   }
+
+            //   if (!uploaded && code === 500) {
+            //     return this.errorInfo()
+            //   }
+
+            // step4 如果文件未传成功,执行切片上传
+            const { uploadedList } = await PostFile(timeSign, file, 0, md5, this)
+            // todo 方法1:逐次发送请求
+            // const requestList = [] // 请求集合
+            // initChunks.forEach(async (chunk, index) => {
+            //     // 过滤掉已上传的切片
+            //     if (uploadedList.indexOf(md5 + '_' + (index + 1)) < 0) {
+            //         const fn = () => {
+            //             return PostFile(file, index, md5, this)
+            //         }
+            //         requestList.push(fn)
+            //     }
+            // })
+
+            // let reqNum = 0 // 记录发送的请求个数
+            // const send = async () => {
+            //     if (reqNum >= requestList.length) {
+            //         // step5 如果所有切片已上传,执行合并
+            //         const res = await merge(initChunks.length, file.name, md5, getFileType(file.name), file.size)
+            //         if (res.data.code === 20000) {
+            //             return res.data.msg
+            //         } else {
+            //             this.errorInfo()
+            //             return {}
+            //         }
+            //     }
+
+            //     if (this.stopUpload) return {} // 阻止上传
+            //     const sliceRes = await requestList[reqNum]()
+            //     if (sliceRes.code && sliceRes.code === 500) {
+            //         return this.errorInfo()
+            //     }
+            //     // 计算当下所上传切片数
+            //     const count = initChunks.length - uploadedList.length
+            //     if (this.percentCount === 0) {
+            //         this.percentCount = 100 / count
+            //     }
+            //     this.percent += this.percentCount
+            //     reqNum++
+            //     return send()
+            // }
+
+            // const mergeResult = await send()
+            // return mergeResult
+
+            // todo 方法2:使用Promise.all 统一发送请求
+            const requestList = initChunks.map(async (chunk, index) => {
+                // 过滤掉已上传的切片
+                if (uploadedList.indexOf(md5 + '_' + (index + 1)) < 0) {
+                    return PostFile(timeSign, file, index, md5, this)
+                }
+            })
+            return Promise.all(requestList)
+                .then(async () => {
+                    const res = await merge(timeSign, md5, file.name, md5)
+                    console.log(res, "-------res")
+                    return { status: res, md5 }
+                })
+                .catch(() => {
+                    this.$message.error('出错了,请稍后重试!')
+                    return { status: false, md5 }
+                })
+        },
+
+        /**
+         * @description: 错误提示
+        */
+        errorInfo() {
+            this.$message.error('出错了,请稍后重试!')
+        }
+    }
+}

+ 89 - 1
src/newApi/applicationData.js

@@ -56,6 +56,14 @@ export default {
             params: data
         })
     },
+    //查询七大员报考数据列表
+    inquiresystemsevensublist(data) {
+        return request({
+            url: '/system/subscribe/sub/list',
+            method: 'get',
+            params: data
+        })
+    },
     //查询用户下商品的考试次数,前培次数列表
     inquiresystemsubscribelistUserExam(data) {
         return request({
@@ -72,6 +80,14 @@ export default {
             params: data
         })
     },
+    //七大员题库商品开通
+    orderquestionopen(data) {
+        return request({
+            url: '/order/question/open',
+            method: 'post',
+            data
+        })
+    },
     //导出新增预约模板
     inquiresystemsubscribeexportNew(data) {
         return request({
@@ -145,5 +161,77 @@ export default {
             data
         })
     },
-    
+    //导出学员信息表
+    inquiresystemsubscribelistUserExport(data) {
+        return request({
+            url: '/system/subscribe/listUserExport',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出学员签到表
+    inquiresystemsubscribelistSignExport(data) {
+        return request({
+            url: '/system/subscribe/listSignExport',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出疫情防控承诺书
+    inquiresystemsubscribelistLetterExport(data) {
+        return request({
+            url: '/system/subscribe/listLetterExport',
+            method: 'get',
+            params: data
+        })
+    },
+
+
+    //预约学员信息下载
+    systemsubscribesubrecorduserexport(data) {
+        return request({
+            url: '/system/subscribe/sub/record/user/export',
+            method: 'post',
+            data
+        })
+    },
+    //预约学员档案资料下载
+    systemsubscribesubuserexport(data) {
+        return request({
+            url: '/system/subscribe/sub/user/export',
+            method: 'get',
+            params: data
+        })
+    },
+    //学员档案下载任务列表
+    systemsubscribesubuserexportlist(data) {
+        return request({
+            url: '/system/subscribe/sub/user/export/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //七大员新考结果
+    commonapplyresultreceipt(data) {
+        return request({
+            url: '/common/apply/result/receipt',
+            method: 'post',
+            data,
+            headers: {
+                isToken: false
+            },
+        })
+    },
+    //七大员新考证书
+    commonapplyresultcertificate(data) {
+        return request({
+            url: '/common/apply/result/certificate',
+            method: 'post',
+            data,
+            headers: {
+                isToken: false
+            },
+        })
+    },
+
 }

+ 60 - 0
src/newApi/appuser.js

@@ -63,4 +63,64 @@ export default {
             method: 'get',
         })
     },
+    //统计查询客户端用户列表
+    inquirestudystats_list(data) {
+        return request({
+            url: '/app/user/stats_list',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出统计查询客户端用户列表
+    exportstudystats_list(data) {
+        return request({
+            url: '/app/user/stats_list_export',
+            method: 'get',
+            params: data
+        })
+    },
+    //同步智慧考场
+    appcommonsyncExamSite(data) {
+        return request({
+            url: '/app/common/syncExamSite',
+            method: 'get',
+            params: data,
+            headers: {
+              isToken: false
+            },
+        })
+    },
+    //同步考生考试状态信息
+    appcommonwisdomSyncExamStatus(data) {
+        return request({
+            url: '/app/common/wisdomSyncExamStatus',
+            method: 'get',
+            params: data,
+            headers: {
+              isToken: false
+            },
+        })
+    },
+    //同步考试视频信息
+    appcommonwisdomSyncExamVideo(data) {
+        return request({
+            url: '/app/common/wisdomSyncExamVideo',
+            method: 'get',
+            params: data,
+            headers: {
+              isToken: false
+            },
+        })
+    },
+    //批量同步考试计划用户
+    appcommonwsyncApplyUserInfo(data) {
+        return request({
+            url: '/app/common/syncApplyUserInfo',
+            method: 'get',
+            params: data,
+            headers: {
+              isToken: false
+            },
+        })
+    },
 }

+ 176 - 0
src/newApi/archives.js

@@ -0,0 +1,176 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //查询档案列表
+    appuserdangAnList(data) {
+        return request({
+            url: '/app/user/dangAnList',
+            isProce:true,
+            method: 'get',
+            params: data
+        })
+    },
+    //获取客户端用户详细信息
+    appuserid(data) { 
+        return request({
+            url: '/app/user/'+data,
+            method: 'get',
+        })
+    },
+    //查询档案网课列表
+    userdangAnlistVideoUserPeriod(data) {
+        return request({
+            url: '/user/dangAn/listVideoUserPeriod',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询档案订单列表
+    userdangAnlistOrder(data) {
+        return request({
+            url: '/user/dangAn/listOrder',
+            isProce:true,
+            method: 'get',
+            params: data
+        })
+    },
+    //查询档案题库列表
+    userdangAnlistUserExam(data) {
+        return request({
+            url: '/user/dangAn/listUserExam',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询档案报名列表
+    userdangAnlistBKUserPeriod(data) {
+        return request({
+            url: '/user/dangAn/listBKUserPeriod',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询档案直播列表
+    userdangAnlistUserLive(data) {
+        return request({
+            url: '/user/dangAn/listUserLive',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询档案资料列表
+    userdangAnlistUserHandouts(data) {
+        return request({
+            url: '/user/dangAn/listUserHandouts',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询档案证书列表
+    userdangAnlistUserCertificate(data) {
+        return request({
+            url: '/user/dangAn/listUserCertificate',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //获取证书详细信息
+    userdangAncertificateDetail(data) {
+        return request({
+            url: '/user/dangAn/certificateDetail',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //学员约考记录
+    userdangAnlistUserSubscribe(data) {
+        return request({
+            url: '/user/dangAn/listUserSubscribe',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //学员考试记录
+    userdangAnlistUserApply(data) {
+        return request({
+            url: '/user/dangAn/listUserApply',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //学员承诺书记录
+    userdangAnlistPromise(data) {
+        return request({
+            url: '/user/dangAn/listPromise',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询学员直播学习记录列表
+    userdangAnlistUserStudyLiveRecord(data) {
+        return request({
+            url: '/user/dangAn/listUserStudyLiveRecord',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //查询学员题库学习记录列表
+    userdangAnlistUserStudyExamRecord(data) {
+        return request({
+            url: '/user/dangAn/listUserStudyExamRecord',
+            method: 'get',
+            isProce:true,
+            params: data
+        })
+    },
+    //学员资料导入更新
+    userdangAnuserDataImportUp(data) {
+        return request({
+            url: '/user/dangAn/userDataImportUp',
+            method: 'post',
+            data
+        })
+    }, 
+    //学员资料照片导入
+    userdangAnuserDataImgImport(data) {
+        return request({
+            url: '/user/dangAn/userDataImgImport',
+            method: 'post',
+            data
+        })
+    },
+    //学员资料批量下载
+    userdangAndatadownload(data) {
+        return request({
+            url: '/user/dangAn/data/download',
+            method: 'post',
+            data
+        })
+    },
+    //学员资料下载任务
+    userdangAndatadownloadlist(data) {
+        return request({
+            url: '/user/dangAn/data/download/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //学员资料下载任务回调
+    userdangAndatadownloadup(data) {
+        return request({
+            url: '/user/dangAn/data/download/up',
+            method: 'post',
+            data
+        })
+    },
+}

+ 28 - 1
src/newApi/business.js

@@ -55,7 +55,6 @@ export default {
             data
         })
     },
-
     //修改业务层次-退款审核
     editRefundPeriodUserIdsCourseBusiness(data) {
         return request({
@@ -64,5 +63,33 @@ export default {
             data
         })
     },
+    //新增业务层次过滤器
+    addBasefilter(data) {
+        return request({
+            url: '/base/filter',
+            method: 'post',
+            data
+        })
+    },
+    //查询业务层次过滤器列表
+    basefilterlist(data) {
+        return request({
+            url: '/base/filter/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //根据名称查找业务层ID
+    coursebusinessqueryFullId(data) {
+        return request({
+            url: '/course/business/queryFullId',
+            method: 'get',
+            headers:{
+                isToken:false,
+            },
+            params: data
+        })
+    },
+    
 
 }

+ 100 - 0
src/newApi/classTab.js

@@ -16,6 +16,14 @@ export default {
             params: data
         })
     },
+    //导出商品的课程结构
+    inquireGradegradeexportGoodsMenuExcel(data) {
+        return request({
+            url: '/grade/grade/exportGoodsMenuExcel',
+            method: 'get',
+            params: data
+        })
+    },
     //选新班
     gradegradechangeGrade(data) {
         return request({
@@ -64,6 +72,14 @@ export default {
             params: data
         })
     },
+    //查询班级列表-s
+    inquireGradegradesearchList(data) {
+        return request({
+            url: '/grade/grade/search/list',
+            method: 'get',
+            params: data
+        })
+    },
     //查询班级学员列表
     inquireGradegradelistGrade(data) {
         return request({
@@ -72,6 +88,14 @@ export default {
             params: data
         })
     },
+    //导出班级学员列表
+    inquireGradegradeexportGrade(data) {
+        return request({
+            url: '/grade/grade/exportListGrade',
+            method: 'get',
+            params: data
+        })
+    },
     //查询学员学时列表
     inquireGradegradelistUserPeriod(data) {
         return request({
@@ -85,6 +109,9 @@ export default {
         return request({
             url: '/grade/grade/listUserPeriod',
             method: 'get',
+            headers: {
+                isToken: false
+            },
             params: data
         })
     },
@@ -124,6 +151,9 @@ export default {
         return request({
             url: '/grade/grade/listPeriod',
             method: 'get',
+            headers: {
+                isToken: false
+            },
             params: data
         })
     },
@@ -140,6 +170,9 @@ export default {
         return request({
             url: '/grade/grade/listPeriodAudit',
             method: 'get',
+            headers: {
+                isToken: false,
+            },
             params: data
         })
     },
@@ -256,4 +289,71 @@ export default {
             data
         })
     },
+    //修改客户端用户密码
+    appuserupdatePwd(data) {
+        return request({
+            url: '/app/user/updatePwd',
+            method: 'post',
+            data
+        })
+    },
+    //查询其他平台班级学员列表
+    inquireGradegradeotherClassuser(data) {
+        return request({
+            url: '/grade/grade/other/Class/user',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取平台列表
+    inquiresystemoldorglist(data) {
+        return request({
+            url: '/system/old/org/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出班级学员列表
+    inquireGradegradeotherClassuserexport(data) {
+        return request({
+            url: '/grade/grade/other/Class/user/export',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询学员视频学习记录列表
+    inquireGradegradelistUserVideoRecord(data) {
+        return request({
+            url: '/grade/grade/listUserVideoRecord',
+            method: 'get',
+            headers: {
+                isToken: false
+            },
+            params: data
+        })
+    },
+    //按周查询学员学时学习记录列表
+    inquireGradegradelistUserPeriodWeekRecord(data) {
+        return request({
+            url: '/grade/grade/listUserPeriodWeekRecord',
+            method: 'get',
+            params: data
+        })
+    },
+    //周查询学员学习记录列表
+    inquireGradegradelistUserStudyRecordV2Week(data) {
+        return request({
+            url: '/grade/grade/listUserStudyRecordV2Week',
+            method: 'get',
+            params: data
+        })
+    },
+    //周导出学员学时列表
+    gradegradeexportWeek(data) {
+        return request({
+            url: '/grade/grade/exportWeek',
+            method: 'post',
+            data
+        })
+    },
 }

+ 16 - 0
src/newApi/colleges.js

@@ -31,4 +31,20 @@ export default {
             method: 'get',
         })
     },
+    //查询用户视频学习日志列表
+    inquireUserStudyloglist(data) {
+        return request({
+            url: '/user/study/log/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询用户访问日志列表
+    inquireUserVisitloglist(data) {
+        return request({
+            url: '/user/visit/log/list',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 72 - 0
src/newApi/course.js

@@ -46,4 +46,76 @@ export default {
             method: 'get',
         })
     },
+    //查询商品课程列表
+    obtainCourseGoodsList(data) {
+        return request({
+            url: `/goods/course/getList`,
+            method: 'get',
+            params: data
+        })
+    },
+    //查询商品双师资模板列表
+    inquireCourseTeacherList(data) {
+        return request({
+            url: `/goods/course/teacher/list`,
+            method: 'get',
+            params: data
+        })
+    },
+    //新增商品双师资模板
+    addCourseTeacherList(data) {
+        return request({
+            url: `/goods/course/teacher`,
+            method: 'post',
+            data
+        })
+    },
+    //修改商品双师资模板
+    editCourseTeacherList(data) {
+        return request({
+            url: `/goods/course/teacher/edit`,
+            method: 'post',
+            data
+        })
+    },
+    //课程统计报表
+    inquireCoursestatement(data) {
+        return request({
+            url: '/course/statement',
+            method: 'get',
+            params: data
+        })
+    },
+    //课程详情统计
+    inquireCoursedetailstatistics(data) {
+        return request({
+            url: '/course/detail/statistics',
+            method: 'get',
+            params: data
+        })
+    },
+    //学员观看记录
+    inquireCourseuserwatch(data) {
+        return request({
+            url: '/course/user/watch',
+            method: 'get',
+            params: data
+        })
+    },
+    //课程维度导出
+    inquireCoursestatementexport(data) {
+        return request({
+            url: '/course/statement/export',
+            method: 'get',
+            params: data
+        })
+    },
+    //课程学员详情导出
+    inquireCoursestatementstatisticsexport(data) {
+        return request({
+            url: '/course/detail/statistics/export',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 79 - 0
src/newApi/examapply.js

@@ -95,4 +95,83 @@ export default {
             params: data
         })
     },
+    //获取考试安排的前培计划详细信息
+    obtainsystemapplygetBefore(data) {
+        return request({
+            url: `/system/apply/getBefore/` + data,
+            method: 'get',
+        })
+    },
+    //查询考场列表
+    inquireexamapplyplaceList(data) {
+        return request({
+            url: '/system/apply/place',
+            method: 'get',
+            params: data
+        })
+    },
+    //考前须知
+    examapplybeforeknow(data) {
+        return request({
+            url: '/system/apply/before/know',
+            method: 'get',
+            params: data
+        })
+    },
+    //根据月份获取当月考试场次
+    obtainsystemsubscribesessiondata(data) {
+        return request({
+            url: `/system/subscribe/session/` + data,
+            method: 'get',
+        })
+    },
+    //七大员题库商品导入开通
+    importorderquestionopen(data) {
+        return request({
+            url: '/order/question/open/import',
+            method: 'post',
+            data
+        })
+    },
+    
+    //考前须知修改
+    systemapplysaveorupbeforeknow(data) {
+        return request({
+            url: '/system/apply/saveorup/before/know',
+            method: 'post',
+            data
+        })
+    },
+    //考场邮件地址
+    examapplysendmail(data) {
+        return request({
+            url: '/system/apply/sendmail',
+            method: 'get',
+            params: data
+        })
+    },
+    //考场邮件发送
+    systemapplysend(data) {
+        return request({
+            url: '/system/apply/send',
+            method: 'post',
+            data
+        })
+    },
+    //七大员学员资料导出
+    systemapplyuserprofileexport(data) {
+        return request({
+            url: '/system/apply/user/profile/export',
+            method: 'post',
+            data
+        })
+    },
+    //七大员学员资料批量变更
+    systemapplyuserprofile(data) {
+        return request({
+            url: '/system/apply/user/profile',
+            method: 'post',
+            data
+        })
+    },
 }

+ 16 - 0
src/newApi/festival.js

@@ -63,4 +63,20 @@ export default {
             data
         })
     },
+    //保存课程小节观看权限
+    coursesectionaddwatchper(data) {
+        return request({
+            url: '/course/section/add/watch/per',
+            method: 'post',
+            data
+        })
+    },
+    //获取课程小节观看权限
+    coursesectionwatchper(data) {
+        return request({
+            url: '/course/section/watch/per',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 61 - 0
src/newApi/goods.js

@@ -40,6 +40,14 @@ export default {
             params: data
         })
     },
+    // 获取题库商品每日一练试卷列表
+    getBankGoodsExamList(id) {
+        return request({
+            url: '/goods/getBankGoodsExamList/' + id,
+            method: 'get',
+        })
+    },
+
     //查询前培或补考商品列表
     inquireGoodslistGoods(data) {
         return request({
@@ -56,6 +64,18 @@ export default {
             params: data
         })
     },
+    //查询商品列表监管
+    commonfreegoodslist(data) {
+        return request({
+            url: '/common/free/goods/list',
+            method: 'get',
+            headers: {
+                isToken: false
+            },
+            params: data
+        })
+    },
+
     //获取商品详细信息
     obtainGoods(data) {
         return request({
@@ -95,6 +115,22 @@ export default {
             data
         })
     },
+    //新增讲义商品
+    addGoodshandouts(data) {
+        return request({
+            url: '/goods/handouts',
+            method: 'post',
+            data
+        })
+    },
+    //修改讲义商品
+    editGoodshandouts(data) {
+        return request({
+            url: '/goods/handouts/edit',
+            method: 'post',
+            data
+        })
+    },
     //查询编辑数据是否有用户通过学时
     gradecheckGoodsChange(data) {
         return request({
@@ -127,4 +163,29 @@ export default {
             params: data
         })
     },
+    //商品专题页查询
+    inquirecoursetopiclist(data) {
+        return request({
+            url: '/course/topic/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //商品修改-复制
+    goodsnodecopyadd(data) {
+        return request({
+            url: '/goods/node/copy/add',
+            method: 'post',
+            data
+        })
+    },
+    //商品修改-复制讲义
+    goodshandoutscopyadd(data) {
+        return request({
+            url: '/goods/handouts/copy/add',
+            method: 'post',
+            data
+        })
+    },
+    
 }

+ 44 - 2
src/newApi/handout.js

@@ -3,7 +3,7 @@ export default {
     //新增讲义列
     addCourseHandouts(data) {
         return request({
-            url: '/course/handouts',
+            url: '/course/handouts/save',
             method: 'post',
             data
         })
@@ -11,7 +11,7 @@ export default {
     //修改讲义列
     editCourseHandouts(data) {
         return request({
-            url: '/course/handouts/edit',
+            url: '/course/handouts/edit/handouts',
             method: 'post',
             data
         })
@@ -31,4 +31,46 @@ export default {
             method: 'get',
         })
     },
+    //获取讲义列详细信息s
+    inquireCourseHandoutsfiledetail(data) {
+        return request({
+            url: '/course/handouts/file/detail',
+            method: 'get',
+            params: data
+        })
+    },
+    //切片上传
+    commondecompression(data) {
+        return request({
+            url: process.env.VUE_APP_BASE_API_QP+'/common/decompression',
+            method: 'post',
+            headers: {
+              isToken: false
+            },
+            data
+        })
+    },
+    //判断完整性
+    commonmergefile(data) {
+        return request({
+            url: process.env.VUE_APP_BASE_API_QP+'/common/merge/file',
+            method: 'post',
+            headers: {
+              isToken: false
+            },
+            data
+        })
+    },
+    //删除后台切片缓存
+    commondeletefile(data) {
+        return request({
+            url: process.env.VUE_APP_BASE_API_QP+'/common/delete/file',
+            method: 'post',
+            headers: {
+              isToken: false
+            },
+            data
+        })
+    },
+    
 }

+ 8 - 0
src/newApi/mockSub.js

@@ -31,4 +31,12 @@ export default {
             method: 'get',
         })
     },
+    //模考导出
+    exportMockrecordData(data) {
+        return request({
+            url: '/user/subscribe/listSubscribe/export',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 8 - 0
src/newApi/modules.js

@@ -45,4 +45,12 @@ export default {
             method: 'get',
         })
     },
+    //导入章节模板
+    CoursemoduleimportData(data) {
+        return request({
+            url: '/course/module/importData',
+            method: 'post',
+            data
+        })
+    },
 }

+ 31 - 0
src/newApi/notificationFL.js

@@ -31,4 +31,35 @@ export default {
             method: 'get',
         })
     },
+    //查询通知绑定系统用户列表
+    inquireinformsys_userlist(data) {
+        return request({
+            url: '/inform/sys_user/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取通知绑定教务用户未读消息数量
+    inquireinformsys_userinformUnReadSum(data) {
+        return request({
+            url: '/inform/sys_user/informUnReadSum',
+            method: 'get',
+            params: data
+        })
+    },
+    //批量修改通知绑定系统用户状态
+    editupdateReadStatusBatch(data) {
+        return request({
+            url: '/inform/sys_user/updateReadStatusBatch',
+            method: 'post',
+            data
+        })
+    },
+    //获取通知绑定系统用户详细信息
+    informsys_user(data) {
+        return request({
+            url: `/inform/sys_user/` + data,
+            method: 'get',
+        })
+    },
 }

+ 9 - 0
src/newApi/order.js

@@ -39,6 +39,15 @@ export default {
             method: 'get',
         })
     },
+    //获取退款订单详细子列表
+    obtainOrderRefundlistAll(data) {
+        return request({
+            url: `/order/refund/listAll/goods`,
+            method: 'get',
+            params: data
+        })
+    },
+    
     //修改订单商品
     editordergoods(data) {
         return request({

+ 112 - 0
src/newApi/orderInvoice.js

@@ -0,0 +1,112 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //企业订单发票审核
+    orderinvoicecompanycheck(data) {
+        return request({
+            url: '/order/invoice/company/check',
+            method: 'post',
+            data
+        })
+    },
+    //企业订单发票批量处理
+    orderinvoicecompanybatchhandle(data) {
+        return request({
+            url: '/order/invoice/company/batch/handle',
+            method: 'post',
+            data
+        })
+    },
+    //查询企业订单发票列表
+    orderinvoicecompanylist(data) {
+        return request({
+            url: '/order/invoice/company/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询企业订单发票统计
+    orderinvoicecompanystatistics(data) {
+        return request({
+            url: '/order/invoice/company/statistics',
+            method: 'get',
+            params: data
+        })
+    },
+    
+    //查询企业订单发票详情
+    orderinvoicecompanydetail(data) {
+        return request({
+            url: '/order/invoice/company/detail/'+data,
+            method: 'get'
+        })
+    },
+
+
+    
+    //经办录单审核
+    orderhandlecheck(data) {
+        return request({
+            url: '/order/handle/check',
+            method: 'post',
+            data
+        })
+    },
+    //经办录单退款审核
+    orderhandlerefundcheck(data) {
+        return request({
+            url: '/order/handle/refund/check',
+            method: 'post',
+            data
+        })
+    },
+    //查询经办录单详情
+    orderhandledetail(data) {
+        return request({
+            url: '/order/handle/detail',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询经办录单商品列表
+    orderhandlegoodsList(data) {
+        return request({
+            url: '/order/handle/goodsList',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询经办录单列表
+    orderhandlelist(data) {
+        return request({
+            url: '/order/handle/list',
+            method: 'get',
+            params: data,
+            isProce:true
+        })
+    },
+    //查询经办录单统计
+    orderhandlestatistics(data) {
+        return request({
+            url: '/order/handle/statistics',
+            method: 'get',
+            params: data,
+            isProce:true
+        })
+    },
+    //获取经办订单收款信息
+    orderhandleBank(data) {
+        return request({
+            url: '/order/handleBank',
+            method: 'get',
+            params: data
+        })
+    },
+    //修改经办订单收款信息
+    orderedithandleBank(data) {
+        return request({
+            url: '/order/edit/handleBank',
+            method: 'post',
+            data
+        })
+    },
+}

+ 24 - 0
src/newApi/paperquestion.js

@@ -63,6 +63,22 @@ export default {
             data
         })
     },
+    //导入建匠题目Word模板列表
+    bankquestionimportJJWordQuestionList(data) {
+        return request({
+            url: '/bank/question/importJJWordQuestionList',
+            method: 'post',
+            data
+        })
+    },
+    //导入学监题目Word模板列表
+    bankquestionimportXueJianWordQuestionList(data) {
+        return request({
+            url: '/bank/question/importXueJianWordQuestionList',
+            method: 'post',
+            data
+        })
+    },
     //导入题目模板EXCEL
     importDatabankimportDataBackList(data) {
         return request({
@@ -71,4 +87,12 @@ export default {
             data
         })
     },
+    //导入题目模板EXCEL(旧系统)
+    importDataBackFromOldList(data) {
+        return request({
+            url: '/bank/question/importDataBackFromOldList',
+            method: 'post',
+            data
+        })
+    },
 }

+ 8 - 0
src/newApi/studentList.js

@@ -88,6 +88,14 @@ export default {
             params: data
         })
     },
+    // 导出學員用户列表
+    inquiregradestudentlistStudentExport(data) {
+        return request({
+            url: '/grade/student/listStudentExport',
+            method: 'get',
+            params: data
+        })
+    },
     
 
 }

+ 55 - 0
src/newApi/systemExam.js

@@ -0,0 +1,55 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增新增活动
+    addSystemexamactivity(data) {
+        return request({
+            url: '/system/exam/activity/add',
+            method: 'post',
+            data
+        })
+    },
+    //修改活动
+    editSystemexamactivity(data) {
+        return request({
+            url: '/system/exam/activity/update',
+            method: 'post',
+            data
+        })
+    },
+    //获取活动列表
+    inquireSystemexamactivitylist(data) {
+        return request({
+            url: '/system/exam/activity/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取活动信息
+    inquireSystemexamactivitydetail(data) {
+        return request({
+            url: '/system/exam/activity/detail/' + data,
+            method: 'get',
+        })
+    },
+    //获取活动用户列表
+    inquireSystemexamactivityuserlist(data) {
+        return request({
+            url: '/system/exam/activity/user/list/' + data,
+            method: 'get',
+        })
+    },
+    //导出活动用户
+    exportsystemexamactivity(data) {
+        return request({
+            url: '/system/exam/activity/export/' + data,
+            method: 'get',
+        })
+    },
+    //获取活动报名二维码
+    exportsystemexamactivitycode(data) {
+        return request({
+            url: '/system/exam/activity/apply/code/' + data,
+            method: 'get',
+        })
+    },
+}

+ 25 - 0
src/newApi/systemRemind.js

@@ -39,5 +39,30 @@ export default {
             params: data
         })
     },
+    //检查密码修改时间
+    inquireusercheckPwdTime(data) {
+        return request({
+            url: '/system/user/checkPwdTime',
+            method: 'get',
+            params: data
+        })
+    },
+    //学时抽查
+    commonfreedecryptOfficialInfo(data) {
+        return request({
+            url: '/common/free/decryptOfficialInfo',
+            method: 'post',
+            data
+        })
+    },
+    //施工继教学时抽查
+    commonfreedecryptSevenOfficialInfo(data) {
+        return request({ 
+            url: '/common/free/decryptSevenOfficialInfo',
+            method: 'post',
+            data
+        })
+    },
+    
     
 }

+ 23 - 0
src/newApi/userInformationManagement.js

@@ -31,4 +31,27 @@ export default {
             method: 'get',
         })
     },
+    //获取企业ID
+    commonfreefindTenantId(data) {
+        return request({
+            url: '/common/free/findTenantId',
+            method: 'get',
+            params: data,
+            headers: {
+                isToken: false
+              },
+        })
+    },
+    //获取系统配置
+    commonfreeconfig(data) {
+        return request({
+            url: '/common/free/config',
+            method: 'get',
+            params: data,
+            headers: {
+                isToken: false
+              },
+        })
+    },
+
 }

+ 104 - 16
src/permission.js

@@ -1,28 +1,82 @@
 import router from './router'
 import store from './store'
-import { Message } from 'element-ui'
+import { MessageBox, Message } from 'element-ui'
 import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import methods from '@/utils/methodsTool';
-import { getToken } from '@/utils/auth'
+import { getToken, setToken } from '@/utils/auth'
+import { checkSession, spotCheckFunc } from '@/utils/spotCheck'
+import $api from "@/api/api"
 
 NProgress.configure({ showSpinner: false })
-
+let spotCheckData = {}
 const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
-
-router.beforeEach((to, from, next) => {
+router.beforeEach(async (to, from, next) => {
   if (to.path !== from.path) {
     NProgress.start();
   }
-  if (methods.getQueryVariable('TenantId') && !sessionStorage.TenantId) {
-    sessionStorage.TenantId = methods.getQueryVariable('TenantId')
+  if (to.path === '/login' && to.query.account) {
+    await store.dispatch('oldLogin', to.query)
+  } else {
+    if (to.path === '/login' && !methods.getQueryVariable('TenantId')) {
+      sessionStorage.removeItem('TenantId')
+    }
+    if (methods.getQueryVariable('TenantId')) {
+      sessionStorage.TenantId = methods.getQueryVariable('TenantId')
+    } else if (!sessionStorage.TenantId && !(to.path.includes('/spotCheck') || to.path.includes('/spotCheck2'))) {
+      await store.dispatch('findTenantId')
+    }
   }
-  if (methods.getQueryVariable('TenantId') && sessionStorage.TenantId == undefined) {
-    sessionStorage.TenantId = methods.getQueryVariable('TenantId')
+  //监管人员抽查处理
+  if (to.path.includes('/spotCheck') || to.path.includes('/spotCheck2')) {
+    let array = to.path.split('/').filter(i => !!i)
+    sessionStorage.TenantId = array[1]
+    if (to.query.data) {
+      to.query.data = to.query.data.replace(/\s/g, '+')
+      store.dispatch('FedLogOut')
+      await new Promise((resolve) => {
+        let url = ''
+        switch (array[0]) {
+          case "spotCheck":
+            url = 'commonfreedecryptOfficialInfo'
+            break;
+          case "spotCheck2":
+            url = 'commonfreedecryptSevenOfficialInfo'
+            break;
+
+          default:
+            break;
+        }
+        $api[url]({ data: to.query.data }).then(res => {
+          let data = {
+            userId: res.data.userId,
+            realName: res.data.realName,
+            id: res.data.gradeId,
+            className: res.data.className,
+            goodsId: res.data.goodsId,
+            goodsName: res.data.goodsName,
+            orderGoodsId: res.data.orderGoodsId,
+            fullName: res.data.fullName,
+            token: res.data.token,
+            keyId: `${res.data.userId}-${res.data.goodsId}-${res.data.gradeId}-${res.data.orderGoodsId}`,
+          };
+          sessionStorage.TenantId = res.data.tenantId
+          setToken(data.token)
+          store.commit('SET_TOKEN', data.token)
+          spotCheckData = data
+          resolve()
+        }).catch(() => {
+          Message.error("数据错误,解析失败")
+          store.dispatch('FedLogOut')
+          next(`/login?TenantId=${sessionStorage.TenantId}`)
+        })
+      })
+    }
   }
-  if (methods.getQueryVariable('TenantId') && sessionStorage.TenantId != methods.getQueryVariable('TenantId')) {
-    sessionStorage.TenantId = methods.getQueryVariable('TenantId')
+  if (sessionStorage.TenantId && !store.state.user.companyName) {
+    store.dispatch('footerData')
   }
+
   if (getToken()) {
     to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
     /* has token*/
@@ -36,7 +90,18 @@ router.beforeEach((to, from, next) => {
           store.dispatch('GenerateRoutes').then(accessRoutes => {
             // 根据roles权限生成可访问的路由表
             router.addRoutes(accessRoutes) // 动态添加可访问路由表
-            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+            if (to.path.includes('/spotCheck')) {
+              checkSession(spotCheckData)
+                .then(() => {
+                  //学时审核
+                  next({ path: '/classHoursReviews', replace: true })
+                })
+                .catch(() => {
+                  Message.error("存在异常,请联系开发人员")
+                });
+            } else {
+              next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+            }
           })
         }).catch(err => {
           store.dispatch('LogOut').then(() => {
@@ -45,9 +110,16 @@ router.beforeEach((to, from, next) => {
           })
         })
       } else {
+        if (!to.path.includes('/user/profile')) {
+          checkFunc()
+        }
         if (!to.query.TenantId) {
-          to.query.TenantId = sessionStorage.TenantId
-          next(to)
+          let query = to.query
+          query.TenantId = sessionStorage.TenantId
+          next({
+            path: to.path,
+            query: query
+          })
         } else {
           next()
         }
@@ -62,13 +134,29 @@ router.beforeEach((to, from, next) => {
       if (sessionStorage.TenantId == undefined) {
         next(`/login`) // 否则全部重定向到登录页
       } else {
-        next(`/login?redirect=${to.fullPath}&TenantId=${sessionStorage.TenantId}`) // 否则全部重定向到登录页
+        next(`/login?TenantId=${sessionStorage.TenantId}`) // 否则全部重定向到登录页
       }
       NProgress.done()
     }
   }
 })
-
+function checkFunc() {
+  $api.inquireusercheckPwdTime().then(res => {
+    if (res.data) {
+      MessageBox.confirm('您已90天为修改密码,请前往修改密码', '系统提示', {
+        confirmButtonText: '前往修改',
+        showCancelButton: false,
+        closeOnClickModal: false,
+        closeOnPressEscape: false,
+        showClose: false,
+        type: 'warning'
+      }
+      ).then(() => {
+        location.href = '/user/profile';
+      }).catch(() => { });
+    }
+  })
+}
 router.afterEach(() => {
   NProgress.done()
 })

+ 0 - 5
src/router/index.js

@@ -48,11 +48,6 @@ export const constantRoutes = [
     component: (resolve) => require(['@/views/login'], resolve),
     hidden: true
   },
-  {
-    path: '/register',
-    component: (resolve) => require(['@/views/register'], resolve),
-    hidden: true
-  },
   {
     path: '/404',
     component: (resolve) => require(['@/views/error/404'], resolve),

+ 1 - 1
src/settings.js

@@ -12,7 +12,7 @@ module.exports = {
   /**
    * 是否显示顶部导航
    */
-  topNav: true,
+  topNav: false,
 
   /**
    * 是否显示 tagsView

+ 9 - 0
src/store/getters.js

@@ -1,6 +1,7 @@
 import api from '@/api/api'
 
 const getters = {
+  downLoadlist: state => state.user.downLoadlist,//档案任务列表
   modulePage: state => state.dataCache.modulePage,//模块变化
   festivalPage: state => state.dataCache.festivalPage,//章变化
   chapterExamPage: state => state.dataCache.chapterExamPage,//章卷变化
@@ -21,6 +22,14 @@ const getters = {
   topbarRouters: state => state.permission.topbarRouters,
   defaultRoutes: state => state.permission.defaultRoutes,
   sidebarRouters: state => state.permission.sidebarRouters,
+  distributionList(state) {
+    if (!state.dict.distributionList) {
+      api.distributiontemplist({ status: 1 }).then(res => {
+        state.dict.distributionList = res.rows
+      })
+    }
+    return state.dict.distributionList
+  },
   indexnum(state) {
     if (!state.dict.indexnum) {
       api.inquireGradegradelistUserPeriod({ status: 1, periodStatus: 2, pageSize: 1, pageNum: 1 }).then(res => {

+ 7 - 0
src/store/modules/dict.js

@@ -31,8 +31,15 @@ const state = {
   beforeList: null,//前培安排过滤
   beforeLists: null,//前培安排
   indexnum: null,//模拟
+  distributionList:null,//活动列表
 }
 const mutations = {
+  //更新活动列表
+  DISTRIBUTIONLIST(state) {
+    api.distributiontemplist({ status: 1 }).then(res => {
+      state.distributionList = res.rows
+    })
+  },
   //更新角色列表
   EDICROLELIST(state) {
     api.obtainRoleList({ status: 1 }).then(res => {

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