Tang 2 سال پیش
والد
کامیت
d35e4b99d1
82فایلهای تغییر یافته به همراه11078 افزوده شده و 1688 حذف شده
  1. 5 5
      public/index.html
  2. 3 0
      src/api/api.js
  3. 4 1
      src/api/login.js
  4. 2 1
      src/components/searchBoxNew.vue
  5. 300 0
      src/components/subjectCy/index.vue
  6. 8 5
      src/components/tableList.vue
  7. 7 0
      src/layout/components/Navbar.vue
  8. 49 1
      src/newApi/applicationData.js
  9. 176 0
      src/newApi/archives.js
  10. 1 1
      src/newApi/systemRemind.js
  11. 15 7
      src/permission.js
  12. 1 0
      src/store/getters.js
  13. 31 2
      src/store/modules/user.js
  14. 28 0
      src/utils/common.js
  15. 11 3
      src/utils/methodsTool.js
  16. 9 2
      src/utils/request.js
  17. 1 1
      src/utils/uploadFile.js
  18. 1 1
      src/views/2Cport/adSlotManagement/tab2.vue
  19. 31 2
      src/views/2Cport/pageSettings/H5_small.vue
  20. 18 1
      src/views/2Cport/pageSettings/footer.vue
  21. 51 1
      src/views/2Cport/pageSettings/header.vue
  22. 297 0
      src/views/Marketing/goods/commodityManageMent/add/courseContent/bankView.vue
  23. 22 0
      src/views/Marketing/goods/commodityManageMent/add/courseContent/index.vue
  24. 3 1
      src/views/Marketing/goods/commodityManageMent/add/index.vue
  25. 9 4
      src/views/Marketing/goods/commodityManageMent/add/issueAcertificate.vue
  26. 1 0
      src/views/Marketing/goods/commodityManageMent/add/productInformation.vue
  27. 298 0
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/bankView.vue
  28. 4 0
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/courseCheck.vue
  29. 22 0
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/index.vue
  30. 14 1
      src/views/Marketing/goods/commodityManageMent/edit/index.vue
  31. 7 1
      src/views/Marketing/goods/commodityManageMent/edit/issueAcertificate.vue
  32. 3 2
      src/views/Marketing/goods/commodityManageMent/edit/productInformation.vue
  33. 7 0
      src/views/Marketing/goods/commodityManageMent/index.vue
  34. 1 1
      src/views/Marketing/order/offlineOrder/index.vue
  35. 5 0
      src/views/Marketing/order/offlineOrder/orderDetailsT/index.vue
  36. 5 0
      src/views/Marketing/order/orderList/index.vue
  37. 8 1
      src/views/classHoursReview/component/ChapterTable.vue
  38. 65 11
      src/views/classHoursReview/component/LessonTable.vue
  39. 21 3
      src/views/classHoursReview/component/ModulTable.vue
  40. 89 95
      src/views/classHoursReview/component/StudyTables.vue
  41. 1 0
      src/views/classHoursReview/studyTimes.vue
  42. 513 0
      src/views/education/archives/archivesDetails/bankRecords/LearningRecord.vue
  43. 253 0
      src/views/education/archives/archivesDetails/bankRecords/index.vue
  44. 288 0
      src/views/education/archives/archivesDetails/certificateRecords.vue
  45. 213 0
      src/views/education/archives/archivesDetails/commitment.vue
  46. 282 0
      src/views/education/archives/archivesDetails/courseRecords/ClassHour.vue
  47. 571 0
      src/views/education/archives/archivesDetails/courseRecords/LearningRecord.vue
  48. 278 0
      src/views/education/archives/archivesDetails/courseRecords/index.vue
  49. 259 0
      src/views/education/archives/archivesDetails/examRecords.vue
  50. 133 0
      src/views/education/archives/archivesDetails/index.vue
  51. 369 0
      src/views/education/archives/archivesDetails/jokaRecords.vue
  52. 556 0
      src/views/education/archives/archivesDetails/liveRecords/LearningRecord.vue
  53. 225 0
      src/views/education/archives/archivesDetails/liveRecords/index.vue
  54. 313 0
      src/views/education/archives/archivesDetails/orderRecords.vue
  55. 147 0
      src/views/education/archives/archivesDetails/personalData.vue
  56. 206 0
      src/views/education/archives/archivesDetails/profileRecords/index.vue
  57. 230 0
      src/views/education/archives/archivesDetails/registrationRecord.vue
  58. 110 0
      src/views/education/archives/downListRW.vue
  59. 166 0
      src/views/education/archives/fileDownload.vue
  60. 457 0
      src/views/education/archives/index.vue
  61. 128 0
      src/views/education/archives/plLeadInfoBox.vue
  62. 125 0
      src/views/education/archives/plUpdateBox.vue
  63. 51 0
      src/views/education/classManageMent/classHoursReview/component/LessonTable.vue
  64. 6 0
      src/views/education/classManageMent/classHoursReview/component/ModulTable.vue
  65. 89 96
      src/views/education/classManageMent/classHoursReview/component/StudyTables.vue
  66. 4 0
      src/views/education/classManageMent/listOfhoursToBeReviewed/index.vue
  67. 2 2
      src/views/education/classManageMent/otherPlatforms/index.vue
  68. 1 0
      src/views/education/classManageMent/studentMenu/index.vue
  69. 19 0
      src/views/education/dataReview/informationTemplate/index.vue
  70. 151 0
      src/views/education/examManagement/sevenExamData/dialog.vue
  71. 77 36
      src/views/education/examManagement/sevenExamData/index.vue
  72. 127 0
      src/views/education/examManagement/sevenExamData/workList.vue
  73. 1 1
      src/views/education/studentManageMent/studentXQ/studentBaseManage.vue
  74. 1967 0
      src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index copy.vue
  75. 9 1138
      src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue
  76. 23 244
      src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue
  77. 18 10
      src/views/resource/videoManagement/courseManagement/chapterContent/index.vue
  78. 117 0
      src/views/resource/videoManagement/moduleManagement/add/index.vue
  79. 126 0
      src/views/resource/videoManagement/moduleManagement/edit/index.vue
  80. 1 3
      src/views/secondBuild/courseList/index.vue
  81. 829 0
      src/views/secondSeven/courseList/index.vue
  82. 4 4
      vue.config.js

+ 5 - 5
public/index.html

@@ -13,7 +13,7 @@
   <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
   <!-- <script src="https://manage.xyyxt.net/static/js/gsap.min.js"></script> -->
   <!-- 使用CDN的CSS文件 -->
-  <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.13/theme-chalk/index.min.css">
+  <link rel="stylesheet" href="https://file.xyyxt.net/web/static/js/index.min.css">
   <style>
     html,
     body,
@@ -215,10 +215,10 @@
     </div>
   </div>
   <!-- 使用CDN的JS文件 -->
-  <script src="https://cdn.staticfile.org/vue/2.6.12/vue.min.js"></script>
-  <script src="https://cdn.staticfile.org/element-ui/2.15.13/index.min.js"></script>
-  <script src="https://cdn.staticfile.org/axios/0.21.0/axios.min.js"></script>
-  <script src="https://cdn.staticfile.org/vue-router/3.5.1/vue-router.min.js"></script>
+  <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>

+ 3 - 0
src/api/api.js

@@ -101,6 +101,8 @@ 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 poster from '../fxApi/poster'//海报列表
@@ -111,6 +113,7 @@ import check from '../fxApi/check'//分销审核
 
 // 导入对应模块------------------------
 export default {
+    ...archives,
     ...poster,
     ...temp,
     ...check,

+ 4 - 1
src/api/login.js

@@ -82,6 +82,9 @@ export function getCodeImg() {
   return request({
     url: '/captchaImage',
     method: 'get',
-    timeout: 20000
+    timeout: 20000,
+    headers: {
+      isToken: false
+    },
   })
 }

+ 2 - 1
src/components/searchBoxNew.vue

@@ -91,7 +91,7 @@
       <div
         class="fon_s"
         style="padding-top: 10px; width: 70px; text-align: end"
-        v-else
+        v-else-if="!remarkStatus"
       >
         筛选:
       </div>
@@ -541,6 +541,7 @@ export default {
     "advanced",
     "advancedName",
     "classStatus",
+    "remarkStatus"
   ], //参考文档 component.md
   data() {
     return {

+ 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>

+ 8 - 5
src/components/tableList.vue

@@ -248,6 +248,9 @@
             >
             <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>
@@ -1414,11 +1417,11 @@
       >
         <template slot-scope="scope">
           <el-popover width="300" trigger="hover">
-            <p>官方信息推送结果:{{ scope.row.officialStatusMsg || "无" }}</p>
+            <p>学时推送结果:{{ scope.row.periodPlushMsg || "无" }}</p>
             <el-button type="text" slot="reference">{{
-               scope.row.officialStatus === 1
-              ? `是(${scope.row.officialStatusNum})`
-              : "否"
+              scope.row.officialStatus === 1
+                ? `是(${scope.row.officialStatusNum})`
+                : "否"
             }}</el-button>
           </el-popover>
         </template>
@@ -1431,7 +1434,7 @@
       >
         <template slot-scope="scope">
           <el-popover width="300" trigger="hover">
-            <p>学时推送结果:{{ scope.row.periodPlushMsg || "无" }}</p>
+            <p>官方信息推送结果:{{ scope.row.officialStatusMsg || "无" }}</p>
             <el-button type="text" slot="reference">{{
               scope.row.periodPlush ? "已上报" : "未上报"
             }}</el-button>

+ 7 - 0
src/layout/components/Navbar.vue

@@ -189,8 +189,15 @@ export default {
         }
       });
     }
+    this.getDownList();
   },
   methods: {
+    /**
+     * 实时获取下载列表
+     */
+    getDownList() {
+      this.$store.dispatch("downloadlist");
+    },
     /**
      * 立即查看
      */

+ 49 - 1
src/newApi/applicationData.js

@@ -185,5 +185,53 @@ export default {
             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
+            },
+        })
+    },
+
 }

+ 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
+        })
+    },
+}

+ 1 - 1
src/newApi/systemRemind.js

@@ -57,7 +57,7 @@ export default {
     },
     //施工继教学时抽查
     commonfreedecryptSevenOfficialInfo(data) {
-        return request({
+        return request({ 
             url: '/common/free/decryptSevenOfficialInfo',
             method: 'post',
             data

+ 15 - 7
src/permission.js

@@ -21,12 +21,10 @@ router.beforeEach(async (to, from, next) => {
     if (to.path === '/login' && !methods.getQueryVariable('TenantId')) {
       sessionStorage.removeItem('TenantId')
     }
-    if (!sessionStorage.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')
-    } else {
-      if (methods.getQueryVariable('TenantId')) {
-        sessionStorage.TenantId = methods.getQueryVariable('TenantId')
-      }
     }
   }
   //监管人员抽查处理
@@ -57,11 +55,12 @@ router.beforeEach(async (to, from, next) => {
             className: res.data.className,
             goodsId: res.data.goodsId,
             goodsName: res.data.goodsName,
-            orderGoodsId:res.data.orderGoodsId,
+            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
@@ -114,7 +113,16 @@ router.beforeEach(async (to, from, next) => {
         if (!to.path.includes('/user/profile')) {
           checkFunc()
         }
-        next()
+        if (!to.query.TenantId) {
+          let query = to.query
+          query.TenantId = sessionStorage.TenantId
+          next({
+            path: to.path,
+            query: query
+          })
+        } else {
+          next()
+        }
       }
     }
   } else {

+ 1 - 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,//章卷变化

+ 31 - 2
src/store/modules/user.js

@@ -12,7 +12,9 @@ const user = {
     roles: [],
     permissions: [],
     userId: '',
-    companyName: ''
+    companyName: '',
+    downLoadlist: [],//档案下载任务列表
+    downLoadlistInterval: null,//定时器
   },
 
   mutations: {
@@ -37,10 +39,37 @@ const user = {
     set_companyName(state, data) {
       state.companyName = data || ''
       document.title = data || ''
-    }
+    },
+    set_downLoadlist(state, data) {
+      state.downLoadlist = data
+    },
   },
 
   actions: {
+    downloadlist({ commit }, queryData) {
+      let func = () => {
+        api.userdangAndatadownloadlist().then((res) => {
+          let data = res.data || []
+          commit('set_downLoadlist', data)
+          data.forEach(i => {
+            if (i.taskStatus == 3) {
+              api.userdangAndatadownloadup({ taskCode: i.taskCode }).then(result => {
+                methods.exportData(i.taskPath, false)
+              })
+            }
+          })
+        }).catch(() => {
+          clearInterval(this.state.downLoadlistInterval)
+        })
+      }
+      if (queryData) {
+        clearInterval(this.state.downLoadlistInterval)
+      }
+      func()
+      this.state.downLoadlistInterval = setInterval(() => {
+        func()
+      }, 5000);
+    },
     oldLogin({ commit }, queryData) {
       return new Promise(resolve => {
         sessionStorage.TenantId = queryData.tenantId

+ 28 - 0
src/utils/common.js

@@ -0,0 +1,28 @@
+export function paramMate(data) {
+  if (typeof data != "object" && data == null) {
+    return data;
+  }
+  data = JSON.parse(JSON.stringify(data));
+  if (Array.isArray(data)) {
+    data = data.map((e) => {
+      if (isTimeStamp(e)) {
+        e = parseInt(e / 1000);
+      }
+      return e;
+    });
+  } else {
+    for (const key in data) {
+      if (typeof data[key] == "object") {
+        data[key] = paramMate(data[key]);
+      } else {
+        if (isTimeStamp(data[key])) {
+          data[key] = parseInt(data[key] / 1000);
+        }
+      }
+    }
+  }
+  return data;
+}
+export function isTimeStamp(time) {
+  return typeof time == "number" && String(time).length == 13;
+}

+ 11 - 3
src/utils/methodsTool.js

@@ -95,18 +95,23 @@ export default {
 			return true;
 		}
 	},
-	exportData(msg) {
+	exportData(msg, status = true) {
 		if (!msg) {
 			this.$message.warning("导出地址获取错误,请联系开发人员处理")
 			return
 		}
+		if (status) {
+			var baseUrl = baseUrls.baseURL + "common/download?fileName="
+		} else {
+			var baseUrl = baseUrls.BASE_IMG_URL + '/'
+		}
 		let url =
-			baseUrls.baseURL + "common/download?fileName=" + msg;
+			baseUrl + msg;
 		let link = document.createElement("a");
 		let fileName = "导入模板" + ".xlsx";
 		document.body.appendChild(link);
 		link.href = url;
-		link.dowmload = fileName;
+		link.download = fileName;
 		link.click();
 		link.remove();
 	},
@@ -201,6 +206,9 @@ export default {
 	 * @remard 单位S转小时分钟秒
 	 */
 	secondToDate(result, Diszing = true) {
+		if(!result){
+			return ''
+		}
 		var h = Math.floor(result / 3600) < 10 ? '0' + Math.floor(result / 3600) : Math.floor(result / 3600);
 		var m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));
 		var s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60));

+ 9 - 2
src/utils/request.js

@@ -4,18 +4,19 @@ import store from '@/store'
 import { getToken } from '@/utils/auth'
 import errorCode from '@/utils/errorCode'
 import methods from '@/utils/methodsTool';
+import { paramMate } from "@/utils/common";
 
 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
 export const baseURL = process.env.VUE_APP_BASE_API
-// export const baseURL = 'http://192.168.1.24:5030/'
+// export const baseURL = 'http://192.168.1.7:5030/'
 export const BASE_IMG_URL = process.env.VUE_APP_IMG_API
 const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: baseURL,
   // 超时
   timeout: 600000
-}) 
+})
 // request拦截器
 service.interceptors.request.use(config => {
   // 是否需要设置 token
@@ -24,6 +25,12 @@ service.interceptors.request.use(config => {
     config.headers['AuthorizationToken'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
   }
   config.headers.TenantId = sessionStorage.TenantId || methods.getQueryVariable('TenantId')
+
+  // 转换时间戳
+  if (config.isProce) {
+    config.params = paramMate(config.params);
+    config.data = paramMate(config.data);
+  }
   // get请求映射params参数
   if (config.method === 'get' && config.params) {
     let url = config.url + '?';

+ 1 - 1
src/utils/uploadFile.js

@@ -1,5 +1,5 @@
 import api from '@/api/api'
-import {readImg,compressImg} from "./compress"
+import { readImg, compressImg } from "./compress"
 export default {
     // 上传图片标识 0头像 1身份证 2题库 3指南指引图片 4广告图片 5身份证或学信网图片 6文件excel,word,zip等
     //file: 类似this.$refs.file.files[0]

+ 1 - 1
src/views/2Cport/adSlotManagement/tab2.vue

@@ -152,7 +152,7 @@
               </label>
               <div style="font-size: 12px; color: #999; line-height: 17px">
                 注:请上传小于300kb,尺寸为
-                <span style="color: red">1272*400</span>
+                <span style="color: red">1920*873</span>
                 的像素图片,支持jpg、jpeg、png等类型
               </div>
             </div>

+ 31 - 2
src/views/2Cport/pageSettings/H5_small.vue

@@ -69,7 +69,7 @@
       <el-form-item label="Pc域名" prop="hostPc">
         <el-input v-model="moveInfo.hostPc" disabled></el-input>
       </el-form-item>
-      <el-form-item label="PC小程序" prop="smallQrCodeShow">
+      <el-form-item label="PC端显示移动码" prop="smallQrCodeShow">
         <el-switch
           v-model="moveInfo.smallQrCodeShow"
           active-color="#13ce66"
@@ -77,7 +77,35 @@
         >
         </el-switch>
       </el-form-item>
-      <el-form-item label="PC移动二维码" prop="mobileImage">
+      <el-form-item label="H5端二维码" prop="h5Image">
+        <div class="imageStyBox" v-if="!moveInfo.h5Image">
+          <label for="uplose5"><i class="btn_upload">上传图片</i></label>
+          <input
+            type="file"
+            style="display: none"
+            id="uplose5"
+            @change="getImgFile($event, 'h5Image')"
+          />
+        </div>
+        <div v-else>
+          <el-image
+            class="imageStyBoxShow"
+            :src="$methodsTools.splitImgHost(moveInfo.h5Image)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(moveInfo.h5Image),
+            ]"
+          >
+          </el-image>
+          <el-button
+            style="margin-left: 20px"
+            type="danger"
+            size="mini"
+            @click="moveInfo.h5Image = ''"
+            >删除</el-button
+          >
+        </div>
+      </el-form-item>
+      <el-form-item label="小程序二维码" prop="mobileImage">
         <div class="imageStyBox" v-if="!moveInfo.mobileImage">
           <label for="uplose3"><i class="btn_upload">上传图片</i></label>
           <input
@@ -254,6 +282,7 @@ export default {
 <style lang="scss" scoped>
 .imageStyBoxShow {
   max-width: 200px;
+  background-color: #eee;
 }
 .btn_upload {
   font-style: normal;

+ 18 - 1
src/views/2Cport/pageSettings/footer.vue

@@ -47,6 +47,12 @@
         label-width="100px"
         class="demo-ruleForm"
       >
+        <el-form-item label="尾页头部" prop="footerHeightStatus">
+          <el-radio-group v-model="ruleForm.footerHeightStatus">
+            <el-radio :label="1">显示</el-radio>
+            <el-radio :label="0">隐藏</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="备案号" prop="footerTip">
           <el-input
             :autosize="{ minRows: 4, maxRows: 15 }"
@@ -144,6 +150,13 @@ export default {
       BData: {},
       ruleForm: {},
       rulesRight: {
+        footerHeightStatus: [
+          {
+            required: true,
+            message: "请选择页尾头部显示状态",
+            trigger: "change",
+          },
+        ],
         footerTip: [
           { required: true, message: "请输入备案号", trigger: "blur" },
         ],
@@ -247,7 +260,11 @@ export default {
             }
             if (item.configKey === "home.footer.record") {
               this.BData = item;
-              this.ruleForm = JSON.parse(item.configValue);
+              let datas = JSON.parse(item.configValue);
+              if(!datas.footerHeightStatus && datas.footerHeightStatus !== 0){
+                datas.footerHeightStatus = 1
+              }
+              this.ruleForm = datas
             }
           });
         }

+ 51 - 1
src/views/2Cport/pageSettings/header.vue

@@ -1,6 +1,6 @@
 <template>
   <div id="header">
-    <div>
+    <div v-if="false">
       <h5>导航效果预览</h5>
       <div class="topSty_home">
         <el-row :gutter="20">
@@ -160,6 +160,24 @@
             <el-input v-model="listData.companyName" :size="size"></el-input>
           </div>
         </li>
+        <li class="liSty">
+          <span>人社批准</span>
+          <div>
+            <el-input v-model="listData.rensha" :size="size"></el-input>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>十年专注</span>
+          <div>
+            <el-input v-model="listData.focus" :size="size"></el-input>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>教学实力</span>
+          <div>
+            <el-input v-model="listData.strength" :size="size"></el-input>
+          </div>
+        </li>
         <li class="liSty">
           <span>客服电话是否显示</span>
           <div>
@@ -184,6 +202,29 @@
             ></el-input>
           </div>
         </li>
+        <li class="liSty">
+          <span>登录限制</span>
+          <div>
+            <el-input-number
+              v-model="listData.loginLimit"
+              :size="size"
+              :min="0"
+              :max="999"
+              :controls="false"
+              :precision="0"
+              @blur="blurLimit"
+            ></el-input-number>
+          </div>
+        </li>
+        <li class="liSty">
+          <span>七大员信息推送权限开关</span>
+          <div>
+            <el-radio-group v-model="listData.sevenPushAuth">
+              <el-radio :label="1">开启</el-radio>
+              <el-radio :label="0">关闭</el-radio>
+            </el-radio-group>
+          </div>
+        </li>
       </ul>
     </div>
     <div>
@@ -253,6 +294,8 @@ export default {
       listData: {
         serviceTel: {},
         templateStatus: 1,
+        loginLimit: 0,
+        sevenPushAuth:0
       },
       tableSet: [
         {
@@ -318,6 +361,11 @@ export default {
     sort(a, b) {
       return a.sort - b.sort;
     },
+    blurLimit(e) {
+      if (!e.target.value) {
+        this.listData.loginLimit = "0";
+      }
+    },
     init() {
       listConfig({ configKey: "home.header" }).then((res) => {
         if (res.rows.length) {
@@ -325,6 +373,8 @@ export default {
           let A = JSON.parse(res.rows[0].configValue);
           A.undertone = A.undertone || "";
           A.templateStatus = A.templateStatus || 1;
+          A.loginLimit = A.loginLimit || 0;
+          A.sevenPushAuth = A.sevenPushAuth || 0;
           this.listData = A;
           if (!this.listData.Nav.some((i) => i.name === "讲义资料")) {
             this.listData.Nav.push({

+ 297 - 0
src/views/Marketing/goods/commodityManageMent/add/courseContent/bankView.vue

@@ -0,0 +1,297 @@
+<template>
+  <div id="bankView">
+    <el-dialog
+      :visible.sync="jYactiveBoxs"
+      width="1080px"
+      append-to-body
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">关联题库列表</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="jYactiveBoxs = false"
+          />
+        </div>
+      </div>
+      <div style="margin-bottom: 10px">
+        <!-- 搜索框 -->
+        <el-input
+          style="width: 230px; margin-right: 10px"
+          :size="size"
+          v-model="formData['goodsName']"
+          placeholder="请输入题库名称"
+        ></el-input>
+        <el-button :size="size" type="primary" @click="getJyData(1)"
+          >查询</el-button
+        >
+        <el-button :size="size" @click="getJyData(2)">重置</el-button>
+      </div>
+      <el-table
+        v-loading="loading"
+        ref="multipleTable"
+        @select-all="selectAll"
+        @select="select"
+        :data="tableData"
+        height="550"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          padding: '8px',
+          color: '#333',
+        }"
+        row-key="goodsId"
+      >
+        <el-table-column
+          align="center"
+          type="selection"
+          width="55"
+          reserve-selection
+        >
+        </el-table-column>
+        <template v-for="(item, index) in tableSet">
+          <el-table-column
+            v-if="item.scope !== 'inputs'"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "启用"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </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
+                >{{ item.ch || "" }}{{ scope.row[item.prop] }}</span
+              ></template
+            >
+          </el-table-column></template
+        >
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="jYactiveBoxs = false">取 消</el-button>
+        <el-button type="primary" @click="submitBox">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      size: "small",
+      jYactiveBoxs: false,
+      tableSet: [
+        {
+          label: "商品编码",
+          prop: "code",
+        },
+        { label: "商品标题", prop: "goodsName" },
+        {
+          label: "商品价格",
+          prop: "standPrice",
+          ch: "¥",
+        },
+        {
+          label: "商品划线价",
+          prop: "linePrice",
+          ch: "¥",
+        },
+        {
+          label: "商品有效期",
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          scope: "TimeLists",
+          Diszing: false,
+        },
+        {
+          label: "可售状态",
+          prop: "goodsStatus",
+          scope: "status",
+        },
+      ],
+      tableData: [],
+      formData: {
+        goodsName: "",
+      },
+      loading: false,
+      allCheckData: [],
+    };
+  },
+  methods: {
+    /**
+     * 初始化
+     */
+    openBox(id) {
+      this.jYactiveBoxs = true;
+      this.getJyData(2);
+      this.allCheckData = id;
+    },
+    /**
+     * 清除多选框
+     */
+    clearMoreActive() {
+      this.allCheckData = [];
+      this.$refs.multipleTable.clearSelection();
+    },
+    //确定讲义ID
+    submitBox() {
+      this.$emit("backData", this.allCheckData);
+      this.jYactiveBoxs = false;
+      this.clearMoreActive();
+    },
+    selectAll(value) {
+      this.allCheckData = value.map((i) => i.goodsId);
+    },
+    select(value) {
+      this.allCheckData = value.map((i) => i.goodsId);
+    },
+    /**
+     * 搜索
+     */
+    getJyData(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          businessId: this.$parent.listData.businessId,
+          goodsType: 2,
+          status: 1,
+          pageSize: 9999,
+          pageNum: 1,
+          goodsName: "",
+        };
+      }
+      this.$api
+        .inquireGoods(this.formData)
+        .then((res) => {
+          res.rows.forEach((i) => {
+            if (this.allCheckData.includes(i.goodsId)) {
+              this.$refs.multipleTable.toggleRowSelection(i, true);
+            }
+          });
+          this.tableData = res.rows;
+          this.total = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/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;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>

+ 22 - 0
src/views/Marketing/goods/commodityManageMent/add/courseContent/index.vue

@@ -31,6 +31,9 @@
       <el-button type="primary" @click="openStyleNumSet" size="small"
         >每天学习限制</el-button
       >
+      <el-button type="primary" @click="openBankSet" size="small"
+        >关联题库</el-button
+      >
       <el-button type="primary" @click="openHandoutSet" size="small"
         >关联讲义</el-button
       >
@@ -117,6 +120,7 @@
     <more-list-check ref="moreListCheck" @backData="backMoreListData" />
     <play-photo ref="playPhoto" @backData="backPlayPhotoData" />
     <every-day-study-num ref="everyDayStudyNum" @backData="backEveryDaySet" />
+    <bank-view ref="bankView" @backData="backBankView" />
     <handout-view ref="handoutView" @backData="backHandoutView" />
   </div>
 </template>
@@ -127,6 +131,7 @@ import courseCheck from "./courseCheck.vue";
 import moreListCheck from "./moreListCheck.vue";
 import playPhoto from "./playPhoto.vue";
 import everyDayStudyNum from "./everyDayStudyNum.vue";
+import bankView from "./bankView.vue";
 import handoutView from "./handoutView.vue";
 
 export default {
@@ -136,6 +141,7 @@ export default {
     moreListCheck,
     playPhoto,
     everyDayStudyNum,
+    bankView,
     handoutView,
   },
   props: ["listData"],
@@ -354,6 +360,22 @@ export default {
     backEveryDaySet(num) {
       this.$set(this.listData, "sectionMaxNum", num);
     },
+    /**
+     * 点击选择关联题库
+     */
+     openBankSet(){
+      if (!this.listData.businessId) {
+        this.$message.warning("请选择业务层次");
+        return;
+      }
+      this.$refs.bankView.openBox(this.listData.questionRelIds || []);
+     },
+    /**
+     * 题库回调数据
+     */
+    backBankView(ids) {
+      this.$set(this.listData, "questionRelIds", ids);
+    },
     /**
      * 点击选择讲义函数
      */

+ 3 - 1
src/views/Marketing/goods/commodityManageMent/add/index.vue

@@ -212,6 +212,7 @@ export default {
         coverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
         goodsType: "",
         status: 1,
+        moreCertificateStatus:1,
         certificateTypeId: "",
         showStatus: 1,
         externalLinkStatus: 0,
@@ -724,6 +725,7 @@ export default {
       if (data.goodsType == 9) {
         data.examLimitClient = data.examLimitClient.toString();
       }
+        data.questionRelIds = data.questionRelIds.toString() || "";
       data.projectId = await this.getProjectId(data.businessId);
       //--------------------------通用处理END------------------------------
       if (this.listData.goodsType === 1 || this.listData.goodsType === 6) {
@@ -929,7 +931,7 @@ export default {
           return;
         }
         //试做数据格式转换
-        data.examConfigList = this.$refs.bankContent.examConfigList.map(
+        data.examConfigList = this.$refs.bankContent.examConfigList?.map(
           (item) => {
             return {
               num: item.num,

+ 9 - 4
src/views/Marketing/goods/commodityManageMent/add/issueAcertificate.vue

@@ -1,7 +1,13 @@
 <template>
   <div id="issueAcertificate">
-    <div class="dis_play_sty">
-      <el-form-item label="请选择" prop="certificateTypeId">
+    <el-form-item label="关联类型" prop="moreCertificateStatus">
+      <el-radio-group v-model="listData.moreCertificateStatus">
+        <el-radio :label="1">单证书</el-radio>
+        <el-radio :label="2">多证书</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <div class="dis_play_sty" v-if="listData.moreCertificateStatus == 1">
+      <el-form-item label="关联证书" prop="certificateTypeId">
         <el-select
           v-model="listData.certificateTypeId"
           placeholder="请选择证书类型"
@@ -102,8 +108,7 @@ export default {
       this.certificateOption = res.rows;
     });
   },
-  methods: {
-  },
+  methods: {},
 };
 </script>
 

+ 1 - 0
src/views/Marketing/goods/commodityManageMent/add/productInformation.vue

@@ -302,6 +302,7 @@ export default {
       this.$set(this.listData, "handoutsName", "");
       this.$set(this.listData, "handoutsCode", "");
       this.$set(this.listData, "sevenYear", "");
+      this.$set(this.listData, "questionRelIds", []);
       this.$bus.$emit("sendBybus");
       this.$bus.$emit("sendBybusBank");
       if (val) {

+ 298 - 0
src/views/Marketing/goods/commodityManageMent/edit/courseContent/bankView.vue

@@ -0,0 +1,298 @@
+<template>
+  <div id="bankView">
+    <el-dialog
+      :visible.sync="jYactiveBoxs"
+      width="1080px"
+      append-to-body
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">关联题库列表</div>
+        <div class="rightBoxs">
+          <img
+            src="@/assets/images/Close@2x.png"
+            alt=""
+            @click="jYactiveBoxs = false"
+          />
+        </div>
+      </div>
+      <div style="margin-bottom: 10px">
+        <!-- 搜索框 -->
+        <el-input
+          style="width: 230px; margin-right: 10px"
+          :size="size"
+          v-model="formData['goodsName']"
+          placeholder="请输入题库名称"
+        ></el-input>
+        <el-button :size="size" type="primary" @click="getJyData(1)"
+          >查询</el-button
+        >
+        <el-button :size="size" @click="getJyData(2)">重置</el-button>
+      </div>
+      <el-table
+        v-loading="loading"
+        ref="multipleTable"
+        @select-all="selectAll"
+        @select="select"
+        :data="tableData"
+        height="550"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          padding: '8px',
+          color: '#333',
+        }"
+        row-key="goodsId"
+      >
+        <el-table-column
+          align="center"
+          type="selection"
+          width="55"
+          reserve-selection
+        >
+        </el-table-column>
+        <template v-for="(item, index) in tableSet">
+          <el-table-column
+            v-if="item.scope !== 'inputs'"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "启用"
+                    : scope.row[item.prop] === 0
+                    ? "关闭"
+                    : "未知"
+                }}
+              </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
+                >{{ item.ch || "" }}{{ scope.row[item.prop] }}</span
+              ></template
+            >
+          </el-table-column></template
+        >
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="jYactiveBoxs = false">取 消</el-button>
+        <el-button type="primary" @click="submitBox">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      size: "small",
+      jYactiveBoxs: false,
+      tableSet: [
+        {
+          label: "商品编码",
+          prop: "code",
+        },
+        { label: "商品标题", prop: "goodsName" },
+        {
+          label: "商品价格",
+          prop: "standPrice",
+          ch: "¥",
+        },
+        {
+          label: "商品划线价",
+          prop: "linePrice",
+          ch: "¥",
+        },
+        {
+          label: "商品有效期",
+          prop1: "validityStartTime",
+          prop2: "validityEndTime",
+          scope: "TimeLists",
+          Diszing: false,
+        },
+        {
+          label: "可售状态",
+          prop: "goodsStatus",
+          scope: "status",
+        },
+      ],
+      tableData: [],
+      formData: {
+        goodsName: "",
+      },
+      loading: false,
+      allCheckData: [],
+    };
+  },
+  methods: {
+    /**
+     * 初始化
+     */
+    openBox(id) {
+      console.log(id,'id')
+      this.jYactiveBoxs = true;
+      this.getJyData(2);
+      this.allCheckData = id;
+    },
+    /**
+     * 清除多选框
+     */
+    clearMoreActive() {
+      this.allCheckData = [];
+      this.$refs.multipleTable.clearSelection();
+    },
+    //确定讲义ID
+    submitBox() {
+      this.$emit("backData", this.allCheckData);
+      this.jYactiveBoxs = false;
+      this.clearMoreActive();
+    },
+    selectAll(value) {
+      this.allCheckData = value.map((i) => i.goodsId);
+    },
+    select(value) {
+      this.allCheckData = value.map((i) => i.goodsId);
+    },
+    /**
+     * 搜索
+     */
+    getJyData(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          businessId: this.$parent.listData.businessId,
+          goodsType: 2,
+          status: 1,
+          pageSize: 9999,
+          pageNum: 1,
+          goodsName: "",
+        };
+      }
+      this.$api
+        .inquireGoods(this.formData)
+        .then((res) => {
+          res.rows.forEach((i) => {
+            if (this.allCheckData.includes(i.goodsId)) {
+              this.$refs.multipleTable.toggleRowSelection(i, true);
+            }
+          });
+          this.tableData = res.rows;
+          this.total = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/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;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>

+ 4 - 0
src/views/Marketing/goods/commodityManageMent/edit/courseContent/courseCheck.vue

@@ -166,6 +166,10 @@ export default {
      * 提交回调数据
      */
     submitTab() {
+      if (this.activeLists.length > 1) {
+        this.$message.error("只能添加一个课程");
+        return;
+      }
       this.$message.success("添加成功");
       this.dialogVisibleTableBoxs = false;
       this.activeLists.forEach((item) => {

+ 22 - 0
src/views/Marketing/goods/commodityManageMent/edit/courseContent/index.vue

@@ -31,6 +31,9 @@
       <el-button type="primary" @click="openStyleNumSet" size="small"
         >每天学习限制</el-button
       >
+      <el-button type="primary" @click="openBankSet" size="small"
+        >关联题库</el-button
+      >
       <el-button type="primary" @click="openHandoutSet" size="small"
         >关联讲义</el-button
       >
@@ -162,6 +165,7 @@
     <play-photo ref="playPhoto" @backData="backPlayPhotoData" />
     <share ref="share" />
     <every-day-study-num ref="everyDayStudyNum" @backData="backEveryDaySet" />
+    <bank-view ref="bankView" @backData="backBankView" />
     <handout-view
       ref="handoutView"
       @backData="backHandoutView"
@@ -201,6 +205,7 @@ import moreListCheck from "./moreListCheck.vue";
 import playPhoto from "./playPhoto.vue";
 import share from "./share.vue";
 import everyDayStudyNum from "./everyDayStudyNum.vue";
+import bankView from "./bankView.vue";
 import handoutView from "./handoutView.vue";
 import { getTenantList } from "@/api/resource/good";
 
@@ -212,6 +217,7 @@ export default {
     playPhoto,
     share,
     everyDayStudyNum,
+    bankView,
     handoutView,
   },
   props: ["listData", "submitStatusInfo"],
@@ -658,6 +664,22 @@ export default {
     backEveryDaySet(num) {
       this.$set(this.listData, "sectionMaxNum", num);
     },
+    /**
+     * 点击选择关联题库
+     */
+     openBankSet(){
+      if (!this.listData.businessId) {
+        this.$message.warning("请选择业务层次");
+        return;
+      }
+      this.$refs.bankView.openBox(this.listData.questionRelIds || []);
+     },
+    /**
+     * 题库回调数据
+     */
+    backBankView(ids) {
+      this.$set(this.listData, "questionRelIds", ids);
+    },
     /**
      * 点击选择讲义函数
      */

+ 14 - 1
src/views/Marketing/goods/commodityManageMent/edit/index.vue

@@ -241,6 +241,7 @@ export default {
     };
     return {
       listData: {
+        moreCertificateStatus: 1,
         coverUrl: "oss/images/avatar/20211013/1634097664410_1397766697",
         goodsType: "",
         certificateTypeId: "",
@@ -782,6 +783,7 @@ export default {
         this.copyNums = res.data.studyCount;
         this.copyExamNumber = res.data.examNumber || 0;
         this.copyDoNumber = res.data.doNumber || 0;
+
         //试听转换
         if (
           res.data.goodsAuditionConfig &&
@@ -861,6 +863,15 @@ export default {
             );
           }
         }
+
+        //商品关联题库转数值
+        if (res.data.questionRelIds) {
+          res.data.questionRelIds = res.data.questionRelIds
+            .split(",")
+            .map(Number);
+        } else {
+          res.data.questionRelIds = [];
+        }
         //讲义资料商品查询讲义Code及名称
         if (res.data.goodsType == 8 && res.data.handoutsId) {
           const result = await this.$api.inquireCourseHandoutsfiledetail({
@@ -936,6 +947,7 @@ export default {
           1
         );
       }
+
       //商品标准价格明细表
       data.standPriceJson = JSON.stringify(data.standPriceJson);
       //商品是否上架
@@ -944,6 +956,7 @@ export default {
       }
       data.subjectIds = data.subjectIds.toString();
       data.examLimitClient = data.examLimitClient.toString();
+      data.questionRelIds = data.questionRelIds.toString() || "";
       data.projectId = await this.getProjectId(data.businessId);
       //--------------------------通用处理END------------------------------
       if (this.listData.goodsType === 1 || this.listData.goodsType === 6) {
@@ -1160,7 +1173,7 @@ export default {
           return;
         }
         //试做数据格式转换
-        data.examConfigList = this.$refs.bankContent.examConfigList.map(
+        data.examConfigList = this.$refs.bankContent.examConfigList?.map(
           (item) => {
             return {
               num: item.num,

+ 7 - 1
src/views/Marketing/goods/commodityManageMent/edit/issueAcertificate.vue

@@ -1,6 +1,12 @@
 <template>
   <div id="issueAcertificate">
-    <div class="dis_play_sty">
+    <el-form-item label="关联类型" prop="moreCertificateStatus">
+      <el-radio-group v-model="listData.moreCertificateStatus">
+        <el-radio :label="1">单证书</el-radio>
+        <el-radio :label="2">多证书</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <div class="dis_play_sty" v-if="listData.moreCertificateStatus == 1">
       <el-form-item label="请选择" prop="certificateTypeId">
         <el-select
           v-model="listData.certificateTypeId"

+ 3 - 2
src/views/Marketing/goods/commodityManageMent/edit/productInformation.vue

@@ -306,6 +306,7 @@ export default {
       // this.$set(this.listData, "schoolId", "");
       // this.$set(this.listData, "majorId", "");
       // this.$set(this.listData, "handoutsId", "");
+      // this.$set(this.listData, "questionRelIds", []);
       // this.$bus.$emit("sendBybus");
       // this.$bus.$emit("sendBybusBank");
       if (val) {
@@ -323,8 +324,8 @@ export default {
   methods: {
     //校验外链格式
     judgeUrl() {
-      if(!this.listData.externalLink){
-        return 
+      if (!this.listData.externalLink) {
+        return;
       }
       var regUrl =
         /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/;

+ 7 - 0
src/views/Marketing/goods/commodityManageMent/index.vue

@@ -293,6 +293,13 @@ export default {
           prop: "code",
           hidden: false,
         },
+        {
+          label: "商品类型",
+          prop: "goodsType",
+          hidden: true,
+          scope:"isOptions",
+          options:this.$methodsTools.getGoodsType()
+        },
         {
           label: "院校",
           prop: "schoolName",

+ 1 - 1
src/views/Marketing/order/offlineOrder/index.vue

@@ -93,7 +93,7 @@ export default {
         },
         {
           prop: "searchKey",
-          placeholder: "请输入订单编码/录单人姓名",
+          placeholder: "请输入订单编码/录单人姓名/学员姓名",
         },
         {
           prop: "orderFrom",

+ 5 - 0
src/views/Marketing/order/offlineOrder/orderDetailsT/index.vue

@@ -198,6 +198,11 @@ export default {
           hidden: true,
           width: "190px",
         },
+        {
+          label: "公司名称",
+          prop: "companyName",
+          hidden: true,
+        },
         {
           label: "商品名称",
           prop: "goodsName",

+ 5 - 0
src/views/Marketing/order/orderList/index.vue

@@ -199,6 +199,11 @@ export default {
           hidden: true,
           width: "190px",
         },
+        {
+          label: "公司名称",
+          prop: "companyName",
+          hidden: true,
+        },
         {
           label: "商品名称",
           prop: "goodsName",

+ 8 - 1
src/views/classHoursReview/component/ChapterTable.vue

@@ -17,10 +17,11 @@
         <template slot-scope="scope">
           <Lesson-table
             :tabledata="scope.row.classPeriodSectionList || []"
+            :dontControls="dontControls"
           ></Lesson-table>
         </template>
       </el-table-column>
-      <el-table-column align="center" prop="realName" label="姓名">
+      <el-table-column align="center" prop="realName" label="姓名" v-if="!dontControls">
       </el-table-column>
       <el-table-column align="center" prop="typeName" :label="label + '标题'">
         <template slot-scope="scope">
@@ -60,6 +61,12 @@
 import LessonTable from "./LessonTable.vue";
 export default {
   props: {
+    dontControls: {
+      type: Boolean,
+      default: () => {
+        return false;
+      },
+    },
     tabledata: {
       type: Array,
       default: () => {

+ 65 - 11
src/views/classHoursReview/component/LessonTable.vue

@@ -54,7 +54,8 @@
                 (periodStatus === 0 ||
                   periodStatus === 2 ||
                   periodStatus === 3) &&
-                scope.row.periodStatus === 1
+                scope.row.periodStatus === 1 &&
+                !dontControls
               "
             >
               <div>
@@ -94,7 +95,7 @@
       </el-table-column>
 
       <el-table-column
-        v-for="(item, index) in tableSet"
+        v-for="(item, index) in setSableSet(dontControls)"
         :width="item.width"
         :key="index"
         :label="item.label"
@@ -149,11 +150,13 @@
             {{ (scope2.row[item.prop] / 60 / 45).toFixed(2) }}
           </span>
           <span v-else-if="item.scope === 'durTime' && scope2.row.type !== 5">
-            {{
-              scope2.row["type"] == 3
-                ? (scope2.row[item.prop] / 60).toFixed(0) + "分钟" || "0分钟"
-                : "分数:" + scope2.row["performance"]
-            }}
+            <span v-if="scope2.row['type'] == 3">
+            {{(scope2.row[item.prop] / 60).toFixed(0) + "分钟" || "0分钟0"}}
+            {{(scope2.row[item.prop] % 60) || 0}}秒
+            </span>
+            <span v-else>
+              {{"分数:" + scope2.row["performance"]}}
+            </span>
           </span>
           <span
             v-else-if="
@@ -276,7 +279,7 @@
                     (scope2.row[item.prop2] - scope2.row[item.prop1]) /
                     60
                   ).toFixed(0) || 0
-                }}分钟
+                }}分钟{{(scope2.row[item.prop2] - scope2.row[item.prop1]) % 60}}秒
               </div>
             </div>
           </div>
@@ -295,6 +298,12 @@
 import CheatDialog from "./CheatDialog.vue";
 export default {
   props: {
+    dontControls: {
+      type: Boolean,
+      default: () => {
+        return false;
+      },
+    },
     setData: {
       type: Object,
       default: () => {
@@ -372,7 +381,7 @@ export default {
           width: "420px",
         },
         {
-          label: "用时",
+          label: "学习用时",
           prop1: "studyStartTime",
           prop2: "studyEndTime",
           scope: "aTimeSEComputer",
@@ -450,8 +459,8 @@ export default {
     },
     comput(item) {
       var ast = item.studyEndTime - item.studyStartTime;
-      let status = item.durationTime - ast
-      if (status > 25) {
+      let status = item.durationTime - ast;
+      if (status > 90) {
         return "color:red;";
       } else {
         return "";
@@ -492,6 +501,51 @@ export default {
     },
   },
   computed: {
+    setSableSet: function () {
+      return function (i) {
+        let array = JSON.parse(JSON.stringify(this.tableSet));
+        if (i) {
+          let ary = [
+            {
+              label: "审核状态",
+              prop: "status",
+              scope: "select",
+              width: "100px",
+              options: [
+                {
+                  label: "待审核",
+                  value: 2,
+                },
+                {
+                  label: "通过",
+                  value: 1,
+                },
+                {
+                  label: "作弊",
+                  value: 0,
+                },
+                {
+                  label: "待重修",
+                  value: 3,
+                },
+              ],
+            },
+            {
+              label: "审核人",
+              prop: "auditUserName",
+              width: "100px",
+            },
+            {
+              label: "审核时间",
+              prop: "auditTime",
+              scope: "aTime",
+            },
+          ];
+          array = array.concat(ary);
+        }
+        return array;
+      };
+    },
     periodStatus() {
       return this.getPeriodStatus();
     },

+ 21 - 3
src/views/classHoursReview/component/ModulTable.vue

@@ -18,17 +18,30 @@
           <Chapter-table
             v-if="scope.row.classPeriods.length"
             :tabledata="scope.row.classPeriods"
+            :dontControls="dontControls"
           ></Chapter-table>
           <Chapter-table
             v-if="scope.row.arr"
             label="卷"
             :tabledata="scope.row.arr"
+            :dontControls="dontControls"
           ></Chapter-table>
         </template>
       </el-table-column>
-      <el-table-column align="center" prop="realName" label="姓名">
+      <el-table-column
+        align="center"
+        prop="realName"
+        label="姓名"
+        v-if="!dontControls"
+      >
       </el-table-column>
       <el-table-column align="center" prop="typeName" label="模块标题">
+        <template slot-scope="scope">
+          <span>{{ scope.row.typeName }}</span
+          ><span v-if="scope.row.commonGradeName" style="color:red;">(公共班级:{{
+            scope.row.commonGradeName
+          }})</span>
+        </template>
       </el-table-column>
     </el-table>
   </div>
@@ -38,6 +51,12 @@
 import ChapterTable from "./ChapterTable.vue";
 export default {
   props: {
+    dontControls: {
+      type: Boolean,
+      default: () => {
+        return false;
+      },
+    },
     tabledata: {
       type: Array,
       default: () => {
@@ -54,5 +73,4 @@ export default {
 };
 </script>
 
-<style>
-</style>
+<style></style>

+ 89 - 95
src/views/classHoursReview/component/StudyTables.vue

@@ -1,93 +1,98 @@
 <template>
   <div class="studyRecordTable">
     <div style="height: 62px">
-      <div
-        class="studyStyle"
-        :class="{ isFixed: headerFixed }"
-        :style="{ left: left }"
-      >
-        <div class="a_style">
-          <i></i>
-          <span>视频审核进度</span>
-          <div class="flex_style_study">
-            <div class="num_style" style="color: #0047d0">
-              待审:{{ userData.pending }}节
+      <div style="height: 50px" class="fixeBox">
+        <div
+          class="studyStyle"
+          :class="fixeStatus ? 'isFixed' : null"
+          :style="{ left: left }"
+        >
+          <div class="a_style">
+            <i></i>
+            <span>视频审核进度</span>
+            <div class="flex_style_study">
+              <div class="num_style" style="color: #0047d0">
+                待审:{{ userData.pending }}节
+              </div>
+              <div class="num_style" style="color: #e53935">
+                作弊:{{ userData.cheat }}节
+              </div>
+              <div class="num_style" style="color: #43a047">
+                通过:{{ userData.pass }}节
+              </div>
+              <div style="clear: both"></div>
             </div>
-            <div class="num_style" style="color: #e53935">
-              作弊:{{ userData.cheat }}节
-            </div>
-            <div class="num_style" style="color: #43a047">
-              通过:{{ userData.pass }}节
-            </div>
-            <div style="clear: both"></div>
           </div>
-        </div>
-        <div class="a_style">
-          <i></i>
-          <span>做题审核进度</span>
-          <div class="flex_style_study">
-            <div class="num_style" style="color: #0047d0">
-              待审:{{ userData.examPending }}节
-            </div>
-            <div class="num_style" style="color: #e53935">
-              作弊:{{ userData.examCheat }}节
-            </div>
-            <div class="num_style" style="color: #43a047">
-              通过:{{ userData.examPass }}节
+          <div class="a_style">
+            <i></i>
+            <span>做题审核进度</span>
+            <div class="flex_style_study">
+              <div class="num_style" style="color: #0047d0">
+                待审:{{ userData.examPending }}节
+              </div>
+              <div class="num_style" style="color: #e53935">
+                作弊:{{ userData.examCheat }}节
+              </div>
+              <div class="num_style" style="color: #43a047">
+                通过:{{ userData.examPass }}节
+              </div>
+              <div style="clear: both"></div>
             </div>
-            <div style="clear: both"></div>
           </div>
-        </div>
-        <div class="a_style" style="width: 280px">
-          <i></i>
-          <span>学时审批状态</span>
-          <div class="flex_style_study">
-            <div class="num_style" style="color: #0047d0">
-              {{
-                ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
-                  periodStatus + 1
-                ]
-              }}
+          <div class="a_style" style="width: 280px">
+            <i></i>
+            <span>学时审批状态</span>
+            <div class="flex_style_study">
+              <div class="num_style" style="color: #0047d0">
+                {{
+                  ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
+                    periodStatus + 1
+                  ]
+                }}
+              </div>
+              <div style="clear: both"></div>
             </div>
-            <div style="clear: both"></div>
           </div>
-        </div>
-        <div class="s_sd">
-          <template v-if="periodStatus === 2">
-            <el-checkbox
-              :disabled="!allIds.length"
-              :indeterminate="isIndeterminate"
-              v-model="checkAll"
-              @change="handleCheckAllChange"
-              >待审全选</el-checkbox
-            >
-            <el-button
-              style="margin-left: 10px"
-              size="mini"
-              type="success"
-              @click="getChangeStatus(1)"
-              >勾选通过</el-button
-            >
-            <el-button size="mini" type="danger" @click="getChangeStatus(2)"
-              >勾选作弊</el-button
-            >
-          </template>
+          <div class="s_sd">
+            <template v-if="periodStatus === 2">
+              <el-checkbox
+                :disabled="!allIds.length"
+                :indeterminate="isIndeterminate"
+                v-model="checkAll"
+                @change="handleCheckAllChange"
+                >待审全选</el-checkbox
+              >
+              <el-button
+                style="margin-left: 10px"
+                size="mini"
+                type="success"
+                @click="getChangeStatus(1)"
+                >勾选通过</el-button
+              >
+              <el-button size="mini" type="danger" @click="getChangeStatus(2)"
+                >勾选作弊</el-button
+              >
+            </template>
 
-          <template v-if="periodStatus === 3">
-            <el-button style="margin-left: 10px" size="mini" @click="checkBack"
-              >勾选数据,打回待审核状态</el-button
-            >
-            <el-button size="mini" type="warning" @click="approvedOK = true"
-              >确认审核通过结果</el-button
-            >
-          </template>
-          <!-- <el-button
+            <template v-if="periodStatus === 3">
+              <el-button
+                style="margin-left: 10px"
+                size="mini"
+                @click="checkBack"
+                >勾选数据,打回待审核状态</el-button
+              >
+              <el-button size="mini" type="warning" @click="approvedOK = true"
+                >确认审核通过结果</el-button
+              >
+            </template>
+            <!-- <el-button
           v-if="periodStatus === 1"
           style="margin-left: 10px"
           size="mini"
           @click="backToAudit"
           >打回待审核状态</el-button
         > -->
+          </div>
         </div>
       </div>
     </div>
@@ -184,7 +189,6 @@ import ChapterTable from "./ChapterTable.vue";
 import LessonTable from "./LessonTable.vue";
 import CheatDialog from "./CheatDialog.vue";
 import { rollBackPeriod } from "@/api/education/classManageMent";
-import { debounce } from "@/utils";
 import { mapGetters } from "vuex";
 export default {
   props: {
@@ -259,22 +263,11 @@ export default {
         },
       ],
       allType3List: [],
-      offsetTop: 0,
-      offsetHeight: 0,
-      headerFixed: false,
+      fixeStatus: false,
       userImg: "",
     };
   },
   methods: {
-    handleScroll() {
-      // 得到页面滚动的距离
-      let scrollTop =
-        window.pageYOffset ||
-        document.documentElement.scrollTop ||
-        document.body.scrollTop;
-      // 判断页面滚动的距离是否大于吸顶元素的位置
-      this.headerFixed = scrollTop > this.offsetTop + this.offsetHeight;
-    },
     submitAllSlect(reason) {
       this.submitOK(2, reason);
     },
@@ -497,16 +490,17 @@ export default {
     },
     ...mapGetters(["sidebar"]),
     left() {
-      return this.sidebar.opened ? "206px" : "60px";
+      return this.sidebar.opened ? "226px" : "60px";
     },
   },
   mounted() {
-    this.$nextTick(function () {
-      let header = document.getElementsByClassName("studyStyle")[0];
-      this.offsetTop = header.offsetTop;
-      this.offsetHeight = header.offsetHeight;
-    });
-    window.addEventListener("scroll", debounce(this.handleScroll, 50));
+    // window.addEventListener("scroll", () => {
+    //   this.fixeStatus =
+    //     document.getElementsByClassName("fixeBox")[0].getBoundingClientRect()
+    //       .top <= 83
+    //       ? true
+    //       : false;
+    // });
   },
 };
 </script>
@@ -514,9 +508,9 @@ export default {
 <style lang="scss" scoped>
 .studyRecordTable {
   .studyStyle {
-    margin: 16px 0;
     display: flex;
     align-items: center;
+    height: 50px;
 
     & > .a_style {
       display: flex;

+ 1 - 0
src/views/classHoursReview/studyTimes.vue

@@ -72,6 +72,7 @@ export default {
   },
   mounted() {
     this.getUserInfo(true);
+    console.log(this.setData,'setData')
   },
   methods: {
     /**

+ 513 - 0
src/views/education/archives/archivesDetails/bankRecords/LearningRecord.vue

@@ -0,0 +1,513 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="1200px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="学习记录"
+      @close="close"
+    >
+      <div class="footerTableStyle">
+        <el-table
+          v-if="!loading"
+          v-loading="loading"
+          ref="multipleTable"
+          :data="tableData"
+          border
+          :span-method="objectSpanMethod"
+          :header-cell-style="{
+            'background-color': '#CCDDF7',
+            padding: '2px',
+            color: '#0047D0',
+            'border-right-color': '#0047D0',
+            'border-left-color': '#0047D0',
+          }"
+        >
+          <el-table-column
+            v-for="(item, index) in tableList"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] == 1
+                    ? "及格"
+                    : scope.row[item.prop] == 0
+                    ? "不及格"
+                    : ""
+                }}
+              </span>
+              <span v-else-if="item.scope === 'sectionType'">
+                {{
+                  scope.row[item.prop] == 1
+                    ? "录播"
+                    : scope.row[item.prop] == 2
+                    ? "直播"
+                    : scope.row[item.prop] == 3
+                    ? "回放"
+                    : scope.row[item.prop] == 4
+                    ? "题卷"
+                    : ""
+                }}
+              </span>
+              <template v-else-if="item.scope == 'isOptions'">
+                <template v-for="(items, indexs) in item.options">
+                  <span
+                    v-if="items.value == scope.row[item.prop]"
+                    :key="indexs"
+                    >{{ items.label }}</span
+                  >
+                </template>
+              </template>
+              <div v-else-if="item.scope === 'moreTime'">
+                {{ $methodsTools.onlyForma(scope.row[item.prop1]) }} -
+                {{ $methodsTools.onlyForma(scope.row[item.prop2]) }}
+              </div>
+              <div v-else-if="item.scope === 'times'">
+                <span v-if="scope.row['sectionType'] == 4">{{
+                  $methodsTools.secondToDate(
+                    scope.row[item.prop2] - scope.row[item.prop1],
+                    false
+                  )
+                }}</span>
+                <span v-else>
+                  {{ $methodsTools.secondToDate(scope.row[item.prop3], false) }}
+                </span>
+              </div>
+              <span v-else-if="item.scope == 'rightRate'">
+                {{
+                  scope.row[item.prop]
+                    ? (scope.row[item.prop] * 100).toFixed(2) + "%"
+                    : "—"
+                }}
+              </span>
+              <span v-else-if="item.scope === 'score'">
+                {{ scope.row[item.prop] ? scope.row[item.prop] + "分" : "—" }}
+              </span>
+              <span v-else>{{
+                scope.row[item.prop]
+                  ? scope.row[item.prop]
+                  : item.noMsg
+                  ? item.noMsg
+                  : ""
+              }}</span></template
+            >
+          </el-table-column>
+        </el-table>
+      </div></BaseDialog
+    >
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      isShow: false,
+      size: "medium",
+      loading: false,
+      tableList: [
+        {
+          label: "模块卷",
+          prop: "moduleName",
+        },
+        {
+          label: "章卷",
+          prop: "chapterName",
+        },
+        {
+          label: "试卷",
+          prop: "examName",
+        },
+        {
+          label: "练习时间",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "moreTime",
+          width: "310px",
+        },
+        {
+          label: "练习时长",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          prop3: "videoCurrentTime",
+          scope: "times",
+          width: "140px",
+        },
+        {
+          label: "练习成绩",
+          prop: "score",
+          scope: "score",
+        },
+        {
+          label: "做题正确率",
+          prop: "rightRate",
+          width: "120px",
+          scope: "rightRate",
+        },
+        {
+          label: "练习终端",
+          prop: "fromPlat",
+          scope: "isOptions",
+          options: [
+            { label: "小程序", value: 1 },
+            {
+              label: "PC网站",
+              value: 2,
+            },
+            {
+              label: "H5",
+              value: 3,
+            },
+          ],
+        },
+      ],
+      tableData: [],
+      formData: {},
+      total: 0,
+      showBox: true,
+      //路由参数
+      objs: {
+        time: "",
+      },
+      //等待获取课程成功后渲染
+      typeNameArr: [],
+      typeNamePos: 0,
+      storeArr: [],
+      storePos: 0,
+      feeArr: [],
+      feePos: 0,
+    };
+  },
+  watch: {
+    tableData(val) {
+      this.merage();
+    },
+  },
+  methods: {
+    openBoxs(item) {
+      this.tableData = [];
+      this.isShow = true;
+      this.objs = item;
+      this.changeActiveCourseIdFunc()
+    },
+    onlyForma(timeStamp) {
+      if (!timeStamp) {
+        return;
+      }
+      var date = new Date(timeStamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+      var Y = date.getFullYear();
+      var M =
+        date.getMonth() + 1 < 10
+          ? "0" + (date.getMonth() + 1)
+          : date.getMonth() + 1;
+      return {
+        time: timeStamp,
+        date: Y + "-" + M,
+        year: Y,
+        month: M,
+      };
+    },
+    //选中课程触发方法
+    changeActiveCourseIdFunc() {
+      return new Promise((resolve, reject) => {
+        this.loading = true;
+        let data = {
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+          orderGoodsId: this.objs.orderGoodsId,
+        };
+        this.$api
+          .userdangAnlistUserStudyExamRecord(data)
+          .then((res) => {
+            if (res.code === 200) {
+              let COURSELISTMX = [];
+              res.rows.forEach((item) => {
+                if (item.recordList && item.recordList.length) {
+                  for (let i = 0; i < item.recordList.length; i++) {
+                    let ary = { ...item };
+                    ary.recordList[i].newVisitNum = i + 1;
+                    COURSELISTMX.push(Object.assign(ary, ary.recordList[i]));
+                  }
+                } else {
+                  if (item.studyStartTime || item.studyEndTime) {
+                    item.newVisitNum = 1;
+                  } else {
+                    item.newVisitNum = "未参与";
+                  }
+
+                  COURSELISTMX.push(item);
+                }
+              });
+              this.tableData = COURSELISTMX;
+              resolve();
+            } else {
+              reject();
+            }
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      });
+    },
+    merageInit() {
+      // 在下文的时候会用到,对数据进行初始化是很有必要的
+      this.typeNameArr = [];
+      this.typeNamePos = 0;
+      this.storeArr = [];
+      this.storePos = 0;
+      this.feeArr = [];
+      this.feePos = 0;
+    },
+    merage() {
+      this.merageInit(); // 前文的初始化数据函数
+      let arys = JSON.parse(JSON.stringify(this.tableData));
+      for (let i = 0; i < arys.length; i += 1) {
+        if (i === 0) {
+          // 第一行必须存在
+          this.typeNameArr.push(1);
+          this.typeNamePos = 0;
+          this.storeArr.push(1);
+          this.storePos = 0;
+          this.feeArr.push(1);
+          this.feePos = 0;
+        } else {
+          // 判断当前元素与上一个元素是否相同,eg:this.typeNamePos 是 this.typeNameArr序号
+          // 第一列 下面的是eslint的不限制语法
+          // eslint-disable-next-line no-lonely-if
+          if (arys[i].moduleName === arys[i - 1].moduleName) {
+            this.typeNameArr[this.typeNamePos] += 1;
+            this.typeNameArr.push(0);
+          } else {
+            this.typeNameArr.push(1);
+            this.typeNamePos = i;
+          }
+          // 第二列
+          if (
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.storeArr[this.storePos] += 1;
+            this.storeArr.push(0);
+          } else {
+            this.storeArr.push(1);
+            this.storePos = i;
+          }
+          // 第三列
+          if (
+            arys[i].examName === arys[i - 1].examName &&
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.feeArr[this.feePos] += 1;
+            this.feeArr.push(0);
+          } else {
+            this.feeArr.push(1);
+            this.feePos = i;
+          }
+        }
+      }
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0) {
+        // 第一列的合并方法
+        const row1 = this.typeNameArr[rowIndex];
+        const col1 = row1 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row1,
+          colspan: col1,
+        };
+      } else if (columnIndex === 1) {
+        // 第二列的合并方法
+        const row2 = this.storeArr[rowIndex];
+        const col2 = row2 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row2,
+          colspan: col2,
+        };
+      } else if (columnIndex === 2) {
+        // 第三列的合并方法
+        const row3 = this.feeArr[rowIndex];
+        const col3 = row3 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row3,
+          colspan: col3,
+        };
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+#hoursTimesRecord {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - 145px);
+}
+.datePicker {
+  margin-top: 14px;
+  font-size: 14px;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+.footerTableStyle {
+  flex: 1;
+  overflow: auto;
+}
+.btn_styleShow {
+  float: right;
+}
+.styFlex {
+  width: 80px;
+  text-align: center;
+}
+.btnstyles {
+  margin-left: 0px;
+  margin-bottom: 10px;
+}
+.dis_flexs {
+  display: flex;
+  align-items: center;
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  height: 211px;
+  background-color: #eee;
+  padding: 0px 30px;
+  overflow: auto;
+  flex-shrink: 0;
+  .ul_ls {
+    margin-right: 30px;
+    align-self: flex-start;
+    li {
+      font-size: 14px;
+      white-space: nowrap;
+      margin-bottom: 14px;
+    }
+  }
+  &::-webkit-scrollbar {
+    width: 14px;
+    height: 14px;
+  }
+
+  &::-webkit-scrollbar-track,
+  &::-webkit-scrollbar-thumb {
+    border-radius: 999px;
+    border: 5px solid transparent;
+  }
+
+  &::-webkit-scrollbar-track {
+    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    min-height: 20px;
+    background-clip: content-box;
+    box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-corner {
+    background: transparent;
+  }
+}
+.photoSty1 {
+  flex-shrink: 0;
+  width: 150px;
+  height: 160px;
+  background-color: #fff;
+  margin-right: 60px;
+  position: relative;
+}
+.photoSty2 {
+  position: relative;
+  flex-shrink: 0;
+  width: 230px;
+  height: 160px;
+  margin-right: 60px;
+  background-color: #fff;
+}
+.pos_bottom {
+  position: absolute;
+  height: 20px;
+  bottom: 0px;
+  left: 0px;
+  right: 0px;
+  background-color: rgba(0, 0, 0, 0.8);
+  text-align: center;
+  line-height: 20px;
+  font-size: 14px;
+  color: #fff;
+}
+.dis_fls {
+  margin: 16px 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+  .s_sd {
+    display: flex;
+    align-items: center;
+    flex-shrink: 0;
+    margin-bottom: 10px;
+    .dis_colu {
+      height: 55px;
+      margin-right: 14px;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-around;
+      font-size: 14px;
+    }
+  }
+}
+.jdNumSty {
+  border: 1px solid #000;
+  border-radius: 6px;
+  padding: 6px;
+}
+.shbtns {
+  padding: 0px 10px;
+  height: 55px;
+  line-height: 55px;
+  background-color: #eee;
+  border-radius: 6px;
+}
+.btnStys {
+  border: 1px solid #666;
+  padding: 0px 8px;
+  border-radius: 4px;
+  font-size: 15px;
+  margin-right: 8px;
+  cursor: pointer;
+}
+.liImgs {
+  float: left;
+  width: 250px;
+  height: 250px;
+  margin-right: 20px;
+  margin-bottom: 20px;
+  position: relative;
+  .abos {
+    position: absolute;
+    bottom: 0px;
+    width: 100%;
+    height: 44px;
+    line-height: 44px;
+    font-size: 16px;
+    color: #000;
+    text-align: center;
+    background-color: rgba(90, 90, 90, 0.7);
+  }
+}
+/deep/ .el-table {
+  border-radius: 8px;
+  overflow: hidden;
+}
+</style>

+ 253 - 0
src/views/education/archives/archivesDetails/bankRecords/index.vue

@@ -0,0 +1,253 @@
+<template>
+  <div id="bankRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="exam" slot-scope="props">
+        <div>
+          {{ `${props.scope.row.stuAllNum} / ${props.scope.row.examNum}` }}
+        </div> </template
+      ><template slot="btn" slot-scope="props">
+        <el-button type="text" @click="LearningRecord(props.scope.row)"
+          >练习记录</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <learning-record ref="LearningRecord" />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import learningRecord from "./LearningRecord.vue";
+export default {
+  name: "bankRecords",
+  components: { searchBoxNew, tableList, pagination, learningRecord },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "题库记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          placeholder1: "练习开始时间",
+          placeholder2: "练习结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "status",
+          placeholder: "题库状态",
+          scope: "select",
+          noClear: false,
+          options: [
+            {
+              label: "全部",
+              value: "0,1",
+            },
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "关闭",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入题库名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "练习时间",
+          prop1: "startTime",
+          prop2: "endTime",
+          scope: "TimeLists",
+          hidden: true,
+        },
+        {
+          label: "题库",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "年份",
+          prop: "year",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "服务期",
+          prop1: "serviceStartTime",
+          prop2: "serviceEndTime",
+          scope: "TimeLists",
+          hidden: true,
+        },
+        {
+          label: "状态",
+          prop: "goodsStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "关闭",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "模块卷",
+          prop: "moduleExamNum",
+          hidden: true,
+        },
+        {
+          label: "章卷",
+          prop: "chapterExamNum",
+          hidden: true,
+        },
+        {
+          label: "试卷",
+          prop: "examNum",
+          hidden: true,
+        },
+        {
+          label: "总进度(题目)",
+          hidden: true,
+          scope: "slot",
+          slotName: "exam",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    LearningRecord(item) {
+      this.$refs.LearningRecord.openBoxs(item);
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistUserExam(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 288 - 0
src/views/education/archives/archivesDetails/certificateRecords.vue

@@ -0,0 +1,288 @@
+<template>
+  <div id="certificateRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="time" slot-scope="props">
+        <div>
+          {{
+            $methodsTools.onlyForma(props.scope.row.trainStartTime, false) ||
+            "-"
+          }}
+          <span> 至 </span>
+          {{
+            $methodsTools.onlyForma(props.scope.row.trainEndTime, false) || "-"
+          }}
+        </div>
+      </template>
+      <template slot="hours" slot-scope="props">
+        <span>{{
+          props.scope.row.classHours + props.scope.row.publicClassHours
+        }}</span>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="Training(props.scope.row)"
+          >培训内容</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+
+    <BaseDialog
+      width="600px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="培训内容"
+      @close="close"
+    >
+      <el-main v-loading="loading_s" style="padding: 0px">
+        <ul class="ul_s">
+          <li class="li_h">{{ apiData.goodsName }}</li>
+          <li
+            class="li_l"
+            v-for="(item, index) in apiData.chapterList"
+            :key="index"
+          >
+            {{ item.name }}(学时:{{ computerTotalTime(item.totalTime) }})
+          </li>
+        </ul>
+      </el-main>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "certificateRecords",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      loading_s: false,
+      navText: {
+        title: "证书/证明",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "searchStartTime",
+          prop2: "searchEndTime",
+          placeholder1: "发证开始时间",
+          placeholder2: "发证结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "certificateCode",
+          placeholder: "输入证书编号",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "发证时间",
+          prop: "pushDate",
+          hidden: true,
+        },
+        {
+          label: "编号",
+          prop: "certificateCode",
+          hidden: true,
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "培训机构",
+          prop: "orgName",
+          hidden: true,
+        },
+        {
+          label: "培训时间",
+          hidden: true,
+          scope: "slot",
+          slotName: "time",
+        },
+        {
+          label: "培训学时",
+          hidden: true,
+          scope: "slot",
+          slotName: "hours",
+        },
+        {
+          label: "预览",
+          prop: "certificatePath",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      isShow: false,
+      apiData: {},
+    };
+  },
+  computed: {
+    computerTotalTime: function () {
+      return function (num) {
+        if (!num) {
+          return 0;
+        } else {
+          return (parseInt(num) / 45 / 60).toFixed(0);
+        }
+      };
+    },
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    close() {},
+    Training(item) {
+      this.apiData = {};
+      this.loading_s = true;
+      this.isShow = true;
+      this.$api
+        .userdangAncertificateDetail({
+          certificateCode: item.certificateCode,
+        })
+        .then((res) => {
+          this.apiData = res.data || {};
+        })
+        .finally(() => {
+          this.loading_s = false;
+        });
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistUserCertificate(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    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>
+.ul_s {
+  border: 1px solid #a4a4a4;
+  & > li {
+    padding: 8px 12px;
+    border-bottom: 1px solid #a4a4a4;
+    font-size: 14px;
+    &:last-child {
+      border-bottom: none;
+    }
+  }
+}
+.li_h {
+  font-weight: bold;
+}
+</style>

+ 213 - 0
src/views/education/archives/archivesDetails/commitment.vue

@@ -0,0 +1,213 @@
+<template>
+  <div id="commitment">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "commitment",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "承诺书",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide:true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "uploadStartTime",
+          prop2: "uploadEndTime",
+          placeholder1: "上传开始时间",
+          placeholder2: "上传结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "stampStatus",
+          placeholder: "盖章状态",
+          scope: "select",
+          options: [
+            {
+              label: "已盖章",
+              value: 1,
+            },
+            {
+              label: "待盖章",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "上传时间",
+          prop: "uploadTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          prop:"businessName",
+        },
+        {
+          label: "专业",
+          prop: "majorName",
+          hidden: true,
+        },
+        {
+          label: "签名状态",
+          prop: "signStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "已签名",
+              value: 1,
+            },
+          ],
+        },
+        {
+          label: "盖章状态",
+          prop: "stampStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "已盖章",
+              value: 1,
+            },
+            {
+              label: "待盖章",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "承诺书预览",
+          prop: "promiseUrl",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistPromise(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    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>

+ 282 - 0
src/views/education/archives/archivesDetails/courseRecords/ClassHour.vue

@@ -0,0 +1,282 @@
+<template>
+  <div>
+    <BaseDialog
+      width="1200px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="学时记录"
+      @close="close"
+    >
+      <el-descriptions :column="3" border style="margin-bottom:10px;">
+        <el-descriptions-item
+          v-for="(item, index) in setList"
+          :key="index"
+          :label="item.label"
+          :span="item.span || 1"
+        >
+          <template v-if="item.scope == 'studyHours'">
+            {{ (userData[item.value] / 60 / 45).toFixed(0) }}
+          </template>
+          <template v-else-if="item.scope == 'auditProgress'">
+            <span style="color: #67c23a; margin-right: 16px"
+              >通过:{{ userData[item.value1] }}节</span
+            >
+            <span style="color: #f56c6c; margin-right: 16px"
+              >作弊:{{ userData[item.value2] }}节</span
+            >
+            <span style="color: #409eff; margin-right: 16px"
+              >待审:{{ userData[item.value3] }}节</span
+            >
+          </template>
+          <template v-else-if="item.scope == 'isOptions'">
+            <template v-for="(items, indexs) in item.options">
+              <span :key="indexs" v-if="items.value == userData[item.value]">{{
+                items.label
+              }}</span>
+            </template>
+          </template>
+          <template v-else-if="item.scope == 'timeList'">
+            <span>{{ $methodsTools.onlyForma(userData[item.value1]) || " - " }}</span>
+            <span> 至 </span>
+            <span>{{ $methodsTools.onlyForma(userData[item.value2]) || " - " }}</span>
+          </template>
+          <div v-else-if="item.scope == 'img'" style="text-align: center">
+            <el-image
+              :style="{
+                width: item.width + 'px',
+                height: '200px',
+                borderRadius: '8px',
+              }"
+              :src="$methodsTools.splitImgHost(userData[item.value])"
+              :preview-src-list="[
+                $methodsTools.splitImgHost(userData[item.value]),
+              ]"
+            >
+            </el-image>
+          </div>
+          <template v-else>
+            {{ userData[item.value] }}
+          </template>
+        </el-descriptions-item>
+      </el-descriptions>
+      <component
+        v-for="key in Object.keys(tablesData)"
+        :key="key"
+        :is="keys[key]"
+        :tabledata="tablesData[key]"
+        :label="key == 5 ? '卷' : '章'"
+        :userImg="userData.oneInchPhotos"
+        :setData="setData"
+        :dontControls="true"
+      ></component>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+import ModulTable from "@/views/classHoursReview/component/ModulTable.vue";
+import ChapterTable from "@/views/classHoursReview/component/ChapterTable.vue";
+import LessonTable from "@/views/classHoursReview/component/LessonTable.vue";
+import CheatDialog from "@/views/classHoursReview/component/CheatDialog.vue";
+export default {
+  components: { ModulTable, ChapterTable, LessonTable, CheatDialog },
+  data() {
+    return {
+      isShow: false,
+      userData: {},
+      setList: [
+        { label: "姓名", value: "realName" },
+        {
+          label: "性别",
+          value: "sex",
+          scope: "isOptions",
+          options: [
+            {
+              label: "男",
+              value: 1,
+            },
+            {
+              label: "女",
+              value: 2,
+            },
+          ],
+        },
+        { label: "身份证号", value: "idCard" },
+        { label: "课程名称", value: "goodsName" },
+        { label: "课程年份", value: "sevenYear" },
+        { label: "业务类型", value: "business" },
+        { label: "专业", value: "categoryName" },
+        { label: "所在班级", value: "className" },
+        {
+          label: "班级有效期",
+          value1: "classStartTime",
+          value2: "classEndTime",
+          scope: "timeList",
+        },
+        {
+          label: "班级状态",
+          value: "gradeStatus",
+          scope: "isOptions",
+          options: [
+            {
+              label: "有效",
+              value: 1,
+            },
+            {
+              label: "无效",
+              value: 0,
+            },
+          ],
+        },
+        { label: "总学时", value: "numTotal", scope: "studyHours" },
+        {
+          label: "完成学时",
+          value: "finishSectionDuration",
+          scope: "studyHours",
+        },
+        { label: "总模块", value: "moduleTotal" },
+        { label: "总章数", value: "chapterTotal" },
+        { label: "总节数", value: "sectionTotal" },
+        { label: "总进度(节)", value: "schedule" },
+        {
+          label: "学习时间",
+          value1: "startTotalTime",
+          value2: "endTotalTime",
+          scope: "timeList",
+          span:2
+        },
+        {
+          label: "学时审核进度",
+          value1: "pass",
+          value2: "cheat",
+          value3: "pending",
+          scope: "auditProgress",
+        },
+        {
+          label: "做题审核进度",
+          value1: "examPass",
+          value2: "examCheat",
+          value3: "examPending",
+          scope: "auditProgress",
+        },
+        {
+          label: "学时审核",
+          value: "periodStatus",
+          scope: "isOptions",
+          options: [
+            {
+              label: "初审",
+              value: 2,
+            },
+            {
+              label: "复审",
+              value: 3,
+            },
+            {
+              label: "已通过",
+              value: 1,
+            },
+            {
+              label: "不通过",
+              value: 0,
+            },
+            {
+              label: "不可审核",
+              value: -1,
+            },
+          ],
+        },
+        { label: "证件照", value: "oneInchPhotos", scope: "img", width: 140 },
+        { label: "身份证正面", value: "idCardImg1", scope: "img", width: 300 },
+        { label: "身份证反面", value: "idCardImg2", scope: "img", width: 300 },
+      ],
+      keys: [],
+      tablesData: {},
+      setData: {},
+    };
+  },
+  provide() {
+    return {
+      getPeriodStatus: () => this.userData.periodStatus,
+      getUserImgPhoto: () => this.userData.oneInchPhotos,
+    };
+  },
+  mounted() {
+    this.keys = {
+      1: "ModulTable",
+      2: "ChapterTable",
+      5: "ChapterTable",
+      6: "LessonTable",
+    };
+  },
+  methods: {
+    openBoxs(item) {
+      this.userData = {};
+      this.setData = item;
+      this.isShow = true;
+      this.getUserInfo();
+    },
+    //获取用户信息
+    getUserInfo() {
+      let data = {
+        gradeId: this.setData.gradeId,
+        userId: this.setData.userId,
+        goodsId: this.setData.goodsId,
+        orderGoodsId: this.setData.orderGoodsId,
+      };
+      this.$api.inquireGradegradelistUserlistPeriod(data).then((res) => {
+        let userData = res.rows[0] || {};
+        userData.business = `${this.setData.educationName}-${this.setData.projectName}-${this.setData.businessName}`;
+        userData.categoryName = this.setData.categoryName;
+        userData.schedule = `${userData.stuAllNum}/${userData.secAllNum}`;
+        userData.totalVideo = `${(
+          ((userData.recordNum + userData.stuAllNum) /
+            (userData.examNum + userData.secAllNum)) *
+          100
+        ).toFixed(2)}%`;
+        this.$api.inquireGradegradelistPeriodAudit(data).then((res) => {
+          this.tablesData = this.changeData(res.rows);
+          if (res.rows.length > 0) {
+            userData.moduleTotal = res.rows[0].moduleTotal;
+            userData.chapterTotal = res.rows[0].chapterTotal;
+            userData.sectionTotal = res.rows[0].sectionTotal;
+            userData.startTotalTime = res.rows[0].startTotalTime;
+            userData.endTotalTime = res.rows[0].endTotalTime;
+            userData.numTotal = res.rows[0].secTotalTime;
+            this.userData = userData;
+          }
+        });
+      });
+    },
+
+    changeData(data) {
+      let obj = {};
+      data.forEach((e) => {
+        if (e.type == 5) {
+          e.classPeriodSectionList = [JSON.parse(JSON.stringify(e))];
+        }
+        // 区分章和模块卷
+        if (e.type == 1) {
+          e.classPeriods &&
+            e.classPeriods.forEach((ele, i) => {
+              if (ele.type == 5) {
+                ele.classPeriodSectionList = [JSON.parse(JSON.stringify(ele))];
+                e.arr = [ele];
+                e.classPeriods.splice(i, 1);
+              }
+            });
+        }
+        (obj[e.type] || (obj[e.type] = [])).push(e);
+      });
+      if (obj["3"]) {
+        obj["6"] = obj["3"];
+        delete obj["3"];
+      }
+      return obj;
+    },
+    close() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 571 - 0
src/views/education/archives/archivesDetails/courseRecords/LearningRecord.vue

@@ -0,0 +1,571 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="1200px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="学习记录"
+      @close="close"
+    >
+      <el-tabs
+        style="margin-top: 14px"
+        v-if="show"
+        v-model="activeCourseId"
+        type="card"
+        :before-leave="changeActiveCourseIdFunc"
+      >
+        <el-tab-pane
+          v-for="(item, index) in courseList"
+          :key="index"
+          :label="item.courseName"
+          :name="item.courseId + ''"
+        ></el-tab-pane>
+      </el-tabs>
+      <div class="footerTableStyle">
+        <el-table
+          v-if="!loading"
+          v-loading="loading"
+          ref="multipleTable"
+          :data="tableData"
+          border
+          :span-method="objectSpanMethod"
+          :header-cell-style="{
+            'background-color': '#CCDDF7',
+            padding: '2px',
+            color: '#0047D0',
+            'border-right-color': '#0047D0',
+            'border-left-color': '#0047D0',
+          }"
+        >
+          <el-table-column
+            v-for="(item, index) in tableList"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] == 1
+                    ? "及格"
+                    : scope.row[item.prop] == 0
+                    ? "不及格"
+                    : ""
+                }}
+              </span>
+              <span v-else-if="item.scope === 'sectionType'">
+                {{
+                  scope.row[item.prop] == 1
+                    ? "录播"
+                    : scope.row[item.prop] == 2
+                    ? "直播"
+                    : scope.row[item.prop] == 3
+                    ? "回放"
+                    : scope.row[item.prop] == 4
+                    ? "题卷"
+                    : ""
+                }}
+              </span>
+              <template v-else-if="item.scope == 'isOptions'">
+                <template v-for="(items, indexs) in item.options">
+                  <span
+                    v-if="items.value == scope.row[item.prop]"
+                    :key="indexs"
+                    >{{ items.label }}</span
+                  >
+                </template>
+              </template>
+              <div v-else-if="item.scope === 'moreTime'">
+                {{ $methodsTools.onlyForma(scope.row[item.prop1]) }} -
+                {{ $methodsTools.onlyForma(scope.row[item.prop2]) }}
+              </div>
+              <div v-else-if="item.scope === 'times'">
+                <span v-if="scope.row['sectionType'] == 4">{{
+                  $methodsTools.secondToDate(
+                    scope.row[item.prop2] - scope.row[item.prop1],
+                    false
+                  )
+                }}</span>
+                <span v-else>
+                  {{ $methodsTools.secondToDate(scope.row[item.prop3], false) }}
+                </span>
+              </div>
+              <span v-else-if="item.scope == 'rightRate'">
+                {{
+                  scope.row[item.prop]
+                    ? (scope.row[item.prop] * 100).toFixed(2) + "%"
+                    : "—"
+                }}
+              </span>
+              <span v-else-if="item.scope === 'durationTime'">
+                {{
+                  scope.row[item.prop]
+                    ? (scope.row[item.prop] / 45 / 60).toFixed(1)
+                    : 0
+                }}
+              </span>
+              <span v-else-if="item.scope === 'score'">
+                {{ scope.row[item.prop] ? scope.row[item.prop] + "分" : "—" }}
+              </span>
+              <span v-else>{{
+                scope.row[item.prop]
+                  ? scope.row[item.prop]
+                  : item.noMsg
+                  ? item.noMsg
+                  : ""
+              }}</span></template
+            >
+          </el-table-column>
+        </el-table>
+      </div></BaseDialog
+    >
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      isShow: false,
+      size: "medium",
+      loading: false,
+      tableList: [
+        {
+          label: "模块标题",
+          prop: "moduleName",
+        },
+        {
+          label: "章标题",
+          prop: "chapterName",
+        },
+        {
+          label: "节标题",
+          prop: "sectionName",
+        },
+        {
+          label: "学习类型",
+          prop: "sectionType",
+          scope: "sectionType",
+        },
+        {
+          label: "学时",
+          prop: "durationTime",
+          scope: "durationTime",
+        },
+        {
+          label: "学习/做题时间",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "moreTime",
+          width: "310px",
+        },
+        {
+          label: "学习/做题时长",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          prop3: "videoCurrentTime",
+          scope: "times",
+          width: "140px",
+        },
+        {
+          label: "做题成绩",
+          prop: "score",
+          scope: "score",
+        },
+        {
+          label: "做题正确率",
+          prop: "rightRate",
+          width: "120px",
+          scope: "rightRate",
+        },
+        {
+          label: "学习终端",
+          prop: "fromPlat",
+          scope: "isOptions",
+          options: [
+            { label: "小程序", value: 1 },
+            {
+              label: "PC网站",
+              value: 2,
+            },
+            {
+              label: "H5",
+              value: 3,
+            },
+          ],
+        },
+      ],
+      tableData: [],
+      formData: {},
+      total: 0,
+      showBox: true,
+      //路由参数
+      objs: {
+        time: "",
+      },
+      //课程列表
+      courseList: [],
+      //选中课程Id
+      activeCourseId: "",
+      //等待获取课程成功后渲染
+      show: false,
+      typeNameArr: [],
+      typeNamePos: 0,
+      storeArr: [],
+      storePos: 0,
+      feeArr: [],
+      feePos: 0,
+    };
+  },
+  watch: {
+    tableData(val) {
+      this.merage();
+    },
+  },
+  methods: {
+    openBoxs(item) {
+      this.courseList = [];
+      this.tableData = [];
+      this.isShow = true;
+      this.objs = item;
+      //获取课程列表
+      this.getGoodsCourseList(this.objs.goodsId).then((newName) => {
+        this.changeActiveCourseIdFunc(newName);
+      });
+    },
+    onlyForma(timeStamp) {
+      if (!timeStamp) {
+        return;
+      }
+      var date = new Date(timeStamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+      var Y = date.getFullYear();
+      var M =
+        date.getMonth() + 1 < 10
+          ? "0" + (date.getMonth() + 1)
+          : date.getMonth() + 1;
+      return {
+        time: timeStamp,
+        date: Y + "-" + M,
+        year: Y,
+        month: M,
+      };
+    },
+    //获取商品课程列表
+    getGoodsCourseList(id) {
+      return new Promise((resolve, reject) => {
+        this.$api.obtainCourseSgoodsId(id).then((res) => {
+          if (res.rows.length > 0) {
+            this.courseList = res.rows;
+            this.activeCourseId = res.rows[0].courseId + "";
+            this.show = true;
+            resolve(res.rows[0].courseId + "");
+          } else {
+            this.$message.warning("查无该商品课程列表");
+            reject();
+          }
+        });
+      });
+    },
+    //选中课程触发方法
+    changeActiveCourseIdFunc(newName, oldName) {
+      return new Promise((resolve, reject) => {
+        this.loading = true;
+        let data = {
+          gradeId: this.objs.gradeId,
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+          orderGoodsId: this.objs.orderGoodsId,
+          courseId: newName,
+        };
+        this.$api
+          .inquireGradegradelistUserStudyRecordV2Week(data)
+          .then((res) => {
+            if (res.code === 200) {
+              let COURSELISTMX = [];
+              res.rows.forEach((item) => {
+                if (item.recordList && item.recordList.length) {
+                  for (let i = 0; i < item.recordList.length; i++) {
+                    let ary = { ...item };
+                    ary.recordList[i].newVisitNum = i + 1;
+                    COURSELISTMX.push(Object.assign(ary, ary.recordList[i]));
+                  }
+                } else {
+                  if (item.studyStartTime || item.studyEndTime) {
+                    item.newVisitNum = 1;
+                  } else {
+                    item.newVisitNum = "未参与";
+                  }
+
+                  COURSELISTMX.push(item);
+                }
+              });
+              this.tableData = COURSELISTMX;
+              resolve();
+            } else {
+              reject();
+            }
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      });
+    },
+    merageInit() {
+      // 在下文的时候会用到,对数据进行初始化是很有必要的
+      this.typeNameArr = [];
+      this.typeNamePos = 0;
+      this.storeArr = [];
+      this.storePos = 0;
+      this.feeArr = [];
+      this.feePos = 0;
+    },
+    merage() {
+      this.merageInit(); // 前文的初始化数据函数
+      let arys = JSON.parse(JSON.stringify(this.tableData));
+      for (let i = 0; i < arys.length; i += 1) {
+        if (i === 0) {
+          // 第一行必须存在
+          this.typeNameArr.push(1);
+          this.typeNamePos = 0;
+          this.storeArr.push(1);
+          this.storePos = 0;
+          this.feeArr.push(1);
+          this.feePos = 0;
+        } else {
+          // 判断当前元素与上一个元素是否相同,eg:this.typeNamePos 是 this.typeNameArr序号
+          // 第一列 下面的是eslint的不限制语法
+          // eslint-disable-next-line no-lonely-if
+          if (arys[i].moduleName === arys[i - 1].moduleName) {
+            this.typeNameArr[this.typeNamePos] += 1;
+            this.typeNameArr.push(0);
+          } else {
+            this.typeNameArr.push(1);
+            this.typeNamePos = i;
+          }
+          // 第二列
+          if (
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.storeArr[this.storePos] += 1;
+            this.storeArr.push(0);
+          } else {
+            this.storeArr.push(1);
+            this.storePos = i;
+          }
+          // 第三列
+          if (
+            arys[i].sectionName === arys[i - 1].sectionName &&
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.feeArr[this.feePos] += 1;
+            this.feeArr.push(0);
+          } else {
+            this.feeArr.push(1);
+            this.feePos = i;
+          }
+        }
+      }
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0) {
+        // 第一列的合并方法
+        const row1 = this.typeNameArr[rowIndex];
+        const col1 = row1 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row1,
+          colspan: col1,
+        };
+      } else if (columnIndex === 1) {
+        // 第二列的合并方法
+        const row2 = this.storeArr[rowIndex];
+        const col2 = row2 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row2,
+          colspan: col2,
+        };
+      } else if (columnIndex === 2) {
+        // 第三列的合并方法
+        const row3 = this.feeArr[rowIndex];
+        const col3 = row3 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row3,
+          colspan: col3,
+        };
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+#hoursTimesRecord {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - 145px);
+}
+.datePicker {
+  margin-top: 14px;
+  font-size: 14px;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+.footerTableStyle {
+  flex: 1;
+  overflow: auto;
+}
+.btn_styleShow {
+  float: right;
+}
+.styFlex {
+  width: 80px;
+  text-align: center;
+}
+.btnstyles {
+  margin-left: 0px;
+  margin-bottom: 10px;
+}
+.dis_flexs {
+  display: flex;
+  align-items: center;
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  height: 211px;
+  background-color: #eee;
+  padding: 0px 30px;
+  overflow: auto;
+  flex-shrink: 0;
+  .ul_ls {
+    margin-right: 30px;
+    align-self: flex-start;
+    li {
+      font-size: 14px;
+      white-space: nowrap;
+      margin-bottom: 14px;
+    }
+  }
+  &::-webkit-scrollbar {
+    width: 14px;
+    height: 14px;
+  }
+
+  &::-webkit-scrollbar-track,
+  &::-webkit-scrollbar-thumb {
+    border-radius: 999px;
+    border: 5px solid transparent;
+  }
+
+  &::-webkit-scrollbar-track {
+    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    min-height: 20px;
+    background-clip: content-box;
+    box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-corner {
+    background: transparent;
+  }
+}
+.photoSty1 {
+  flex-shrink: 0;
+  width: 150px;
+  height: 160px;
+  background-color: #fff;
+  margin-right: 60px;
+  position: relative;
+}
+.photoSty2 {
+  position: relative;
+  flex-shrink: 0;
+  width: 230px;
+  height: 160px;
+  margin-right: 60px;
+  background-color: #fff;
+}
+.pos_bottom {
+  position: absolute;
+  height: 20px;
+  bottom: 0px;
+  left: 0px;
+  right: 0px;
+  background-color: rgba(0, 0, 0, 0.8);
+  text-align: center;
+  line-height: 20px;
+  font-size: 14px;
+  color: #fff;
+}
+.dis_fls {
+  margin: 16px 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+  .s_sd {
+    display: flex;
+    align-items: center;
+    flex-shrink: 0;
+    margin-bottom: 10px;
+    .dis_colu {
+      height: 55px;
+      margin-right: 14px;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-around;
+      font-size: 14px;
+    }
+  }
+}
+.jdNumSty {
+  border: 1px solid #000;
+  border-radius: 6px;
+  padding: 6px;
+}
+.shbtns {
+  padding: 0px 10px;
+  height: 55px;
+  line-height: 55px;
+  background-color: #eee;
+  border-radius: 6px;
+}
+.btnStys {
+  border: 1px solid #666;
+  padding: 0px 8px;
+  border-radius: 4px;
+  font-size: 15px;
+  margin-right: 8px;
+  cursor: pointer;
+}
+.liImgs {
+  float: left;
+  width: 250px;
+  height: 250px;
+  margin-right: 20px;
+  margin-bottom: 20px;
+  position: relative;
+  .abos {
+    position: absolute;
+    bottom: 0px;
+    width: 100%;
+    height: 44px;
+    line-height: 44px;
+    font-size: 16px;
+    color: #000;
+    text-align: center;
+    background-color: rgba(90, 90, 90, 0.7);
+  }
+}
+/deep/ .el-table {
+  border-radius: 8px;
+  overflow: hidden;
+}
+</style>

+ 278 - 0
src/views/education/archives/archivesDetails/courseRecords/index.vue

@@ -0,0 +1,278 @@
+<template>
+  <div id="courseRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="totalDus" slot-scope="props">
+        <span
+          >{{ props.scope.row.stuAllNum }}/{{ props.scope.row.secAllNum }}</span
+        >
+      </template>
+      <template slot="time" slot-scope="props">
+        <div>
+          {{ $methodsTools.onlyForma(props.scope.row.startTime) || "-" }}
+          <span> 至 </span>
+          {{ $methodsTools.onlyForma(props.scope.row.endTime) || "-" }}
+        </div>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="ClassHour(props.scope.row)"
+          >学时记录</el-button
+        >
+        <el-button type="text" @click="LearningRecord(props.scope.row)">学习记录</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <class-hour ref="ClassHour" />
+    <learning-record ref="LearningRecord" />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import ClassHour from "./ClassHour.vue";
+import LearningRecord from "./LearningRecord.vue";
+export default {
+  name: "courseRecords",
+  components: {
+    searchBoxNew,
+    tableList,
+    pagination,
+    ClassHour,
+    LearningRecord,
+  },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "网课记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "searchStartTime",
+          prop2: "searchEndTime",
+          placeholder1: "学习开始时间",
+          placeholder2: "学习结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "periodStatus",
+          placeholder: "学时审核",
+          scope: "select",
+          options: [
+            {
+              label: "初审",
+              value: 2,
+            },
+            {
+              label: "复审",
+              value: 3,
+            },
+            {
+              label: "已通过",
+              value: 1,
+            },
+            {
+              label: "不通过",
+              value: 0,
+            },
+            {
+              label: "不可审核",
+              value: -1,
+            },
+          ],
+        },
+        {
+          prop: "searchKey",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "学习时间",
+          scope: "slot",
+          slotName: "time",
+          hidden: true,
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "年份",
+          prop: "sevenYear",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "所在班级",
+          prop: "className",
+          hidden: true,
+        },
+        {
+          label: "总学时",
+          prop: "classHours",
+          hidden: true,
+        },
+        {
+          label: "总进度(节)",
+          hidden: true,
+          scope: "slot",
+          slotName: "totalDus",
+        },
+        {
+          label: "学时审核",
+          prop: "periodStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "初审",
+              value: 2,
+            },
+            {
+              label: "复审",
+              value: 3,
+            },
+            {
+              label: "已通过",
+              value: 1,
+            },
+            {
+              label: "不通过",
+              value: 0,
+            },
+            {
+              label: "不可审核",
+              value: -1,
+            },
+          ],
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    ClassHour(item) {
+      this.$refs.ClassHour.openBoxs(item);
+    },
+    LearningRecord(item){
+      this.$refs.LearningRecord.openBoxs(item);
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistVideoUserPeriod(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 259 - 0
src/views/education/archives/archivesDetails/examRecords.vue

@@ -0,0 +1,259 @@
+<template>
+  <div id="examRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="perfor" slot-scope="props">
+        <div>
+          {{!props.scope.row.performance && props.scope.row.performance != 0 ? '---':props.scope.row.performance + '分'}}
+        </div>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "examRecords",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "考试记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide:true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "applyStartTime",
+          prop2: "applyEndTime",
+          placeholder1: "考试开始时间",
+          placeholder2: "考试结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "applyNew",
+          placeholder: "是否新考",
+          scope: "select",
+          options: [
+            {
+              label: "是",
+              value: 1,
+            },
+            {
+              label: "否",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "applyStatus",
+          placeholder: "考试状态",
+          scope: "select",
+          options: [
+            {
+              label: "已通过",
+              value: 1,
+            },
+            {
+              label: "未通过",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "考试时间",
+          prop: "applyTimeStr",
+          hidden: true,
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          prop:"businessName",
+        },
+        {
+          label: "专业",
+          prop: "majorName",
+          hidden: true,
+        },
+        {
+          label: "是否新考",
+          prop: "applyNew",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "是",
+              value: 1,
+            },
+            {
+              label: "否",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "出考情况",
+          prop: "examStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "缺考",
+              value: 2,
+            },
+            {
+              label: "作弊",
+              value: 3,
+            },
+            {
+              label: "替考",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "考试状态",
+          prop: "applyStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "已通过",
+              value: 1,
+            },
+            {
+              label: "未通过",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "考试成绩",
+          hidden: true,
+          scope:"slot",
+          slotName:"perfor"
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistUserApply(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    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>

+ 133 - 0
src/views/education/archives/archivesDetails/index.vue

@@ -0,0 +1,133 @@
+<template>
+  <div id="archivesDetails">
+    <div class="header">
+      <strong
+        >姓名:<span>{{ userDetails.realname }}</span></strong
+      >
+      <strong
+        >身份证号:<span>{{ userDetails.idCard }}</span></strong
+      >
+    </div>
+    <el-tabs v-model="activeName" @tab-click="activeList" type="border-card">
+      <el-tab-pane
+        v-for="(item, index) in componentsList"
+        :key="index"
+        lazy
+        :label="item.label"
+        :name="item.name"
+      >
+        <component :is="item.name" :style="style"></component>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import personalData from "./personalData.vue";
+import orderRecords from "./orderRecords.vue";
+import registrationRecord from "./registrationRecord.vue";
+import courseRecords from "./courseRecords/index.vue";
+import bankRecords from "./bankRecords/index.vue";
+import liveRecords from "./liveRecords/index.vue";
+import profileRecords from "./profileRecords/index.vue";
+import certificateRecords from "./certificateRecords.vue";
+import jokaRecords from "./jokaRecords.vue";
+import examRecords from "./examRecords.vue";
+import commitment from "./commitment.vue";
+
+export default {
+  components: {
+    personalData,
+    orderRecords,
+    registrationRecord,
+    courseRecords,
+    bankRecords,
+    liveRecords,
+    profileRecords,
+    certificateRecords,
+    jokaRecords,
+    examRecords,
+    commitment,
+  },
+  data() {
+    return {
+      style: {},
+      activeName: "personalData",
+      userDetails: {},
+      componentsList: [
+        {
+          label: "个人资料",
+          name: "personalData",
+        },
+        {
+          label: "订单记录",
+          name: "orderRecords",
+        },
+        {
+          label: "报名记录",
+          name: "registrationRecord",
+        },
+        {
+          label: "网课记录",
+          name: "courseRecords",
+        },
+        {
+          label: "题库记录",
+          name: "bankRecords",
+        },
+        {
+          label: "直播记录",
+          name: "liveRecords",
+        },
+        {
+          label: "资料记录",
+          name: "profileRecords",
+        },
+        {
+          label: "约考记录",
+          name: "jokaRecords",
+        },
+        {
+          label: "考试记录",
+          name: "examRecords",
+        },
+        {
+          label: "证书/证明",
+          name: "certificateRecords",
+        },
+        {
+          label: "承诺书",
+          name: "commitment",
+        },
+      ],
+    };
+  },
+  created() {
+    this.userDetails = this.$route.query;
+  },
+  mounted() {
+    this.style = {
+      height: window.innerHeight - 240 + "px",
+      overflow: "auto",
+    };
+  },
+  methods: {
+    activeList() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.header {
+  border: 1px solid #eee;
+  border-radius: 8px;
+  padding: 10px 18px;
+  margin-bottom: 10px;
+  strong {
+    margin-right: 30px;
+    span {
+      font-weight: 400;
+    }
+  }
+}
+</style>

+ 369 - 0
src/views/education/archives/archivesDetails/jokaRecords.vue

@@ -0,0 +1,369 @@
+<template>
+  <div id="jokaRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+      ><template slot="month">
+        <el-date-picker
+          v-model="month"
+          type="month"
+          placeholder="选择考试年月"
+          format="yyyy 年 MM 月"
+          value-format="yyyyMM"
+          @change="getCanActiveApplyMonth"
+        >
+        </el-date-picker>
+        <!-- <el-select
+          size="small"
+          v-model="month"
+          placeholder="月份"
+          @change="getCanActiveApplyMonth"
+        >
+          <el-option
+            v-for="item in monthList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select> -->
+        <el-select
+          style="margin-left: 10px"
+          size="small"
+          v-model="day"
+          v-if="month"
+          placeholder="日期"
+          @change="getCanActiveApply"
+        >
+          <el-option
+            v-for="item in dayList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+
+        <el-select
+          style="margin-left: 10px"
+          v-if="month || day"
+          size="small"
+          v-model="monthApplyIndex"
+          placeholder="考试场次"
+        >
+          <el-option
+            v-for="(item, index) in monthApplyList"
+            :key="index"
+            :label="item.examSession"
+            :value="index"
+          >
+          </el-option> </el-select></template
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="time" slot-scope="props">
+        <div>
+          {{ $methodsTools.onlyForma(props.scope.row.trainStartTime) || "-" }}
+          <span> 至 </span>
+          {{ $methodsTools.onlyForma(props.scope.row.trainEndTime) || "-" }}
+        </div>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "jokaRecords",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      month: "",
+      monthList: [
+        { label: "一月", value: "01" },
+        { label: "二月", value: "02" },
+        { label: "三月", value: "03" },
+        { label: "四月", value: "04" },
+        { label: "五月", value: "05" },
+        { label: "六月", value: "06" },
+        { label: "七月", value: "07" },
+        { label: "八月", value: "08" },
+        { label: "九月", value: "09" },
+        { label: "十月", value: "10" },
+        { label: "十一月", value: "11" },
+        { label: "十二月", value: "12" },
+      ],
+      day: "",
+      dayList: [],
+      monthApplyIndex: "",
+      monthApplyList: [],
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "约考记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "subStartTime",
+          prop2: "subEndTime",
+          placeholder1: "约考开始时间",
+          placeholder2: "约考结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "subscribeStatus",
+          placeholder: "约考状态",
+          scope: "select",
+          options: [
+            {
+              label: "已预约",
+              value: 1,
+            },
+            {
+              label: "已过期",
+              value: 3,
+            },
+            {
+              label: "已取消",
+              value: 2,
+            },
+          ],
+        },
+        {
+          prop: "applyTime",
+          placeholder: "选择考试月份",
+          scope: "slot",
+          slotName: "month",
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "约考时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          prop: "businessName",
+        },
+        {
+          label: "专业",
+          prop: "majorName",
+          hidden: true,
+        },
+        {
+          label: "约考状态",
+          prop: "subscribeStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "已预约",
+              value: 1,
+            },
+            {
+              label: "已过期",
+              value: 3,
+            },
+            {
+              label: "已取消",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "考试时间",
+          prop: "applyTimeStr",
+          hidden: true,
+        },
+        {
+          label: "考试地点",
+          prop: "applyAddress",
+          hidden: true,
+        },
+        {
+          label: "备注",
+          prop: "remark",
+          hidden: true,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+        this.month = ""
+        this.day = ""
+        this.monthApplyIndex = ""
+      }
+      let data = Object.assign({}, this.formData);
+      if (this.month) {
+        var a = this.month;
+        if (this.day) {
+          a = this.month + "" + this.day;
+        }
+        data.ApplyDateTime = a;
+      }
+      if (this.monthApplyIndex) {
+        data.applySiteExamTime =
+          this.monthApplyList[this.monthApplyIndex].examTime;
+        data.applySiteStartTime =
+          this.monthApplyList[this.monthApplyIndex].examStartTime;
+        data.applySiteEndTime =
+          this.monthApplyList[this.monthApplyIndex].examEndTime;
+      }
+      this.$api
+        .userdangAnlistUserSubscribe(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+    getMonthDays(target) {
+      // 将字符串转换为字符数组
+      var arr = target.split("");
+      // 在指定位置插入字符
+      arr.splice(4, 0, "-");
+      // 转换回字符串
+      var newStr = arr.join("");
+      let date = new Date(newStr + "-01"); // 移动端使用格式要转成: "2018/10/01"
+      date.setMonth(date.getMonth() + 1); // 先设置为下个月
+      date.setDate(0); // 再置0,变成当前月最后一天
+      return date.getDate(); // 当前月最后一天即当前月拥有的天数
+    },
+    getCanActiveApplyMonth() {
+      this.day = "";
+      var num = this.getMonthDays(this.month);
+      var list = [];
+      for (let i = 0; i < num; i++) {
+        list.push({
+          label: i + 1 + "号",
+          value: i < 10 ? "0" + (i + 1) : i + 1,
+        });
+      }
+      this.dayList = list || [];
+      var a = this.month + this.day;
+      this.getSearchApply(a);
+    },
+    getCanActiveApply() {
+      var a = this.month + "" + this.day;
+      this.getSearchApply(a);
+    },
+    getSearchApply(i) {
+      this.monthApplyIndex = "";
+      this.$api
+        .obtainsystemsubscribesessiondata(i)
+        .then((res) => {
+          this.monthApplyList = res.data;
+        })
+        .catch(() => {
+          this.monthApplyList = [];
+        });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 556 - 0
src/views/education/archives/archivesDetails/liveRecords/LearningRecord.vue

@@ -0,0 +1,556 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="1200px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="学习记录"
+      @close="close"
+    >
+      <el-tabs
+        style="margin-top: 14px"
+        v-if="show"
+        v-model="activeCourseId"
+        type="card"
+        :before-leave="changeActiveCourseIdFunc"
+      >
+        <el-tab-pane
+          v-for="(item, index) in courseList"
+          :key="index"
+          :label="item.courseName"
+          :name="item.courseId + ''"
+        ></el-tab-pane>
+      </el-tabs>
+      <div class="footerTableStyle">
+        <el-table
+          v-if="!loading"
+          v-loading="loading"
+          ref="multipleTable"
+          :data="tableData"
+          border
+          :span-method="objectSpanMethod"
+          :header-cell-style="{
+            'background-color': '#CCDDF7',
+            padding: '2px',
+            color: '#0047D0',
+            'border-right-color': '#0047D0',
+            'border-left-color': '#0047D0',
+          }"
+        >
+          <el-table-column
+            v-for="(item, index) in tableList"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'status'">
+                {{
+                  scope.row[item.prop] == 1
+                    ? "及格"
+                    : scope.row[item.prop] == 0
+                    ? "不及格"
+                    : ""
+                }}
+              </span>
+              <template v-else-if="item.scope == 'isOptions'">
+                <template v-for="(items, indexs) in item.options">
+                  <span
+                    v-if="items.value == scope.row[item.prop]"
+                    :key="indexs"
+                    >{{ items.label }}</span
+                  >
+                </template>
+              </template>
+              <div v-else-if="item.scope === 'moreTime'">
+                {{ $methodsTools.onlyForma(scope.row[item.prop1]) }} -
+                {{ $methodsTools.onlyForma(scope.row[item.prop2]) }}
+              </div>
+              <div v-else-if="item.scope === 'times'">
+                <span v-if="scope.row['sectionType'] == 4">{{
+                  $methodsTools.secondToDate(
+                    scope.row[item.prop2] - scope.row[item.prop1],
+                    false
+                  )
+                }}</span>
+                <span v-else>
+                  {{ $methodsTools.secondToDate(scope.row[item.prop3], false) }}
+                </span>
+              </div>
+              <span v-else-if="item.scope == 'rightRate'">
+                {{
+                  scope.row[item.prop]
+                    ? (scope.row[item.prop] * 100).toFixed(2) + "%"
+                    : "—"
+                }}
+              </span>
+              <span v-else-if="item.scope === 'durationTime'">
+                {{
+                  scope.row[item.prop]
+                    ? (scope.row[item.prop] / 45 / 60).toFixed(1)
+                    : 0
+                }}
+              </span>
+              <span v-else-if="item.scope === 'score'">
+                {{ scope.row[item.prop] ? scope.row[item.prop] + "分" : "—" }}
+              </span>
+              <span v-else>{{
+                scope.row[item.prop]
+                  ? scope.row[item.prop]
+                  : item.noMsg
+                  ? item.noMsg
+                  : ""
+              }}</span></template
+            >
+          </el-table-column>
+        </el-table>
+      </div></BaseDialog
+    >
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      isShow: false,
+      size: "medium",
+      loading: false,
+      tableList: [
+        {
+          label: "模块",
+          prop: "moduleName",
+        },
+        {
+          label: "章",
+          prop: "chapterName",
+        },
+        {
+          label: "节",
+          prop: "sectionName",
+        },
+        {
+          label: "观看时间",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "moreTime",
+          width: "310px",
+        },
+        {
+          label: "观看时长",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          prop3: "videoCurrentTime",
+          scope: "times",
+          width: "140px",
+        },
+        {
+          label: "观看类型",
+          prop: "sectionType",
+          scope: "isOptions",
+          options: [
+            { label: "录播", value: 1 },
+            {
+              label: "直播",
+              value: 2,
+            },
+            {
+              label: "回放",
+              value: 3,
+            },
+            {
+              label: "试卷",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "观看终端",
+          prop: "fromPlat",
+          scope: "isOptions",
+          options: [
+            { label: "小程序", value: 1 },
+            {
+              label: "PC网站",
+              value: 2,
+            },
+            {
+              label: "H5",
+              value: 3,
+            },
+          ],
+        },
+      ],
+      tableData: [],
+      formData: {},
+      total: 0,
+      showBox: true,
+      //路由参数
+      objs: {
+        time: "",
+      },
+      //课程列表
+      courseList: [],
+      //选中课程Id
+      activeCourseId: "",
+      //等待获取课程成功后渲染
+      show: false,
+      typeNameArr: [],
+      typeNamePos: 0,
+      storeArr: [],
+      storePos: 0,
+      feeArr: [],
+      feePos: 0,
+    };
+  },
+  watch: {
+    tableData(val) {
+      this.merage();
+    },
+  },
+  methods: {
+    openBoxs(item) {
+      this.courseList = [];
+      this.tableData = [];
+      this.isShow = true;
+      this.objs = item;
+      //获取课程列表
+      this.getGoodsCourseList(this.objs.goodsId).then((newName) => {
+        this.changeActiveCourseIdFunc(newName);
+      });
+    },
+    onlyForma(timeStamp) {
+      if (!timeStamp) {
+        return;
+      }
+      var date = new Date(timeStamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+      var Y = date.getFullYear();
+      var M =
+        date.getMonth() + 1 < 10
+          ? "0" + (date.getMonth() + 1)
+          : date.getMonth() + 1;
+      return {
+        time: timeStamp,
+        date: Y + "-" + M,
+        year: Y,
+        month: M,
+      };
+    },
+    //获取商品课程列表
+    getGoodsCourseList(id) {
+      return new Promise((resolve, reject) => {
+        this.$api.obtainCourseSgoodsId(id).then((res) => {
+          if (res.rows.length > 0) {
+            this.courseList = res.rows;
+            this.activeCourseId = res.rows[0].courseId + "";
+            this.show = true;
+            resolve(res.rows[0].courseId + "");
+          } else {
+            this.$message.warning("查无该商品课程列表");
+            reject();
+          }
+        });
+      });
+    },
+    //选中课程触发方法
+    changeActiveCourseIdFunc(newName, oldName) {
+      return new Promise((resolve, reject) => {
+        this.loading = true;
+        let data = {
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+          orderGoodsId: this.objs.orderGoodsId,
+          courseId: newName,
+        };
+        this.$api
+          .userdangAnlistUserStudyLiveRecord(data)
+          .then((res) => {
+            if (res.code === 200) {
+              let COURSELISTMX = [];
+              res.rows.forEach((item) => {
+                if (item.recordList && item.recordList.length) {
+                  for (let i = 0; i < item.recordList.length; i++) {
+                    let ary = { ...item };
+                    ary.recordList[i].newVisitNum = i + 1;
+                    COURSELISTMX.push(Object.assign(ary, ary.recordList[i]));
+                  }
+                } else {
+                  if (item.studyStartTime || item.studyEndTime) {
+                    item.newVisitNum = 1;
+                  } else {
+                    item.newVisitNum = "未参与";
+                  }
+
+                  COURSELISTMX.push(item);
+                }
+              });
+              this.tableData = COURSELISTMX;
+              resolve();
+            } else {
+              reject();
+            }
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      });
+    },
+    merageInit() {
+      // 在下文的时候会用到,对数据进行初始化是很有必要的
+      this.typeNameArr = [];
+      this.typeNamePos = 0;
+      this.storeArr = [];
+      this.storePos = 0;
+      this.feeArr = [];
+      this.feePos = 0;
+    },
+    merage() {
+      this.merageInit(); // 前文的初始化数据函数
+      let arys = JSON.parse(JSON.stringify(this.tableData));
+      for (let i = 0; i < arys.length; i += 1) {
+        if (i === 0) {
+          // 第一行必须存在
+          this.typeNameArr.push(1);
+          this.typeNamePos = 0;
+          this.storeArr.push(1);
+          this.storePos = 0;
+          this.feeArr.push(1);
+          this.feePos = 0;
+        } else {
+          // 判断当前元素与上一个元素是否相同,eg:this.typeNamePos 是 this.typeNameArr序号
+          // 第一列 下面的是eslint的不限制语法
+          // eslint-disable-next-line no-lonely-if
+          if (arys[i].moduleName === arys[i - 1].moduleName) {
+            this.typeNameArr[this.typeNamePos] += 1;
+            this.typeNameArr.push(0);
+          } else {
+            this.typeNameArr.push(1);
+            this.typeNamePos = i;
+          }
+          // 第二列
+          if (
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.storeArr[this.storePos] += 1;
+            this.storeArr.push(0);
+          } else {
+            this.storeArr.push(1);
+            this.storePos = i;
+          }
+          // 第三列
+          if (
+            arys[i].sectionName === arys[i - 1].sectionName &&
+            arys[i].chapterName === arys[i - 1].chapterName &&
+            arys[i].moduleName === arys[i - 1].moduleName
+          ) {
+            this.feeArr[this.feePos] += 1;
+            this.feeArr.push(0);
+          } else {
+            this.feeArr.push(1);
+            this.feePos = i;
+          }
+        }
+      }
+    },
+    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0) {
+        // 第一列的合并方法
+        const row1 = this.typeNameArr[rowIndex];
+        const col1 = row1 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row1,
+          colspan: col1,
+        };
+      } else if (columnIndex === 1) {
+        // 第二列的合并方法
+        const row2 = this.storeArr[rowIndex];
+        const col2 = row2 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row2,
+          colspan: col2,
+        };
+      } else if (columnIndex === 2) {
+        // 第三列的合并方法
+        const row3 = this.feeArr[rowIndex];
+        const col3 = row3 > 0 ? 1 : 0; // 如果被合并了row = 0; 则他这个列需要取消
+        return {
+          rowspan: row3,
+          colspan: col3,
+        };
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+#hoursTimesRecord {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh - 145px);
+}
+.datePicker {
+  margin-top: 14px;
+  font-size: 14px;
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+}
+.footerTableStyle {
+  flex: 1;
+  overflow: auto;
+}
+.btn_styleShow {
+  float: right;
+}
+.styFlex {
+  width: 80px;
+  text-align: center;
+}
+.btnstyles {
+  margin-left: 0px;
+  margin-bottom: 10px;
+}
+.dis_flexs {
+  display: flex;
+  align-items: center;
+}
+.dis_fs {
+  display: flex;
+  align-items: center;
+  height: 211px;
+  background-color: #eee;
+  padding: 0px 30px;
+  overflow: auto;
+  flex-shrink: 0;
+  .ul_ls {
+    margin-right: 30px;
+    align-self: flex-start;
+    li {
+      font-size: 14px;
+      white-space: nowrap;
+      margin-bottom: 14px;
+    }
+  }
+  &::-webkit-scrollbar {
+    width: 14px;
+    height: 14px;
+  }
+
+  &::-webkit-scrollbar-track,
+  &::-webkit-scrollbar-thumb {
+    border-radius: 999px;
+    border: 5px solid transparent;
+  }
+
+  &::-webkit-scrollbar-track {
+    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    min-height: 20px;
+    background-clip: content-box;
+    box-shadow: 0 0 0 5px rgba(0, 0, 0, 0.2) inset;
+  }
+
+  &::-webkit-scrollbar-corner {
+    background: transparent;
+  }
+}
+.photoSty1 {
+  flex-shrink: 0;
+  width: 150px;
+  height: 160px;
+  background-color: #fff;
+  margin-right: 60px;
+  position: relative;
+}
+.photoSty2 {
+  position: relative;
+  flex-shrink: 0;
+  width: 230px;
+  height: 160px;
+  margin-right: 60px;
+  background-color: #fff;
+}
+.pos_bottom {
+  position: absolute;
+  height: 20px;
+  bottom: 0px;
+  left: 0px;
+  right: 0px;
+  background-color: rgba(0, 0, 0, 0.8);
+  text-align: center;
+  line-height: 20px;
+  font-size: 14px;
+  color: #fff;
+}
+.dis_fls {
+  margin: 16px 0px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+  .s_sd {
+    display: flex;
+    align-items: center;
+    flex-shrink: 0;
+    margin-bottom: 10px;
+    .dis_colu {
+      height: 55px;
+      margin-right: 14px;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-around;
+      font-size: 14px;
+    }
+  }
+}
+.jdNumSty {
+  border: 1px solid #000;
+  border-radius: 6px;
+  padding: 6px;
+}
+.shbtns {
+  padding: 0px 10px;
+  height: 55px;
+  line-height: 55px;
+  background-color: #eee;
+  border-radius: 6px;
+}
+.btnStys {
+  border: 1px solid #666;
+  padding: 0px 8px;
+  border-radius: 4px;
+  font-size: 15px;
+  margin-right: 8px;
+  cursor: pointer;
+}
+.liImgs {
+  float: left;
+  width: 250px;
+  height: 250px;
+  margin-right: 20px;
+  margin-bottom: 20px;
+  position: relative;
+  .abos {
+    position: absolute;
+    bottom: 0px;
+    width: 100%;
+    height: 44px;
+    line-height: 44px;
+    font-size: 16px;
+    color: #000;
+    text-align: center;
+    background-color: rgba(90, 90, 90, 0.7);
+  }
+}
+/deep/ .el-table {
+  border-radius: 8px;
+  overflow: hidden;
+}
+</style>

+ 225 - 0
src/views/education/archives/archivesDetails/liveRecords/index.vue

@@ -0,0 +1,225 @@
+<template>
+  <div id="liveRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="nums" slot-scope="props">
+        <div>
+          {{ props.scope.row.stuAllNum + " / " + props.scope.row.sectionNum }}
+        </div>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="LearningRecord(props.scope.row)">观看记录</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <learning-record ref="LearningRecord" />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import LearningRecord from "./LearningRecord.vue";
+export default {
+  name: "liveRecords",
+  components: { searchBoxNew, tableList, pagination,LearningRecord },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "直播记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "status",
+          placeholder: "直播状态",
+          scope: "select",
+          noClear: false,
+          options: [
+            {
+              label: "全部",
+              value: "0,1",
+            },
+            {
+              label: "有效",
+              value: 1,
+            },
+            {
+              label: "无效",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入直播名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "直播",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "状态",
+          prop: "status",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "关闭",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "模块",
+          prop: "moduleNum",
+          hidden: true,
+        },
+        {
+          label: "章",
+          prop: "chapterNum",
+          hidden: true,
+        },
+        {
+          label: "节",
+          prop: "sectionNum",
+          hidden: true,
+        },
+        {
+          label: "总进度(节)",
+          hidden: true,
+          scope: "slot",
+          slotName: "nums",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    LearningRecord(item){
+      this.$refs.LearningRecord.openBoxs(item);
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistUserLive(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 313 - 0
src/views/education/archives/archivesDetails/orderRecords.vue

@@ -0,0 +1,313 @@
+<template>
+  <div id="orderRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="dontgetmoney" slot-scope="props">
+        <div>
+          ¥{{
+            (props.scope.row.goodsRealPrice - props.scope.row.goodsReceived)
+              | formatPrice
+          }}
+        </div>
+      </template>
+      <template slot="time" slot-scope="props">
+        <div v-if="props.scope.row.serviceStartTime && props.scope.row.serviceEndTime">
+          {{
+            `${$methodsTools.onlyForma(
+              props.scope.row.serviceStartTime
+            )} 至 ${$methodsTools.onlyForma(props.scope.row.serviceEndTime)}`
+          }}
+        </div>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "orderRecords",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "订单记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "goodsType",
+          placeholder: "订单类别",
+          scope: "select",
+          options: [
+            {
+              label: "视频",
+              value: 1,
+            },
+            {
+              label: "题库",
+              value: 2,
+            },
+            {
+              label: "直播",
+              value: 6,
+            },
+            {
+              label: "资料",
+              value: 8,
+            },
+          ],
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "orderGoodsStatus",
+          placeholder: "订单状态",
+          scope: "select",
+          options: [
+            {
+              label: "待支付",
+              value: 0,
+            },
+            {
+              label: "已支付",
+              value: 1,
+            },
+            {
+              label: "已退款",
+              value: 2,
+            },
+            {
+              label: "已取消",
+              value: -1,
+            },
+          ],
+        },
+        {
+          prop: "searchKey",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "创建时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "订单编号",
+          prop: "orderSn",
+          hidden: true,
+        },
+        {
+          label: "订单类别",
+          prop: "goodsType",
+          hidden: true,
+          scope: "isOptions",
+          options: this.$methodsTools.getGoodsType(),
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "订单状态",
+          prop: "orderGoodsStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "已取消",
+              value: -1,
+            },
+            {
+              label: "待支付",
+              value: 0,
+            },
+            {
+              label: "已支付",
+              value: 1,
+            },
+            {
+              label: "已退款",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "支付方式",
+          prop: "payType",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "线下",
+              value: 0,
+            },
+            {
+              label: "微信",
+              value: 1,
+            },
+            {
+              label: "支付宝",
+              value: 2,
+            },
+            {
+              label: "金币",
+              value: 3,
+            },
+            {
+              label: "现金",
+              value: 4,
+            },
+            {
+              label: "网银支付",
+              value: 5,
+            },
+            {
+              label: "协议",
+              value: 6,
+            },
+            {
+              label: "对公转账",
+              value: 7,
+            },
+          ],
+        },
+        {
+          label: "成交金额",
+          prop: "goodsRealPrice",
+          hidden: true,
+          scope: "formatPrice",
+        },
+        {
+          label: "已收金额",
+          prop: "goodsReceived",
+          hidden: true,
+          scope: "formatPrice",
+        },
+        {
+          label: "未收金额",
+          hidden: true,
+          scope: "slot",
+          slotName: "dontgetmoney",
+        },
+        {
+          label: "服务期",
+          scope: "slot",
+          slotName: "time",
+          hidden: true,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistOrder(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 147 - 0
src/views/education/archives/archivesDetails/personalData.vue

@@ -0,0 +1,147 @@
+<template>
+  <div id="personalData">
+    <div class="box">
+      <div class="box_header">基础资料</div>
+      <el-descriptions :column="3" border>
+        <el-descriptions-item label="注册时间">
+          {{ $methodsTools.onlyForma(userDetails.createTime) }}
+        </el-descriptions-item>
+        <el-descriptions-item label="学员编号">
+          {{ userDetails.userAccount }}
+        </el-descriptions-item>
+        <el-descriptions-item label="姓名">
+          {{ userDetails.realname }}
+        </el-descriptions-item>
+        <el-descriptions-item label="性别">
+          {{ userDetails.sex == 1 ? "男" : userDetails.sex == 2 ? "女" : "" }}
+        </el-descriptions-item>
+        <el-descriptions-item label="手机号码">
+          {{ userDetails.telphone }}
+        </el-descriptions-item>
+        <el-descriptions-item label="身份证号">
+          {{ userDetails.idCard }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <div class="box">
+      <div class="box_header">学历</div>
+      <el-descriptions :column="3" border>
+        <el-descriptions-item label="学历">
+          {{ userDetails.eduLevel }}
+        </el-descriptions-item>
+        <el-descriptions-item label="毕业院校">
+          {{ userDetails.school }}
+        </el-descriptions-item>
+        <el-descriptions-item label="毕业时间">
+          {{ userDetails.graduationTime }}
+        </el-descriptions-item>
+        <el-descriptions-item label="所学专业">
+          {{ userDetails.major }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <div class="box">
+      <div class="box_header">工作</div>
+      <el-descriptions :column="3" border>
+        <el-descriptions-item label="工作年限" :span="3">
+          {{ userDetails.workYear }}
+        </el-descriptions-item>
+        <el-descriptions-item label="工作单位1">
+          {{ userDetails.companyName }}
+        </el-descriptions-item>
+        <el-descriptions-item label="单位联系人">
+          {{ userDetails.unitContact }}
+        </el-descriptions-item>
+        <el-descriptions-item label="单位联系电话">
+          {{ userDetails.unitTel }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <div class="box">
+      <div class="box_header">照片</div>
+      <div class="box_img">
+        <div>
+          <el-image
+            style="width: 140px; height: 200px"
+            :src="$methodsTools.splitImgHost(userDetails.oneInchPhotos)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(userDetails.oneInchPhotos),
+            ]"
+          >
+          </el-image>
+          <p>证件照</p>
+        </div>
+        <div>
+          <el-image
+            style="width: 300px; height: 200px"
+            :src="$methodsTools.splitImgHost(userDetails.idCardImg1)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(userDetails.idCardImg1),
+            ]"
+          >
+          </el-image>
+          <p>身份证正面</p>
+        </div>
+        <div>
+          <el-image
+            style="width: 300px; height: 200px"
+            :src="$methodsTools.splitImgHost(userDetails.idCardImg2)"
+            :preview-src-list="[
+              $methodsTools.splitImgHost(userDetails.idCardImg2),
+            ]"
+          >
+          </el-image>
+          <p>身份证反面</p>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      userDetails: {},
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    init() {
+      this.$api.appuserid(this.$route.query.id).then((res) => {
+        this.userDetails = res.data || {};
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.box {
+  padding: 10px 0px;
+  .box_header {
+    border-bottom: 2px solid #000;
+    font-size: 16px;
+    font-weight: 600;
+    padding: 10px;
+    margin-bottom: 10px;
+  }
+  .box_img {
+    display: flex;
+    align-items: center;
+    padding: 20px 20px 0px;
+    & > div {
+      padding: 10px;
+      margin-right: 50px;
+      & > .el-image {
+        border-radius: 8px;
+      }
+      & > p {
+        text-align: center;
+      }
+    }
+  }
+}
+</style>

+ 206 - 0
src/views/education/archives/archivesDetails/profileRecords/index.vue

@@ -0,0 +1,206 @@
+<template>
+  <div id="profileRecords">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="exam" slot-scope="props">
+        <div>
+          {{!props.scope.row.stuAllNum && !props.scope.row.examNum ? '' :((props.scope.row.stuAllNum / props.scope.row.examNum)*100).toFixed(2)+'%'}}
+        </div>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "profileRecords",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "资料记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "status",
+          placeholder: "资料状态",
+          scope: "select",
+          noClear:false,
+          options: [
+            {
+              label: "全部",
+              value: "0,1",
+            },
+            {
+              label: "有效",
+              value: 1,
+            },
+            {
+              label: "无效",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "goodsName",
+          placeholder: "输入资料名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "资料",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "科目",
+          prop: "subjectNames",
+          hidden: true,
+        },
+        {
+          label: "状态",
+          prop: "status",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "有效",
+              value: 1,
+            },
+            {
+              label: "无效",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "文件",
+          prop: "fileNum",
+          hidden: true,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistUserHandouts(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 230 - 0
src/views/education/archives/archivesDetails/registrationRecord.vue

@@ -0,0 +1,230 @@
+<template>
+  <div id="registrationRecord">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="busin" slot-scope="props">
+        <div>
+          {{
+            `${props.scope.row.educationName}-${props.scope.row.projectName}-${props.scope.row.businessName}`
+          }}
+        </div>
+      </template>
+      <template slot="dontgetmoney" slot-scope="props">
+        <div>
+          ¥{{
+            (props.scope.row.goodsRealPrice - props.scope.row.goodsReceived)
+              | formatPrice
+          }}
+        </div>
+      </template>
+      <template slot="time" slot-scope="props">
+        <div v-if="props.scope.row.serviceStartTime && props.scope.row.serviceEndTime">
+          {{
+            `${$methodsTools.onlyForma(
+              props.scope.row.serviceStartTime
+            )} 至 ${$methodsTools.onlyForma(props.scope.row.serviceEndTime)}`
+          }}
+        </div>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "registrationRecord",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "报名记录",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: false,
+        addHide: true,
+        tableHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop1: "searchStartTime",
+          prop2: "searchEndTime",
+          placeholder1: "报名开始时间",
+          placeholder2: "报名结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "profileStatus",
+          placeholder: "资料审核",
+          scope: "select",
+          options: [
+            {
+              label: "已通过",
+              value: 1,
+            },
+            {
+              label: "不通过",
+              value: 3,
+            },
+            {
+              label: "待审核",
+              value: 2,
+            },
+          ],
+        },
+        {
+          prop: "searchKey",
+          placeholder: "输入课程名称",
+        },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "报名时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "课程",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "课程年份",
+          prop: "goodsYear",
+          hidden: true,
+        },
+        {
+          label: "业务类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "busin",
+        },
+        {
+          label: "专业",
+          prop: "categoryName",
+          hidden: true,
+        },
+        {
+          label: "资料审核",
+          prop: "profileStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "通过",
+              value: 1,
+            },
+            {
+              label: "不通过",
+              value: 3,
+            },
+            {
+              label: "待审核",
+              value: 2,
+            }
+          ],
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          userId: this.$route.query.id,
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      this.$api
+        .userdangAnlistBKUserPeriod(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 110 - 0
src/views/education/archives/downListRW.vue

@@ -0,0 +1,110 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="640px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="下载记录"
+      @close="close"
+    >
+      <el-table :data="downLoadlist" style="width: 100%" border ref="table" max-height="600px" >
+        <el-table-column label="下载时间" align="center">
+          <template slot-scope="scope">
+            <span>{{$methodsTools.onlyForma(scope.row.taskTime)}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="taskCode" label="文件编码" align="center">
+        </el-table-column>
+        <el-table-column prop="taskStatus" label="状态" align="center">
+          <template slot-scope="scope">
+            {{ taskStatus(scope.row.taskStatus) }}
+          </template>
+        </el-table-column>
+        <el-table-column fixed="right" label="操作" width="100" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" size="small" @click="down(scope.row.taskPath)" v-if="scope.row.taskStatus == 3 || scope.row.taskStatus == 4"
+              >下载</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      isShow: false,
+    };
+  },
+  computed: {
+    ...mapGetters(["downLoadlist"]),
+  },
+  methods: {
+    taskStatus(i) {
+      var str = "";
+      switch (i) {
+        case 1:
+          str = "未开始";
+          break;
+        case 2:
+          str = "执行中";
+          break;
+        case 3:
+          str = "已完成";
+          break;
+        case 4:
+          str = "已下载";
+          break;
+
+        default:
+          break;
+      }
+      return str
+    },
+    openBoxs() {
+      this.isShow = true;
+    },
+    down(i) {
+      this.$methodsTools.exportData(i,false)
+    },
+    close() {},
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.updateBox {
+  display: flex;
+  & > .first {
+    width: 100px;
+    text-align: end;
+    height: 32px;
+    line-height: 32px;
+  }
+  & > .second {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    & > .labels {
+      width: 100%;
+      height: 32px;
+      line-height: 32px;
+      border-radius: 8px;
+      border: 1px solid #007aff;
+      text-align: center;
+      user-select: none;
+      cursor: pointer;
+      color: #aaa;
+      background-color: rgb(221, 238, 255);
+    }
+    & > p {
+      color: rgb(116, 116, 116);
+      margin: 10px 0px 0px;
+    }
+  }
+}
+</style>

+ 166 - 0
src/views/education/archives/fileDownload.vue

@@ -0,0 +1,166 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="500px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      :title="userList.length > 1 ? '档案批量下载' : '档案下载'"
+      @close="close"
+    >
+      <el-button
+        size="small"
+        type="primary"
+        style="margin-bottom: 14px"
+        @click="plDown"
+        >批量下载</el-button
+      >
+      <el-table :data="tableData" style="width: 100%" border ref="table">
+        <el-table-column type="selection" width="55" align="center">
+        </el-table-column>
+        <el-table-column prop="name" label="文件名称" align="center">
+        </el-table-column>
+        <el-table-column fixed="right" label="操作" width="100" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" size="small" @click="down([scope.row.value])"
+              >下载</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      isShow: false,
+      tableData: [
+        {
+          name: "个人资料",
+          value: 1,
+        },
+        {
+          name: "证件照",
+          value: 2,
+        },
+        {
+          name: "身份证",
+          value: 3,
+        },
+        {
+          name: "订单记录",
+          value: 4,
+        },
+        {
+          name: "报名记录",
+          value: 5,
+        },
+        {
+          name: "网课记录",
+          value: 6,
+        },
+        {
+          name: "题库记录",
+          value: 7,
+        },
+        {
+          name: "直播记录",
+          value: 8,
+        },
+        {
+          name: "资料记录",
+          value: 9,
+        },
+        {
+          name: "约考记录",
+          value: 10,
+        },
+        {
+          name: "考试记录",
+          value: 11,
+        },
+        {
+          name: "证书/证明",
+          value: 12,
+        },
+        {
+          name: "承诺书",
+          value: 13,
+        },
+      ],
+      userList: [],
+    };
+  },
+  methods: {
+    openBoxs(item) {
+      this.userList = item || [];
+      this.isShow = true;
+    },
+    plDown() {
+      let len = this.$refs.table.selection;
+      if (len.length > 0) {
+        this.down(len.map((i) => i.value));
+      } else {
+        this.$message.error("请勾选需要下载的选项");
+      }
+    },
+    down(i) {
+      this.$confirm(`确定${i.length > 1 ? "批量" : ""}下载吗?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$api
+            .userdangAndatadownload({
+              userIds: this.userList,
+              types: i,
+            })
+            .then((res) => {
+              this.$message.success("操作成功,正在下载");
+              this.$store.dispatch("downloadlist", true);
+            });
+        })
+        .catch(() => {});
+    },
+    close() {
+      this.$refs.table.clearSelection();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.updateBox {
+  display: flex;
+  & > .first {
+    width: 100px;
+    text-align: end;
+    height: 32px;
+    line-height: 32px;
+  }
+  & > .second {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    & > .labels {
+      width: 100%;
+      height: 32px;
+      line-height: 32px;
+      border-radius: 8px;
+      border: 1px solid #007aff;
+      text-align: center;
+      user-select: none;
+      cursor: pointer;
+      color: #aaa;
+      background-color: rgb(221, 238, 255);
+    }
+    & > p {
+      color: rgb(116, 116, 116);
+      margin: 10px 0px 0px;
+    }
+  }
+}
+</style>

+ 457 - 0
src/views/education/archives/index.vue

@@ -0,0 +1,457 @@
+<template>
+  <div id="archives">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :remarkStatus="true"
+    ></search-box-new>
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      :rowKey="'userId'"
+      ><template slot="customize">
+        <el-button type="primary" @click="plUpdate">更新文字资料</el-button>
+        <el-button type="primary" @click="plLeadInfo">更新图片资料</el-button>
+        <el-button type="primary" @click="fileDownloadFunc()">批量下载</el-button>
+        <el-button type="primary" @click="listDown">下载记录</el-button>
+      </template>
+      <template slot="code" slot-scope="props">
+        <div>
+          注册时间:{{ $methodsTools.onlyForma(props.scope.row.createTime) }}
+        </div>
+        <div>学员编号:{{ props.scope.row.userAccount }}</div>
+      </template>
+      <template slot="baseInfo" slot-scope="props">
+        <div>姓名:{{ props.scope.row.realname }}</div>
+        <div>
+          性别:{{
+            props.scope.row.sex == 1
+              ? "男"
+              : props.scope.row.sex == 2
+              ? "女"
+              : ""
+          }}
+        </div>
+        <div>手机号码:{{ props.scope.row.telphone }}</div>
+        <div>身份证号:{{ props.scope.row.idCard }}</div>
+      </template>
+      <template slot="educational" slot-scope="props">
+        <div>学历:{{ props.scope.row.eduLevel || "—" }}</div>
+        <div>毕业院校:{{ props.scope.row.school || "—" }}</div>
+        <div>毕业时间:{{ props.scope.row.graduationTime || "—" }}</div>
+        <div>所学专业:{{ props.scope.row.major || "—" }}</div>
+      </template>
+      <template slot="works" slot-scope="props">
+        <div>工作年限:{{ props.scope.row.workYear || "—" }}</div>
+        <div>工作单位:{{ props.scope.row.companyName || "—" }}</div>
+        <div>单位联系人:{{ props.scope.row.unitContact || "—" }}</div>
+        <div>单位联系电话:{{ props.scope.row.unitTel || "—" }}</div>
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="details(props.scope.row)"
+          >详情</el-button
+        >
+        <el-button type="text" @click="fileDownloadFunc(props.scope.row.userId)"
+          >下载</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <pl-update-box :dialogVisible.sync="plUpdateBox" />
+    <pl-lead-info-box :dialogVisible.sync="plLeadInfoBox" />
+    <file-download ref="fileDownload" />
+    <down-listrw ref="downListRw" />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import plUpdateBox from "./plUpdateBox.vue";
+import plLeadInfoBox from "./plLeadInfoBox.vue";
+import fileDownload from "./fileDownload.vue";
+import downListrw from "./downListRW.vue";
+
+export default {
+  name: "Archives",
+  components: {
+    searchBoxNew,
+    tableList,
+    pagination,
+    plUpdateBox,
+    plLeadInfoBox,
+    fileDownload,
+    downListrw
+  },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "学员档案",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        addHide: true,
+        openCheckMore: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        // {
+        //   prop: "",
+        //   placeholder: "订单状态",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //     {
+        //       label: "待支付",
+        //       value: 0,
+        //     },
+        //     {
+        //       label: "已退款",
+        //       value: 2,
+        //     },
+        //     {
+        //       label: "已取消",
+        //       value: 3,
+        //     },
+        //   ],
+        // },
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
+        {
+          prop: "majorId",
+          placeholder: "专业",
+          scope: "Professional",
+          edu: "educationTypeId",
+        },
+        // {
+        //   prop: "",
+        //   placeholder: "报名状态",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //     {
+        //       label: "待支付",
+        //       value: 0,
+        //     },
+        //     {
+        //       label: "已退款",
+        //       value: 2,
+        //     },
+        //     {
+        //       label: "已取消",
+        //       value: 3,
+        //     },
+        //   ],
+        // },
+        // {
+        //   prop: "",
+        //   placeholder: "学时审核",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //     {
+        //       label: "待支付",
+        //       value: 0,
+        //     },
+        //     {
+        //       label: "已退款",
+        //       value: 2,
+        //     },
+        //     {
+        //       label: "已取消",
+        //       value: 3,
+        //     },
+        //   ],
+        // },
+        // {
+        //   prop: "",
+        //   placeholder: "约考状态",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //   ],
+        // },
+        // {
+        //   prop: "",
+        //   placeholder: "是否新考",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //   ],
+        // },
+        // {
+        //   prop: "",
+        //   placeholder: "考试状态",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //   ],
+        // },
+        // {
+        //   prop: "",
+        //   placeholder: "出考情况",
+        //   scope: "select",
+        //   options: [
+        //     {
+        //       label: "已支付",
+        //       value: 1,
+        //     },
+        //   ],
+        // },
+        {
+          prop: "promiseUploadSign",
+          placeholder: "承诺书上传",
+          scope: "select",
+          options: [
+            {
+              label: "已上传",
+              value: 1,
+            },
+            {
+              label: "待上传",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "promiseSign",
+          placeholder: "承诺书签名",
+          scope: "select",
+          options: [
+            {
+              label: "已签名",
+              value: 1,
+            },
+            {
+              label: "待签名",
+              value: 0,
+            },
+          ],
+        },
+        {
+          prop: "realname",
+          placeholder: "输入姓名",
+        },
+        {
+          prop: "idCard",
+          placeholder: "输入身份证号",
+        },
+        {
+          prop: "telphone",
+          placeholder: "输入手机号码",
+        },
+        {
+          prop: "companyName",
+          placeholder: "输入工作单位",
+        },
+        // {
+        //   prop: "",
+        //   placeholder: "输入订单编号",
+        // },
+      ],
+      formData: {
+        status: "0,1",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "注册/编号",
+          hidden: true,
+          scope: "slot",
+          slotName: "code",
+          dontCenter: true,
+        },
+        {
+          label: "基本信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "baseInfo",
+          dontCenter: true,
+        },
+        {
+          label: "学历",
+          hidden: true,
+          scope: "slot",
+          slotName: "educational",
+          dontCenter: true,
+        },
+        {
+          label: "工作",
+          hidden: true,
+          scope: "slot",
+          slotName: "works",
+          dontCenter: true,
+        },
+        {
+          label: "证件照",
+          prop: "oneInchPhotos",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+        {
+          label: "身份证(正)",
+          prop: "idCardImg1",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+        {
+          label: "身份证(反)",
+          prop: "idCardImg2",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      plUpdateBox: false,
+      plLeadInfoBox: false,
+    };
+  },
+  mounted() {
+    this.search(2);
+  },
+  methods: {
+    listDown() {
+      this.$refs.downListRw.openBoxs();
+    },
+    plUpdate() {
+      this.plUpdateBox = true;
+    },
+    plLeadInfo() {
+      this.plLeadInfoBox = true;
+    },
+    fileDownloadFunc(i) {
+      if (!i) {
+        if (this.$refs.tableList.allCheckData.length == 0) {
+          this.$message.error("请勾选需要批量操作的学员");
+          return;
+        }
+        this.$refs.fileDownload.openBoxs(
+          this.$refs.tableList.allCheckData.map((s) => s.userId)
+        );
+      } else {
+        this.$refs.fileDownload.openBoxs([i]);
+      }
+    },
+    //详情
+    details(v) {
+      const jump = () => {
+        this.$router.push({
+          path: "archivesDetails",
+          query: {
+            id: v.userId,
+            realname: v.realname,
+            idCard: v.idCard,
+          },
+        });
+      };
+      const statusPage = this.$store.state.tagsView.visitedViews.some(
+        (item) => {
+          return item.name == "ArchivesDetails";
+        }
+      );
+      if (statusPage) {
+        this.$store
+          .dispatch("tagsView/delCachedView", {
+            name: "ArchivesDetails",
+          })
+          .then((res) => {
+            jump();
+          });
+      } else {
+        jump();
+      }
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          status: "0,1",
+          pageSize: 10,
+          pageNum: 1,
+        };
+        this.$refs.tableList.clearMoreActive()
+      }
+      this.$api
+        .appuserdangAnList(this.formData)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 128 - 0
src/views/education/archives/plLeadInfoBox.vue

@@ -0,0 +1,128 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="500px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="批量更新证件照/身份证/承诺书/证书"
+      @close="close"
+    >
+      <div class="updateBox">
+        <div class="first">导入文件:</div>
+        <div class="second">
+          <label class="labels" for="update2"
+            ><i class="el-icon-upload" style="color: #007aff"></i
+            ><span>选择并导入zip压缩包</span></label
+          >
+          <input
+            type="file"
+            id="update2"
+            style="display: none"
+            @change="updateFile"
+          />
+          <p style="color: #007aff">导入文件说明:</p>
+          <p>zip压缩包文件支持:jpg、png、pdf格式图片;</p>
+          <p>图片命名要求:</p>
+          <p>1、证件照:身份号码&证件照;</p>
+          <p>2、身份证正面:身份号码&身份证正面;</p>
+          <p>3、身份证反面:身份号码&身份证反面;</p>
+          <p>4、承诺书:身份号码&承诺书&专业;</p>
+          <p>5、证书/证明:身份号码&证书&专业;</p>
+          <p>6、例如证件照:441123200101213313&证件照;</p>
+        </div>
+      </div>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: () => {
+        return false;
+      },
+    },
+  },
+  data() {
+    return {};
+  },
+  computed: {
+    isShow: {
+      get() {
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+  },
+  methods: {
+    updateFile(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) return;
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      let typeList = ["zip"];
+      if (!typeList.includes(type[0])) {
+        self.$message.error("上传格式需为:.zip");
+        e.target.value = "";
+        return;
+      }
+      if (file.size > 50 * 1024 * 1024) {
+        self.$message.error("图片不得大于50MB");
+        return;
+      }
+      let formData = new FormData();
+      formData.append("file", file); //存储在oss的文件路径
+      this.$api
+        .userdangAnuserDataImgImport(formData)
+        .then((res) => {
+          this.$message.success("上传成功");
+          this.$parent.search(2);
+          this.isShow = false;
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    down() {},
+    close() {},
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.updateBox {
+  display: flex;
+  & > .first {
+    width: 100px;
+    text-align: end;
+    height: 32px;
+    line-height: 32px;
+  }
+  & > .second {
+    flex: 0.9;
+    display: flex;
+    flex-direction: column;
+    & > .labels {
+      font-weight: 400;
+      width: 100%;
+      height: 32px;
+      line-height: 32px;
+      border-radius: 8px;
+      border: 1px solid #007aff;
+      text-align: center;
+      user-select: none;
+      cursor: pointer;
+      color: #aaa;
+      background-color: rgb(221, 238, 255);
+    }
+    & > p {
+      color: rgb(116, 116, 116);
+      margin: 10px 0px 0px;
+    }
+  }
+}
+</style>

+ 125 - 0
src/views/education/archives/plUpdateBox.vue

@@ -0,0 +1,125 @@
+<template>
+  <div id="">
+    <BaseDialog
+      width="500px"
+      :isShowFooter="false"
+      :isShow.sync="isShow"
+      title="批量更新个人资料"
+      @close="close"
+    >
+      <div class="updateBox">
+        <div class="first">导入文件:</div>
+        <div class="second">
+          <label class="labels" for="update1"
+            ><i class="el-icon-upload" style="color: #007aff"></i
+            ><span>选择并导入更新资料</span></label
+          >
+          <input
+            type="file"
+            id="update1"
+            style="display: none"
+            @change="updateFile"
+          />
+          <span @click="down">下载导入模板</span>
+        </div>
+      </div>
+    </BaseDialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: () => {
+        return false;
+      },
+    },
+  },
+  data() {
+    return {};
+  },
+  computed: {
+    isShow: {
+      get() {
+        return this.dialogVisible;
+      },
+      set(val) {
+        this.$emit("update:dialogVisible", false);
+      },
+    },
+  },
+  methods: {
+    updateFile(e) {
+      var self = this;
+      var file = e.target.files[0];
+      if (file === undefined) return;
+      var type = e.target.value.toLowerCase().split(".").splice(-1);
+      let typeList = ["xlsx"];
+      if (!typeList.includes(type[0])) {
+        self.$message.error("上传格式需为:.xlsx");
+        e.target.value = "";
+        return;
+      }
+      if (file.size > 10 * 1024 * 1024) {
+        self.$message.error("图片不得大于10MB");
+        return;
+      }
+      let formData = new FormData();
+      formData.append("file", file); //存储在oss的文件路径
+      this.$api
+        .userdangAnuserDataImportUp(formData)
+        .then((res) => {
+          this.$message.success("上传成功")
+          this.$parent.search(2)
+          this.isShow = false
+        }).finally(()=>{
+          e.target.value = "";
+        })
+    },
+    down() {
+      this.$methodsTools.exportData('oss/images/file/dangan/upload/个人资料更新模板.xlsx',false)
+    },
+    close() {},
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.updateBox {
+  display: flex;
+  & > .first {
+    width: 100px;
+    text-align: end;
+    height: 32px;
+    line-height: 32px;
+  }
+  & > .second {
+    flex: 0.9;
+    display: flex;
+    flex-direction: column;
+    & > .labels {
+      font-weight: 400;
+      width: 100%;
+      height: 32px;
+      line-height: 32px;
+      border-radius: 8px;
+      border: 1px solid #007aff;
+      text-align: center;
+      user-select: none;
+      cursor: pointer;
+      color: #aaa;
+      background-color: rgb(221, 238, 255);
+    }
+    & > span {
+      cursor: pointer;
+      user-select: none;
+      color: #007aff;
+      margin-top: 10px;
+      display: inline-block;
+      text-decoration: underline;
+    }
+  }
+}
+</style>

+ 51 - 0
src/views/education/classManageMent/classHoursReview/component/LessonTable.vue

@@ -195,6 +195,50 @@
               }}
             </div>
           </div>
+          <div v-else-if="item.scope === 'aTimeSEComputer'">
+            <div
+              v-if="
+                scope2.row['type'] === 3 &&
+                scope2.row['durationTime'] &&
+                scope2.row['studyStartTime'] &&
+                scope2.row['studyEndTime']
+              "
+            >
+              <div
+                v-if="
+                  scope2.row['numIndex'] === scope2.row['numList'] &&
+                  scope2.row['numIndex'] !== 1
+                "
+              >
+                <div>
+                  上次时间:{{
+                    (
+                      (scope2.row["preEndTime"] - scope2.row["preStartTime"]) /
+                      60
+                    ).toFixed(0) || 0
+                  }}分钟
+                </div>
+                <div>
+                  重学时间:
+                  {{
+                    (
+                      (scope2.row[item.prop2] - scope2.row[item.prop1]) /
+                      60
+                    ).toFixed(0) || 0
+                  }}分钟
+                </div>
+              </div>
+              <div v-else>
+                学习时间:
+                {{
+                  (
+                    (scope2.row[item.prop2] - scope2.row[item.prop1]) /
+                    60
+                  ).toFixed(0) || 0
+                }}分钟
+              </div>
+            </div>
+          </div>
           <span v-else> {{ scope2.row[item.prop] }} </span>
         </template>
       </el-table-column>
@@ -274,6 +318,13 @@ export default {
           scope: "aTimeSE",
           width: "420px",
         },
+        {
+          label: "学习用时",
+          prop1: "studyStartTime",
+          prop2: "studyEndTime",
+          scope: "aTimeSEComputer",
+          width: "170px",
+        },
         {
           label: "审核状态",
           prop: "status",

+ 6 - 0
src/views/education/classManageMent/classHoursReview/component/ModulTable.vue

@@ -29,6 +29,12 @@
       <el-table-column align="center" prop="realName" label="姓名">
       </el-table-column>
       <el-table-column align="center" prop="typeName" label="模块标题">
+        <template slot-scope="scope">
+          <span>{{ scope.row.typeName }}</span
+          ><span v-if="scope.row.commonGradeName" style="color:red;">(公共班级:{{
+            scope.row.commonGradeName
+          }})</span>
+        </template>
       </el-table-column>
     </el-table>
   </div>

+ 89 - 96
src/views/education/classManageMent/classHoursReview/component/StudyTables.vue

@@ -1,92 +1,94 @@
 <template>
   <div class="studyRecordTable">
-    <div
-      class="studyStyle"
-      :class="{ isFixed: headerFixed }"
-      :style="{ left: left }"
-    >
-      <div class="a_style">
-        <i></i>
-        <span>视频审核进度</span>
-        <div class="flex_style_study">
-          <div class="num_style" style="color: #0047d0">
-            待审:{{ userData.pending }}节
-          </div>
-          <div class="num_style" style="color: #e53935">
-            作弊:{{ userData.cheat }}节
-          </div>
-          <div class="num_style" style="color: #43a047">
-            通过:{{ userData.pass }}节
+    <div style="height: 50px" class="fixeBox">
+      <div
+        class="studyStyle"
+        :class="fixeStatus ? 'isFixed' : null"
+        :style="{ left: left }"
+      >
+        <div class="a_style">
+          <i></i>
+          <span>视频审核进度</span>
+          <div class="flex_style_study">
+            <div class="num_style" style="color: #0047d0">
+              待审:{{ userData.pending }}节
+            </div>
+            <div class="num_style" style="color: #e53935">
+              作弊:{{ userData.cheat }}节
+            </div>
+            <div class="num_style" style="color: #43a047">
+              通过:{{ userData.pass }}节
+            </div>
+            <div style="clear: both"></div>
           </div>
-          <div style="clear: both"></div>
         </div>
-      </div>
-      <div class="a_style">
-        <i></i>
-        <span>做题审核进度</span>
-        <div class="flex_style_study">
-          <div class="num_style" style="color: #0047d0">
-            待审:{{ userData.examPending }}节
-          </div>
-          <div class="num_style" style="color: #e53935">
-            作弊:{{ userData.examCheat }}节
-          </div>
-          <div class="num_style" style="color: #43a047">
-            通过:{{ userData.examPass }}节
+        <div class="a_style">
+          <i></i>
+          <span>做题审核进度</span>
+          <div class="flex_style_study">
+            <div class="num_style" style="color: #0047d0">
+              待审:{{ userData.examPending }}节
+            </div>
+            <div class="num_style" style="color: #e53935">
+              作弊:{{ userData.examCheat }}节
+            </div>
+            <div class="num_style" style="color: #43a047">
+              通过:{{ userData.examPass }}节
+            </div>
+            <div style="clear: both"></div>
           </div>
-          <div style="clear: both"></div>
         </div>
-      </div>
-      <div class="a_style" style="width: 280px">
-        <i></i>
-        <span>学时审批状态</span>
-        <div class="flex_style_study">
-          <div class="num_style" style="color: #0047d0">
-            {{
-              ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
-                periodStatus + 1
-              ]
-            }}
+        <div class="a_style" style="width: 280px">
+          <i></i>
+          <span>学时审批状态</span>
+          <div class="flex_style_study">
+            <div class="num_style" style="color: #0047d0">
+              {{
+                ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
+                  periodStatus + 1
+                ]
+              }}
+            </div>
+            <div style="clear: both"></div>
           </div>
-          <div style="clear: both"></div>
         </div>
-      </div>
-      <div class="s_sd">
-        <template v-if="periodStatus === 2">
-          <el-checkbox
-            :disabled="!allIds.length"
-            :indeterminate="isIndeterminate"
-            v-model="checkAll"
-            @change="handleCheckAllChange"
-            >待审全选</el-checkbox
-          >
-          <el-button
-            style="margin-left: 10px"
-            size="mini"
-            type="success"
-            @click="getChangeStatus(1)"
-            >勾选通过</el-button
-          >
-          <el-button size="mini" type="danger" @click="getChangeStatus(2)"
-            >勾选作弊</el-button
-          >
-        </template>
+        <div class="s_sd">
+          <template v-if="periodStatus === 2">
+            <el-checkbox
+              :disabled="!allIds.length"
+              :indeterminate="isIndeterminate"
+              v-model="checkAll"
+              @change="handleCheckAllChange"
+              >待审全选</el-checkbox
+            >
+            <el-button
+              style="margin-left: 10px"
+              size="mini"
+              type="success"
+              @click="getChangeStatus(1)"
+              >勾选通过</el-button
+            >
+            <el-button size="mini" type="danger" @click="getChangeStatus(2)"
+              >勾选作弊</el-button
+            >
+          </template>
 
-        <template v-if="periodStatus === 3">
-          <el-button style="margin-left: 10px" size="mini" @click="checkBack"
-            >勾选数据,打回待审核状态</el-button
-          >
-          <el-button size="mini" type="warning" @click="approvedOK = true"
-            >确认审核通过结果</el-button
-          >
-        </template>
-        <!-- <el-button
+          <template v-if="periodStatus === 3">
+            <el-button style="margin-left: 10px" size="mini" @click="checkBack"
+              >勾选数据,打回待审核状态</el-button
+            >
+            <el-button size="mini" type="warning" @click="approvedOK = true"
+              >确认审核通过结果</el-button
+            >
+          </template>
+          <!-- <el-button
           v-if="periodStatus === 1"
           style="margin-left: 10px"
           size="mini"
           @click="backToAudit"
           >打回待审核状态</el-button
         > -->
+        </div>
       </div>
     </div>
 
@@ -182,7 +184,6 @@ import ChapterTable from "./ChapterTable.vue";
 import LessonTable from "./LessonTable.vue";
 import CheatDialog from "./CheatDialog.vue";
 import { rollBackPeriod } from "@/api/education/classManageMent";
-import { debounce } from "@/utils";
 import { mapGetters } from "vuex";
 export default {
   props: {
@@ -256,21 +257,10 @@ export default {
         },
       ],
       allType3List: [],
-      offsetTop: 0,
-      offsetHeight: 0,
-      headerFixed: false,
+      fixeStatus: false,
     };
   },
   methods: {
-    handleScroll() {
-      // 得到页面滚动的距离
-      let scrollTop =
-        window.pageYOffset ||
-        document.documentElement.scrollTop ||
-        document.body.scrollTop;
-      // 判断页面滚动的距离是否大于吸顶元素的位置
-      this.headerFixed = scrollTop > this.offsetTop + this.offsetHeight;
-    },
     submitAllSlect(reason) {
       this.submitOK(2, reason);
     },
@@ -457,6 +447,14 @@ export default {
         name: "ListOfhoursToBeReviewed",
       });
     },
+    scrollFunc() {
+      this.fixeStatus =
+        document.getElementsByClassName("fixeBox")[0].getBoundingClientRect()
+          .top <= 83
+          ? true
+          : false;
+          console.log(this.userData.examPending,'fixed')
+    },
   },
 
   created() {
@@ -486,16 +484,11 @@ export default {
     },
     ...mapGetters(["sidebar"]),
     left() {
-      return this.sidebar.opened ? "206px" : "60px";
+      return this.sidebar.opened ? "226px" : "60px";
     },
   },
-  mounted() {
-    this.$nextTick(function () {
-      let header = document.getElementsByClassName("studyStyle")[0];
-      this.offsetTop = header.offsetTop;
-      this.offsetHeight = header.offsetHeight;
-    });
-    window.addEventListener("scroll", debounce(this.handleScroll, 50));
+  mounted(){
+    // window.addEventListener("scroll", this.scrollFunc,false);
   },
 };
 </script>
@@ -503,9 +496,9 @@ export default {
 <style lang="scss" scoped>
 .studyRecordTable {
   .studyStyle {
-    margin: 16px 0;
     display: flex;
     align-items: center;
+    height: 50px;
 
     & > .a_style {
       display: flex;

+ 4 - 0
src/views/education/classManageMent/listOfhoursToBeReviewed/index.vue

@@ -175,6 +175,10 @@ export default {
           scope: "moreDataPicker",
           Diszing: true,
         },
+        {
+          prop: "companyName",
+          placeholder: "公司名称",
+        },
         {
           prop: "className",
           placeholder: "所在班级",

+ 2 - 2
src/views/education/classManageMent/otherPlatforms/index.vue

@@ -233,7 +233,8 @@ export default {
     await this.moRenBus();
     this.search();
   },
-  activated() {
+  async activated() {
+    await this.moRenBus();
     this.search();
   },
   methods: {
@@ -512,4 +513,3 @@ export default {
   }
 }
 </style>
-

+ 1 - 0
src/views/education/classManageMent/studentMenu/index.vue

@@ -918,6 +918,7 @@ export default {
       }
       let arr = this.$refs.tableList.allCheckData.map((item) => {
         return {
+          orderGoodsId:item.orderGoodsId,
           userId: item.userId,
           gradeId: this.$route.query.id,
         };

+ 19 - 0
src/views/education/dataReview/informationTemplate/index.vue

@@ -965,9 +965,25 @@ export default {
             },
           ],
         },
+        {
+          label: "审核通过才允许学习",
+          prop: "checkStatus",
+          scope: "status",
+          options: [
+            {
+              label: "是",
+              value: 1,
+            },
+            {
+              label: "否",
+              value: 0,
+            },
+          ],
+        },
       ],
       //   弹窗数据
       listData: {
+        checkStatus:0,
         keyValue: [],
         keyValue2: [],
       },
@@ -1099,6 +1115,7 @@ export default {
           { required: true, message: "请选择指派审核人", trigger: "change" },
         ],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
+        checkStatus: [{ required: true, message: "请选择", trigger: "change" }],
       },
       activeListGoods: [],
       totala: 0,
@@ -1637,6 +1654,7 @@ export default {
         this.statusPop = 1;
         this.listData = {
           status: 1,
+          checkStatus:0,
           keyValue: [],
           keyValue2: [],
         };
@@ -1646,6 +1664,7 @@ export default {
       } else {
         this.statusPop = int;
         this.listData = JSON.parse(JSON.stringify(v));
+        this.listData.checkStatus = this.listData.checkStatus || 0
         if (this.listData.keyValue) {
           this.listData.keyValue = JSON.parse(this.listData.keyValue);
         }

+ 151 - 0
src/views/education/examManagement/sevenExamData/dialog.vue

@@ -0,0 +1,151 @@
+<template>
+  <div id="">
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="800px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <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>
+      <div>
+        <span style="color: red">(本文件是从部里系统下载原始exel)</span>
+        选择导入文件:
+        <input type="file" @change="upload1" multiple />
+      </div>
+      <div style="margin-top: 60px">
+        <span style="color: red">(从部里系统下载证书pdf上传)</span>
+        选择导入文件:
+        <input type="file" @change="upload2" multiple />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+      </span>
+    </el-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>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      isShowErr: false,
+      errorData: "",
+    };
+  },
+  methods: {
+    openBoxs() {
+      this.dialogVisible = true;
+    },
+    upload1(e) {
+      this.errorData = "";
+      let STATUS = true;
+      let files = e.target.files;
+      if (files.length == 0) return;
+      let formData = new FormData();
+      files.forEach((i) => {
+        let type = i.name.toLowerCase().split(".").splice(-1);
+        let typeList = ["xls", "xlsx"];
+        formData.append("files", i);
+        if (!typeList.includes(type[0])) {
+          STATUS = false;
+        }
+      });
+      if (STATUS) {
+        const loading = this.$loading({
+          lock: true,
+          text: "文件上传中,请耐心等待",
+          spinner: "el-icon-loading",
+          background: "rgba(0, 0, 0, 0.7)",
+        });
+        this.$api
+          .commonapplyresultreceipt(formData)
+          .then((res) => {
+            if (res.msg) {
+              this.errorData = res.msg.replace(/,/g, "\r\n");
+              this.isShowErr = true;
+            }
+          })
+          .finally(() => {
+            loading.close();
+          });
+      } else {
+        this.$message.error("上传格式需为:.xls/.xlsx");
+        e.target.value = "";
+      }
+    },
+    upload2(e) {
+      this.errorData = "";
+      let STATUS = true;
+      let files = e.target.files;
+      if (files.length == 0) return;
+      let formData = new FormData();
+      files.forEach((i) => {
+        let type = i.name.toLowerCase().split(".").splice(-1);
+        let typeList = ["pdf"];
+        formData.append("files", i);
+        if (!typeList.includes(type[0])) {
+          STATUS = false;
+        }
+      });
+      if (STATUS) {
+        const loading = this.$loading({
+          lock: true,
+          text: "文件上传中,请耐心等待",
+          spinner: "el-icon-loading",
+          background: "rgba(0, 0, 0, 0.7)",
+        });
+        this.$api
+          .commonapplyresultcertificate(formData)
+          .then((res) => {
+            if (res.msg) {
+              this.errorData = res.msg.replace(/,/g, "\r\n");
+              this.isShowErr = true;
+            }
+          })
+          .finally(() => {
+            loading.close();
+          });
+      } else {
+        this.$message.error("上传格式需为:.pdf");
+        e.target.value = "";
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 77 - 36
src/views/education/examManagement/sevenExamData/index.vue

@@ -64,44 +64,55 @@
       @addClick="addClick"
       :loading="loading"
       ref="tableList"
-    >
+      ><template slot="customize">
+        <el-button type="primary" @click="getWorkList">下载任务列表</el-button>
+        <el-button type="primary" @click="exportFormData(2)"
+          >学员档案下载</el-button
+        >
+        <el-button type="primary" @click="$refs.dialog.openBoxs()"
+          >上传考试回执</el-button
+        >
+        <el-button type="primary" @click="exportFormData(1)"
+          >批量下载</el-button
+        >
+      </template>
       <template slot="name" slot-scope="props">
-        <div>
-          姓名:{{props.scope.row["userName"]}}
-        </div>
-        <div>
-          手机:{{props.scope.row["userPhone"]}}
-        </div>
-        <div>
-          身份证:{{props.scope.row["userCard"]}}
-        </div>
+        <div>姓名:{{ props.scope.row["userName"] }}</div>
+        <div>手机:{{ props.scope.row["userPhone"] }}</div>
+        <div>身份证:{{ props.scope.row["userCard"] }}</div>
       </template>
       <template slot="applyResult" slot-scope="props">
         <div>
-          考试时间:{{$methodsTools.onlyForma(props.scope.row["applyTime"],false)}}({{props.scope.row["applyStartTime"]}}-{{props.scope.row["applyEndTime"]}})
-        </div>
-        <div>
-          考试地点:{{props.scope.row["applyAddress"]}}
-        </div>
-        <div>
-          备注:自带文具、身份证
+          考试时间:{{
+            $methodsTools.onlyForma(props.scope.row["applyTime"], false)
+          }}({{ props.scope.row["applyStartTime"] }}-{{
+            props.scope.row["applyEndTime"]
+          }})
         </div>
+        <div>考试地点:{{ props.scope.row["applyAddress"] }}</div>
+        <div>备注:自带文具、身份证</div>
       </template>
       <template slot="receipt" slot-scope="props">
         <div>
-          出考情况:{{props.scope.row["examStatus"] == 1 ? "出席":""}}
-        </div>
-        <div>
-          分数登记:{{props.scope.row["performance"]}}
+          出考情况:{{ props.scope.row["examStatus"] == 1 ? "出席" : "" }}
         </div>
+        <div>分数登记:{{ props.scope.row["performance"] }}</div>
+        <div>证书编号:{{ props.scope.row["certificateCode"] }}</div>
         <div>
-          证书编号:{{props.scope.row["certificateCode"]}}
+          发证时间:{{
+            $methodsTools.onlyForma(
+              props.scope.row["certificateStartTime"],
+              false
+            )
+          }}
         </div>
         <div>
-          发证时间:{{$methodsTools.onlyForma(props.scope.row["certificateStartTime"],false)}}
-        </div>
-        <div>
-          到期时间:{{$methodsTools.onlyForma(props.scope.row["certificateEndTime"],false)}}
+          到期时间:{{
+            $methodsTools.onlyForma(
+              props.scope.row["certificateEndTime"],
+              false
+            )
+          }}
         </div>
       </template>
     </table-list>
@@ -112,18 +123,20 @@
       @handleSizeChange="handleSizeChange"
       @handleCurrentChange="handleCurrentChange"
     />
-    
+    <dialogs ref="dialog" />
+    <workList ref="workList" />
   </div>
 </template>
 
 <script>
-import * as baseUrls from "@/utils/request.js";
+import workList from "./workList.vue";
+import dialogs from "./dialog.vue";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
   name: "SevenExamData",
-  components: { searchBoxNew, tableList, pagination },
+  components: { dialogs, workList, searchBoxNew, tableList, pagination },
   data() {
     return {
       month: "",
@@ -153,7 +166,7 @@ export default {
         ch: "条",
         num: false,
         tableHide: true,
-        choice: true,
+        choice: false,
         changeWidth: "240px",
         openCheckMore: true,
         addHide: true,
@@ -211,12 +224,12 @@ export default {
       },
       // 表单
       tableSet: [
-         {
+        {
           label: "姓名",
           hidden: true,
           slotName: "name",
           scope: "slot",
-          dontCenter:'left'
+          dontCenter: "left",
         },
         {
           label: "课程",
@@ -269,7 +282,7 @@ export default {
           hidden: true,
           slotName: "applyResult",
           scope: "slot",
-          dontCenter:'left'
+          dontCenter: "left",
         },
         {
           label: "是否开通题库",
@@ -333,7 +346,7 @@ export default {
           hidden: true,
           slotName: "receipt",
           scope: "slot",
-          dontCenter:'left'
+          dontCenter: "left",
         },
       ],
       tableData: [], //表单数据
@@ -349,6 +362,34 @@ export default {
     this.getQP();
   },
   methods: {
+    getWorkList() {
+      this.$refs.workList.openBoxs();
+    },
+    exportFormData(type) {
+      if (!this.month || !this.day) {
+        this.$message.error("请在搜索条件中选择月份和日期");
+        return;
+      }
+      let date = new Date().getFullYear() + "-" + this.month + "-" + this.day;
+      this.$api[
+        type == 1
+          ? "systemsubscribesubrecorduserexport"
+          : "systemsubscribesubuserexport"
+      ]({
+        applyTime: new Date(date).getTime() / 1000 - 28800,
+      }).then((res) => {
+        if (type == 1) {
+          this.$methodsTools.exportData(res.data, false);
+          this.$message.success("导出成功,正在下载");
+        } else {
+          this.$notify({
+            title: "成功",
+            message: "学员档案下载中,请前往下载任务列表查看",
+            type: "success",
+          });
+        }
+      });
+    },
     /**
      * 默认选择考前培训-施工七大员
      */
@@ -455,10 +496,10 @@ export default {
         });
     },
     init() {
-      this.formData= {
+      this.formData = {
         pageSize: 10,
         pageNum: 1,
-      }
+      };
       this.month = "";
       this.day = "";
       this.search();

+ 127 - 0
src/views/education/examManagement/sevenExamData/workList.vue

@@ -0,0 +1,127 @@
+<template>
+  <div id="">
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="1000px"
+      :show-close="false"
+      :close-on-click-modal="false"
+      @close="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>
+      <el-table :data="list" style="width: 100%" border>
+        <el-table-column
+          prop="taskName"
+          label="文件名称"
+          width="480"
+          header-align="center"
+        >
+        </el-table-column>
+        <el-table-column prop="name" label="下载进度" align="center">
+          <template slot-scope="scope">
+            <el-progress
+              :percentage="
+                parseFloat(scope.row.finishNum / scope.row.taskNum) * 100 || 0
+              "
+            ></el-progress>
+          </template>
+        </el-table-column>
+        <el-table-column prop="address" label="状态" width="100" align="center">
+          <template slot-scope="scope">
+            {{ statusShow(scope.row.taskStatus) }}
+          </template>
+        </el-table-column>
+        <el-table-column fixed="right" label="操作" width="100" align="center">
+          <template slot-scope="scope">
+            <el-button
+              type="primary"
+              size="mini"
+              v-if="scope.row.taskStatus == 3"
+              @click="dowmLoad(scope.row.taskPath)"
+              >下载</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      clearInst: null,
+      list: [],
+      finishNum: 0,
+    };
+  },
+  computed: {
+    statusShow: function () {
+      return function (type) {
+        var str = "";
+        switch (type) {
+          case 1:
+            str = "未开始";
+            break;
+          case 2:
+            str = "执行中";
+            break;
+          case 3:
+            str = "已完成";
+            break;
+
+          default:
+            break;
+        }
+        return str;
+      };
+    },
+  },
+  methods: {
+    openBoxs() {
+      this.dialogVisible = true;
+      this.workList();
+      this.clearInst = setInterval(() => {
+        this.workList();
+      }, 1000);
+    },
+    close() {
+      clearInterval(this.clearInst);
+    },
+    workList() {
+      console.log(this.finishNum, "finishNum");
+      this.$api.systemsubscribesubuserexportlist().then((res) => {
+        this.list = res.data || [];
+      });
+    },
+    dowmLoad(path) {
+      this.$methodsTools.exportData(path, false);
+      this.$message.success("正在下载");
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+ul {
+  li {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 14px;
+  }
+}
+</style>

+ 1 - 1
src/views/education/studentManageMent/studentXQ/studentBaseManage.vue

@@ -281,7 +281,7 @@ export default {
   },
   methods: {
     editPass() {
-      this.$prompt("请输入6~16位字母、数字、符号的组合密码", "提示", {
+      this.$prompt("请输入8~16位字母、数字、符号的组合密码", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         inputPattern: /^(?:\d+|[a-zA-Z]+|[!@#$%^&*.]+){6,16}$/,

+ 1967 - 0
src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index copy.vue

@@ -0,0 +1,1967 @@
+<template>
+  <div id="baseAddPapers">
+    <el-tabs v-model="activeName" type="card">
+      <el-tab-pane label="试卷基本信息" name="first"></el-tab-pane>
+      <el-tab-pane label="试卷题目内容" name="second" disabled></el-tab-pane>
+    </el-tabs>
+    <div class="boxWidth" v-show="page === 1">
+      <el-form
+        label-position="right"
+        label-width="120px"
+        :model="listDataIns"
+        :rules="rules"
+        ref="listDataIns"
+      >
+        <el-form-item label="适用业务层级" :required="true">
+          <subject-cy :activeArray.sync="businessList"></subject-cy>
+        </el-form-item>
+        <el-form-item label="试卷类型" prop="examPaperId">
+          <el-select
+            v-model="listDataIns.examPaperId"
+            placeholder="请选择试卷类型"
+          >
+            <el-option
+              v-for="item in paperexam"
+              :key="item.paperId"
+              :label="item.paperName"
+              :value="item.paperId"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="地域(省)" prop="provinceId">
+          <el-select
+            v-model="listDataIns.provinceId"
+            placeholder="请选择省"
+            @change="changeCity"
+          >
+            <el-option
+              v-for="item in areas"
+              :key="item.areaId"
+              :label="item.areaName"
+              :value="item.areaId"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="地域(市)"
+          prop="cityId"
+          v-if="listDataIns.provinceId"
+        >
+          <el-select v-model="listDataIns.cityId" placeholder="请选择市">
+            <el-option
+              v-for="item in optionsCity"
+              :key="item.areaId"
+              :label="item.areaName"
+              :value="item.areaId"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份" prop="year">
+          <el-date-picker
+            v-model="listDataIns.year"
+            type="year"
+            value-format="yyyy"
+            placeholder="请选择年份"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="标题前缀" prop="prefixName">
+          <el-input v-model="listDataIns.prefixName"></el-input>
+        </el-form-item>
+        <el-form-item label="试卷名称" prop="examName">
+          <el-input v-model="listDataIns.examName"></el-input>
+        </el-form-item>
+        <el-form-item label="商品试卷限制终端学习" prop="examLimitClient">
+          <el-select
+            v-model="listDataIns.examLimitClient"
+            multiple
+            placeholder="请选择"
+          >
+            <el-option label="公众号" value="1"></el-option
+            ><el-option label="小程序" value="2"> </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="是否发布" prop="publishStatus">
+          <el-radio-group v-model="listDataIns.publishStatus">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="backPage">取消</el-button>
+          <el-button
+            type="primary"
+            @click="submitIns('listDataIns')"
+            :loading="disabledBtn"
+            >下一步</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </div>
+    <div v-show="page === 2">
+      <table-list
+        :tableSets="tableSet"
+        :tableData="tableData"
+        :navText="navText"
+        @addClick="openActiveBox"
+        :loading="loading"
+        @editInfo="editInfo"
+        @emitData="emitData"
+      >
+        <template slot="btn" slot-scope="props">
+          <el-button
+            type="text"
+            @click="addClick(props.scope.row, 0, props.scope.$index)"
+            >修改</el-button
+          >
+          <el-button
+            type="text"
+            @click="del(props.scope.row, props.scope.$index)"
+            >删除</el-button
+          >
+        </template>
+      </table-list>
+      <div class="centerStys">
+        <el-button size="small" type="warning" @click="page = 1"
+          >上一步</el-button
+        >
+        <el-button size="small" @click="backPage">取消</el-button>
+        <el-button size="small" type="primary" @click="submitTableAllInfos"
+          >确定</el-button
+        >
+      </div>
+      <el-dialog
+        width="1080px"
+        :visible.sync="innerVisiblePaperTopic"
+        append-to-body
+        :show-close="false"
+        :fullscreen="fullscreenChildPaperTopic"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">
+            {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+          </div>
+          <div class="rightBoxs">
+            <img
+              src="@/assets/images/Max@2x.png"
+              alt=""
+              @click="fullscreenChildPaperTopic = !fullscreenChildPaperTopic"
+            />
+            <img
+              src="@/assets/images/Close@2x.png"
+              alt=""
+              @click="closeBefore"
+            />
+          </div>
+        </div>
+        <busIns
+          @amdis="changeAmdis"
+          ref="sujects"
+          :typeBus="typeBus"
+          :sujectApisTable="sujectApisTable"
+          :newSujectApisTable="newSujectApisTable"
+        />
+        <el-form
+          label-position="right"
+          label-width="110px"
+          :model="listData"
+          ref="listData"
+          :rules="rulesTest"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <div v-if="items.scope === 'bussing'">
+              <div v-if="!activeExam.length">请在下面输入框添加知识点</div>
+              <ul v-else class="BusBoxs">
+                <li
+                  class="fot_Le"
+                  v-for="(item, index) in activeExam"
+                  :key="index"
+                >
+                  {{ item.knowledgeName }}
+                  <i
+                    class="el-icon-error icon_clear"
+                    @click="clearBusName(index)"
+                  ></i>
+                </li>
+                <div style="clear: both"></div>
+              </ul>
+              <el-select
+                v-model="value"
+                placeholder="请选择知识点"
+                @change="changeKnow"
+              >
+                <el-option
+                  v-for="item in options"
+                  :key="item.knowledgeId"
+                  :label="item.knowledgeName"
+                  :value="item.knowledgeId"
+                  :disabled="comLs(item)"
+                >
+                </el-option>
+              </el-select>
+              <el-button @click="addExam">自定义添加</el-button>
+            </div>
+
+            <el-radio-group
+              v-else-if="items.scope === 'radio'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio :label="1">发布</el-radio>
+              <el-radio :label="0">未发布</el-radio>
+            </el-radio-group>
+            <el-input
+              v-model="listData[items.prop]"
+              v-else
+            ></el-input> </el-form-item
+        ></el-form>
+        <questionBank :dingFormInfo="listNums" :nums="1" ref="child" />
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closeBefore">关 闭</el-button>
+          <el-button
+            @click="submitForm('listData')"
+            v-if="statusPop === 1 || statusPop === 0"
+            >完成</el-button
+          >
+        </span>
+      </el-dialog>
+      <el-dialog
+        :visible.sync="dialogVisible"
+        :append-to-body="true"
+        width="780px"
+        :show-close="false"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">添加</div>
+          <div class="rightBoxs">
+            <img src="@/assets/images/Close@2x.png" alt="" @click="closeBoxs" />
+          </div>
+        </div>
+        <div>
+          <el-form label-position="right" label-width="110px">
+            <el-form-item label="知识点">
+              <div>
+                <div v-if="!BusNameList.length">请在下面输入框添加知识点</div>
+                <ul v-else class="BusBoxs">
+                  <li
+                    class="fot_Le"
+                    v-for="(item, index) in BusNameList"
+                    :key="index"
+                  >
+                    {{ item }}
+                    <i
+                      class="el-icon-error icon_clear"
+                      @click="clearBus(index)"
+                    ></i>
+                  </li>
+                  <div style="clear: both"></div>
+                </ul>
+                <el-input
+                  style="width: 40%; margin-right: 10px"
+                  v-model="BusName"
+                ></el-input
+                ><el-button @click="addBusName">添加</el-button>
+              </div></el-form-item
+            ></el-form
+          >
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closeBoxs">取 消</el-button>
+          <el-button type="primary" @click="submit">确 定</el-button>
+        </span>
+      </el-dialog>
+      <el-dialog
+        :visible.sync="dialogVisibleActive"
+        width="420px"
+        :show-close="false"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">操作类型</div>
+          <div class="rightBoxs">
+            <img
+              src="@/assets/images/Close@2x.png"
+              alt=""
+              @click="closeBoxsActive"
+            />
+          </div>
+        </div>
+        <div>
+          <el-radio-group v-model="radioActive">
+            <el-radio :label="1">自定义</el-radio>
+            <el-radio :label="2">已有数据池</el-radio>
+          </el-radio-group>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closeBoxsActive">取 消</el-button>
+          <el-button type="primary" @click="submitActive">确 定</el-button>
+        </span>
+      </el-dialog>
+      <el-dialog
+        :visible.sync="dialogVisibleTable"
+        width="960px"
+        :show-close="false"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">题库数据池</div>
+          <div class="rightBoxs">
+            <img
+              src="@/assets/images/Close@2x.png"
+              alt=""
+              @click="closeBoxsTable"
+            />
+          </div>
+        </div>
+        <div>
+          <el-table
+            ref="multipleTable"
+            :data="boxtableData"
+            border
+            @select-all="selectAll"
+            @select="select"
+            :row-key="getRowKeys"
+            :header-cell-style="{
+              'background-color': '#eee',
+              padding: '8px',
+              color: '#333',
+            }"
+          >
+            <el-table-column
+              align="center"
+              type="selection"
+              width="55"
+              header-align="center"
+              :selectable="checkboxT"
+              :reserve-selection="true"
+            >
+            </el-table-column>
+            <template v-for="(item, index) in tableSetTables">
+              <el-table-column
+                v-if="item.scope !== 'inputs'"
+                :width="item.width"
+                :key="index"
+                :label="item.label"
+                align="center"
+                :show-overflow-tooltip="true"
+                header-align="center"
+              >
+                <template slot-scope="scope">
+                  <span v-if="item.scope === 'Status'">
+                    {{
+                      scope.row[item.prop] === 1
+                        ? "发布"
+                        : scope.row[item.prop] === 0
+                        ? "未发布"
+                        : "未知"
+                    }}
+                  </span>
+                  <span v-else-if="item.scope === 'topic'">{{
+                    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
+                    class="editInfoSty"
+                    v-else-if="item.scope === 'editInfoHTML'"
+                  >
+                    {{ getSimpleText(scope.row[item.prop]) }}
+                  </div>
+                  <div v-else-if="item.scope === 'knowledge'">
+                    <el-button
+                      type="success"
+                      size="small"
+                      v-for="(items, ks) in scope.row[item.prop]"
+                      :key="ks"
+                    >
+                      {{ items.knowledgeName }}
+                    </el-button>
+                  </div>
+                  <span v-else>{{ scope.row[item.prop] }}</span></template
+                >
+              </el-table-column></template
+            >
+          </el-table>
+          <!-- <pagination
+        :total="total"
+        :pageSize="pageSize"
+        :currentPage="currentPage"
+        @handleSizeChange="handleSizeChange"
+        @handleCurrentChange="handleCurrentChange"
+      /> -->
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closeBoxsTable">取 消</el-button>
+          <el-button type="primary" @click="submitTable">确 定</el-button>
+        </span>
+      </el-dialog>
+      <el-dialog
+        :visible.sync="diansBoxStatus"
+        width="960px"
+        :show-close="false"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">分值设置</div>
+          <div class="rightBoxs">
+            <img
+              src="@/assets/images/Close@2x.png"
+              alt=""
+              @click="closePagsInfos"
+            />
+          </div>
+        </div>
+        <div>
+          <div class="dis_fos">
+            <div>
+              <div class="margin_bs">当前总分:{{ getAllpocis }}</div>
+              <div class="margin_bs">
+                及格分数:<el-input-number
+                  style="margin: 0px 6px; width: 100px !important"
+                  v-model="passScore"
+                  controls-position="right"
+                  :min="0"
+                  size="mini"
+                ></el-input-number>
+              </div>
+              <div class="margin_bs">
+                答卷时长:
+                <el-radio-group v-model="djTimeType">
+                  <el-radio :label="0">无限时长</el-radio>
+                  <el-radio :label="1">有限时长</el-radio>
+                </el-radio-group>
+                <el-input-number
+                  v-if="djTimeType === 1"
+                  style="margin: 0px 6px; width: 100px !important"
+                  v-model="djTime"
+                  controls-position="right"
+                  :min="0"
+                  size="mini"
+                ></el-input-number>
+              </div>
+              <div class="margin_bs">
+                答卷次数:
+                <el-radio-group v-model="djNumType">
+                  <el-radio :label="0">无限次</el-radio>
+                  <el-radio :label="1">有限次</el-radio>
+                </el-radio-group>
+                <el-input-number
+                  v-if="djNumType === 1"
+                  style="margin: 0px 6px; width: 100px !important"
+                  v-model="djNum"
+                  controls-position="right"
+                  :min="0"
+                  size="mini"
+                ></el-input-number>
+              </div>
+            </div>
+            <div class="margin_bs">
+              <el-button size="mini" @click="activeOpens"
+                >按选中设置分数</el-button
+              ><el-button size="mini" @click="activePicis"
+                >按题型设置分数</el-button
+              >
+            </div>
+          </div>
+          <el-table
+            ref="multipleTables"
+            :data="boxtableDataPags"
+            border
+            @select-all="selectAllPags"
+            @select="selectPags"
+            :row-key="getRowKeysPags"
+            :header-cell-style="{
+              'background-color': '#eee',
+              padding: '8px',
+              color: '#333',
+            }"
+          >
+            <el-table-column
+              align="center"
+              type="selection"
+              width="55"
+              header-align="center"
+              :reserve-selection="true"
+            >
+            </el-table-column>
+            <el-table-column
+              label="序号"
+              type="index"
+              width="80"
+              align="center"
+            ></el-table-column>
+            <template v-for="(item, index) in tableSetTablesPags">
+              <el-table-column
+                v-if="item.scope !== 'inputs'"
+                :width="item.width"
+                :key="index"
+                :label="item.label"
+                :align="item.scope === 'inputS' ? 'left' : 'center'"
+                :show-overflow-tooltip="true"
+                header-align="center"
+              >
+                <template slot-scope="scope">
+                  <span v-if="item.scope === 'Status'">
+                    {{
+                      scope.row[item.prop] === 1
+                        ? "发布"
+                        : scope.row[item.prop] === 0
+                        ? "未发布"
+                        : "未知"
+                    }}
+                  </span>
+                  <span v-else-if="item.scope === 'topic'">{{
+                    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
+                    class="editInfoSty"
+                    v-else-if="item.scope === 'editInfoHTML'"
+                  >
+                    {{ getSimpleText(scope.row[item.prop]) }}
+                  </div>
+                  <div v-else-if="item.scope === 'inputS'">
+                    <el-input-number
+                      style="width: 100px !important"
+                      v-model="scope.row[item.prop]"
+                      controls-position="right"
+                      :min="0"
+                    ></el-input-number>
+                    <el-tooltip
+                      class="item"
+                      effect="dark"
+                      content="右侧输入框为多选题漏选给分"
+                      placement="top-start"
+                    >
+                      <i
+                        v-if="scope.row['type'] === 2"
+                        class="el-icon-question"
+                      ></i>
+                    </el-tooltip>
+
+                    <el-input-number
+                      v-if="scope.row['type'] === 2"
+                      style="width: 100px !important"
+                      v-model="scope.row['partScore']"
+                      controls-position="right"
+                      :min="0"
+                    ></el-input-number>
+                  </div>
+                  <div v-else-if="item.scope === 'knowledge'">
+                    <el-button
+                      type="success"
+                      size="small"
+                      v-for="(items, ks) in scope.row[item.prop]"
+                      :key="ks"
+                    >
+                      {{ items.knowledgeName }}
+                    </el-button>
+                  </div>
+                  <span v-else>{{ scope.row[item.prop] }}</span></template
+                >
+              </el-table-column></template
+            >
+          </el-table>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closePagsInfos">取 消</el-button>
+          <el-button type="primary" @click="submitPagsInfos">确 定</el-button>
+        </span>
+      </el-dialog>
+      <el-dialog
+        :visible.sync="dialogVisibleActivePocis"
+        width="420px"
+        append-to-body
+        :show-close="false"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">分值设置</div>
+          <div class="rightBoxs">
+            <img
+              src="@/assets/images/Close@2x.png"
+              alt=""
+              @click="closeBoxsActivePocis"
+            />
+          </div>
+        </div>
+        <div>
+          一共选择了{{ activeListsPags.length }}道题目,一键设置
+          <el-input-number
+            style="width: 100px !important"
+            v-model="Pocis"
+            controls-position="right"
+            :min="0"
+          ></el-input-number>
+          分
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closeBoxsActivePocis">取 消</el-button>
+          <el-button type="primary" @click="submitActivePocis">确 定</el-button>
+        </span>
+      </el-dialog>
+      <el-dialog
+        :visible.sync="dialogVisibleActivePLPoics"
+        width="580px"
+        append-to-body
+        :show-close="false"
+        :close-on-click-modal="false"
+      >
+        <div slot="title" class="hearders">
+          <div class="leftTitle">分值设置</div>
+          <div class="rightBoxs">
+            <img
+              src="@/assets/images/Close@2x.png"
+              alt=""
+              @click="closeBoxsActivePLPoics"
+            />
+          </div>
+        </div>
+        <div>
+          <div class="margin_bs" v-if="pocisArray.danx">
+            单选题:共{{ pocisArray.danx }}道,共
+            {{ pocisArray.danx * Pocis1 }} 分数,每题分数<el-input-number
+              style="margin: 0px 6px; width: 100px !important"
+              v-model="Pocis1"
+              controls-position="right"
+              :min="0"
+              size="mini"
+            ></el-input-number
+            >分
+          </div>
+          <div class="margin_bs" v-if="pocisArray.duox">
+            多选题:共{{ pocisArray.duox }}道,共
+            {{ pocisArray.duox * Pocis2 }} 分数,每题分数<el-input-number
+              style="margin: 0px 6px; width: 100px !important"
+              v-model="Pocis2"
+              controls-position="right"
+              :min="0"
+              size="mini"
+            ></el-input-number
+            >分
+            <el-tooltip
+              class="item"
+              effect="dark"
+              content="右侧输入框为多选题漏选给分"
+              placement="top-start"
+            >
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+
+            <el-input-number
+              style="margin: 0px 6px; width: 100px !important"
+              v-model="Pocis2s"
+              controls-position="right"
+              :min="0"
+              size="mini"
+            ></el-input-number>
+          </div>
+          <div class="margin_bs" v-if="pocisArray.pand">
+            判断题:共{{ pocisArray.pand }}道,共
+            {{ pocisArray.pand * Pocis3 }} 分数,每题分数<el-input-number
+              style="margin: 0px 6px; width: 100px !important"
+              v-model="Pocis3"
+              controls-position="right"
+              :min="0"
+              size="mini"
+            ></el-input-number
+            >分
+          </div>
+          <div class="margin_bs" v-if="pocisArray.anli">
+            案例题:共{{ pocisArray.anli }}道,共
+            {{ pocisArray.anli * Pocis4 }} 分数,每题分数<el-input-number
+              style="margin: 0px 6px; width: 100px !important"
+              v-model="Pocis4"
+              controls-position="right"
+              :min="0"
+              size="mini"
+            ></el-input-number
+            >分
+          </div>
+          <div class="margin_bs" v-if="pocisArray.jiand">
+            简答题:共{{ pocisArray.jiand }}道,共
+            {{ pocisArray.jiand * Pocis5 }} 分数,每题分数<el-input-number
+              style="margin: 0px 6px; width: 100px !important"
+              v-model="Pocis5"
+              controls-position="right"
+              :min="0"
+              size="mini"
+            ></el-input-number
+            >分
+          </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="closeBoxsActivePLPoics" size="small"
+            >取 消</el-button
+          >
+          <el-button type="primary" size="small" @click="submitActivePLPoics"
+            >确 定</el-button
+          >
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import subjectCy from "@/components/subjectCy";
+import tableList from "@/components/tableList";
+import busIns from "@/components/busIns";
+import questionBank from "@/components/questionBank";
+import { mapGetters } from "vuex";
+export default {
+  components: { tableList, busIns, questionBank, subjectCy },
+  name: "AddPaper",
+  data() {
+    return {
+      disabledBtn: false,
+      businessList: [],
+      activeName: "first",
+      data1: {},
+      page: 1,
+      listDataIns: {
+        provinceId: "",
+        cityId: "",
+        publishStatus: 1,
+      }, //   弹窗数据
+      eduTypeOptions: [], //教育类型数据
+      projectTypeOptions: [], //项目类型数据
+      courTypeOptions: [], //业务层次数据
+      newCourTypeOptions: [], //当前业务层次数据
+      sujectOption: [], //科目数据
+      newSujectOption: [], //当前科目数据数据
+      eduType: "", //当前选中教育类型
+      courType: "", //当前选中业务层次
+
+      newSujectApis: {},
+      sujectApis: "", //当前存在的科目 例如'19-2'
+      optionsCity: [],
+      //表单验证
+      rules: {
+        examPaperId: [
+          {
+            required: true,
+            message: "请选择试卷类型",
+            trigger: ["change", "blur"],
+          },
+        ],
+        // prefixName: [
+        //   { required: true, message: "请输入标题前缀", trigger: "blur" },
+        // ],
+        examName: [
+          { required: true, message: "请输入试卷名称", trigger: "blur" },
+        ],
+        publishStatus: [
+          { required: true, message: "请选择是否发布", trigger: "change" },
+        ],
+      },
+      rulesTest: {
+        // prefixName: [
+        //   { required: true, message: "请输入标签前缀", trigger: "blur" },
+        // ],
+      },
+      // --------------------------分割线-------------------------------------
+      tableSet: [
+        {
+          label: "排序",
+          prop: "sort",
+          scope: "inputs",
+          width: "100px",
+          hidden: true,
+        },
+        {
+          label: "题型",
+          prop: "type",
+          hidden: true,
+          scope: "topic",
+        },
+        {
+          label: "题目编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "标题前缀",
+          prop: "prefixName",
+          hidden: true,
+        },
+        {
+          label: "知识点",
+          prop: "knowledgeList",
+          hidden: true,
+          scope: "knowledge",
+          width: "180px",
+        },
+        {
+          label: "题目内容",
+          prop: "content",
+          hidden: true,
+          scope: "editInfoHTML",
+        },
+      ],
+      tableData: [],
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "题目管理",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: false,
+        addHide: false,
+        backFatherBtn: {
+          status: true,
+          title: "分值设置",
+        },
+      },
+      dialogVisible: false,
+      innerVisiblePaperTopic: false,
+      fullscreenChildPaperTopic: false,
+      statusPop: 1,
+      dingForm: {},
+      questionId: "",
+      queryData: {},
+      allOptions: [], //知识点列表
+      options: [], //当前知识点列表
+      activeExam: [], // 已选知识点列表
+      value: "",
+      BusName: "", //弹窗新增知识点输入框
+      BusNameList: [],
+      listNums: {},
+      typeBus: 1,
+      indexZB: "",
+      listData: {
+        publishStatus: "",
+        prefixName: "",
+      },
+      int: "",
+      listitem: [
+        {
+          label: "标题前缀",
+          prop: "prefixName",
+        },
+        {
+          label: "知识点",
+          scope: "bussing",
+        },
+        {
+          label: "发布状态",
+          prop: "publishStatus",
+          scope: "radio",
+        },
+      ],
+      radioActive: "",
+      dialogVisibleActive: false,
+      dialogVisibleTable: false,
+      boxtableData: [],
+      tableSetTables: [
+        {
+          label: "题目类型",
+          prop: "type",
+          hidden: true,
+          scope: "topic",
+        },
+        {
+          label: "题目编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "标题前缀",
+          prop: "prefixName",
+          hidden: true,
+        },
+        {
+          label: "知识点",
+          prop: "knowledgeList",
+          hidden: true,
+          scope: "knowledge",
+          width: "180px",
+        },
+        {
+          label: "题目标题",
+          prop: "content",
+          hidden: true,
+          scope: "editInfoHTML",
+        },
+        {
+          label: "发布状态",
+          prop: "publishStatus",
+          hidden: true,
+          scope: "Status",
+        },
+      ],
+      activeLists: [],
+      disCheckList: [],
+      sujectApisTable: [],
+      newSujectApisTable: [],
+      // -------------------------------------
+      diansBoxStatus: false,
+      boxtableDataPags: [],
+      tableSetTablesPags: [
+        {
+          label: "排序",
+          prop: "sort",
+          hidden: true,
+          width: "80px",
+        },
+        {
+          label: "题型",
+          prop: "type",
+          hidden: true,
+          scope: "topic",
+        },
+        {
+          label: "标题前缀",
+          prop: "prefixName",
+          hidden: true,
+        },
+        {
+          label: "题目标题",
+          prop: "content",
+          hidden: true,
+          scope: "editInfoHTML",
+        },
+        {
+          label: "发布状态",
+          prop: "publishStatus",
+          hidden: true,
+          scope: "Status",
+        },
+        {
+          label: "分值",
+          prop: "score",
+          hidden: true,
+          scope: "inputS",
+          width: "250px",
+        },
+      ],
+      activeListsPags: [],
+      dialogVisibleActivePocis: false,
+      Pocis: "",
+      dialogVisibleActivePLPoics: false,
+      Pocis1: "",
+      Pocis2: "",
+      Pocis2s: "",
+      Pocis3: "",
+      Pocis4: "",
+      Pocis5: "",
+      pocisArray: {
+        danx: 0,
+        duox: 0,
+        pand: 0,
+        anli: 0,
+        jiand: 0,
+      },
+      passScore: "", //及格分数
+      djTimeType: 0, //0无限1有限
+      djTime: 0, //答卷时长
+      djNumType: 0, //0无限1有限
+      djNum: 0, //答卷次数
+      localData: [],
+    };
+  },
+  computed: {
+    ...mapGetters(["paperexam", "areas", "cityList"]),
+    getAllpocis() {
+      var num = 0;
+      this.boxtableDataPags.map((item) => {
+        num += item.score;
+      });
+      return num;
+    },
+  },
+  mounted() {
+    this.localData = this.$methodsTools.getBusinessList();
+    this.getDict();
+    this.getFns();
+  },
+  watch: {
+    sujectApis: {
+      immediate: true,
+      handler(newName, oldName) {
+        this.changeTypes();
+      },
+    },
+    djTime: {
+      handler(newVal, oldVal) {
+        if (newVal === 0) {
+          this.djTimeType = 0;
+        } else {
+          this.djTimeType = 1;
+        }
+      },
+      // 立即处理 进入页面就触发
+      immediate: true,
+    },
+    djNum: {
+      handler(newVal, oldVal) {
+        if (newVal === 0) {
+          this.djNumType = 0;
+        } else {
+          this.djNumType = 1;
+        }
+      },
+      // 立即处理 进入页面就触发
+      immediate: true,
+    },
+    tableData: {
+      handler(newVal, oldVal) {
+        this.navText.index = newVal.length;
+      },
+      // 立即处理 进入页面就触发
+      immediate: true,
+    },
+  },
+  methods: {
+    unTime(val) {
+      let a = `${val.businessId}-${val.subjectId}`;
+      if (this.sujectApis == a) {
+        this.sujectApis = "";
+      } else {
+        this.sujectApis = a;
+      }
+    },
+    changeSty(val) {
+      var arr = "";
+      let arr1 = this.sujectApis.split("-").map(Number);
+      if (val.businessId == arr1[0] && val.subjectId == arr1[1]) {
+        arr = "activeStyIcons";
+      }
+      return arr;
+    },
+    getMessage() {
+      if (!this.courType) {
+        this.$message.warning("请先选择业务层级");
+      } else if (!this.newSujectOption.length) {
+        this.$message.warning("该业务层级暂无关联科目");
+      }
+    },
+    getSimpleText(html) {
+      var re1 = new RegExp("<.+?>", "g"); //匹配html标签的正则表达式,"g"是搜索匹配多个符合的内容
+      var msg = html.replace(re1, ""); //执行替换成空字符
+      return msg;
+    },
+    changeCity(newVal) {
+      this.optionsCity = this.cityList.filter((item) => {
+        return item.parentId === newVal;
+      });
+      this.listDataIns.cityId = "";
+    },
+    clearImgs() {
+      this.listDataIns.coverUrl = "";
+    },
+    changeTypes() {
+      var self = this;
+      if (!this.sujectApis) {
+        self.newSujectApis = {};
+        return;
+      }
+      this.courTypeOptions.map((items) => {
+        if (items.id === this.sujectApis.split("-").map(Number)[0]) {
+          var obj = {
+            type: 2,
+            educationTypeId: items.educationId,
+            educationName: items.educationName,
+            projectId: items.projectId,
+            projectName: items.projectName,
+            businessId: items.id,
+            businessName: items.businessName,
+          };
+          self.sujectOption.map((i) => {
+            if (
+              i.id === self.sujectApis.split("-").map(Number)[1] &&
+              i.courseArrays.indexOf(items.projectId) !== -1
+            ) {
+              obj.subjectName = i.subjectName;
+              obj.subjectId = i.id;
+            }
+          });
+          self.newSujectApis = obj;
+        }
+      });
+    },
+    submitSujectArray() {
+      this.$refs.popovers.doClose();
+    },
+    showHandle() {
+      this.sujectApis = "";
+      this.newSujectOption.map((item) => {
+        item.newId = this.courType + "-" + item.id;
+        if (item.newId === this.sujectApis) {
+          console.log("成功");
+        }
+      });
+      this.sujectApis =
+        this.newSujectApis.businessId + "-" + this.newSujectApis.subjectId;
+    },
+    hideHandle() {},
+    getDict() {
+      this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
+        this.eduTypeOptions = res.rows;
+      });
+      this.$api.inquireCourseProjectType({ status: 1 }).then((res) => {
+        this.projectTypeOptions = res.rows;
+      });
+      this.$api.inquirebusinessList({ status: 1 }).then((res) => {
+        this.courTypeOptions = res.rows;
+        this.newCourTypeOptions = res.rows;
+      });
+      this.$api.inquireCourseSubject({ status: 1 }).then((res) => {
+        res.rows.map((item, index) => {
+          var array = [];
+          item.courseProjectTypes.map((items, indexs) => {
+            array.push(items.id);
+          });
+          item.courseArrays = array;
+        });
+        this.sujectOption = res.rows;
+      });
+    },
+    changeEduType() {
+      if (!(this.courType === undefined || this.courType === "")) {
+        this.courType = "";
+      }
+      var arrays = [];
+      this.courTypeOptions.map((item) => {
+        if (item.educationId === this.eduType) {
+          arrays.push(item);
+        }
+      });
+      this.newCourTypeOptions = arrays;
+    },
+    changecourseType() {
+      this.newCourTypeOptions.map((item, index) => {
+        if (item.id === this.courType) {
+          this.eduType = item.educationId;
+          var array = [];
+          this.sujectOption.map((items, indexs) => {
+            if (items.courseArrays.indexOf(item.projectId) !== -1) {
+              array.push(items);
+            }
+          });
+          this.newSujectOption = array;
+        }
+      });
+      var arrays = [];
+      this.courTypeOptions.map((item) => {
+        if (item.educationId === this.eduType) {
+          arrays.push(item);
+        }
+      });
+      this.newCourTypeOptions = arrays;
+      this.$refs.popovers.doClose();
+    },
+    submitIns(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    async rulesTableSumbit() {
+      this.disabledBtn = true;
+      var data1 = {
+        examPaperId: this.listDataIns.examPaperId,
+        examName: this.listDataIns.examName,
+        publishStatus: this.listDataIns.publishStatus,
+        prefixName: this.listDataIns.prefixName,
+        businessList: this.businessList,
+        provinceId: this.listDataIns.provinceId,
+        cityId: this.listDataIns.cityId,
+        year: this.listDataIns.year,
+        status: 1,
+        examLimitClient: this.listDataIns.examLimitClient.join(",") || null,
+      };
+      this.$api
+        .addbankexam(data1)
+        .then((res) => {
+          this.$methodsTools.cacheBusinessList(this.businessList);
+          this.$message.success("新增成功");
+          this.$store.dispatch("tagsView/exitView", this.$route).then(() => {
+            this.$router.push({
+              path: "topicAddPaper",
+              query: {
+                id: res.data.examId,
+                code: res.data.code,
+              },
+            });
+          });
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
+    },
+    backPage() {
+      this.$store.dispatch("tagsView/delView", this.$route).then((res) => {
+        this.$router.push({
+          path: "testPaperManagement",
+        });
+      });
+    },
+    closeType() {
+      this.sujectApis = "";
+    },
+    // --------------------------分割线---------------------------
+    editInfo(v) {
+      this.addClick(v, 0);
+    },
+    search(v) {
+      this.loading = true;
+      var data = {
+        status: 1,
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.$api
+        .inquirebankquestionList(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search();
+    },
+    del(v, index) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          this.tableData.splice(index, 1);
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    openActiveBox() {
+      this.radioActive = "";
+      this.dialogVisibleActive = true;
+    },
+    submitActive() {
+      if (!this.radioActive) {
+        this.$message.warning("请选择操作类型");
+        return;
+      }
+      this.dialogVisibleActive = false;
+      if (this.radioActive === 1) {
+        this.addClick();
+      } else {
+        var self = this;
+        this.$api
+          .inquirebankquestionList({
+            status: 1,
+            pageNum: 1,
+            pageSize: 10,
+          })
+          .then((res) => {
+            var aList = [];
+            this.tableData.map((item) => {
+              if (item.questionId) {
+                aList.push(item.questionId);
+              }
+            });
+            this.disCheckList = aList;
+            this.boxtableData = res.rows;
+            this.dialogVisibleTable = true;
+            this.$nextTick(function () {
+              self.$refs.multipleTable.clearSelection();
+            });
+          });
+      }
+    },
+    closeBoxsActive() {
+      this.dialogVisibleActive = false;
+    },
+    submitTable() {
+      if (this.activeLists.length === 0) {
+        this.dialogVisibleTable = false;
+        return;
+      }
+      this.activeLists.map((item) => {
+        item.optionsList = JSON.parse(item.jsonStr);
+        item.sort = 0;
+        (item.partScore = 0), (item.score = "");
+      });
+      this.tableData = this.tableData.concat(this.activeLists);
+      this.dialogVisibleTable = false;
+      this.$message.success("添加成功");
+      this.activeLists = [];
+    },
+    closeBoxsTable() {
+      this.dialogVisibleTable = false;
+    },
+    selectAll(value) {
+      this.activeLists = value;
+    },
+    select(value) {
+      this.activeLists = value;
+    },
+    checkboxT(row, index) {
+      if (this.disCheckList.indexOf(row.questionId) !== -1) {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    getRowKeys(row) {
+      return row.questionId;
+    },
+    addClick(v, int, indexZB) {
+      var self = this;
+      if (v === undefined) {
+        self.statusPop = 1;
+        self.innerVisiblePaperTopic = true;
+        self.$nextTick(() => {
+          (self.listNums = {
+            type: 1,
+            optionsList: [],
+            answerQuestionList: [],
+            content: "",
+            status: "",
+            analysisContent: "",
+            answerQuestion: "",
+          }),
+            (self.$refs.sujects.eduType = "");
+          self.$refs.sujects.courType = "";
+          self.$refs.sujects.sujectApis = [];
+          self.$refs.sujects.newSujectApis = [];
+          self.listData = {
+            publishStatus: 1,
+            prefixName: "",
+          };
+          self.activeExam = [];
+        });
+      } else {
+        self.innerVisiblePaperTopic = true;
+        self.statusPop = int;
+        var vres = JSON.parse(JSON.stringify(v));
+        self.indexZB = indexZB;
+        if (vres.knowledgeIds) {
+          var a = [];
+          vres.knowledgeIds
+            .split(",")
+            .map(Number)
+            .map((items) => {
+              self.allOptions.map((item) => {
+                if (item.knowledgeId === items) {
+                  a.push(item);
+                }
+              });
+            });
+          self.activeExam = a;
+        }
+        if (vres.type === 2) {
+          if (vres.answerQuestion) {
+            vres.answerQuestionList = vres.answerQuestion
+              .split(",")
+              .map(Number);
+          }
+        } else if (vres.type === 4) {
+          vres.optionsList.map((item) => {
+            if (item.type === 2) {
+              if (item.answerQuestion) {
+                item.answerQuestionList = item.answerQuestion
+                  .split(",")
+                  .map(Number);
+              }
+            } else {
+              item.answerQuestionList = [];
+            }
+          });
+        } else {
+          vres.answerQuestionList = [];
+        }
+        self.listData.prefixName = vres.prefixName;
+        self.listData.publishStatus = vres.publishStatus;
+        self.listNums = vres;
+        var arrays = [];
+        vres.businessList.map((item) => {
+          arrays.push(item.businessId + "-" + item.subjectId);
+        });
+        self.sujectApisTable = arrays;
+        self.newSujectApisTable = vres.businessList;
+      }
+    },
+    //-----------------------------------------------
+    comLs(item) {
+      var os = this.activeExam.some((items) => {
+        return items.knowledgeId === item.knowledgeId;
+      });
+      if (os) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+    getFns() {
+      return new Promise((resolve, reject) => {
+        this.$api.inquireKnowledgeExamListS({ status: 1 }).then((res) => {
+          this.allOptions = res.rows;
+          resolve();
+        });
+      });
+    },
+    addBusName() {
+      if (this.BusName.trim()) {
+        var as = this.allOptions.some((item) => {
+          return item.knowledgeName == this.BusName;
+        });
+        if (as) {
+          this.$message.warning("当前知识点名称已存在");
+          return;
+        }
+        this.BusNameList.push(this.BusName);
+        this.BusName = "";
+      } else {
+        this.$message({
+          message: "请输入知识点内容",
+          type: "warning",
+          duration: 1200,
+        });
+        this.BusName = "";
+      }
+    },
+    submit() {
+      var data = {
+        examKnowledgeBusinessAddBoList: this.$refs.sujects.newSujectApis,
+        knowledgeName: this.BusNameList,
+        status: 1,
+      };
+      this.$api.addKnowledgeExam(data).then(async (res) => {
+        this.$message.success("添加成功");
+        this.dialogVisible = false;
+        await this.getFns();
+        this.changeAmdis();
+      });
+    },
+    closeBoxs() {
+      this.dialogVisible = false;
+    },
+    addExam() {
+      if (!this.$refs.sujects.courType) {
+        this.$message.warning("请选择业务层级");
+        return;
+      }
+      this.BusNameList = [];
+      this.BusName = "";
+      this.dialogVisible = true;
+    },
+    clearBus() {
+      this.BusNameList.splice(index, 1);
+    },
+    //子组件回调 业务层及变换-知识点重新筛选
+    changeAmdis() {
+      var int = this.$refs.sujects.courType;
+      var ao = [];
+      this.allOptions.map((item, index) => {
+        let acts = item.courseBusinessList.every((items) => {
+          return items.businessId === int;
+        });
+        if (acts) {
+          ao.push(item);
+        }
+      });
+      this.options = ao;
+    },
+    clearBusName(index) {
+      this.activeExam.splice(index, 1);
+    },
+    changeKnow(item) {
+      this.allOptions.map((items) => {
+        if (items.knowledgeId === item) {
+          this.activeExam.push(items);
+        }
+      });
+      this.value = "";
+    },
+    addListNums() {
+      this.listNums.push({
+        type: 1,
+        optionsList: [],
+        answerQuestionList: [],
+        content: "",
+        status: "",
+        analysisContent: "",
+        answerQuestion: "",
+      });
+    },
+    closeBefore() {
+      this.innerVisiblePaperTopic = false;
+    },
+    async submitForm(formName, int) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          var self = this;
+          if (!this.$refs.sujects.newSujectApis.length) {
+            this.$message.error("请选择科目");
+            return;
+          }
+          var data = this.$refs.child.getInfosPage();
+          if (!data.content || data.content == "<p><br></p>") {
+            self.$message.error("请填写题目内容");
+            return;
+          }
+          if (data.type != 3 && data.type != 5 && !data.optionsList.length) {
+            self.$message.error("请添加选项");
+            return;
+          }
+          if (data.type != 3 && data.type != 4 && data.optionsList.length) {
+            var ast = data.optionsList.some((item) => {
+              return !item.content && !item.imgUrl;
+            });
+            if (ast) {
+              self.$message.error("请完善选项内容");
+              return;
+            }
+          }
+          if (data.type != 5 && data.type != 4) {
+            if (data.type === 2 && !data.answerQuestionList.length) {
+              self.$message.error("请选择正确答案");
+              return;
+            }
+            if (data.type !== 2 && !data.answerQuestion) {
+              self.$message.error("请选择正确答案");
+              return;
+            }
+          }
+          if (data.type == 4 && data.optionsList.length) {
+            for (let i = 0; i < data.optionsList.length; i++) {
+              if (
+                !data.optionsList[i].content ||
+                data.optionsList[i].content == "<p><br></p>"
+              ) {
+                self.$message.error("请填写题目内容");
+                return;
+              }
+              if (
+                data.optionsList[i].type != 3 &&
+                data.optionsList[i].type != 5 &&
+                !data.optionsList[i].optionsList.length
+              ) {
+                self.$message.error("请添加选项");
+                return;
+              }
+              if (
+                data.optionsList[i].type != 3 &&
+                data.optionsList[i].optionsList.length
+              ) {
+                var ast = data.optionsList[i].optionsList.some((item) => {
+                  return !item.content && !item.imgUrl;
+                });
+                if (ast) {
+                  self.$message.error("请完善选项内容");
+                  return;
+                }
+              }
+              if (data.optionsList[i].type != 5) {
+                if (
+                  data.optionsList[i].type === 2 &&
+                  !data.optionsList[i].answerQuestionList.length
+                ) {
+                  self.$message.error("请选择正确答案");
+                  return;
+                }
+                if (
+                  data.optionsList[i].type !== 2 &&
+                  !data.optionsList[i].answerQuestion
+                ) {
+                  self.$message.error("请选择正确答案");
+                  return;
+                }
+              }
+            }
+          }
+          var numList = [];
+          this.activeExam.map((item) => {
+            numList.push(item.knowledgeId);
+          });
+          data.knowledgeList = this.activeExam;
+          data.prefixName = this.listData.prefixName;
+          data.knowledgeIds = numList.toString();
+          data.publishStatus = this.listData.publishStatus;
+          data.businessList = this.$refs.sujects.newSujectApis;
+          if (data.type === 2) {
+            if (data.answerQuestionList.length) {
+              data.answerQuestion = data.answerQuestionList.toString();
+            }
+          }
+          if (data.type === 4) {
+            data.optionsList.map((item) => {
+              if (item.type === 2) {
+                if (item.answerQuestionList.length) {
+                  item.answerQuestion = item.answerQuestionList.toString();
+                }
+              }
+            });
+          }
+          if (this.statusPop === 1) {
+            data.sort = 0;
+            data.partScore = 0;
+            data.score = "";
+            this.tableData.push(data);
+            // this.$api.addbankquestion(data).then((res) => {
+            self.$message.success("添加成功");
+            self.innerVisiblePaperTopic = false;
+            // self.search();
+            // });
+          }
+          if (this.statusPop === 0) {
+            this.tableData.splice(this.indexZB, 1, data);
+            // this.$api.editbankquestion(data).then((res) => {
+            self.$message.success("修改成功");
+            self.innerVisiblePaperTopic = false;
+            // self.search();
+            // });
+          }
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    uploadApis(item) {
+      return new Promise((resolve, reject) => {
+        this.$api.editbankquestion(item).then((res) => {
+          resolve();
+        });
+      });
+    },
+    addbankquestion(item) {
+      return new Promise((resolve, reject) => {
+        this.$api.addbankquestion(item).then((res) => {
+          resolve(res.data);
+        });
+      });
+    },
+    async submitTableAllInfos() {
+      var self = this;
+      var arrs = [];
+      for (let i = 0; i < this.tableData.length; i++) {
+        if (self.tableData[i].questionId) {
+          await self.uploadApis(self.tableData[i]);
+        } else {
+          var ids = await self.addbankquestion(self.tableData[i]);
+          self.tableData[i].questionId = ids;
+        }
+        arrs.push({
+          questionId: self.tableData[i].questionId,
+          sort: self.tableData[i].sort,
+          score: self.tableData[i].score,
+          partScore: self.tableData[i].partScore,
+        });
+      }
+      (this.data1.questionList = arrs), (this.data1.status = 1);
+      this.data1.passScore = this.passScore;
+      if (this.djTimeType === 0) {
+        this.data1.answerTime = 0;
+      } else {
+        this.data1.answerTime = this.djTime;
+      }
+      if (this.djNumType === 0) {
+        this.data1.answerNum = 0;
+      } else {
+        this.data1.answerNum = this.djNum;
+      }
+      this.$api.addbankexam(this.data1).then((res) => {
+        this.$message.success("新增成功");
+        setTimeout(() => {
+          this.$router.push({
+            path: "testPaperManagement",
+          });
+        }, 500);
+      });
+    },
+    emitData() {
+      if (!this.tableData.length) {
+        this.$message.warning("请添加题目");
+        return;
+      }
+      this.boxtableDataPags = JSON.parse(JSON.stringify(this.tableData));
+      this.diansBoxStatus = true;
+    },
+    closePagsInfos() {
+      this.diansBoxStatus = false;
+    },
+    submitPagsInfos() {
+      this.tableData = this.boxtableDataPags;
+      this.diansBoxStatus = false;
+    },
+    selectAllPags(value) {
+      this.activeListsPags = value;
+    },
+    selectPags(value) {
+      this.activeListsPags = value;
+    },
+    getRowKeysPags(row) {
+      return row.questionId;
+    },
+    activeOpens() {
+      if (!this.activeListsPags.length) {
+        this.$message.warning("请选择需要设置分值的题目");
+        return;
+      }
+      this.Pocis = "";
+      this.dialogVisibleActivePocis = true;
+    },
+    closeBoxsActivePocis() {
+      this.dialogVisibleActivePocis = false;
+    },
+    submitActivePocis() {
+      this.activeListsPags.map((item) => {
+        item.score = this.Pocis;
+      });
+      this.dialogVisibleActivePocis = false;
+      this.activeListsPags = [];
+      this.$refs.multipleTables.clearSelection();
+    },
+    activePicis() {
+      if (!this.activeListsPags.length) {
+        this.$message.warning("请选择需要设置分值的题目");
+        return;
+      }
+      this.pocisArray = {
+        danx: 0,
+        duox: 0,
+        pand: 0,
+        anli: 0,
+        jiand: 0,
+      };
+      for (let i = 0; i < this.activeListsPags.length; i++) {
+        if (this.activeListsPags[i].type === 1) {
+          this.pocisArray.danx++;
+        }
+        if (this.activeListsPags[i].type === 2) {
+          this.pocisArray.duox++;
+        }
+        if (this.activeListsPags[i].type === 3) {
+          this.pocisArray.pand++;
+        }
+        if (this.activeListsPags[i].type === 4) {
+          this.pocisArray.anli++;
+        }
+        if (this.activeListsPags[i].type === 5) {
+          this.pocisArray.jiand++;
+        }
+      }
+      this.Pocis1 = "";
+      this.Pocis2 = "";
+      this.Pocis2s = "";
+      this.Pocis3 = "";
+      this.Pocis4 = "";
+      this.Pocis5 = "";
+      this.dialogVisibleActivePLPoics = true;
+    },
+    closeBoxsActivePLPoics() {
+      this.dialogVisibleActivePLPoics = false;
+    },
+    submitActivePLPoics() {
+      this.activeListsPags.map((item) => {
+        if (item.type === 1) {
+          item.score = this.Pocis1;
+        }
+        if (item.type === 2) {
+          item.score = this.Pocis2;
+          item.partScore = this.Pocis2s;
+        }
+        if (item.type === 3) {
+          item.score = this.Pocis3;
+        }
+        if (item.type === 4) {
+          item.score = this.Pocis4;
+        }
+        if (item.type === 5) {
+          item.score = this.Pocis5;
+        }
+      });
+      this.dialogVisibleActivePLPoics = false;
+      this.activeListsPags = [];
+      this.$refs.multipleTables.clearSelection();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.dis_flexbox {
+  display: flex;
+  flex-direction: column;
+}
+.boxWidth {
+  width: 700px;
+}
+.numInputs {
+  width: 150px;
+}
+.checkboxSty {
+  max-height: 210px;
+  overflow: auto;
+  display: flex;
+  flex-direction: column;
+}
+.listBoxStys {
+  flex-shrink: 0;
+  padding: 0px 10px;
+  border-radius: 8px;
+  border: 1px solid #eee;
+  margin-right: 10px;
+  margin-bottom: 6px;
+}
+.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;
+}
+.imgBoxins {
+  width: 375px;
+  height: 220px;
+  text-align: center;
+  img {
+    height: 100%;
+  }
+}
+.iconStsz {
+  font-size: 40px;
+  color: #67c23a;
+  cursor: pointer;
+}
+.BusBoxs {
+  min-height: 100px;
+  border: 1px solid #a4a4a4;
+  margin-bottom: 10px;
+  border-radius: 8px;
+  max-height: 280px;
+  padding: 10px;
+  overflow-y: auto;
+  .fot_Le {
+    border-radius: 12px;
+    border: 1px solid yellowgreen;
+    padding: 0px 10px;
+    height: 30px;
+    line-height: 30px;
+    text-align: center;
+    float: left;
+    margin-right: 6px;
+    margin-bottom: 6px;
+    .icon_clear {
+      margin-left: 2px;
+      font-size: 15px;
+      color: #f56c6c;
+      cursor: pointer;
+    }
+  }
+}
+.marg_play {
+  display: flex;
+  margin-bottom: 15px;
+  .spans {
+    text-align: right;
+    width: 80px;
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/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: center;
+    }
+  }
+}
+.centerStys {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-top: 18px;
+}
+.dis_fos {
+  align-items: flex-end;
+  display: flex;
+  justify-content: space-between;
+}
+.margin_bs {
+  margin-bottom: 6px;
+}
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 9 - 1138
src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue


+ 23 - 244
src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue

@@ -9,94 +9,10 @@
         ref="listDataIns"
       >
         <el-form-item label="适用业务层级" :required="true">
-          <el-select
-            disabled
-            v-model="eduType"
-            placeholder="请选择教育类型"
-            @change="changeEduType"
-          >
-            <el-option
-              v-for="(item, index) in eduTypeOptions"
-              :key="index"
-              :label="item.educationName"
-              :value="item.id"
-            >
-            </el-option>
-          </el-select>
-          <el-select
-            disabled
-            v-model="courType"
-            placeholder="请选择业务层次"
-            @change="changecourseType"
-          >
-            <el-option
-              v-for="(item, index) in newCourTypeOptions"
-              :key="index"
-              :label="item.projectName + '-' + item.businessName"
-              :value="item.id"
-            >
-            </el-option>
-          </el-select>
-          <el-popover
-            ref="popovers"
-            placement="bottom"
-            trigger="click"
-            @show="showHandle"
-            @hide="hideHandle"
-            :disabled="courType && newSujectOption.length ? false : true"
-          >
-            <el-radio-group v-model="sujectApis" class="dis_flexbox">
-              <el-radio
-                disabled
-                v-for="(item, index) in newSujectOption"
-                :label="item.newId"
-                :key="index"
-                >{{ item.subjectName }}</el-radio
-              >
-            </el-radio-group>
-            <div style="display: block; text-align: center; margin-top: 10px">
-              <el-button
-                size="mini"
-                type="primary"
-                @click="submitSujectArray"
-                v-if="false"
-                >确定</el-button
-              >
-            </div>
-            <el-button
-              disabled
-              slot="reference"
-              style="margin-left: 12px"
-              @click="getMessage"
-              >请选择科目</el-button
-            >
-          </el-popover>
-        </el-form-item>
-        <el-form-item label="">
-          <!-- <span v-if="Object.keys(newSujectApis).length == 0"
-            >未选项目类型</span
-          > -->
-          <div
-            v-if="Object.keys(newSujectApis).length !== 0"
-            style="display: flex"
-          >
-            <div class="listBoxStys">
-              {{
-                newSujectApis.educationName +
-                " - " +
-                newSujectApis.projectName +
-                " - " +
-                newSujectApis.businessName +
-                " - " +
-                newSujectApis.subjectName
-              }}
-              <i
-                class="el-icon-error closeIcons"
-                @click="closeType"
-                v-if="false"
-              ></i>
-            </div>
-          </div>
+          <subject-cy
+            :activeArray.sync="businessList"
+            :disabled="true"
+          ></subject-cy>
         </el-form-item>
         <el-form-item label="试卷类型" prop="examPaperId">
           <el-select
@@ -189,28 +105,18 @@
 </template>
 
 <script>
-import tableList from "@/components/tableList";
+import subjectCy from "@/components/subjectCy";
 import { mapGetters } from "vuex";
 export default {
-  components: { tableList },
+  components: { subjectCy },
   data() {
     return {
+      businessList: [],
       disabledBtn: false,
       listDataIns: {
         publishStatus: 1,
         year: "",
       }, //   弹窗数据
-      eduTypeOptions: [], //教育类型数据
-      projectTypeOptions: [], //项目类型数据
-      courTypeOptions: [], //业务层次数据
-      newCourTypeOptions: [], //当前业务层次数据
-      sujectOption: [], //科目数据
-      newSujectOption: [], //当前科目数据数据
-      eduType: "", //当前选中教育类型
-      courType: "", //当前选中业务层次
-
-      newSujectApis: {},
-      sujectApis: "", //当前存在的科目 例如'19-2'
       optionsCity: [],
       noStudent: true,
       //表单验证
@@ -244,29 +150,12 @@ export default {
         }
       });
     this.getDict();
-    // this.search();
   },
-  // watch: {
-  //   "listDataIns.provinceId": {
-  //     handler(newVal, oldVal) {
-  //       this.changeCity(newVal);
-  //     },
-  //     // 立即处理 进入页面就触发
-  //     immediate: true,
-  //   },
-  // },
   methods: {
-    getMessage() {
-      if (!this.courType) {
-        this.$message.warning("请先选择业务层级");
-      } else if (!this.newSujectOption.length) {
-        this.$message.warning("该业务层级暂无关联科目");
-      }
-    },
     search() {
       this.$api.obtainbankexam(this.$route.query.id).then((res) => {
         res.data.year = res.data.year + "";
-        res.data.examLimitClient = res.data.examLimitClient?.split(",") || []
+        res.data.examLimitClient = res.data.examLimitClient?.split(",") || [];
         this.listDataIns = res.data;
         if (res.data.provinceId) {
           this.changeCity(res.data.provinceId, true);
@@ -275,13 +164,13 @@ export default {
       this.$api
         .inquirebankexamListbusiness({ type: 2, majorId: this.$route.query.id })
         .then((res) => {
-          this.eduType = res.rows[0].educationTypeId;
-          this.changeEduType();
-          this.courType = res.rows[0].businessId;
-          this.changecourseType();
-          this.newSujectApis = res.rows[0];
-          this.sujectApis =
-            res.rows[0].businessId + "-" + res.rows[0].subjectId;
+          this.businessList = res.rows.map((i) => {
+            return {
+              ...i,
+              educationId: i.educationTypeId,
+              onlyId: `${i.educationTypeId}-${i.projectId}-${i.businessId}-${i.subjectId}`,
+            };
+          });
         })
         .finally(() => {
           this.$modal.closeLoading();
@@ -295,123 +184,17 @@ export default {
         return item.parentId === newVal;
       });
     },
-    changeTypes() {
-      var self = this;
-      if (!this.sujectApis) {
-        self.newSujectApis = {};
-        return;
-      }
-      this.courTypeOptions.map((items) => {
-        if (items.id === this.sujectApis.split("-").map(Number)[0]) {
-          var obj = {
-            type: 2,
-            educationTypeId: items.educationId,
-            educationName: items.educationName,
-            projectId: items.projectId,
-            projectName: items.projectName,
-            businessId: items.id,
-            businessName: items.businessName,
-          };
-          self.sujectOption.map((i) => {
-            if (
-              i.id === self.sujectApis.split("-").map(Number)[1] &&
-              i.courseArrays.indexOf(items.projectId) !== -1
-            ) {
-              obj.subjectName = i.subjectName;
-              obj.subjectId = i.id;
-            }
-          });
-          self.newSujectApis = obj;
-        }
-      });
-    },
-    submitSujectArray() {
-      this.changeTypes();
-      this.$refs.popovers.doClose();
-    },
-    showHandle() {
-      this.sujectApis = "";
-      this.newSujectOption.map((item) => {
-        item.newId = this.courType + "-" + item.id;
-        if (item.newId === this.sujectApis) {
-          console.log("成功");
-        }
-      });
-      this.sujectApis =
-        this.newSujectApis.businessId + "-" + this.newSujectApis.subjectId;
-    },
-    hideHandle() {},
     getDict() {
-      new Promise((resolve, reject) => {
-        this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
-          this.eduTypeOptions = res.rows;
-        });
-        this.$api.inquireCourseProjectType({ status: 1 }).then((res) => {
-          this.projectTypeOptions = res.rows;
-        });
-        this.$api
-          .inquireapplyCityList({ areaType: 2, status: 1 })
-          .then((res) => {
-            this.cityList = res.rows;
-          });
-        this.$api.inquirebusinessList({ status: 1 }).then((res) => {
-          this.courTypeOptions = res.rows;
-          this.newCourTypeOptions = res.rows;
-        });
-        this.$api.inquireCourseSubject({ status: 1 }).then((res) => {
-          res.rows.map((item, index) => {
-            var array = [];
-            item.courseProjectTypes.map((items, indexs) => {
-              array.push(items.id);
-            });
-            item.courseArrays = array;
-          });
-          this.sujectOption = res.rows;
-          resolve();
-        });
-      }).then((res) => {
+      this.$api.inquireapplyCityList({ areaType: 2, status: 1 }).then((res) => {
+        this.cityList = res.rows;
         this.search();
       });
     },
-    changeEduType() {
-      if (!(this.courType === undefined || this.courType === "")) {
-        this.courType = "";
-      }
-      var arrays = [];
-      this.courTypeOptions.map((item) => {
-        if (item.educationId === this.eduType) {
-          arrays.push(item);
-        }
-      });
-      this.newCourTypeOptions = arrays;
-    },
-    changecourseType() {
-      this.newCourTypeOptions.map((item, index) => {
-        if (item.id === this.courType) {
-          this.eduType = item.educationId;
-          var array = [];
-          this.sujectOption.map((items, indexs) => {
-            if (items.courseArrays.indexOf(item.projectId) !== -1) {
-              array.push(items);
-            }
-          });
-          this.newSujectOption = array;
-        }
-      });
-      var arrays = [];
-      this.courTypeOptions.map((item) => {
-        if (item.educationId === this.eduType) {
-          arrays.push(item);
-        }
-      });
-      this.newCourTypeOptions = arrays;
-      this.$refs.popovers.doClose();
-    },
     submitIns(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
-          if (JSON.stringify(this.newSujectApis) === "{}") {
-            this.$message.error("请选择适用业务层级");
+          if (this.businessList.length == 0) {
+            this.$message.error("请选择科目");
             return;
           }
           this.rulesTableSumbit();
@@ -422,20 +205,20 @@ export default {
     },
     async rulesTableSumbit() {
       this.disabledBtn = true;
-      var data1 = {
+      var data = {
         examId: this.listDataIns.examId,
         examPaperId: this.listDataIns.examPaperId,
         examName: this.listDataIns.examName,
         publishStatus: this.listDataIns.publishStatus,
         prefixName: this.listDataIns.prefixName,
-        businessList: [this.newSujectApis],
+        businessList: this.businessList,
         provinceId: this.listDataIns.provinceId,
         cityId: this.listDataIns.cityId,
         year: this.listDataIns.year,
         examLimitClient: this.listDataIns.examLimitClient.join(",") || null,
       };
       this.$api
-        .editbankexam(data1)
+        .editbankexam(data)
         .then((res) => {
           this.$message.success("修改成功");
           setTimeout(() => {
@@ -446,7 +229,7 @@ export default {
                   // this.$router.push({
                   //   path: this.$store.getters.testPaperPage.name,
                   // });
-                  return
+                  return;
                 } else {
                   this.$router.push({
                     path: "testPaperManagement",
@@ -472,10 +255,6 @@ export default {
         }
       });
     },
-    closeType() {
-      this.sujectApis = "";
-      this.changeTypes();
-    },
   },
 };
 </script>

+ 18 - 10
src/views/resource/videoManagement/courseManagement/chapterContent/index.vue

@@ -345,15 +345,22 @@
               header-align="center"
             >
               <template slot-scope="scope">
-                <span v-if="item.scope === 'moreList'">
-                  {{
-                    scope.row[item.prop1] +
-                    "-" +
-                    scope.row[item.prop2] +
-                    "-" +
-                    scope.row[item.prop3]
-                  }}
-                </span>
+                <ul v-if="item.scope === 'moreList'">
+                  <li
+                    v-for="(items, indexs) in scope.row['businessList']"
+                    :key="indexs"
+                  >
+                    {{
+                      items[item.prop1] +
+                      "-" +
+                      items[item.prop2] +
+                      "-" +
+                      items[item.prop3] +
+                      "-" +
+                      items[item.prop4]
+                    }}
+                  </li>
+                </ul>
                 <span v-else-if="item.scope === 'status'">{{
                   scope.row[item.prop] === 1
                     ? "发布"
@@ -428,6 +435,7 @@ export default {
           prop1: "educationName",
           prop2: "projectName",
           prop3: "businessName",
+          prop4: "subjectName",
           scope: "moreList",
           width: "300px",
         },
@@ -950,7 +958,7 @@ export default {
             type: 2,
             isDels: true,
             sort: item.sort,
-            firstChoiceStatus: item.firstChoiceStatus || 0, 
+            firstChoiceStatus: item.firstChoiceStatus || 0,
           };
           arrays.push(arr);
           // });

+ 117 - 0
src/views/resource/videoManagement/moduleManagement/add/index.vue

@@ -136,6 +136,7 @@
           <el-input v-model="listData.prefixName"></el-input>
           <div style="color: #999">注:便于检索、归类,以及区分一样的标题</div>
         </el-form-item>
+
         <el-form-item label="模块标题" prop="moduleName">
           <el-input v-model="listData.moduleName"></el-input>
           <div style="color: #999">
@@ -143,6 +144,75 @@
           </div>
         </el-form-item>
 
+        <div class="dis_play_sty">
+          <el-form-item label="证书专业" prop="certificateTypeId">
+            <el-select
+              v-model="listData.certificateTypeId"
+              placeholder="请选择证书类型"
+              @change="editStatus = true"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in certificate"
+                :key="index"
+                :label="item.certificateName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            v-if="certificateList.length"
+            label=" "
+            label-width="10px"
+            prop="certificateId"
+          >
+            <el-select
+              v-model="listData.certificateId"
+              placeholder="请选择证书名称"
+              @change="editStatus = true"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in certificateList"
+                :key="index"
+                :label="item.certificateName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            v-if="certificateTpList.length"
+            label=" "
+            label-width="10px"
+            prop="certificateTpId"
+          >
+            <el-select
+              v-model="listData.certificateTpId"
+              placeholder="请选择证书模板"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in certificateTpList"
+                :key="index"
+                :label="item.title"
+                :value="item.tpId"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </div>
+        <div
+          style="
+            color: #999;
+            margin-left: 120px;
+            font-size: 14px;
+            margin-bottom: 20px;
+          "
+        >
+          注:为商品生成多证书,证书专业名称取值使用
+        </div>
         <el-form-item label="模块封面">
           <el-row :gutter="10" style="margin-bottom: 10px">
             <el-col :span="12">
@@ -193,6 +263,12 @@
             >删除</el-button
           >
         </el-form-item>
+        <el-form-item label="公共标识" prop="commonSign">
+          <el-radio-group v-model="listData.commonSign">
+            <el-radio :label="1">公共模块</el-radio>
+            <el-radio :label="0">非公共模块</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -407,6 +483,7 @@
 </template>
 
 <script>
+import { mapGetters } from "vuex";
 import * as baseUrls from "@/utils/request.js";
 import addChapter from "../addChapter.vue";
 import batchImportDialoga from "@/components/Comon/batchImportDialog.vue";
@@ -417,6 +494,8 @@ export default {
   name: "ModuleManagementAdd",
   data() {
     return {
+      certificateList: [],
+      certificateTpList: [],
       disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
@@ -424,6 +503,7 @@ export default {
       changeHeight: true,
       bfImg: "oss/images/avatar/20211013/1634097664410_1397766697",
       listData: {
+        commonSign: 0,
         publishStatus: 1,
         recordingUrl: "",
         liveUrl: "",
@@ -452,6 +532,9 @@ export default {
         //   { required: true, message: "节时长不能为空" },
         //   { type: "number", message: "节时长必须为数字值" },
         // ],
+        commonSign: [
+          { required: true, message: "请选择公共标识", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -525,6 +608,7 @@ export default {
       loading: false,
     };
   },
+  computed: { ...mapGetters(["certificate"]) },
   watch: {
     sujectApis: {
       immediate: true,
@@ -532,6 +616,31 @@ export default {
         this.changeTypes();
       },
     },
+
+    "listData.certificateTypeId"(val) {
+      this.$set(this.listData, "certificateId", "");
+      if (val) {
+        this.$api
+          .inquireBaseCertificatecommon({ status: 1, certificateTypeId: val })
+          .then((res) => {
+            this.certificateList = res.rows;
+          });
+      } else {
+        this.certificateList = [];
+      }
+    },
+    "listData.certificateId"(val) {
+      this.$set(this.listData, "certificateTpId", "");
+      if (val) {
+        this.$api
+          .inquireBaseCertificatetp({ status: 1, certificateId: val })
+          .then((res) => {
+            this.certificateTpList = res.rows;
+          });
+      } else {
+        this.certificateTpList = [];
+      }
+    },
   },
   mounted() {
     this.localData = this.$methodsTools.getBusinessList();
@@ -918,6 +1027,10 @@ export default {
         moduleName: this.listData.moduleName,
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
+        commonSign: this.listData.commonSign,
+        certificateTypeId: this.listData.certificateTypeId,
+        certificateId: this.listData.certificateId,
+        certificateTpId: this.listData.certificateTpId,
       };
       this.$api
         .addCoursemodule(dataInfos)
@@ -1192,4 +1305,8 @@ export default {
     margin: 5px 0px;
   }
 }
+.dis_play_sty {
+  display: flex;
+  align-items: center;
+}
 </style>

+ 126 - 0
src/views/resource/videoManagement/moduleManagement/edit/index.vue

@@ -110,6 +110,76 @@
           <el-input v-model="listData.prefixName"></el-input>
           <div style="color: #999">注:便于检索、归类,以及区分一样的标题</div>
         </el-form-item>
+
+        <div class="dis_play_sty">
+          <el-form-item label="证书专业" prop="certificateTypeId">
+            <el-select
+              v-model="listData.certificateTypeId"
+              placeholder="请选择证书类型"
+              @change="editStatus = true"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in certificate"
+                :key="index"
+                :label="item.certificateName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            v-if="certificateList.length"
+            label=" "
+            label-width="10px"
+            prop="certificateId"
+          >
+            <el-select
+              v-model="listData.certificateId"
+              placeholder="请选择证书名称"
+              @change="editStatus = true"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in certificateList"
+                :key="index"
+                :label="item.certificateName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            v-if="certificateTpList.length"
+            label=" "
+            label-width="10px"
+            prop="certificateTpId"
+          >
+            <el-select
+              v-model="listData.certificateTpId"
+              placeholder="请选择证书模板"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in certificateTpList"
+                :key="index"
+                :label="item.title"
+                :value="item.tpId"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </div>
+        <div
+          style="
+            color: #999;
+            margin-left: 120px;
+            font-size: 14px;
+            margin-bottom: 20px;
+          "
+        >
+          注:为商品生成多证书,证书专业名称取值使用
+        </div>
         <el-form-item label="模块标题" prop="moduleName">
           <el-input v-model="listData.moduleName"></el-input>
           <div style="color: #999">
@@ -167,6 +237,12 @@
             >删除</el-button
           >
         </el-form-item>
+        <el-form-item label="公共标识" prop="commonSign">
+          <el-radio-group v-model="listData.commonSign">
+            <el-radio :label="1">公共模块</el-radio>
+            <el-radio :label="0">非公共模块</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -382,6 +458,7 @@
 </template>
 
 <script>
+import { mapGetters } from "vuex";
 import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import pagination from "@/components/pagination";
@@ -392,6 +469,9 @@ export default {
   components: { searchBoxNew, pagination, addChapter, batchImportDialoga },
   data() {
     return {
+      certificateList: [],
+      certificateTpList: [],
+      editStatus: false, //避免第一次进来初始化数据丢失
       disabledBtn: false,
       isIndeterminate: false,
       checkAll: false,
@@ -426,6 +506,9 @@ export default {
         //   { required: true, message: "节时长不能为空" },
         //   { type: "number", message: "节时长必须为数字值" },
         // ],
+        commonSign: [
+          { required: true, message: "请选择公共标识", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -501,6 +584,7 @@ export default {
       loading: false,
     };
   },
+  computed: { ...mapGetters(["certificate"]) },
   watch: {
     sujectApis: {
       immediate: true,
@@ -508,6 +592,40 @@ export default {
         this.changeTypes();
       },
     },
+    "listData.certificateTypeId": {
+      handler(val, oldVal) {
+        if (this.editStatus) {
+          this.$set(this.listData, "certificateId", "");
+        }
+        if (val) {
+          this.$api
+            .inquireBaseCertificatecommon({ status: 1, certificateTypeId: val })
+            .then((res) => {
+              this.certificateList = res.rows;
+            });
+        } else {
+          this.certificateList = [];
+        }
+      },
+      immediate: true,
+    },
+    "listData.certificateId": {
+      handler(val, oldVal) {
+        if (this.editStatus) {
+          this.$set(this.listData, "certificateTpId", "");
+        }
+        if (val) {
+          this.$api
+            .inquireBaseCertificatetp({ status: 1, certificateId: val })
+            .then((res) => {
+              this.certificateTpList = res.rows;
+            });
+        } else {
+          this.certificateTpList = [];
+        }
+      },
+      immediate: true,
+    },
   },
   async mounted() {
     this.$modal.loading("正在导入数据,请稍后...");
@@ -888,6 +1006,10 @@ export default {
         moduleName: this.listData.moduleName,
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
+        commonSign: this.listData.commonSign,
+        certificateTypeId: this.listData.certificateTypeId,
+        certificateId: this.listData.certificateId,
+        certificateTpId: this.listData.certificateTpId,
       };
       this.$api
         .editCoursemodule(dataInfos)
@@ -1107,4 +1229,8 @@ export default {
     }
   }
 }
+.dis_play_sty {
+  display: flex;
+  align-items: center;
+}
 </style>

+ 1 - 3
src/views/secondBuild/courseList/index.vue

@@ -192,10 +192,8 @@ export default {
         },
         {
           label: "业务层次",
-          prop1: "projectName",
-          prop2: "businessName",
+          prop: "projectName",
           hidden: true,
-          scope: "InfoMore",
         },
         {
           label: "商品编码",

+ 829 - 0
src/views/secondSeven/courseList/index.vue

@@ -0,0 +1,829 @@
+<template>
+  <div id="">
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="msgInfo(props.scope.row)"
+          >课程内容详情</el-button
+        ><el-button
+          type="text"
+          @click="exportBtn(props.scope.row)"
+          style="margin-left: 0px"
+          >导出课程结构</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="1300px"
+      :show-close="false"
+      :close-on-click-modal="false"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">{{ goodsBoxName }}</div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div class="dis_flexs">
+        <div class="leftBoxs">
+          <span v-if="!activeId" style="font-size: 30px"
+            >请打开目录详情,点击播放您需要观看的视频内容。</span
+          >
+          <div v-show="vid" id="player"></div>
+          <div v-show="vidzb" id="playerzb"></div>
+        </div>
+        <div class="rightBoxslist">
+          <div v-for="(item, index) in courseList" :key="index" class="bg_ls">
+            <div
+              class="jus_sty"
+              :style="
+                item.checked
+                  ? 'border-bottom: 1px dotted #666;margin-bottom:6px;'
+                  : ''
+              "
+            >
+              <div style="font-size: 12px">{{ item.courseName }}</div>
+              <div class="line_h" @click="getCourseInfos(item, index)">
+                {{ item.checked ? "—" : "+" }}
+              </div>
+            </div>
+            <template v-if="item.checked">
+              <div v-for="(items, indexs) in item.children" :key="indexs">
+                <div
+                  class="firstSty"
+                  @click="getSecouredInfos(items, index, indexs)"
+                >
+                  <div class="typeIcon" v-if="items.type === 3">
+                    {{ getTypeName(items.sectionType) }}
+                  </div>
+                  <i
+                    v-if="items.type !== 3"
+                    :class="
+                      items.checked
+                        ? 'el-icon-caret-bottom'
+                        : 'el-icon-caret-right'
+                    "
+                  ></i>
+                  <span :style="activeId === items.onlyId ? 'color:red;' : ''">
+                    {{ items.menuName }}
+                  </span>
+                  <span v-if="items.type === 3" class="itemsty">{{
+                    $methodsTools.secondToDate(items.durationTime, false)
+                  }}</span>
+                </div>
+                <template v-if="items.checked">
+                  <div
+                    v-for="(its, ids) in items.children"
+                    :key="ids"
+                    style="padding-left: 14px"
+                  >
+                    <div
+                      class="firstSty"
+                      @click="getTemsInfo(its, index, indexs, ids)"
+                    >
+                      <div class="typeIcon" v-if="its.type === 3">
+                        {{ getTypeName(its.sectionType) }}
+                      </div>
+                      <i
+                        v-if="its.type !== 3"
+                        :class="
+                          its.checked
+                            ? 'el-icon-caret-bottom'
+                            : 'el-icon-caret-right'
+                        "
+                      ></i>
+                      <span
+                        :style="activeId === its.onlyId ? 'color:red;' : ''"
+                      >
+                        {{ its.menuName }}
+                      </span>
+                      <span v-if="its.type === 3" class="itemsty">{{
+                        $methodsTools.secondToDate(its.durationTime, false)
+                      }}</span>
+                    </div>
+                    <template v-if="its.checked">
+                      <div
+                        v-for="(itschild, ids) in its.children"
+                        :key="ids"
+                        style="padding-left: 14px"
+                        @click="getTemsInfo(itschild)"
+                      >
+                        <div class="firstSty">
+                          <div class="typeIcon">
+                            {{ getTypeName(itschild.sectionType) }}
+                          </div>
+                          <span
+                            :style="
+                              activeId === itschild.onlyId ? 'color:red;' : ''
+                            "
+                          >
+                            {{ itschild.menuName }}
+                          </span>
+                          <span class="itemsty">{{
+                            $methodsTools.secondToDate(
+                              itschild.durationTime,
+                              false
+                            )
+                          }}</span>
+                        </div>
+                      </div>
+                    </template>
+                  </div>
+                </template>
+              </div>
+            </template>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "",
+  components: { tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "课程列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        changeWidth: "150px",
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      formData: {
+        status: 1,
+        pageSize: 10,
+        pageNum: 1,
+        commitPeriodStatus:1
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "教育类型",
+          prop: "educationName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          scope: "InfoMore",
+        },
+        {
+          label: "商品编码",
+          prop: "code",
+          hidden: false,
+        },
+        {
+          label: "商品名称",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "商品状态",
+          prop: "status",
+          hidden: false,
+          scope: "hasTime",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: true,
+        },
+        {
+          label: "官方审核备注说明",
+          prop: "commitPeriodRemark",
+          hidden: true,
+        },
+        {
+          label: "学习服务期",
+          prop1: "serviceTimeType",
+          prop2: "serviceTimeNum",
+          prop3: "studyStartTime",
+          prop4: "studyEndTime",
+          scope: "studentServicePeriod",
+          hidden: false,
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      dialogVisible: false,
+      courseList: [], //详情列表
+      activeId: "", //当前选中ID
+      vodPlayerJs: "https://player.polyv.net/script/player.js",
+      vid: "",
+      playerJs:
+        "https://player.polyv.net/resp/live-h5-player/latest/liveplayer.min.js",
+      uidzb: "egsxlptzdq",
+      vidzb: "",
+      goodsId: "",
+      goodsBoxName: "",
+    };
+  },
+  mounted() {
+    this.$api
+      .coursebusinessqueryFullId({
+        educationName: "考前培训",
+        projectName: "施工现场专业人员",
+        businessName: "七大员",
+      })
+      .then((res) => {
+        this.formData.educationId = res.data.educationId;
+        this.formData.projectId = res.data.projectId;
+        this.formData.businessId = res.data.businessId;
+        this.search();
+      });
+  },
+  methods: {
+    getTypeName(type) {
+      let ast = "";
+      switch (type) {
+        case 1:
+          ast = "录播";
+          break;
+        case 2:
+          ast = "直播";
+          break;
+        case 3:
+          ast = "回放";
+          break;
+        default:
+          break;
+      }
+      return ast;
+    },
+    /**
+     * 导出商品的课程结构
+     */
+    exportBtn(item) {
+      this.$api
+        .inquireGradegradeexportGoodsMenuExcel({ goodsId: item.goodsId })
+        .then((res) => {
+          this.$methodsTools.exportData(res.msg);
+        });
+    },
+    /**
+     * 关闭详情触发事件
+     */
+    close() {
+      this.dialogVisible = false;
+      this.clears();
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      data.chapterNum = 1
+      this.$api
+        .commonfreegoodslist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    /**
+     * 点击详情
+     */
+    msgInfo(option) {
+      this.goodsBoxName = option.goodsName;
+      this.$api.obtainCourseSgoodsId(option.goodsId).then(async (res) => {
+        // if (res.rows.length) {
+        if (!res.rows.length) {
+          this.dialogVisible = true;
+        } else {
+          res.rows.forEach((item, index) => {
+            item.checked = false;
+          });
+          this.courseList = res.rows;
+          await this.autoGetCourseInfos(res.rows[0], 0);
+          this.dialogVisible = true;
+        }
+        // } else {
+        //   this.$message.warning("该商品暂无课程");
+        //   return;
+        // }
+      });
+    },
+    /**
+     * 自动播放第一个视频
+     */
+    autoGetCourseInfos(option, int) {
+      return new Promise((resolve, reject) => {
+        this.$api
+          .inquireCoursemenuListS({ courseId: option.courseId })
+          .then((res) => {
+            res.rows.forEach((item) => {
+              if (item.type !== 3) {
+                item.checked = false;
+              }
+              if (item.type === 3) {
+                item.onlyId = `${option.courseId}-0-0-${item.menuId}`;
+              }
+            });
+            this.$set(this.courseList[int], "children", res.rows);
+            this.$set(this.courseList[int], "checked", true);
+            if (this.courseList[0].children.length) {
+              switch (this.courseList[0].children[0].type) {
+                case 1:
+                  this.$api
+                    .inquireCourseListmodulechapter(
+                      this.courseList[0].children[0].menuId
+                    )
+                    .then((resz) => {
+                      resz.data.forEach((item) => {
+                        if (item.type !== 3) {
+                          item.checked = false;
+                          item.type = 2;
+                          item.courseId =
+                            this.courseList[0].children[0].courseId;
+                          item.menuName = item.name;
+                        }
+                      });
+                      this.$set(
+                        this.courseList[int].children[0],
+                        "children",
+                        resz.data
+                      );
+                      this.$set(
+                        this.courseList[int].children[0],
+                        "checked",
+                        true
+                      );
+                      if (this.courseList[int].children[0].children.length) {
+                        this.$api
+                          .inquireCoursechaptersectionlist(
+                            this.courseList[0].children[0].children[0].chapterId
+                          )
+                          .then((result) => {
+                            result.data.forEach((item) => {
+                              item.type = 3;
+                              item.menuName = item.name;
+                              item.onlyId = `${this.courseList[0].children[0].children[0].courseId}-${this.courseList[0].children[0].children[0].moduleId}-${this.courseList[0].children[0].children[0].chapterId}-${item.sectionId}`;
+                            });
+                            this.$set(
+                              this.courseList[int].children[0].children[0],
+                              "children",
+                              result.data
+                            );
+                            this.$set(
+                              this.courseList[int].children[0].children[0],
+                              "checked",
+                              true
+                            );
+                            if (
+                              this.courseList[int].children[0].children[0]
+                                .children.length
+                            ) {
+                              this.activeId =
+                                this.courseList[0].children[0].children[0].children[0].onlyId;
+                              this.initVideo(
+                                this.courseList[0].children[0].children[0]
+                                  .children[0]
+                              );
+                            }
+                          });
+                      }
+                    });
+                  break;
+                case 2:
+                  this.$api
+                    .inquireCoursechaptersectionlist(
+                      this.courseList[0].children[0].menuId
+                    )
+                    .then((result) => {
+                      result.data.forEach((item) => {
+                        item.type = 3;
+                        item.menuName = item.name;
+                        item.onlyId = `${this.courseList[0].children[0].courseId}-0-${this.courseList[0].children[0].menuId}-${item.sectionId}`;
+                      });
+                      this.$set(
+                        this.courseList[int].children[0],
+                        "children",
+                        result.data
+                      );
+                      this.$set(
+                        this.courseList[int].children[0],
+                        "checked",
+                        true
+                      );
+                      if (this.courseList[0].children[0].children.length) {
+                        this.activeId =
+                          this.courseList[0].children[0].children[0].onlyId;
+                        this.initVideo(
+                          this.courseList[0].children[0].children[0]
+                        );
+                      }
+                    });
+                  break;
+                case 3:
+                  this.activeId = this.courseList[0].children[0].onlyId;
+                  this.initVideo(this.courseList[0].children[0]);
+                  break;
+
+                default:
+                  break;
+              }
+            }
+            resolve();
+          });
+      });
+    },
+    /**
+     * 点击课程
+     */
+    getCourseInfos(option, int) {
+      if (option.checked) {
+        this.$set(this.courseList[int], "checked", false);
+      } else {
+        if (option.children) {
+          this.$set(this.courseList[int], "checked", true);
+          return;
+        }
+        this.$api
+          .inquireCoursemenuListS({ courseId: option.courseId })
+          .then((res) => {
+            res.rows.forEach((item) => {
+              if (item.type !== 3) {
+                item.checked = false;
+              }
+              if (item.type === 3) {
+                item.onlyId = `${option.courseId}-0-0-${item.menuId}`;
+              }
+            });
+            this.$set(this.courseList[int], "children", res.rows);
+            this.$set(this.courseList[int], "checked", true);
+          });
+      }
+    },
+    getSecouredInfos(option, int, ints) {
+      if (option.type === 3) {
+        //触发节函数
+        this.activeId = option.onlyId;
+        this.initVideo(option);
+      } else {
+        if (option.checked) {
+          this.$set(this.courseList[int].children[ints], "checked", false);
+        } else {
+          if (option.children) {
+            this.$set(this.courseList[int].children[ints], "checked", true);
+            return;
+          }
+          if (option.type === 1) {
+            this.$api
+              .inquireCourseListmodulechapter(option.menuId)
+              .then((res) => {
+                res.data.forEach((item) => {
+                  if (item.type !== 3) {
+                    item.checked = false;
+                    item.type = 2;
+                    item.courseId = option.courseId;
+                    item.menuName = item.name;
+                  }
+                });
+                this.$set(
+                  this.courseList[int].children[ints],
+                  "children",
+                  res.data
+                );
+                this.$set(this.courseList[int].children[ints], "checked", true);
+              });
+          }
+          if (option.type === 2) {
+            this.$api
+              .inquireCoursechaptersectionlist(option.menuId)
+              .then((res) => {
+                res.data.forEach((item) => {
+                  item.type = 3;
+                  item.menuName = item.name;
+                  item.onlyId = `${option.courseId}-0-${option.menuId}-${item.sectionId}`;
+                });
+                this.$set(
+                  this.courseList[int].children[ints],
+                  "children",
+                  res.data
+                );
+                this.$set(this.courseList[int].children[ints], "checked", true);
+              });
+          }
+        }
+      }
+    },
+    getTemsInfo(option, int, ints, ids) {
+      if (option.type === 3) {
+        //触发节函数
+        this.initVideo(option);
+      } else {
+        if (option.checked) {
+          this.$set(
+            this.courseList[int].children[ints].children[ids],
+            "checked",
+            false
+          );
+        } else {
+          if (option.children) {
+            this.$set(
+              this.courseList[int].children[ints].children[ids],
+              "checked",
+              true
+            );
+            return;
+          }
+          if (option.type === 2) {
+            this.$api
+              .inquireCoursechaptersectionlist(option.chapterId)
+              .then((res) => {
+                res.data.forEach((item) => {
+                  item.type = 3;
+                  item.menuName = item.name;
+                  item.onlyId = `${option.courseId}-${option.moduleId}-${option.chapterId}-${item.sectionId}`;
+                });
+                this.$set(
+                  this.courseList[int].children[ints].children[ids],
+                  "children",
+                  res.data
+                );
+                this.$set(
+                  this.courseList[int].children[ints].children[ids],
+                  "checked",
+                  true
+                );
+              });
+          }
+        }
+      }
+    },
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+    async initVideo(option) {
+      await this.clears();
+      this.activeId = option.onlyId;
+      if (option.sectionType === 2) {
+        this.vidzb = option.liveUrl;
+        this.loadPlayerScriptzb(this.loadPlayerzb);
+      } else {
+        this.vid = option.recordingUrl;
+        this.loadPlayerScript(this.loadPlayer);
+      }
+    },
+    loadPlayerScript(callback) {
+      if (!window.polyvPlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.vodPlayerJs);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
+    loadPlayer() {
+      var self = this;
+      const polyvPlayer = window.polyvPlayer;
+      self.player = polyvPlayer({
+        wrap: "#player",
+        width: 932,
+        height: 627,
+        vid: self.vid,
+        teaser_show: 0,
+        playsafe: function (vid, next) {
+          self.$api.obtainpolyvvideosign(vid).then((res) => {
+            next(res.data);
+          });
+        },
+      });
+    },
+    /**
+     * @param {String} 关闭视频窗口-销毁实例
+     */
+    clears() {
+      return new Promise((resolve, reject) => {
+        this.activeId = "";
+        this.vid = "";
+        this.vidzb = "";
+        if (this.player) {
+          this.player.destroy();
+        }
+        if (this.playerzb) {
+          this.playerzb.destroy();
+        }
+        resolve();
+      });
+    },
+    /**
+     * @param {String} 直播预览
+     */
+    loadPlayerScriptzb(callback) {
+      if (!window.polyvLivePlayer) {
+        const myScript = document.createElement("script");
+        myScript.setAttribute("src", this.playerJs);
+        myScript.onload = callback;
+        document.body.appendChild(myScript);
+      } else {
+        callback();
+      }
+    },
+
+    loadPlayerzb() {
+      const polyvLivePlayer = window.polyvLivePlayer;
+      this.playerzb = polyvLivePlayer({
+        wrap: "#playerzb",
+        width: 932,
+        height: 627,
+        uid: this.uidzb,
+        vid: this.vidzb,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/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;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+.dis_flexs {
+  display: flex;
+}
+.leftBoxs {
+  width: 932px;
+  height: 627px;
+  border: 1px solid #eee;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.rightBoxslist {
+  flex: 1;
+  max-height: 627px;
+  overflow-y: auto;
+  margin-left: 10px;
+}
+.bg_ls {
+  background-color: #eee;
+  padding: 8px;
+  margin-bottom: 10px;
+}
+.jus_sty {
+  display: flex;
+  justify-content: space-between;
+  padding: 6px 0px;
+}
+.line_h {
+  font-size: 14px;
+  height: 18px;
+  width: 18px;
+  font-weight: bold;
+  color: #000;
+  background-color: rgb(153, 153, 153);
+  line-height: 18px;
+  text-align: center;
+  cursor: pointer;
+}
+.firstSty {
+  font-size: 13px;
+  margin-bottom: 6px;
+  cursor: pointer;
+  &:hover {
+    color: red;
+  }
+}
+.typeIcon {
+  display: inline-block;
+  border-radius: 8px;
+  border: 1px solid #000;
+  padding: 0px 4px;
+  color: #000 !important;
+  font-size: 12px;
+}
+.itemsty {
+  font-size: 13px;
+  color: purple;
+  margin-left: 14px;
+}
+</style>

+ 4 - 4
vue.config.js

@@ -10,7 +10,7 @@ const CompressionWebpackPlugin = require("compression-webpack-plugin");
 // vue.config.js 配置说明
 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
 // 这里只列一部分,具体配置参考文档
-module.exports = {
+module.exports = {   
   // 部署生产环境和开发环境下的URL。
   // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
   // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
@@ -40,7 +40,7 @@ module.exports = {
     },
     disableHostCheck: true
   },
-  configureWebpack: {
+  configureWebpack: { 
     output: { // 输出重构  打包编译后的 文件名称  【模块名称.版本号.时间戳】
       filename: `js/[name].[hash].js`,
       chunkFilename: `js/[id].[hash].js`
@@ -110,8 +110,8 @@ module.exports = {
           config
             .optimization.splitChunks({
               chunks: 'all',
-              minSize: 1000000,
-              maxSize: 3000000,
+              minSize: 1005000,
+              maxSize: 3005000,
               cacheGroups: {
                 libs: {
                   name: 'chunk-libs',

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است