瀏覽代碼

fix 新功能

Tang 4 年之前
父節點
當前提交
17444cda73
共有 47 個文件被更改,包括 7150 次插入1665 次删除
  1. 4 1
      src/assets/styles/index.scss
  2. 49 7
      src/components/searchBoxNew.vue
  3. 1007 1053
      src/components/tableList.vue
  4. 33 0
      src/newApi/applicationData.js
  5. 35 0
      src/newApi/certificate.js
  6. 16 1
      src/newApi/classTab.js
  7. 17 1
      src/store/getters.js
  8. 17 3
      src/store/modules/dict.js
  9. 1 2
      src/store/modules/tagsView.js
  10. 6 6
      src/utils/methodsTool.js
  11. 23 25
      src/utils/uopladFile.js
  12. 4 1
      src/views/2Cport/adSlotManagement/index.vue
  13. 17 7
      src/views/2Cport/adSlotManagement/tab1.vue
  14. 160 143
      src/views/Marketing/goods/commodityManageMent/add/index.vue
  15. 176 153
      src/views/Marketing/goods/commodityManageMent/edit/index.vue
  16. 7 19
      src/views/Marketing/goods/commodityManageMent/poppleSet.vue
  17. 11 3
      src/views/Marketing/goods/courseInquiryList/index.vue
  18. 444 0
      src/views/education/certificateManagement/certificateModel/index.vue
  19. 21 0
      src/views/education/certificateManagement/creditHoursList/index.vue
  20. 11 2
      src/views/education/classManageMent/classHoursReview/studyTimes.vue
  21. 137 0
      src/views/education/classManageMent/learningHoursRecordList/exportTable.vue
  22. 370 0
      src/views/education/classManageMent/learningHoursRecordList/hoursTimesRecord.vue
  23. 225 20
      src/views/education/classManageMent/learningHoursRecordList/index.vue
  24. 1281 0
      src/views/education/classManageMent/learningHoursRecordList/studyTimesRecord.vue
  25. 86 47
      src/views/education/examManagement/applicationData/asPlanned.vue
  26. 31 0
      src/views/education/examManagement/applicationData/bulkImportPlan/index.vue
  27. 429 0
      src/views/education/examManagement/applicationData/bulkImportPlan/newRegister.vue
  28. 245 0
      src/views/education/examManagement/applicationData/bulkImportPlan/newYY.vue
  29. 1 8
      src/views/education/examManagement/applicationData/byTrainee.vue
  30. 629 0
      src/views/education/examManagement/applicationData/cancelAppointMent/index.vue
  31. 678 0
      src/views/education/examManagement/applicationData/examRegistration/index.vue
  32. 674 0
      src/views/education/examManagement/applicationData/formerAccount/index.vue
  33. 39 37
      src/views/education/examManagement/examArrangement/index.vue
  34. 12 5
      src/views/education/examManagement/examConfiguration/examPlace/index.vue
  35. 89 44
      src/views/education/notificationManageMent/notificationList/add/index.vue
  36. 108 52
      src/views/education/notificationManageMent/notificationList/edit/index.vue
  37. 26 11
      src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue
  38. 5 5
      src/views/resource/baseManageInfos/index.vue
  39. 1 0
      src/views/resource/baseManageInfos/resource/businessLevel/index.vue
  40. 1 1
      src/views/resource/baseManageInfos/resource/certificate/index.vue
  41. 1 1
      src/views/resource/baseManageInfos/resource/label/index.vue
  42. 2 1
      src/views/resource/videoManagement/chapter/index.vue
  43. 12 1
      src/views/resource/videoManagement/courseManagement/index.vue
  44. 3 2
      src/views/resource/videoManagement/festival/add/index.vue
  45. 3 1
      src/views/resource/videoManagement/festival/edit/index.vue
  46. 1 1
      src/views/resource/videoManagement/festival/index.vue
  47. 2 1
      src/views/resource/videoManagement/moduleManagement/index.vue

+ 4 - 1
src/assets/styles/index.scss

@@ -12,7 +12,10 @@ body {
   text-rendering: optimizeLegibility;
   font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
 }
-
+// 设置全局
+.el-table__fixed-right {
+  height: 100% !important;
+}
 label {
   font-weight: 700;
 }

+ 49 - 7
src/components/searchBoxNew.vue

@@ -192,6 +192,20 @@
               :value="items.applyId"
             ></el-option>
           </el-select>
+          <!-- 考试地点 -->
+          <el-select
+            v-else-if="item.scope === 'applySiteAddress'"
+            v-model="formData[item.prop]"
+            :placeholder="item.placeholder"
+            :size="size"
+          >
+            <el-option
+              v-for="(items, indexs) in applySiteAddress"
+              :key="indexs"
+              :label="items.siteAddress"
+              :value="item.getType === 1 ? items.siteAddress : items.siteId"
+            ></el-option>
+          </el-select>
           <!-- 前培标题 -->
           <el-select
             v-else-if="item.scope === 'beforeList'"
@@ -255,6 +269,16 @@
             :max="100"
             :size="size"
           ></el-input-number>
+          <el-input
+            v-else-if="item.scope === 'textarea' && formData[item.prop]"
+            type="textarea"
+            :size="size"
+            readonly
+            :rows="3"
+            placeholder="请输入身份证"
+            v-model="formData[item.prop]"
+          >
+          </el-input>
           <el-cascader
             v-else-if="item.scope === 'cascader'"
             v-model="formData[item.prop]"
@@ -324,7 +348,7 @@
             </el-date-picker>
           </div>
           <el-input
-            v-else
+            v-else-if="!item.scope"
             clearable
             v-model="formData[item.prop]"
             :placeholder="item.placeholder"
@@ -332,6 +356,13 @@
           ></el-input>
         </el-form-item>
         <el-form-item>
+          <el-button
+            v-if="advanced"
+            :size="size"
+            type="success"
+            @click="emitAdvanced"
+            >{{ advancedName }}</el-button
+          >
           <el-button :size="size" type="primary" @click="search"
             >查询</el-button
           >
@@ -345,7 +376,15 @@
 <script>
 import { mapGetters } from "vuex";
 export default {
-  props: ["formList", "topType", "formData", "shType", "redIcon"], //参考文档 component.md
+  props: [
+    "formList",
+    "topType",
+    "formData",
+    "shType",
+    "redIcon",
+    "advanced",
+    "advancedName",
+  ], //参考文档 component.md
   data() {
     return {
       tireStatus: "", //当前选择的教育类型tireStatus
@@ -484,7 +523,7 @@ export default {
     };
   },
   computed: {
-    ...mapGetters(["educationType", "Professional", "examList", "beforeList"]),
+    ...mapGetters(["educationType", "Professional", "examList", "beforeList","applySiteAddress"]),
     formListComput: function () {
       return function (item) {
         var newOption = JSON.parse(JSON.stringify(item));
@@ -520,11 +559,11 @@ export default {
               }
             }
           } else {
-            if(items.diff === 'gfxs'){
-              if(this.formData['studyStatus'] == 2){
-                return items
+            if (items.diff === "gfxs") {
+              if (this.formData["studyStatus"] == 2) {
+                return items;
               }
-            }else{
+            } else {
               return items;
             }
           }
@@ -537,6 +576,9 @@ export default {
     var self = this;
   },
   methods: {
+    emitAdvanced() {
+      this.$emit("Advanced", this.formData);
+    },
     change1(data1, data2) {
       if (this.formData[data1]) {
         if (

File diff suppressed because it is too large
+ 1007 - 1053
src/components/tableList.vue


+ 33 - 0
src/newApi/applicationData.js

@@ -24,6 +24,14 @@ export default {
             data
         })
     },
+    //预约考试身份证导入新增模板
+    editsystemimportIdsData(data) {
+        return request({
+            url: '/system/subscribe/importIdsData',
+            method: 'post',
+            data
+        })
+    },
     //导入修改预约考试模板
     editsystemimportUpdateData(data) {
         return request({
@@ -56,4 +64,29 @@ export default {
             params: data
         })
     },
+    //查询报考数据用户列表
+    inquiresystemsubscribelistUser(data) {
+        return request({
+            url: '/system/subscribe/listUser',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出新增预约模板
+    inquiresystemsubscribeexportNew(data) {
+        return request({
+            url: '/system/subscribe/exportNew',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出登记模板
+    inquiresystemsubscribeexportRegister(data) {
+        return request({
+            url: '/system/subscribe/exportRegister',
+            method: 'get',
+            params: data
+        })
+    },
+
 }

+ 35 - 0
src/newApi/certificate.js

@@ -31,4 +31,39 @@ export default {
             method: 'get',
         })
     },
+    /**
+     *  
+     * @remarks 证书模板 
+     */
+    //新增证书模板
+    appBaseCertificatetp(data) {
+        return request({
+            url: '/certificate/tp',
+            method: 'post',
+            data
+        })
+    },
+    //修改证书模板
+    editBaseCertificatetp(data) {
+        return request({
+            url: '/certificate/tp/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询证书模板列表
+    inquireBaseCertificatetp(data) {
+        return request({
+            url: '/certificate/tp/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取证书模板详细信息
+    obtainBaseCertificatetp(data) {
+        return request({
+            url: `/certificate/tp/` + data,
+            method: 'get',
+        })
+    },
 }

+ 16 - 1
src/newApi/classTab.js

@@ -1,6 +1,21 @@
 import request from '@/utils/request' //引入axios请求及拦截器
 export default {
-
+    //查询学员学习记录列表
+    gradegradelistUserStudyRecord(data) {
+        return request({
+            url: '/grade/grade/listUserStudyRecord',
+            method: 'get',
+            params: data
+        })
+    },
+    //导出学员学时列表
+    inquireGradegradeListexport(data) {
+        return request({
+            url: '/grade/grade/export',
+            method: 'get',
+            params: data
+        })
+    },
     //选新班
     gradegradechangeGrade(data) {
         return request({

+ 17 - 1
src/store/getters.js

@@ -97,6 +97,14 @@ const getters = {
     }
     return state.dict.certificate
   },
+  certificateTp(state) {
+    if (!state.dict.certificateTp) {
+      api.inquireBaseCertificatetp({ status: 1 }).then(res => {
+        state.dict.certificateTp = res.rows
+      })
+    }
+    return state.dict.certificateTp
+  },
   labelList(state) {
     if (!state.dict.labelList) {
       api.inquireCourseLabelList({ status: 1 }).then(res => {
@@ -203,12 +211,20 @@ const getters = {
   },
   examList(state) {
     if (!state.dict.examList) {
-      api.inquiresystemapplyList({ status: 1 }).then(res => {
+      api.inquiresystemapplyList({ status: '0,1,2' }).then(res => {
         state.dict.examList = res.rows
       })
     }
     return state.dict.examList
   },
+  applySiteAddress(state) {
+    if (!state.dict.applySiteAddress) {
+      api.inquiresystemsite({ status: 1 }).then(res => {
+        state.dict.applySiteAddress = res.rows
+      })
+    }
+    return state.dict.applySiteAddress
+  },
   beforeList(state) {
     if (!state.dict.beforeList) {
       api.inquiresystembefore({ status: 1 }).then(res => {

+ 17 - 3
src/store/modules/dict.js

@@ -9,7 +9,8 @@ const state = {
     schoolList: null,//院校
     Professional: null,//专业
     courseExamine: null,//考期
-    certificate: null,//证书
+    certificate: null,//证书类型
+    certificateTp: null,//证书模板
     labelList: null,//标签
     payList: null,//支付通道
     paypayee: null,//收款方
@@ -24,6 +25,7 @@ const state = {
     cityList: null,//地区-市
     classList:null,//班级
     examList:null,//考试安排
+    applySiteAddress:null,//考试地点
     beforeList:null,//前培安排
     indexnum:null,//模拟
 }
@@ -77,12 +79,18 @@ const mutations = {
       state.courseExamine = res.rows
     })
   },
-  //更新证书
+  //更新证书类型
   CERTIFICATE(state){
     api.inquireBaseCertificate({status:1}).then(res => {
       state.certificate = res.rows
     })
   },
+  //更新证书模板
+  CERTIFICATETP(state){
+    api.inquireBaseCertificatetp({status:1}).then(res => {
+      state.certificateTp = res.rows
+    })
+  },
   //更新标签
   LABELLIST(state){
     api.inquireCourseLabelList({status:1}).then(res => {
@@ -159,10 +167,16 @@ const mutations = {
   },
   //更新考试安排
   EXAMLIST(state){
-    api.inquiresystemapplyList({status:1}).then(res => {
+    api.inquiresystemapplyList({status:'0,1,2'}).then(res => {
       state.examList = res.rows
     })
   },
+  //更新考试地点
+  APPLYSITEADDRESS(state){
+    api.inquiresystemsite({status:1}).then(res => {
+      state.applySiteAddress = res.rows
+    })
+  },
   //更新前培安排
   BEFORELIST(state){
     api.inquiresystembefore({status:1}).then(res => {

+ 1 - 2
src/store/modules/tagsView.js

@@ -2,7 +2,7 @@ import { MessageBox } from 'element-ui';
 const state = {
   visitedViews: [],
   cachedViews: [],
-  alertPage: ["CommodityManageMentAdd", "CommodityManageMentEdit", "FestivalAdd", "FestivalEdit", "ChapterAdd", "ChapterEdit","ModuleManagementAdd","ModuleManagementEdit","BasicInfoEdit","BasicInfoAdd","ChapterContent","EditCourse","OrderDetail","OrderPrice","AddOrder","EditPaper","AddPaper","TopicAddPaper","ChapterVolumeManagementEdit","ChapterVolumeManagementAdd","VolumeManagementAdd","VolumeManagementEdit","HandoutListEdit","HandoutListAdd","StudentXQ","AddClass","ManageClass","NotificationInfo","NotificationListAdd","NotificationListEdit"],
+  alertPage: ["CommodityManageMentAdd", "CommodityManageMentEdit", "FestivalAdd", "FestivalEdit", "ChapterAdd", "ChapterEdit","ModuleManagementAdd","ModuleManagementEdit","BasicInfoEdit","BasicInfoAdd","ChapterContent","EditCourse","OrderDetail","OrderPrice","AddOrder","EditPaper","AddPaper","TopicAddPaper","ChapterVolumeManagementEdit","ChapterVolumeManagementAdd","VolumeManagementAdd","VolumeManagementEdit","HandoutListEdit","HandoutListAdd","StudentXQ","AddClass","ManageClass","NotificationInfo","NotificationListAdd","NotificationEdit"],
 }
  
 const mutations = {
@@ -166,7 +166,6 @@ const actions = {
     })
   },
   delView({ dispatch, state }, view) {
-    console.log(view)
     return new Promise(resolve => {
       var func = () => {
         dispatch('delVisitedView', view)

+ 6 - 6
src/utils/methodsTool.js

@@ -138,7 +138,7 @@ export default {
 	 * @returns {string}
 	 * @remard 单位S转小时分钟秒
 	 */
-	secondToDate(result,Diszing = true) {
+	secondToDate(result, Diszing = true) {
 		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));
@@ -154,14 +154,14 @@ export default {
 	 * @returns int
 	 * @remard 00:00:00格式转秒
 	 */
-	secondFormDate(result){
-		if(result){
+	secondFormDate(result) {
+		if (result) {
 			let reTime = result.split(":").map(Number)
-			var hs = reTime[0]*60*60
-			var ms = reTime[1]*60
+			var hs = reTime[0] * 60 * 60
+			var ms = reTime[1] * 60
 			var ss = reTime[2]
 			return hs + ms + ss
-		}else{
+		} else {
 			return 0
 		}
 	},

+ 23 - 25
src/utils/uopladFile.js

@@ -1,5 +1,6 @@
 import PlvVideoUpload from '@polyv/vod-upload-js-sdk'
 import api from '@/api/api'
+import { Message } from 'element-ui';
 // import md5 from 'js-md5'
 
 // 此方法主要用于加密一些保利威的专用参数 如果是后端传递的 可以打掉
@@ -10,8 +11,8 @@ function getToken(videoUpload, array) {
     // const writeToken = '8f14a371-9d02-4ec1-922d-54d7b4f79dca'
     const hash = array.hash
     const sign = array.sign
-//     const hash = md5(ptime + writeToken)
-//   const sign = md5(secretkey + ptime)
+    //     const hash = md5(ptime + writeToken)
+    //   const sign = md5(secretkey + ptime)
     videoUpload.updateUserData({ ptime, hash, sign, userid })
     videoUpload.startAll()
 }
@@ -29,7 +30,6 @@ function autoUpdateUserData(timer, videoUpload, array) {
 }
 
 /**
- * @Date: 2021/3/26
  * @param: files -> 一个文件的数组 注意 是【数组】
  * @param: fileSetting -> 主要是用来传递给保利威的属性
  * @param: callback -> 上传进度,成功,失败 的回调 tips:回调太多 我就拿了这三个比较有用的
@@ -44,33 +44,31 @@ export function uploadFile(files, fileSetting, callback) {
             UploadComplete: () => { }  // 全部上传任务完成回调
         }
     })
-    console.log(videoUpload,'init')
     new Promise((resolve, reject) => {
         api.inquirepolyvvideogetPolyvUpload().then(res => {
             resolve(res)
         })
     }).then(res => {
         autoUpdateUserData(null, videoUpload, res.data)
-        var filet = [files]
-        Array.from(filet).forEach((file, index) => {
-            console.log(videoUpload, 1121)
-            const uploader = videoUpload.addFile(file, {
-                // 上传视频进度的回调
-                FileProgress: ({ progress }) => {
-                    const progressSize = (progress * 100).toFixed(2)
-                    callback(index, progressSize)
-                },
-                // 上传视频成功的回调
-                FileSucceed: ({ fileData }) => {
-                    callback(index, fileData)
-                },
-                // 上传视频失败的回调
-                onFileFailed: ({ errData }) => {
-                    callback(index, errData)
-                }
-            }, fileSetting)
-            // console.log(uploader)
-        })
+        const uploader = videoUpload.addFile(files, {
+            FileStarted: function (uploadInfo) { // 文件开始上传回调
+                console.log("文件上传开始: " + uploadInfo.fileData.title);
+            },
+            FileProgress: function (uploadInfo) { // 文件上传过程返回上传进度信息回调
+                console.log("文件上传中: " + (uploadInfo.progress * 100).toFixed(2) + '%');
+            },
+            FileStopped: function (uploadInfo) { // 文件暂停上传回调
+                console.log("文件上传停止: " + uploadInfo.fileData.title);
+            },
+            FileSucceed: ({ fileData }) => {// 上传视频成功的回调
+                Message.success({ message: "视频已上传成功,待审核中,等待审核通过后才可使用。如未自动填充时长,请手动填写!", duration: 6000, showClose: true })
+                callback(fileData)
+            },
+            FileFailed: ({ errData }) => {// 上传视频失败的回调
+                Message.error({ message: "文件上传失败" })
+                callback("文件上传失败: " + errData)
+            }
+        }, fileSetting)
 
     })
     /**
@@ -79,5 +77,5 @@ export function uploadFile(files, fileSetting, callback) {
      * 但是考虑到对于有多选上传不是很友好
      * 就无论你传递几个视频 这里都统一一起上传
      * */
-    
+
 }

+ 4 - 1
src/views/2Cport/adSlotManagement/index.vue

@@ -31,7 +31,10 @@ export default {
       activeIndex: 1,
     };
   },
-  methods: {},
+  mounted(){
+  },
+  methods: {
+  },
 };
 </script>
 

+ 17 - 7
src/views/2Cport/adSlotManagement/tab1.vue

@@ -75,7 +75,7 @@
                   {{
                     scope.row[item.prop] === 1
                       ? "启用"
-                      : scope.row[item.prop] === 2
+                      : scope.row[item.prop] === 0
                       ? "关闭"
                       : "未知"
                   }}
@@ -207,6 +207,16 @@
               "
             ></el-input>
           </el-form-item>
+          <el-form-item
+            label="appid"
+            prop="remarks"
+            v-if="listData.jumpType === 4"
+          >
+            <el-input
+              v-model="listData.remarks"
+              placeholder="请输入外部小程序appid"
+            ></el-input>
+          </el-form-item>
           <el-form-item label="排序" prop="sort">
             <el-input-number
               :min="1"
@@ -284,6 +294,9 @@ export default {
           { required: true, message: "请输入广告标题", trigger: "blur" },
         ],
         jumpUrl: [{ required: true, message: "请输入内容", trigger: "blur" }],
+        remarks: [
+          { required: true, message: "请输入外部小程序appid", trigger: "blur" },
+        ],
         adverUrl: [{ required: true, validator: valiIcon, trigger: "change" }],
         status: [
           { required: true, message: "请选择发布状态", trigger: "change" },
@@ -346,7 +359,7 @@ export default {
         this.statusPop = 0;
         this.listData = JSON.parse(JSON.stringify(v));
       }
-      this.listData.locationId = Number(this.activeid)
+      this.listData.locationId = Number(this.activeid);
       this.dialogVisible = true;
     },
     /**
@@ -398,15 +411,12 @@ export default {
             statusNS = true;
           }
         } else {
-          if (
-            item.sort == this.listData.sort &&
-            item.id !== this.listData.id
-          ) {
+          if (item.sort == this.listData.sort && item.id !== this.listData.id) {
             statusNS = true;
           }
         }
       });
-      if (anum >= 5) {
+      if (anum >= 5 && this.listData.status === 1) {
         this.$message.error("轮播图启用数量不得大于5个!");
         this.disabledBtn = false;
         return;

+ 160 - 143
src/views/Marketing/goods/commodityManageMent/add/index.vue

@@ -262,30 +262,29 @@
               align="center"
             >
             </el-table-column>
-            <template v-for="(item, index) in tableSet">
-              <el-table-column
-                :width="item.width"
-                :key="index"
-                :label="item.label"
-                align="center"
-                :show-overflow-tooltip="true"
-                header-align="center"
-                :prop="item.prop"
-              >
-                <template slot-scope="scope">
-                  <span
-                    v-if="item.scope === 'editInfo'"
-                    @click="openBoxs(2, scope.row)"
-                    class="clickSpan"
-                    >{{ scope.row[item.prop] }}</span
-                  >
-                  <span v-else-if="item.scope === 'leftCh'"
-                    >{{ item.ch }}{{ scope.row[item.prop] }}</span
-                  >
-                  <span v-else>{{ scope.row[item.prop] }}</span></template
-                >
-              </el-table-column></template
+            <el-table-column
+              v-for="(item, index) in tableSet"
+              :width="item.width"
+              :key="index"
+              :label="item.label"
+              align="center"
+              :show-overflow-tooltip="true"
+              header-align="center"
+              :prop="item.prop"
             >
+              <template slot-scope="scope">
+                <span
+                  v-if="item.scope === 'editInfo'"
+                  @click="openBoxs(2, scope.row)"
+                  class="clickSpan"
+                  >{{ scope.row[item.prop] }}</span
+                >
+                <span v-else-if="item.scope === 'leftCh'"
+                  >{{ item.ch }}{{ scope.row[item.prop] }}</span
+                >
+                <span v-else>{{ scope.row[item.prop] }}</span></template
+              >
+            </el-table-column>
             <el-table-column
               label="操作"
               align="center"
@@ -329,54 +328,53 @@
           }"
           :default-sort="{ prop: 'sort', order: 'ascending' }"
         >
-          <template v-for="(item, index) in tableSetTSB">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :label="item.label"
-              align="center"
-              :show-overflow-tooltip="true"
-              header-align="center"
-              :sortable="item.prop === 'sort'"
-              sort-by="sort"
-              :prop="item.prop"
-            >
-              <template slot-scope="scope">
-                <span v-if="item.scope === 'types'">{{
+          <el-table-column
+            v-for="(item, index) in tableSetTSB"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+            :sortable="item.prop === 'sort'"
+            sort-by="sort"
+            :prop="item.prop"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'types'">{{
+                scope.row[item.prop] === 1
+                  ? "录播"
+                  : scope.row[item.prop] === 2
+                  ? "直播"
+                  : scope.row[item.prop] === 3
+                  ? "回放"
+                  : "未知"
+              }}</span>
+              <span v-else-if="item.scope === 'busin'">
+                {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
+              </span>
+              <span v-else-if="item.scope === 'Status'">
+                {{
                   scope.row[item.prop] === 1
-                    ? "录播"
-                    : scope.row[item.prop] === 2
-                    ? "直播"
-                    : scope.row[item.prop] === 3
-                    ? "回放"
+                    ? "发布"
+                    : scope.row[item.prop] === 0
+                    ? "未发布"
                     : "未知"
-                }}</span>
-                <span v-else-if="item.scope === 'busin'">
-                  {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
-                </span>
-                <span v-else-if="item.scope === 'Status'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "发布"
-                      : scope.row[item.prop] === 0
-                      ? "未发布"
-                      : "未知"
-                  }}
-                </span>
-                <div v-else-if="item.scope === 'inputs'">
-                  <el-input-number
-                    style="width: 50px"
-                    size="small"
-                    :controls="false"
-                    v-model="scope.row[item.prop]"
-                    controls-position="right"
-                    :min="0"
-                  ></el-input-number>
-                </div>
-                <span v-else>{{ scope.row[item.prop] }}</span></template
-              >
-            </el-table-column></template
-          >
+                }}
+              </span>
+              <div v-else-if="item.scope === 'inputs'">
+                <el-input-number
+                  style="width: 50px"
+                  size="small"
+                  :controls="false"
+                  v-model="scope.row[item.prop]"
+                  controls-position="right"
+                  :min="0"
+                ></el-input-number>
+              </div>
+              <span v-else>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
           <el-table-column
             label="操作"
             align="center"
@@ -413,65 +411,64 @@
           }"
           :default-sort="{ prop: 'sort', order: 'ascending' }"
         >
-          <template v-for="(item, index) in tableSetTSB2">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :label="item.label"
-              align="center"
-              :show-overflow-tooltip="true"
-              header-align="center"
-              :sortable="item.prop === 'sort'"
-              sort-by="sort"
-              :prop="item.prop"
-            >
-              <template slot-scope="scope">
-                <span v-if="item.scope === 'types'">{{
+          <el-table-column
+            v-for="(item, index) in tableSetTSB2"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+            :sortable="item.prop === 'sort'"
+            sort-by="sort"
+            :prop="item.prop"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'types'">{{
+                scope.row[item.prop] === 1
+                  ? "录播"
+                  : scope.row[item.prop] === 2
+                  ? "直播"
+                  : scope.row[item.prop] === 3
+                  ? "回放"
+                  : "未知"
+              }}</span>
+              <span v-else-if="item.scope === 'type'">
+                {{
                   scope.row[item.prop] === 1
-                    ? "录播"
+                    ? "模块卷"
                     : scope.row[item.prop] === 2
-                    ? "直播"
+                    ? "章卷"
                     : scope.row[item.prop] === 3
-                    ? "回放"
+                    ? "试卷"
                     : "未知"
-                }}</span>
-                <span v-else-if="item.scope === 'type'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "模块卷"
-                      : scope.row[item.prop] === 2
-                      ? "章卷"
-                      : scope.row[item.prop] === 3
-                      ? "试卷"
-                      : "未知"
-                  }}
-                </span>
-                <span v-else-if="item.scope === 'busin'">
-                  {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
-                </span>
-                <span v-else-if="item.scope === 'Status'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "发布"
-                      : scope.row[item.prop] === 0
-                      ? "未发布"
-                      : "未知"
-                  }}
-                </span>
-                <div v-else-if="item.scope === 'inputs'">
-                  <el-input-number
-                    style="width: 50px"
-                    size="small"
-                    :controls="false"
-                    v-model="scope.row[item.prop]"
-                    controls-position="right"
-                    :min="0"
-                  ></el-input-number>
-                </div>
-                <span v-else>{{ scope.row[item.prop] }}</span></template
-              >
-            </el-table-column></template
-          >
+                }}
+              </span>
+              <span v-else-if="item.scope === 'busin'">
+                {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
+              </span>
+              <span v-else-if="item.scope === 'Status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "发布"
+                    : scope.row[item.prop] === 0
+                    ? "未发布"
+                    : "未知"
+                }}
+              </span>
+              <div v-else-if="item.scope === 'inputs'">
+                <el-input-number
+                  style="width: 50px"
+                  size="small"
+                  :controls="false"
+                  v-model="scope.row[item.prop]"
+                  controls-position="right"
+                  :min="0"
+                ></el-input-number>
+              </div>
+              <span v-else>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
           <el-table-column
             label="操作"
             align="center"
@@ -636,17 +633,34 @@
           class="dis_fs"
           v-if="listData.goodsType === 1 || listData.goodsType === 2"
         >
-          <el-popover placement="bottom" trigger="click">
+          <el-popover
+            placement="bottom-start"
+            trigger="click"
+            class="checkBoxSty1"
+          >
             <el-checkbox-group v-model="listData.certificateIds">
               <el-checkbox
                 v-for="(item, index) in certificateOption"
                 :key="index"
-                :label="item.id"
-                >{{ item.certificateName }}</el-checkbox
+                :label="item.tpId"
+                >{{
+                  item.typeId
+                    ? item.certificateName + ":" + item.title
+                    : item.title
+                }}</el-checkbox
               >
             </el-checkbox-group>
             <el-button slot="reference" size="small">选择证书</el-button>
           </el-popover>
+          <span
+            style="
+              font-size: 12px;
+              color: #9f9f9f;
+              flex-shrink: 0;
+              margin-left: 6px;
+            "
+            >注:可多选</span
+          >
           <ul>
             <li
               class="boxlefs"
@@ -1283,20 +1297,19 @@
               >
             </template>
           </el-table-column>
-          <template v-for="(item, index) in goodsSetList">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :label="item.label"
-              align="center"
-              :show-overflow-tooltip="true"
-              header-align="center"
-            >
-              <template slot-scope="scope">
-                <span>{{ scope.row[item.prop] }}</span></template
-              >
-            </el-table-column></template
+          <el-table-column
+            v-for="(item, index) in goodsSetList"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
           >
+            <template slot-scope="scope">
+              <span>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
         </el-table>
         <pagination
           :total="total5"
@@ -2144,7 +2157,7 @@ export default {
       this.$api.inquirepaycost({ status: 1 }).then((res) => {
         this.listitem[0].options = res.rows;
       });
-      this.$api.inquireBaseCertificate({ status: 1 }).then((res) => {
+      this.$api.inquireBaseCertificatetp({ status: 1 }).then((res) => {
         this.certificateOption = res.rows;
       });
     },
@@ -2561,8 +2574,8 @@ export default {
     checkListName(id) {
       var a = "";
       this.certificateOption.map((item, index) => {
-        if (item.id === id) {
-          a = item.certificateName;
+        if (item.tpId === id) {
+          a = item.typeId ? item.certificateName + ":" + item.title : item.title;
         }
       });
       return a;
@@ -3048,6 +3061,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.checkBoxSty1 {
+  display: flex;
+  flex-direction: column;
+}
 .dis_f {
   display: flex;
   justify-content: space-around;

+ 176 - 153
src/views/Marketing/goods/commodityManageMent/edit/index.vue

@@ -265,30 +265,29 @@
               align="center"
             >
             </el-table-column>
-            <template v-for="(item, index) in tableSet">
-              <el-table-column
-                :width="item.width"
-                :key="index"
-                :label="item.label"
-                align="center"
-                :show-overflow-tooltip="true"
-                header-align="center"
-                :prop="item.prop"
-              >
-                <template slot-scope="scope">
-                  <span
-                    v-if="item.scope === 'editInfo'"
-                    @click="openBoxs(2, scope.row)"
-                    class="clickSpan"
-                    >{{ scope.row[item.prop] }}</span
-                  >
-                  <span v-else-if="item.scope === 'leftCh'"
-                    >{{ item.ch }}{{ scope.row[item.prop] }}</span
-                  >
-                  <span v-else>{{ scope.row[item.prop] }}</span></template
-                >
-              </el-table-column></template
+            <el-table-column
+              v-for="(item, index) in tableSet"
+              :width="item.width"
+              :key="index"
+              :label="item.label"
+              align="center"
+              :show-overflow-tooltip="true"
+              header-align="center"
+              :prop="item.prop"
             >
+              <template slot-scope="scope">
+                <span
+                  v-if="item.scope === 'editInfo'"
+                  @click="openBoxs(2, scope.row)"
+                  class="clickSpan"
+                  >{{ scope.row[item.prop] }}</span
+                >
+                <span v-else-if="item.scope === 'leftCh'"
+                  >{{ item.ch }}{{ scope.row[item.prop] }}</span
+                >
+                <span v-else>{{ scope.row[item.prop] }}</span></template
+              >
+            </el-table-column>
             <el-table-column
               label="操作"
               align="center"
@@ -334,54 +333,53 @@
           }"
           :default-sort="{ prop: 'sort', order: 'ascending' }"
         >
-          <template v-for="(item, index) in tableSetTSB">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :label="item.label"
-              align="center"
-              :show-overflow-tooltip="true"
-              header-align="center"
-              :sortable="item.prop === 'sort'"
-              sort-by="sort"
-              :prop="item.prop"
-            >
-              <template slot-scope="scope">
-                <span v-if="item.scope === 'types'">{{
+          <el-table-column
+            v-for="(item, index) in tableSetTSB"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+            :sortable="item.prop === 'sort'"
+            sort-by="sort"
+            :prop="item.prop"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'types'">{{
+                scope.row[item.prop] === 1
+                  ? "录播"
+                  : scope.row[item.prop] === 2
+                  ? "直播"
+                  : scope.row[item.prop] === 3
+                  ? "回放"
+                  : "未知"
+              }}</span>
+              <span v-else-if="item.scope === 'busin'">
+                {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
+              </span>
+              <span v-else-if="item.scope === 'Status'">
+                {{
                   scope.row[item.prop] === 1
-                    ? "录播"
-                    : scope.row[item.prop] === 2
-                    ? "直播"
-                    : scope.row[item.prop] === 3
-                    ? "回放"
+                    ? "发布"
+                    : scope.row[item.prop] === 0
+                    ? "未发布"
                     : "未知"
-                }}</span>
-                <span v-else-if="item.scope === 'busin'">
-                  {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
-                </span>
-                <span v-else-if="item.scope === 'Status'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "发布"
-                      : scope.row[item.prop] === 0
-                      ? "未发布"
-                      : "未知"
-                  }}
-                </span>
-                <div v-else-if="item.scope === 'inputs'">
-                  <el-input-number
-                    style="width: 50px"
-                    size="small"
-                    :controls="false"
-                    v-model="scope.row[item.prop]"
-                    controls-position="right"
-                    :min="0"
-                  ></el-input-number>
-                </div>
-                <span v-else>{{ scope.row[item.prop] }}</span></template
-              >
-            </el-table-column></template
-          >
+                }}
+              </span>
+              <div v-else-if="item.scope === 'inputs'">
+                <el-input-number
+                  style="width: 50px"
+                  size="small"
+                  :controls="false"
+                  v-model="scope.row[item.prop]"
+                  controls-position="right"
+                  :min="0"
+                ></el-input-number>
+              </div>
+              <span v-else>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
           <el-table-column
             label="操作"
             align="center"
@@ -419,65 +417,64 @@
           }"
           :default-sort="{ prop: 'sort', order: 'ascending' }"
         >
-          <template v-for="(item, index) in tableSetTSB2">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :label="item.label"
-              align="center"
-              :show-overflow-tooltip="true"
-              header-align="center"
-              :sortable="item.prop === 'sort'"
-              sort-by="sort"
-              :prop="item.prop"
-            >
-              <template slot-scope="scope">
-                <span v-if="item.scope === 'types'">{{
+          <el-table-column
+            v-for="(item, index) in tableSetTSB2"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
+            :sortable="item.prop === 'sort'"
+            sort-by="sort"
+            :prop="item.prop"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'types'">{{
+                scope.row[item.prop] === 1
+                  ? "录播"
+                  : scope.row[item.prop] === 2
+                  ? "直播"
+                  : scope.row[item.prop] === 3
+                  ? "回放"
+                  : "未知"
+              }}</span>
+              <span v-else-if="item.scope === 'type'">
+                {{
                   scope.row[item.prop] === 1
-                    ? "录播"
+                    ? "模块卷"
                     : scope.row[item.prop] === 2
-                    ? "直播"
+                    ? "章卷"
                     : scope.row[item.prop] === 3
-                    ? "回放"
+                    ? "试卷"
                     : "未知"
-                }}</span>
-                <span v-else-if="item.scope === 'type'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "模块卷"
-                      : scope.row[item.prop] === 2
-                      ? "章卷"
-                      : scope.row[item.prop] === 3
-                      ? "试卷"
-                      : "未知"
-                  }}
-                </span>
-                <span v-else-if="item.scope === 'busin'">
-                  {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
-                </span>
-                <span v-else-if="item.scope === 'Status'">
-                  {{
-                    scope.row[item.prop] === 1
-                      ? "发布"
-                      : scope.row[item.prop] === 0
-                      ? "未发布"
-                      : "未知"
-                  }}
-                </span>
-                <div v-else-if="item.scope === 'inputs'">
-                  <el-input-number
-                    style="width: 50px"
-                    size="small"
-                    :controls="false"
-                    v-model="scope.row[item.prop]"
-                    controls-position="right"
-                    :min="0"
-                  ></el-input-number>
-                </div>
-                <span v-else>{{ scope.row[item.prop] }}</span></template
-              >
-            </el-table-column></template
-          >
+                }}
+              </span>
+              <span v-else-if="item.scope === 'busin'">
+                {{ scope.row[item.prop1] + " - " + scope.row[item.prop2] }}
+              </span>
+              <span v-else-if="item.scope === 'Status'">
+                {{
+                  scope.row[item.prop] === 1
+                    ? "发布"
+                    : scope.row[item.prop] === 0
+                    ? "未发布"
+                    : "未知"
+                }}
+              </span>
+              <div v-else-if="item.scope === 'inputs'">
+                <el-input-number
+                  style="width: 50px"
+                  size="small"
+                  :controls="false"
+                  v-model="scope.row[item.prop]"
+                  controls-position="right"
+                  :min="0"
+                ></el-input-number>
+              </div>
+              <span v-else>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
           <el-table-column
             label="操作"
             align="center"
@@ -643,17 +640,33 @@
           class="dis_fs"
           v-if="listData.goodsType === 1 || listData.goodsType === 2"
         >
-          <el-popover placement="bottom" trigger="click">
-            <el-checkbox-group v-model="listData.certificateIds">
+          <el-popover placement="bottom-start" trigger="click">
+            <el-checkbox-group
+              v-model="listData.certificateIds"
+              class="checkBoxSty1"
+            >
               <el-checkbox
                 v-for="(item, index) in certificateOption"
                 :key="index"
-                :label="item.id"
-                >{{ item.certificateName }}</el-checkbox
+                :label="item.tpId"
+                >{{
+                  item.typeId
+                    ? item.certificateName + ":" + item.title
+                    : item.title
+                }}</el-checkbox
               >
             </el-checkbox-group>
             <el-button slot="reference" size="small">选择证书</el-button>
           </el-popover>
+          <span
+            style="
+              font-size: 12px;
+              color: #9f9f9f;
+              flex-shrink: 0;
+              margin-left: 6px;
+            "
+            >注:可多选</span
+          >
           <ul>
             <li
               class="boxlefs"
@@ -1298,20 +1311,19 @@
               >
             </template>
           </el-table-column>
-          <template v-for="(item, index) in goodsSetList">
-            <el-table-column
-              :width="item.width"
-              :key="index"
-              :label="item.label"
-              align="center"
-              :show-overflow-tooltip="true"
-              header-align="center"
-            >
-              <template slot-scope="scope">
-                <span>{{ scope.row[item.prop] }}</span></template
-              >
-            </el-table-column></template
+          <el-table-column
+            v-for="(item, index) in goodsSetList"
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+            :show-overflow-tooltip="true"
+            header-align="center"
           >
+            <template slot-scope="scope">
+              <span>{{ scope.row[item.prop] }}</span></template
+            >
+          </el-table-column>
         </el-table>
         <pagination
           :total="total5"
@@ -2185,7 +2197,7 @@ export default {
     },
     Certificate() {
       return new Promise((resolve, reject) => {
-        this.$api.inquireBaseCertificate({ status: 1 }).then((res) => {
+        this.$api.inquireBaseCertificatetp({ status: 1 }).then((res) => {
           this.certificateOption = res.rows;
           resolve();
         });
@@ -2202,7 +2214,10 @@ export default {
               TypeId: "3-" + item.sectionId,
               menuId: item.sectionId,
               courseId: item.courseId,
-              auditionMinute: this.$methodsTools.secondToDate(item.auditionMinute,false),
+              auditionMinute: this.$methodsTools.secondToDate(
+                item.auditionMinute,
+                false
+              ),
               type: 3,
             });
           });
@@ -2566,7 +2581,9 @@ export default {
         var auditionListArray = [];
         this.auditionList.map((item) => {
           auditionListArray.push({
-            auditionMinute: this.$methodsTools.secondFormDate(item.auditionMinute),
+            auditionMinute: this.$methodsTools.secondFormDate(
+              item.auditionMinute
+            ),
             courseId: item.courseId,
             sectionId: item.menuId,
           });
@@ -2756,8 +2773,10 @@ export default {
     checkListName(id) {
       var a = "";
       this.certificateOption.map((item, index) => {
-        if (item.id === id) {
-          a = item.certificateName;
+        if (item.tpId === id) {
+          a = item.typeId
+            ? item.certificateName + ":" + item.title
+            : item.title;
         }
       });
       return a;
@@ -3110,7 +3129,7 @@ export default {
         if (this.activeLists2.moduleCheck.length) {
           this.activeLists2.moduleCheck.forEach((item, index) => {
             item.sort = maxIndex + 1;
-            maxIndex = item.sort
+            maxIndex = item.sort;
           });
           this.tableData2 = this.tableData2.concat(
             this.activeLists2.moduleCheck
@@ -3119,7 +3138,7 @@ export default {
         if (this.activeLists2.chapterCheck.length) {
           this.activeLists2.chapterCheck.forEach((item, index) => {
             item.sort = maxIndex + 1;
-            maxIndex = item.sort
+            maxIndex = item.sort;
           });
           this.tableData2 = this.tableData2.concat(
             this.activeLists2.chapterCheck
@@ -3128,16 +3147,16 @@ export default {
         if (this.activeLists2.examCheck.length) {
           this.activeLists2.examCheck.forEach((item, index) => {
             item.sort = maxIndex + 1;
-            maxIndex = item.sort
+            maxIndex = item.sort;
           });
           this.tableData2 = this.tableData2.concat(this.activeLists2.examCheck);
         }
       } else {
-        let maxIndex = 0
+        let maxIndex = 0;
         if (this.activeLists2.moduleCheck.length) {
           this.activeLists2.moduleCheck.forEach((item, index) => {
             item.sort = maxIndex + 1;
-            maxIndex = item.sort
+            maxIndex = item.sort;
           });
           this.tableData2 = this.tableData2.concat(
             this.activeLists2.moduleCheck
@@ -3146,7 +3165,7 @@ export default {
         if (this.activeLists2.chapterCheck.length) {
           this.activeLists2.chapterCheck.forEach((item, index) => {
             item.sort = maxIndex + 1;
-            maxIndex = item.sort
+            maxIndex = item.sort;
           });
           this.tableData2 = this.tableData2.concat(
             this.activeLists2.chapterCheck
@@ -3155,7 +3174,7 @@ export default {
         if (this.activeLists2.examCheck.length) {
           this.activeLists2.examCheck.forEach((item, index) => {
             item.sort = maxIndex + 1;
-            maxIndex = item.sort
+            maxIndex = item.sort;
           });
           this.tableData2 = this.tableData2.concat(this.activeLists2.examCheck);
         }
@@ -3258,6 +3277,10 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.checkBoxSty1 {
+  display: flex;
+  flex-direction: column;
+}
 .dis_f {
   display: flex;
   justify-content: space-around;

+ 7 - 19
src/views/Marketing/goods/commodityManageMent/poppleSet.vue

@@ -36,26 +36,14 @@
           <span>{{ node.label }}</span>
           <span v-if="node.checked"
             >试听前
-            <!-- <el-input-number
-              v-model="node.data.auditionMinute"
-              controls-position="right"
-              :min="0"
-              :precision="2"
-              :controls="false"
-              size="mini"
-              style="width: 80px"
-              :max="node.data.durationTime"
-              @blur="changeNum(node)"
-            ></el-input-number
-            >分钟 -->
             <el-time-picker
               style="width: 140px"
               size="mini"
               value-format="HH:mm:ss"
-              range-separator=":"
+              range-separator="-"
               v-model="node.data.auditionMinute"
               :picker-options="{
-                selectableRange: '00:00:00 - 12:12:15',
+                selectableRange: compTimes(node.data.durationTime),
               }"
               placeholder="请选择试听时长"
               @blur="changeNum(node)"
@@ -96,11 +84,11 @@ export default {
     };
   },
   computed: {
-    compTimes() {
-      const aTime = 192;
-      let chasTime = this.$methodsTools.secondToDate(aTime, false);
-      console.log(chasTime);
-      return `00:00:00 - 00:00:21`;
+    compTimes: function () {
+      return function (aTime) {
+        let chasTime = this.$methodsTools.secondToDate(aTime, false);
+        return `00:00:00 - ${chasTime}`;
+      };
     },
   },
   methods: {

+ 11 - 3
src/views/Marketing/goods/courseInquiryList/index.vue

@@ -83,7 +83,7 @@
                     {{ items.menuName }}
                   </span>
                   <span v-if="items.type === 3" class="itemsty"
-                    >{{ items.durationTime }}分钟</span
+                    >{{ $methodsTools.secondToDate(items.durationTime,false)}}</span
                   >
                 </div>
                 <template v-if="items.checked">
@@ -113,7 +113,7 @@
                         {{ its.menuName }}
                       </span>
                       <span v-if="its.type === 3" class="itemsty"
-                        >{{ its.durationTime }}分钟</span
+                        >{{ $methodsTools.secondToDate(its.durationTime,false)}}</span
                       >
                     </div>
                     <template v-if="its.checked">
@@ -135,7 +135,7 @@
                             {{ itschild.menuName }}
                           </span>
                           <span class="itemsty"
-                            >{{ itschild.durationTime }}分钟</span
+                            >{{ $methodsTools.secondToDate(itschild.durationTime,false)}}</span
                           >
                         </div>
                       </div>
@@ -202,6 +202,7 @@ export default {
         status: 1,
         pageSize: 10,
         pageNum: 1,
+        sectionNum: 1,
       },
       // 表单
       tableSet: [
@@ -244,6 +245,12 @@ export default {
           prop: "classHours",
           hidden: true,
         },
+        {
+          label: "视频节数量",
+          prop: "sectionNum",
+          hidden: true,
+          width:'100px'
+        },
         {
           label: "学习有效期",
           prop1: "studyStartTime",
@@ -309,6 +316,7 @@ export default {
           status: 1,
           pageSize: 10,
           pageNum: 1,
+          sectionNum: 1,
         };
       }
       if (int === 3) {

+ 444 - 0
src/views/education/certificateManagement/certificateModel/index.vue

@@ -0,0 +1,444 @@
+<template>
+  <div id="certificateModel">
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+      @editInfo="editInfo"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 0)"
+          >关联</el-button
+        >
+        <!-- <el-button type="text" @click="del(props.scope.row)">删除</el-button> -->
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="pageSize"
+      :currentPage="currentPage"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="560px"
+      :show-close="false"
+      :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/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="110px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'status'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
+              >
+            </el-radio-group>
+            <el-select
+              clearable
+              v-else-if="items.scope === 'select'"
+              v-model="listData[items.prop]"
+              placeholder="请选择关联证书类型"
+            >
+              <el-option
+                v-for="(item, index) in certificate"
+                :key="index"
+                :label="item.certificateName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'textarea'"
+              type="textarea"
+              v-model="listData[items.prop]"
+            ></el-input>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else
+              v-model="listData[items.prop]"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button
+          type="primary"
+          :loading="disabledBtn"
+          v-if="statusPop !== 2"
+          @click="submit('listData')"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import searchBox from "@/components/searchBox";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "CertificateModel",
+  components: { searchBox, tableList, pagination },
+  data() {
+    return {
+      disabledBtn: false,
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "证书模板",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "类型编码",
+          prop: "code",
+          hidden: true,
+        },
+        {
+          label: "证书模板名称",
+          prop: "title",
+          hidden: true,
+          width:"300px"
+        },
+        {
+          label: "证书模板键值",
+          prop: "keyValue",
+          hidden: true,
+        },
+        {
+          label: "说明",
+          prop: "introduce",
+          hidden: true,
+        },
+        {
+          label: "关联证书类型",
+          prop: "certificateName",
+          hidden: true,
+        },
+        {
+          label: "状态",
+          prop: "status",
+          hidden: true,
+          scope: "status",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      pageSize: 10, //每页多少条数据
+      currentPage: 1, //当前页码
+      // 弹窗字段
+      listitem: [
+        {
+          label: "关联证书类型",
+          prop: "typeId",
+          scope: "select",
+        },
+        {
+          label: "证书模板名称",
+          prop: "title",
+        },
+        {
+          label: "证书模板键值",
+          prop: "keyValue",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+          options: [
+            {
+              label: "启用",
+              value: 1,
+            },
+            {
+              label: "关闭",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "说明",
+          prop: "introduce",
+          scope: "textarea",
+        },
+      ],
+      //   弹窗数据
+      listData: {},
+      statusPop: -1,
+      dialogVisible: false,
+      //表单验证
+      rules: {
+        title: [
+          { required: true, message: "请输入证书模板名称", trigger: "blur" },
+        ],
+        keyValue: [
+          { required: true, message: "请输入证书模板键值", trigger: "blur" },
+        ],
+        status: [{ required: true, message: "请选择状态", trigger: "change" }],
+      },
+    };
+  },
+  computed: { ...mapGetters(["certificate"]) },
+  mounted() {
+    this.search();
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    editInfo(v) {
+      this.addClick(v, 0);
+    },
+    search(v) {
+      this.loading = true;
+      var data = {
+        status: "0,1",
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.$api
+        .inquireBaseCertificatetp(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) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            sourceId: v.sourceId,
+            status: -1,
+          };
+          this.$api.editBaseCertificatetp(data).then((res) => {
+            this.$message.success("删除成功");
+            this.$store.commit("CERTIFICATETP");
+            this.search();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    addClick(v, int) {
+      if (v === undefined) {
+        this.statusPop = 1;
+        this.listData = {
+          status: 1,
+        };
+      } else {
+        this.statusPop = int;
+        this.listData = JSON.parse(JSON.stringify(v));
+      }
+      this.$nextTick(() => {
+        this.$refs.listData.clearValidate();
+      });
+      this.dialogVisible = true;
+    },
+    submit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    rulesTableSumbit() {
+      this.disabledBtn = true;
+      if (this.statusPop === 1) {
+        this.$api
+          .appBaseCertificatetp(this.listData)
+          .then((res) => {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.$store.commit("CERTIFICATETP");
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+      if (this.statusPop === 0) {
+        this.$api
+          .editBaseCertificatetp(this.listData)
+          .then((res) => {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.$store.commit("CERTIFICATETP");
+            this.search();
+          })
+          .catch(() => {
+            this.disabledBtn = false;
+          });
+      }
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    handleSizeChange(v) {
+      this.pageSize = v;
+      this.currentPage = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.currentPage = v;
+      this.search();
+    },
+  },
+};
+</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>
+

+ 21 - 0
src/views/education/certificateManagement/creditHoursList/index.vue

@@ -0,0 +1,21 @@
+<template>
+  <div id="creditHoursList">
+creditHoursList
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+    }
+  },
+  methods: {
+
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 11 - 2
src/views/education/classManageMent/classHoursReview/studyTimes.vue

@@ -553,6 +553,9 @@
                           <span v-else-if="item.scope === 'aTime'">
                             {{ $methodsTools.onlyForma(scope3.row[item.prop]) }}
                           </span>
+                          <span v-else-if="item.scope === 'durTime'">
+                            {{$methodsTools.secondToDate(scope3.row[item.prop],false)}}
+                          </span>
                           <div v-else-if="item.scope === 'aTimeSE'">
                             <span
                               v-if="
@@ -633,6 +636,9 @@
                     <span v-else-if="item.scope === 'aTime'">
                       {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
                     </span>
+                    <span v-else-if="item.scope === 'durTime'">
+                            {{$methodsTools.secondToDate(scope2.row[item.prop],false)}}
+                          </span>
                     <div v-else-if="item.scope === 'aTimeSE'">
                       <span
                         v-if="
@@ -704,6 +710,9 @@
               <span v-else-if="item.scope === 'aTime'">
                 {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
               </span>
+              <span v-else-if="item.scope === 'durTime'">
+                            {{$methodsTools.secondToDate(scope.row[item.prop],false)}}
+                          </span>
               <div v-else-if="item.scope === 'aTimeSE'">
                 <span
                   v-if="
@@ -829,6 +838,7 @@ export default {
           label: "节时长",
           prop: "durationTime",
           width: "180px",
+          scope:"durTime"
         },
         {
           label: "开始时间",
@@ -879,8 +889,7 @@ export default {
   },
   methods: {
     comput(item) {
-      var ast = (item.studyEndTime - item.studyStartTime) / 60;
-      console.log(ast, item.durationTime, 555);
+      var ast = item.studyEndTime - item.studyStartTime
       if (ast < item.durationTime) {
         return "color:red;";
       } else {

+ 137 - 0
src/views/education/classManageMent/learningHoursRecordList/exportTable.vue

@@ -0,0 +1,137 @@
+<template>
+  <div id="exportTable">
+    <div class="swq">
+      <img
+        style="width: 182px; height: 168px"
+        src="@/assets/images/dc.png"
+        alt=""
+      />
+    </div>
+    <div class="boxStyDz">
+      <div>
+        <el-select
+          v-model="formData.eduId"
+          placeholder="请选择教育类型"
+          @change="changeEdu"
+        >
+          <el-option
+            v-for="(item, index) in educationType"
+            :key="index"
+            :label="item.educationName"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <div>
+        <el-select
+          v-model="formData.businessid"
+          placeholder="请选择业务层次"
+          @change="changeBusin"
+        >
+          <el-option
+            v-for="(item, index) in businessLevel"
+            :key="index"
+            :label="`${item.projectName}-${item.businessName}`"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <div>
+        <el-select
+          v-model="formData.studyStatus"
+          placeholder="请选择学习状态"
+          @change="changeStudyStatus"
+        >
+          <el-option
+            v-for="(item, index) in options"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <div v-if="formData.studyStatus === 2">
+        <span style="margin-right:10px;">学时官方推送状态</span>
+        <el-radio-group v-model="formData.officialStatus">
+          <el-radio :label="1">是</el-radio>
+          <el-radio :label="0">否</el-radio>
+        </el-radio-group>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      formData: {
+        eduId: "",
+        businessid: "",
+        studyStatus: 2,
+        officialStatus: "",
+      },
+      copyBusiness: [],
+      businessLevel: [],
+      options: [
+        { label: "全部", value: 0 },
+        { label: "未完成学习", value: 1 },
+        { label: "完成学习", value: 2 },
+      ],
+    };
+  },
+  computed: { ...mapGetters(["educationType"]) },
+  mounted() {
+    this.initDATA();
+  },
+  methods: {
+    changeStudyStatus() {
+      this.formData.officialStatus = "";
+    },
+    initDATA() {
+      this.$api.inquirebusinessList({ status: 1 }).then((res) => {
+        this.businessLevel = res.rows;
+        this.copyBusiness = res.rows;
+      });
+    },
+    changeEdu(ids, x) {
+      if (!x) {
+        this.formData.businessid = "";
+        this.formData.businessName = ""
+      }
+      this.businessLevel = this.copyBusiness.filter((item) => {
+        return item.educationId == ids;
+      });
+    },
+    changeBusin(ids) {
+      this.copyBusiness.forEach((item) => {
+        if (item.id == ids) {
+          this.formData.eduId = item.educationId;
+          this.formData.businessName = `${item.projectName}-${item.businessName}`
+          this.changeEdu(item.educationId, true);
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.boxStyDz {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 40px 0px 0px;
+  & > div {
+    margin-bottom: 15px;
+  }
+}
+</style>

+ 370 - 0
src/views/education/classManageMent/learningHoursRecordList/hoursTimesRecord.vue

@@ -0,0 +1,370 @@
+<template>
+  <div id="classHoursReview">
+    <div style="margin-bottom: 10px">
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「1」</strong>所在班级:{{
+          objs.className
+        }}</span
+      >
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「2」</strong>学时:{{
+          objs.classHours
+        }}</span
+      >
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「3」</strong>完成{{
+          userData.stuAllNum + userData.recordNum
+        }}节的内容学习</span
+      >
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「4」</strong>学习时间:{{
+          $methodsTools.onlyForma(objs.studyStartTime, false)
+        }}
+        - {{ $methodsTools.onlyForma(objs.studyEndTime, false) }}</span
+      >
+    </div>
+    <div class="dis_fs">
+      <ul class="ul_ls">
+        <li>学员编码:{{ userData.studentCode }}</li>
+        <li>学员姓名:{{ userData.realName }}</li>
+        <li>学员身份证号码:{{ userData.idCard }}</li>
+        <li>绑定手机号码:{{ userData.telPhone }}</li>
+      </ul>
+      <div class="photoSty1">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(recent_photos)"
+          :preview-src-list="[$methodsTools.splitImgHost(recent_photos)]"
+        >
+        </el-image>
+        <div class="pos_bottom">一寸头像图</div>
+      </div>
+      <div class="photoSty2">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(idcard_face_photo)"
+          :preview-src-list="[$methodsTools.splitImgHost(idcard_face_photo)]"
+        >
+        </el-image>
+        <div class="pos_bottom">身份证正面照片</div>
+      </div>
+      <div class="photoSty2" style="margin-right: 0px">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(idcard_national_photo)"
+          :preview-src-list="[
+            $methodsTools.splitImgHost(idcard_national_photo),
+          ]"
+        >
+        </el-image>
+        <div class="pos_bottom">身份证背面照片</div>
+      </div>
+    </div>
+    <div style="margin-top:12px;">
+      <el-table
+        v-loading="loading"
+        ref="multipleTable"
+        :data="tableData"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          padding: '8px',
+          color: '#333',
+        }"
+      >
+        <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>{{ scope.row[item.prop] }}</span></template
+          >
+        </el-table-column>
+      </el-table>
+      <!-- <pagination
+        :total="total"
+        :pageSize="formData.pageSize"
+        :currentPage="formData.pageNum"
+        @handleSizeChange="handleSizeChange"
+        @handleCurrentChange="handleCurrentChange"
+      /> -->
+    </div>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/pagination";
+export default {
+  components: { pagination },
+  props: {
+    objs: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      size: "medium",
+      active: "",
+      loading: false,
+      studentCode: "",
+      realName: "",
+      idCard: "",
+      telPhone: "",
+      recent_photos: "",
+      idcard_face_photo: "",
+      idcard_national_photo: "",
+      userData: {},
+      tableList: [
+        {
+          label: "模块标题",
+          prop: "moduleName",
+        },
+        {
+          label: "章标题",
+          prop: "chapterName",
+        },
+        {
+          label: "节标题",
+          prop: "sectionName",
+        },
+        {
+          label: "节时长(秒)",
+          prop: "durationTime",
+        },
+        {
+          label: "学习/做题时间",
+          prop: "studyTimeTxt",
+        },
+        {
+          label: "学习/做题时长",
+          prop: "studyTimeLongTxt",
+        },
+        {
+          label: "学习/做题状态",
+          prop: "studyStatusTxt",
+        },
+      ],
+      tableData: [],
+      formData: {
+        // pageSize: 10,
+        // pageNum: 1,
+      },
+      total: 0,
+    };
+  },
+  mounted() {
+    this.getUserInfo();
+    this.search();
+  },
+  methods: {
+    // handleSizeChange(v) {
+    //   this.formData.pageSize = v;
+    //   this.formData.pageNum = 1;
+    //   this.search();
+    // },
+    // handleCurrentChange(v) {
+    //   this.formData.pageNum = v;
+    //   this.search();
+    // },
+    //获取用户信息
+    getUserInfo() {
+      this.$api
+        .inquireGradegradelistUserlistPeriod({
+          gradeId: this.objs.id,
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+        })
+        .then((res) => {
+          if (res.rows[0].keyValue) {
+            var data = JSON.parse(res.rows[0].keyValue);
+            this.recent_photos = data.recent_photos.value;
+            this.idcard_face_photo = data.idcard_face_photo.value;
+            this.idcard_national_photo = data.idcard_national_photo.value;
+            this.realName = data.name.value;
+            this.idCard = data.idcard.value;
+            this.telPhone = data.telphone.value;
+          }
+          this.userData = res.rows[0];
+        });
+    },
+    search() {
+      this.loading = true;
+      let data = {
+        gradeId: this.objs.id,
+        userId: this.objs.userId,
+        goodsId: this.objs.goodsId,
+        // pageSize: this.formData.pageSize,
+        // pageNum: this.formData.pageNum,
+      };
+      this.$api
+        .gradegradelistUserStudyRecord(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.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;
+  .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);
+  }
+}
+</style>

+ 225 - 20
src/views/education/classManageMent/learningHoursRecordList/index.vue

@@ -13,9 +13,18 @@
       :navText="navText"
       :loading="loading"
     >
+      <template slot="customize">
+        <el-button size="small" type="success" @click="moreActive"
+          >批量导出</el-button
+        >
+      </template>
       <template slot="btn" slot-scope="props">
-        <el-button type="text">学习记录</el-button>
-        <el-button type="text">学时记录</el-button>
+        <el-button type="text" @click="activeHoursRecord(props.scope.row)"
+          >学习记录</el-button
+        >
+        <el-button type="text" @click="activeStudyRecord(props.scope.row)"
+          >学时记录</el-button
+        >
       </template>
     </table-list>
     <pagination
@@ -25,18 +34,107 @@
       @handleSizeChange="handleSizeChange"
       @handleCurrentChange="handleCurrentChange"
     />
+    <el-dialog
+      :visible.sync="vidBoxHours"
+      v-if="vidBoxHours"
+      width="1160px"
+      :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="vidBoxHours = false"
+          />
+        </div>
+      </div>
+      <div>
+        <hours-times-record :objs="objs" />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="vidBoxHours = false">取 消</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="vidBox"
+      v-if="vidBox"
+      width="1160px"
+      :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="vidBox = false"
+          />
+        </div>
+      </div>
+      <div>
+        <study-times-record :objs="objs" />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="vidBox = false">取 消</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogDR"
+      v-if="dialogDR"
+      width="660px"
+      :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="dialogDR = false"
+          />
+        </div>
+      </div>
+      <div>
+        <export-table ref="exportTable" />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogDR = false">取消</el-button>
+        <el-button type="primary" @click="exputs" :loading="disabledBtn"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import * as baseUrls from "@/utils/request.js";
 import searchBoxNew from "@/components/searchBoxNew";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
+import studyTimesRecord from "./studyTimesRecord.vue";
+import hoursTimesRecord from "./hoursTimesRecord.vue";
+import exportTable from "./exportTable.vue";
 export default {
   name: "LearningHoursRecordList",
-  components: { searchBoxNew, tableList, pagination },
+  components: {
+    searchBoxNew,
+    tableList,
+    pagination,
+    studyTimesRecord,
+    hoursTimesRecord,
+    exportTable,
+  },
   data() {
     return {
+      disabledBtn: false,
+      dialogDR: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
         title: "学习学时记录列表",
@@ -51,6 +149,7 @@ export default {
           title: "未定义",
         },
       },
+      objs: {},
       //搜索
       formList: [
         {
@@ -80,11 +179,11 @@ export default {
           ],
         },
         {
-          prop: "status1",
+          prop: "learnStatus",
           placeholder: "请选择学时官方推送状态",
           scope: "select",
           noClear: false,
-          diff:"gfxs",
+          diff: "gfxs",
           options: [
             {
               label: "学时官方推送状态",
@@ -97,7 +196,7 @@ export default {
             },
             {
               label: "否",
-              value: 2,
+              value: 0,
             },
           ],
         },
@@ -108,9 +207,10 @@ export default {
       ],
       formData: {
         status: 1,
-        changeGrade:0,
+        changeGrade: 0,
         pageSize: 10,
         pageNum: 1,
+        userPhoto: 1,
       },
       // 表单
       tableSet: [
@@ -136,8 +236,17 @@ export default {
         },
         {
           label: "一寸头像照",
-          prop: "classHours",
+          prop: "oneInchPhotos",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+        {
+          label: "身份证正面照",
+          prop: "idCardImg1",
           hidden: true,
+          scope: "img",
+          width: "120px",
         },
         {
           label: "商品名称",
@@ -165,8 +274,8 @@ export default {
         },
         {
           label: "班级有效期",
-          prop1: "studyStartTime",
-          prop2: "studyEndTime",
+          prop1: "classStartTime",
+          prop2: "classEndTime",
           scope: "TimeLists",
           width: "220px",
           Diszing: false,
@@ -176,23 +285,39 @@ export default {
           label: "学习状态",
           prop: "periodStatus",
           hidden: true,
-          scope:"isOptions",
-          options:[{
-            label:"已完成",
-            value:0 || 1 || 2
-          },{
-            label:"未完成",
-            value:-1
-          }]
+          scope: "isOptions",
+          options: [
+            {
+              label: "已完成",
+              value: 0 || 1 || 2,
+            },
+            {
+              label: "未完成",
+              value: -1,
+            },
+          ],
         },
         {
           label: "学时官方推送状态",
-          prop: "createTime",
+          prop: "learnStatus",
           hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "否",
+              value: 0,
+            },
+            {
+              label: "是",
+              value: 1,
+            },
+          ],
         },
       ],
       tableData: [], //表单数据
       total: 0, //一共多少条
+      vidBox: false,
+      vidBoxHours: false,
     };
   },
   mounted() {
@@ -202,6 +327,85 @@ export default {
     this.search();
   },
   methods: {
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    exputs() {
+      var data = this.$refs.exportTable.formData;
+      if (!data.businessid) {
+        this.$message.warning("请选择业务层次");
+        return;
+      }
+      if (
+        data.studyStatus === 2 &&
+        data.officialStatus !== 0 &&
+        data.officialStatus !== 1
+      ) {
+        this.$message.warning("请选择学时官方推送状态");
+        return;
+      }
+      this.disabledBtn = true;
+      this.$api
+        .inquireGradegradeListexport({
+          businessId: data.businessid,
+          studyStatus: data.studyStatus,
+          businessName:data.businessName,
+          officialStatus:
+            data.studyStatus === 2 ? data.officialStatus : undefined,
+        })
+        .then((res) => {
+          let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+          let link = document.createElement("a");
+          document.body.appendChild(link);
+          let fileName = "导出数据" + ".xlsx";
+          link.dowmload = fileName;
+          link.href = url;
+          link.click();
+          link.remove();
+          this.$message.success("批量导出成功");
+          this.dialogDR = false;
+        })
+        .finally(() => {
+          this.disabledBtn = false;
+        });
+    },
+    moreActive() {
+      this.dialogDR = true;
+    },
+    /**
+     *
+     * @param {obj} int
+     * @remard 学习记录
+     */
+    activeHoursRecord(options) {
+      this.objs = {
+        gradeId: options.gradeId,
+        userId: options.userId,
+        goodsId: options.goodsId,
+        className: options.className,
+        classHours: options.classHours,
+        studyStartTime: options.studyStartTime,
+        studyEndTime: options.studyEndTime,
+      };
+      this.vidBoxHours = true;
+    },
+    /**
+     *
+     * @param {obj} int
+     * @remard 学时记录
+     */
+    activeStudyRecord(options) {
+      this.objs = {
+        gradeId: options.gradeId,
+        userId: options.userId,
+        goodsId: options.goodsId,
+        className: options.className,
+        classHours: options.classHours,
+        studyStartTime: options.studyStartTime,
+        studyEndTime: options.studyEndTime,
+      };
+      this.vidBox = true;
+    },
     search(int) {
       this.loading = true;
       if (int === 1) {
@@ -209,10 +413,11 @@ export default {
       }
       if (int === 2) {
         this.formData = {
-          changeGrade:0,
+          changeGrade: 0,
           status: 1,
           pageSize: 10,
           pageNum: 1,
+          userPhoto: 1,
         };
       }
       if (int === 3) {

+ 1281 - 0
src/views/education/classManageMent/learningHoursRecordList/studyTimesRecord.vue

@@ -0,0 +1,1281 @@
+<template>
+  <div id="classHoursReview">
+    <div style="margin-bottom: 10px">
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「1」</strong>所在班级:{{
+          objs.className
+        }}</span
+      >
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「2」</strong>学时:{{
+          objs.classHours
+        }}</span
+      >
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「3」</strong>完成{{
+          userData.stuAllNum + userData.recordNum
+        }}节的内容学习</span
+      >
+      <span style="margin-left: 10px"
+        ><strong style="color: red">「4」</strong>学习时间:{{
+          $methodsTools.onlyForma(objs.studyStartTime, false)
+        }}
+        - {{ $methodsTools.onlyForma(objs.studyEndTime, false) }}</span
+      >
+    </div>
+    <div class="dis_fs">
+      <ul class="ul_ls">
+        <li>学员编码:{{ userData.studentCode }}</li>
+        <li>学员姓名:{{ userData.realName }}</li>
+        <li>学员身份证号码:{{ userData.idCard }}</li>
+        <li>绑定手机号码:{{ userData.telPhone }}</li>
+      </ul>
+      <div class="photoSty1">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(recent_photos)"
+          :preview-src-list="[$methodsTools.splitImgHost(recent_photos)]"
+        >
+        </el-image>
+        <div class="pos_bottom">一寸头像图</div>
+      </div>
+      <div class="photoSty2">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(idcard_face_photo)"
+          :preview-src-list="[$methodsTools.splitImgHost(idcard_face_photo)]"
+        >
+        </el-image>
+        <div class="pos_bottom">身份证正面照片</div>
+      </div>
+      <div class="photoSty2" style="margin-right: 0px">
+        <el-image
+          style="width: 100%; height: 100%"
+          :src="$methodsTools.splitImgHost(idcard_national_photo)"
+          :preview-src-list="[
+            $methodsTools.splitImgHost(idcard_national_photo),
+          ]"
+        >
+        </el-image>
+        <div class="pos_bottom">身份证背面照片</div>
+      </div>
+    </div>
+    <div class="dis_fls">
+      <div class="s_sd">
+        <div class="dis_colu">
+          <div class="jdNumSty" style="margin-bottom: 4px">
+            视频学习进度:{{ userData.stuAllNum }}/{{ userData.secAllNum }}
+            {{
+              userData.stuAllNum == 0 && userData.secAllNum == 0
+                ? "0"
+                : ((userData.stuAllNum / userData.secAllNum) * 100).toFixed(2)
+            }}% 通过:{{ userData.pass }}节
+            <span style="color: #f56c6c">作弊:{{ userData.cheat }}节</span>
+            <span style="color: #409eff"> 待审:{{ userData.pending }}节</span>
+          </div>
+          <div class="jdNumSty">
+            做题学习进度:{{ userData.recordNum }}/{{ userData.examNum }}
+            {{
+              userData.recordNum == 0 && userData.examNum == 0
+                ? "0"
+                : ((userData.recordNum / userData.examNum) * 100).toFixed(2)
+            }}% 通过:{{ userData.examPass }}节
+            <span style="color: #f56c6c">作弊:{{ userData.examCheat }}节</span>
+            <span style="color: #409eff">
+              待审:{{ userData.examPending }}节</span
+            >
+          </div>
+        </div>
+        <div class="shbtns">
+          学时审批状态:{{
+            userData.allStatus === 1
+              ? "未通过"
+              : userData.allStatus === 0
+              ? "待审核"
+              : userData.allStatus === -1
+              ? "不可审核"
+              : userData.allStatus === 2
+              ? "通过审核"
+              : "未知状态,请联系管理员"
+          }}
+        </div>
+      </div>
+      <div class="s_sd">
+        <div
+          class="btnStys"
+          @click="getChangeStatus(1)"
+          v-if="userData.allStatus === 0 || userData.allStatus === 1"
+        >
+          待审核全部通过
+        </div>
+        <div
+          class="btnStys"
+          @click="getChangeStatus(2)"
+          v-if="userData.allStatus === 0 || userData.allStatus === 1"
+        >
+          待审核全部作弊
+        </div>
+      </div>
+    </div>
+    <template v-for="(asrt, insrt) in 3">
+      <el-table
+        border
+        v-loading="loading"
+        :key="insrt"
+        :data="
+          listData[
+            insrt === 0
+              ? 'tableData1'
+              : insrt === 1
+              ? 'tableData2'
+              : insrt === 2
+              ? 'tableData3'
+              : ''
+          ]
+        "
+        style="width: 100%"
+        :default-expand-all="false"
+        :header-cell-style="
+          insrt === 0
+            ? {
+                'background-color': 'skyblue',
+                padding: '8px',
+                color: '#333',
+              }
+            : insrt === 1
+            ? {
+                'background-color': 'rgb(255,255,204)',
+                padding: '8px',
+                color: '#333',
+              }
+            : insrt === 2
+            ? {
+                'background-color': '#eee',
+                padding: '8px',
+                color: '#333',
+              }
+            : ''
+        "
+      >
+        <!-- 插槽开始--------------------------------------------------------- -->
+        <el-table-column
+          :label="
+            insrt === 0
+              ? '模块'
+              : insrt === 1
+              ? '章'
+              : insrt === 2
+              ? '节/卷'
+              : ''
+          "
+          type="expand"
+          width="70px"
+        >
+          <template slot-scope="scope">
+            <!-- type为3时使用该插槽START -->
+            <div
+              v-if="scope.row.type === 3 || scope.row.type === 4"
+              class="dis_flexs"
+            >
+              <ul
+                style="flex: 1"
+                v-if="
+                  scope.row.userStudyRecordPhotoList &&
+                  scope.row.userStudyRecordPhotoList.length
+                "
+              >
+                <li
+                  v-for="(its, inds) in scope.row.userStudyRecordPhotoList"
+                  :key="inds"
+                  class="liImgs"
+                >
+                  <el-image
+                    style="width: 100%; height: 100%"
+                    :src="$methodsTools.splitImgHost(its.photo)"
+                    :preview-src-list="[$methodsTools.splitImgHost(its.photo)]"
+                  >
+                  </el-image>
+                  <div class="abos">
+                    {{ $methodsTools.onlyForma(its.createTime) }}
+                  </div>
+                </li>
+                <div style="clear: both"></div>
+              </ul>
+              <p v-else style="text-align: center; width: 100%">暂无拍照数据</p>
+              <div
+                class="styFlex"
+                v-if="
+                  (userData.allStatus === 0 || userData.allStatus === 1) &&
+                  scope.row.periodStatus === 1
+                "
+              >
+                <el-button
+                  :disabled="scope.row.status === 1"
+                  class="btnstyles"
+                  size="mini"
+                  @click="changeStatus(scope.row, 1, scope.$index)"
+                  >通过</el-button
+                >
+                <el-button
+                  :disabled="scope.row.status === 0"
+                  class="btnstyles"
+                  size="mini"
+                  @click="
+                    scope.row.status === 2 || scope.row.status === 3
+                      ? changeStatus(scope.row, 2, scope.$index)
+                      : ''
+                  "
+                  >作弊</el-button
+                >
+              </div>
+              <!-- <div
+                class="styFlex"
+                v-if="
+                  (scope.row.allStatus === 0 || scope.row.allStatus === 1) &&
+                  scope.row.periodStatus === 1 &&
+                  scope.row.status === 0
+                "
+              >
+                <el-button
+                  class="btnstyles"
+                  size="mini"
+                  @click="changeStatus(scope.row, 1, scope.$index)"
+                  >通过</el-button
+                >
+              </div> -->
+            </div>
+            <!-- type为3时使用该插槽END -->
+            <!-- 章表格START -->
+            <el-table
+              v-else
+              border
+              :data="
+                scope.row.type === 1
+                  ? scope.row.classPeriods
+                  : scope.row.type === 2
+                  ? scope.row.classPeriodSectionList
+                  : ''
+              "
+              style="width: 100%"
+              :default-expand-all="false"
+              :header-cell-style="
+                scope.row.type === 1
+                  ? {
+                      'background-color': 'rgb(255,255,204)',
+                      padding: '8px',
+                      color: '#333',
+                    }
+                  : scope.row.type === 2
+                  ? {
+                      'background-color': '#eee',
+                      padding: '8px',
+                      color: '#333',
+                    }
+                  : ''
+              "
+            >
+              <!-- 章插槽START -->
+              <el-table-column
+                type="expand"
+                :label="
+                  scope.row.type === 1
+                    ? '章'
+                    : scope.row.type === 2
+                    ? '节/卷'
+                    : ''
+                "
+                :width="
+                  scope.row.type === 1
+                    ? '70px'
+                    : scope.row.type === 2
+                    ? '80px'
+                    : ''
+                "
+              >
+                <template slot-scope="scope2">
+                  <!-- 节插槽START -->
+                  <div
+                    v-if="scope2.row.type === 3 || scope2.row.type === 4"
+                    class="dis_flexs"
+                  >
+                    <ul
+                      style="flex: 1"
+                      v-if="
+                        scope2.row.userStudyRecordPhotoList &&
+                        scope2.row.userStudyRecordPhotoList.length
+                      "
+                    >
+                      <li
+                        v-for="(its, inds) in scope2.row
+                          .userStudyRecordPhotoList"
+                        :key="inds"
+                        class="liImgs"
+                      >
+                        <el-image
+                          style="width: 100%; height: 100%"
+                          :src="$methodsTools.splitImgHost(its.photo)"
+                          :preview-src-list="[
+                            $methodsTools.splitImgHost(its.photo),
+                          ]"
+                        >
+                        </el-image>
+                        <div class="abos">
+                          {{ $methodsTools.onlyForma(its.createTime) }}
+                        </div>
+                      </li>
+                      <div style="clear: both"></div>
+                    </ul>
+                    <p v-else style="text-align: center; width: 100%">
+                      暂无拍照数据
+                    </p>
+                    <div
+                      class="styFlex"
+                      v-if="
+                        (userData.allStatus === 0 ||
+                          userData.allStatus === 1) &&
+                        scope2.row.periodStatus === 1
+                      "
+                    >
+                      <el-button
+                        :disabled="scope2.row.status === 1"
+                        class="btnstyles"
+                        size="mini"
+                        @click="
+                          changeStatusCharpter(
+                            scope2.row,
+                            1,
+                            scope.$index,
+                            scope2.$index
+                          )
+                        "
+                        >通过</el-button
+                      >
+                      <el-button
+                        :disabled="scope2.row.status === 0"
+                        class="btnstyles"
+                        size="mini"
+                        @click="
+                          scope2.row.status === 2 || scope2.row.status === 3
+                            ? changeStatusCharpter(
+                                scope2.row,
+                                2,
+                                scope.$index,
+                                scope2.$index
+                              )
+                            : ''
+                        "
+                        >作弊</el-button
+                      >
+                    </div>
+                    <!-- <div
+                      class="styFlex"
+                      v-if="
+                        (scope2.row.allStatus === 0 ||
+                          scope2.row.allStatus === 1) &&
+                        scope2.row.periodStatus === 1 &&
+                        scope2.row.status === 0
+                      "
+                    >
+                      <el-button
+                        class="btnstyles"
+                        size="mini"
+                        @click="
+                          changeStatusCharpter(
+                            scope2.row,
+                            1,
+                            scope.$index,
+                            scope2.$index
+                          )
+                        "
+                        >通过</el-button
+                      >
+                    </div> -->
+                  </div>
+                  <!-- 节插槽END -->
+                  <!-- 节表格START -->
+                  <el-table
+                    v-else
+                    border
+                    :data="
+                      scope2.row.type === 2
+                        ? scope2.row.classPeriodSectionList
+                        : ''
+                    "
+                    style="width: 100%"
+                    :default-expand-all="false"
+                    :header-cell-style="
+                      scope2.row.type === 2
+                        ? {
+                            'background-color': '#eee',
+                            padding: '8px',
+                            color: '#333',
+                          }
+                        : ''
+                    "
+                  >
+                    <!-- 节插槽START -->
+                    <el-table-column
+                      type="expand"
+                      :label="scope2.row.type === 2 ? '节/卷' : ''"
+                      width="80px"
+                    >
+                      <template slot-scope="scope3">
+                        <div
+                          v-if="scope3.row.type === 3 || scope3.row.type === 4"
+                          class="dis_flexs"
+                        >
+                          <ul
+                            style="flex: 1"
+                            v-if="
+                              scope3.row.userStudyRecordPhotoList &&
+                              scope3.row.userStudyRecordPhotoList.length
+                            "
+                          >
+                            <li
+                              v-for="(its, inds) in scope3.row
+                                .userStudyRecordPhotoList"
+                              :key="inds"
+                              class="liImgs"
+                            >
+                              <el-image
+                                style="width: 100%; height: 100%"
+                                :src="$methodsTools.splitImgHost(its.photo)"
+                                :preview-src-list="[
+                                  $methodsTools.splitImgHost(its.photo),
+                                ]"
+                              >
+                              </el-image>
+                              <div class="abos">
+                                {{ $methodsTools.onlyForma(its.createTime) }}
+                              </div>
+                            </li>
+                            <div style="clear: both"></div>
+                          </ul>
+                          <p v-else style="text-align: center; width: 100%">
+                            暂无拍照数据
+                          </p>
+                          <div
+                            class="styFlex"
+                            v-if="
+                              (userData.allStatus === 0 ||
+                                userData.allStatus === 1) &&
+                              scope3.row.periodStatus === 1
+                            "
+                          >
+                            <el-button
+                              :disabled="scope3.row.status === 1"
+                              class="btnstyles"
+                              size="mini"
+                              @click="
+                                changeStatusModule(
+                                  scope3.row,
+                                  1,
+                                  scope.$index,
+                                  scope2.$index,
+                                  scope3.$index
+                                )
+                              "
+                              >通过</el-button
+                            >
+                            <el-button
+                              :disabled="scope3.row.status === 0"
+                              class="btnstyles"
+                              size="mini"
+                              @click="
+                                scope3.row.status === 2 ||
+                                scope3.row.status === 3
+                                  ? changeStatusModule(
+                                      scope3.row,
+                                      2,
+                                      scope.$index,
+                                      scope2.$index,
+                                      scope3.$index
+                                    )
+                                  : ''
+                              "
+                              >作弊</el-button
+                            >
+                          </div>
+                          <!-- <div
+                            class="styFlex"
+                            v-if="
+                              (scope3.row.allStatus === 0 ||
+                                scope3.row.allStatus === 1) &&
+                              scope3.row.periodStatus === 1 &&
+                              scope3.row.status === 0
+                            "
+                          >
+                            <el-button
+                              class="btnstyles"
+                              size="mini"
+                              @click="
+                                changeStatusModule(
+                                  scope3.row,
+                                  1,
+                                  scope.$index,
+                                  scope2.$index,
+                                  scope3.$index
+                                )
+                              "
+                              >通过</el-button
+                            >
+                          </div> -->
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <!-- 节插槽END -->
+                    <template
+                      v-for="(item, index) in scope2.row.type === 2
+                        ? tableSet3
+                        : ''"
+                    >
+                      <el-table-column
+                        :width="item.width"
+                        :key="index"
+                        :label="item.label"
+                        align="center"
+                      >
+                        <template slot-scope="scope3">
+                          <span v-if="item.scope === 'select'">
+                            <span v-for="(k, ds) in item.options" :key="ds">
+                              {{
+                                k.value == scope3.row[item.prop] ? k.label : ""
+                              }}
+                            </span>
+                          </span>
+                          <div v-else-if="item.scope === 'activeNum'">
+                            <el-select
+                              v-model="scope3.row[item.prop]"
+                              placeholder="请选择"
+                              @change="
+                                getNewListMores(
+                                  scope.$index,
+                                  scope2.$index,
+                                  scope3.$index,
+                                  $event,
+                                  scope3.row
+                                )
+                              "
+                            >
+                              <el-option
+                                v-for="(items, indexs) in scope3.row['numList']"
+                                :key="indexs"
+                                :label="'第' + items + '次审核记录'"
+                                :value="items"
+                              >
+                              </el-option>
+                            </el-select>
+                          </div>
+                          <span v-else-if="item.scope === 'typeOptions'">
+                            <span v-for="(is, ds) in item.options" :key="ds">
+                              <span v-if="is.value === scope3.row[item.prop]">{{
+                                is.label
+                              }}</span>
+                            </span>
+                          </span>
+                          <span v-else-if="item.scope === 'aTime'">
+                            {{ $methodsTools.onlyForma(scope3.row[item.prop]) }}
+                          </span>
+                          <div v-else-if="item.scope === 'aTimeSE'">
+                            <span
+                              v-if="
+                                scope3.row['type'] === 3 &&
+                                scope3.row['durationTime'] &&
+                                scope3.row['studyStartTime'] &&
+                                scope3.row['studyEndTime']
+                              "
+                              :style="comput(scope3.row)"
+                            >
+                              {{
+                                $methodsTools.onlyForma(scope3.row[item.prop])
+                              }}
+                            </span>
+                            <span v-else>
+                              {{
+                                $methodsTools.onlyForma(scope3.row[item.prop])
+                              }}
+                            </span>
+                          </div>
+                          <span v-else-if="item.scope === 'durTime'">
+                            {{
+                              $methodsTools.secondToDate(
+                                scope3.row[item.prop],
+                                false
+                              )
+                            }}
+                          </span>
+                          <span v-else> {{ scope3.row[item.prop] }} </span>
+                        </template>
+                      </el-table-column>
+                    </template>
+                  </el-table>
+                  <!-- 节表格END -->
+                </template>
+              </el-table-column>
+              <!-- 章插槽END -->
+              <template
+                v-for="(item, index) in scope.row.type === 1
+                  ? tableSet2
+                  : scope.row.type === 2
+                  ? tableSet3
+                  : ''"
+              >
+                <el-table-column
+                  :width="item.width"
+                  :key="index"
+                  :label="item.label"
+                  align="center"
+                >
+                  <template slot-scope="scope2">
+                    <span v-if="item.scope === 'select'">
+                      <span v-for="(k, ds) in item.options" :key="ds">
+                        {{ k.value == scope2.row[item.prop] ? k.label : "" }}
+                      </span>
+                    </span>
+                    <div v-else-if="item.scope === 'activeNum'">
+                      <el-select
+                        v-model="scope2.row[item.prop]"
+                        placeholder="请选择"
+                        @change="
+                          getNewListchapt(
+                            scope.$index,
+                            scope2.$index,
+                            $event,
+                            scope2.row
+                          )
+                        "
+                      >
+                        <el-option
+                          v-for="(items, indexs) in scope2.row['numList']"
+                          :key="indexs"
+                          :label="'第' + items + '次审核记录'"
+                          :value="items"
+                        >
+                        </el-option>
+                      </el-select>
+                    </div>
+                    <span v-else-if="item.scope === 'typeOptions'">
+                      <span v-for="(is, ds) in item.options" :key="ds">
+                        <span v-if="is.value === scope2.row[item.prop]">{{
+                          is.label
+                        }}</span>
+                      </span>
+                    </span>
+                    <span v-else-if="item.scope === 'aTime'">
+                      {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
+                    </span>
+                    <span v-else-if="item.scope === 'durTime'">
+                      {{
+                        $methodsTools.secondToDate(scope2.row[item.prop], false)
+                      }}
+                    </span>
+                    <div v-else-if="item.scope === 'aTimeSE'">
+                      <span
+                        v-if="
+                          scope2.row['type'] === 3 &&
+                          scope2.row['durationTime'] &&
+                          scope2.row['studyStartTime'] &&
+                          scope2.row['studyEndTime']
+                        "
+                        :style="comput(scope2.row)"
+                      >
+                        {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
+                      </span>
+                      <span v-else>
+                        {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
+                      </span>
+                    </div>
+                    <span v-else> {{ scope2.row[item.prop] }} </span>
+                  </template>
+                </el-table-column>
+              </template>
+            </el-table>
+            <!-- 章表格END -->
+          </template>
+        </el-table-column>
+        <!-- 插槽结束--------------------------------------------------------- -->
+        <template
+          v-for="(item, index) in insrt === 0
+            ? tableSet1
+            : insrt === 1
+            ? tableSet2
+            : insrt === 2
+            ? tableSet3
+            : ''"
+        >
+          <el-table-column
+            :width="item.width"
+            :key="index"
+            :label="item.label"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <span v-if="item.scope === 'select'">
+                <span v-for="(k, ds) in item.options" :key="ds">
+                  {{ k.value == scope.row[item.prop] ? k.label : "" }}
+                </span>
+              </span>
+              <div v-else-if="item.scope === 'activeNum'">
+                <el-select
+                  v-model="scope.row[item.prop]"
+                  placeholder="请选择"
+                  @change="getNewList(scope.$index, $event, scope.row)"
+                >
+                  <el-option
+                    v-for="(items, indexs) in scope.row['numList']"
+                    :key="indexs"
+                    :label="'第' + items + '次审核记录'"
+                    :value="items"
+                  >
+                  </el-option>
+                </el-select>
+              </div>
+              <span v-else-if="item.scope === 'typeOptions'">
+                <span v-for="(is, ds) in item.options" :key="ds">
+                  <span v-if="is.value === scope.row[item.prop]">{{
+                    is.label
+                  }}</span>
+                </span>
+              </span>
+              <span v-else-if="item.scope === 'aTime'">
+                {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
+              </span>
+              <span v-else-if="item.scope === 'durTime'">
+                {{ $methodsTools.secondToDate(scope.row[item.prop], false) }}
+              </span>
+              <div v-else-if="item.scope === 'aTimeSE'">
+                <span
+                  v-if="
+                    scope.row['type'] === 3 &&
+                    scope.row['durationTime'] &&
+                    scope.row['studyStartTime'] &&
+                    scope.row['studyEndTime']
+                  "
+                  :style="comput(scope.row)"
+                >
+                  {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
+                </span>
+                <span v-else>
+                  {{ $methodsTools.onlyForma(scope.row[item.prop]) }}
+                </span>
+              </div>
+              <span v-else>
+                {{ scope.row[item.prop] }}{{ item.ch ? item.ch : "" }}
+              </span>
+            </template>
+          </el-table-column>
+        </template>
+      </el-table>
+    </template>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    objs: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      size: "medium",
+      active: "",
+      loading: false,
+      studentCode: "",
+      realName: "",
+      idCard: "",
+      telPhone: "",
+      recent_photos: "",
+      idcard_face_photo: "",
+      idcard_national_photo: "",
+      arr: ["tableData1", "tableData2", "tableData3"],
+      listData: {
+        tableData1: [],
+        tableData2: [],
+        tableData3: [],
+      },
+      userData: {},
+      tableData: [],
+      tableSet1: [
+        {
+          label: "姓名",
+          prop: "realName",
+        },
+        {
+          label: "模块标题",
+          prop: "typeName",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+        },
+      ],
+      tableSet2: [
+        {
+          label: "姓名",
+          prop: "realName",
+        },
+        {
+          label: "章标题",
+          prop: "typeName",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+        },
+        {
+          label: "开始学习时间",
+          prop: "studyStartTime",
+          scope: "aTime",
+        },
+        {
+          label: "结束学习时间",
+          prop: "studyEndTime",
+          scope: "aTime",
+        },
+        {
+          label: "测试成绩",
+          prop: "performance",
+        },
+      ],
+      tableSet3: [
+        {
+          label: "选择",
+          prop: "numIndex",
+          scope: "activeNum",
+          width: "180px",
+        },
+        {
+          label: "姓名",
+          prop: "realName",
+        },
+        {
+          label: "标题",
+          prop: "typeName",
+          width:"240px"
+        },
+        {
+          label: "类型",
+          prop: "type",
+          scope: "typeOptions",
+          options: [
+            {
+              label: "节",
+              value: 3,
+            },
+            {
+              label: "试卷",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "节时长",
+          prop: "durationTime",
+          width: "180px",
+          scope: "durTime",
+        },
+        {
+          label: "开始时间",
+          prop: "studyStartTime",
+          scope: "aTimeSE",
+        },
+        {
+          label: "结束时间",
+          prop: "studyEndTime",
+          scope: "aTimeSE",
+        },
+        {
+          label: "审核状态",
+          prop: "status",
+          scope: "select",
+          options: [
+            {
+              label: "待审核",
+              value: 2,
+            },
+            {
+              label: "通过",
+              value: 1,
+            },
+            {
+              label: "作弊",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "审核人",
+          prop: "auditUserName",
+        },
+        {
+          label: "审核时间",
+          prop: "auditTime",
+          scope: "aTime",
+        },
+      ],
+      tableDataChild: {},
+      tableSetChild: [],
+    };
+  },
+  mounted() {
+    this.getUserInfo();
+    this.search();
+  },
+  methods: {
+    comput(item) {
+      var ast = item.studyEndTime - item.studyStartTime;
+      if (ast < item.durationTime) {
+        return "color:red;";
+      } else {
+        return "";
+      }
+    },
+    /**
+     * 通过 作弊 periodId
+     */
+    changeStatus(item, int, index) {
+      var data = {
+        id: item.periodStatusId,
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriode(data).then((res) => {
+        this.$message.success("修改成功");
+        this.getNewList(index, item.numIndex, item);
+      });
+    },
+    changeStatusCharpter(item, int, index1, index2) {
+      var data = {
+        id: item.periodStatusId,
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriode(data).then((res) => {
+        this.$message.success("修改成功");
+        this.getNewListchapt(index1, index2, item.numIndex, item);
+      });
+    },
+    changeStatusModule(item, int, index1, index2, index3) {
+      var data = {
+        id: item.periodStatusId,
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriode(data).then((res) => {
+        this.$message.success("修改成功");
+        this.getNewListMores(index1, index2, index3, item.numIndex, item);
+      });
+    },
+    //批量审批
+    getChangeStatus(int) {
+      var data = {
+        gradeId: Number(this.objs.id),
+        userId: Number(this.objs.userId),
+        goodsId: Number(this.objs.goodsId),
+      };
+      if (int === 1) {
+        data.status = 1;
+      }
+      if (int === 2) {
+        data.status = 0;
+      }
+      this.$api.editGradeUsereditPeriodeAll(data).then((res) => {
+        if (int === 1) {
+          this.$message.success("状态全部通过修改成功");
+        }
+        if (int === 2) {
+          this.$message.success("状态全部作弊修改成功");
+        }
+        this.getUserInfo();
+        this.search();
+      });
+    },
+    //节
+    getNewList(index, int, item) {
+      let data = {
+        courseId: item.courseId,
+        moduleId: item.moduleId,
+        chapterId: item.chapterId,
+        numIndex: int,
+        userId: this.objs.userId,
+        goodsId: this.objs.goodsId,
+        gradeId: this.objs.id,
+      };
+      if (item.type === 3) {
+        data.sectionId = item.id;
+      }
+      if (item.type === 4) {
+        data.examId = item.id;
+      }
+      this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
+        this.$set(this.listData.tableData3, index, res.data);
+        this.getUserInfo();
+      });
+    },
+    //章 节
+    getNewListchapt(a, b, int, item) {
+      let data = {
+        courseId: item.courseId,
+        moduleId: item.moduleId,
+        chapterId: item.chapterId,
+        numIndex: int,
+        userId: this.objs.userId,
+        goodsId: this.objs.goodsId,
+        gradeId: this.objs.id,
+      };
+      if (item.type === 3) {
+        data.sectionId = item.id;
+      }
+      if (item.type === 4) {
+        data.examId = item.id;
+      }
+      this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
+        this.$set(
+          this.listData.tableData2[a].classPeriodSectionList,
+          b,
+          res.data
+        );
+        this.getUserInfo();
+      });
+    },
+    //模块 章 节
+    getNewListMores(a, b, c, int, item) {
+      let data = {
+        courseId: item.courseId,
+        moduleId: item.moduleId,
+        chapterId: item.chapterId,
+        numIndex: int,
+        userId: this.objs.userId,
+        goodsId: this.objs.goodsId,
+        gradeId: this.objs.id,
+      };
+      if (item.type === 3) {
+        data.sectionId = item.id;
+      }
+      if (item.type === 4) {
+        data.examId = item.id;
+      }
+      this.$api.inquireGradegradelistPeriodAuditStatus(data).then((res) => {
+        this.$set(
+          this.listData.tableData1[a].classPeriods[b].classPeriodSectionList,
+          c,
+          res.data
+        );
+        this.getUserInfo();
+      });
+    },
+    //获取用户信息
+    getUserInfo() {
+      this.$api
+        .inquireGradegradelistUserlistPeriod({
+          gradeId: this.objs.id,
+          userId: this.objs.userId,
+          goodsId: this.objs.goodsId,
+        })
+        .then((res) => {
+          if (res.rows[0].keyValue) {
+            var data = JSON.parse(res.rows[0].keyValue);
+            this.recent_photos = data.recent_photos.value;
+            this.idcard_face_photo = data.idcard_face_photo.value;
+            this.idcard_national_photo = data.idcard_national_photo.value;
+            this.realName = data.name.value;
+            this.idCard = data.idcard.value;
+            this.telPhone = data.telphone.value;
+          }
+          this.userData = res.rows[0];
+        });
+    },
+    search() {
+      let data = {
+        gradeId: this.objs.id,
+        userId: this.objs.userId,
+        goodsId: this.objs.goodsId,
+      };
+      this.loading = true;
+      this.$api
+        .inquireGradegradelistPeriodAudit(data)
+        .then((res) => {
+          let tab1 = [];
+          let tab2 = [];
+          let tab3 = [];
+          for (let i = 0; i < res.rows.length; i++) {
+            if (res.rows[i].type === 1) {
+              tab1.push(res.rows[i]);
+            }
+            if (res.rows[i].type === 2) {
+              tab2.push(res.rows[i]);
+            }
+            if (res.rows[i].type === 3) {
+              tab3.push(res.rows[i]);
+            }
+          }
+          this.listData.tableData1 = tab1;
+          this.listData.tableData2 = tab2;
+          this.listData.tableData3 = tab3;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.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;
+  .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);
+  }
+}
+</style>

+ 86 - 47
src/views/education/examManagement/applicationData/asPlanned.vue

@@ -17,20 +17,20 @@
       ref="tableList"
     >
       <template slot="customize">
-        <el-button :size="size" type="success" @click="moreActive(1)"
-          >批量导入</el-button
-        >
         <el-button :size="size" type="warning" @click="moreActive(2)"
-          >批量:取消预约</el-button
+          >取消预约</el-button
+        >
+        <el-button :size="size" type="primary" @click="moreActive(5)"
+          >前培账号标记</el-button
         >
         <el-button :size="size" type="primary" @click="moreActive(3)"
-          >批量:考试登记</el-button
+          >考试登记</el-button
         >
-        <el-button :size="size" type="primary" @click="moreActive(4)"
+        <!-- <el-button :size="size" type="primary" @click="moreActive(4)"
           >批量:成绩证书登记</el-button
-        >
-        <el-button :size="size" type="primary" @click="moreActive(5)"
-          >标记:前培账号已开通</el-button
+        > -->
+        <el-button :size="size" type="success" @click="moreActive(1)"
+          >批量导入</el-button
         >
       </template>
       <template slot="btn" slot-scope="props">
@@ -503,6 +503,12 @@ export default {
           hidden: true,
           width: "130px",
         },
+        {
+          label: "前培标题",
+          prop: "beforeName",
+          hidden: true,
+          width: "130px",
+        },
         {
           label: "学员姓名",
           prop: "realname",
@@ -636,49 +642,54 @@ export default {
       var file = e.target.files[0];
       let formData = new FormData();
       formData.append("file", file);
-      this.$api.editsystemimportDatae(formData).then((res) => {
-        if (res.msg) {
-          let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
-          let link = document.createElement("a");
-          let fileName = "失败原因" + ".xlsx";
-          document.body.appendChild(link);
-          link.href = url;
-          link.dowmload = fileName;
-          link.click();
-          link.remove();
-          self.$message.warning("导出失败,请看失败xlsx原因");
-        } else {
-          self.$message.success("导入成功");
-        }
-        self.search();
-      }).finally(()=>{
-        e.target.value = "";
-      })
+      this.$api
+        .editsystemimportDatae(formData)
+        .then((res) => {
+          if (res.msg) {
+            let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+            let link = document.createElement("a");
+            let fileName = "失败原因" + ".xlsx";
+            document.body.appendChild(link);
+            link.href = url;
+            link.dowmload = fileName;
+            link.click();
+            link.remove();
+            self.$message.warning("导出失败,请看失败xlsx原因");
+          } else {
+            self.$message.success("导入成功");
+          }
+          self.search();
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
     },
     importMobleEdit(e) {
       var self = this;
       var file = e.target.files[0];
       let formData = new FormData();
       formData.append("file", file);
-      this.$api.editsystemimportUpdateData(formData).then((res) => {
-        if (res.msg) {
-          let url =
-            "http://192.168.1.12:5030/common/download?fileName=" + res.msg;
-          let link = document.createElement("a");
-          let fileName = "失败原因" + ".xlsx";
-          document.body.appendChild(link);
-          link.href = url;
-          link.dowmload = fileName;
-          link.click();
-          link.remove();
-          self.$message.warning("导出失败,请看失败xlsx原因");
-        } else {
-          self.$message.success("导入成功");
-        }
-        self.search();
-      }).finally(()=>{
-        e.target.value = "";
-      })
+      this.$api
+        .editsystemimportUpdateData(formData)
+        .then((res) => {
+          if (res.msg) {
+            let url = baseUrls.baseURL + "common/download?fileName=" + res.msg;
+            let link = document.createElement("a");
+            let fileName = "失败原因" + ".xlsx";
+            document.body.appendChild(link);
+            link.href = url;
+            link.dowmload = fileName;
+            link.click();
+            link.remove();
+            self.$message.warning("导出失败,请看失败xlsx原因");
+          } else {
+            self.$message.success("导入成功");
+          }
+          self.search();
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
     },
     openZS(row, int) {
       if (row.examStatus !== 1) {
@@ -726,6 +737,30 @@ export default {
     },
     submitChecksDR() {},
     moreActive(int) {
+      if (int === 1) {
+        this.$router.push({
+          path: "bulkImportPlan",
+        });
+        return;
+      }
+      if (int === 2) {
+        this.$router.push({
+          path: "cancelAppointMent",
+        });
+        return;
+      }
+      if (int === 3) {
+        this.$router.push({
+          path: "examRegistration",
+        });
+        return;
+      }
+      if (int === 5) {
+        this.$router.push({
+          path: "formerAccount",
+        });
+        return;
+      }
       if (int === 1) {
         this.dialogDR = true;
         return;
@@ -735,6 +770,10 @@ export default {
         return;
       }
       if (int === 2) {
+        this.$router.push({
+          path: "cancelAppointMent",
+        });
+        return;
         this.peopleList = JSON.parse(
           JSON.stringify(this.$refs.tableList.allCheckData)
         );
@@ -936,7 +975,7 @@ export default {
       this.$api
         .inquiresystemsubscribelist(this.formData)
         .then((res) => {
-          this.$refs.tableList.allCheckData = []
+          this.$refs.tableList.allCheckData = [];
           this.tableData = res.rows;
           this.total = res.total;
           this.navText.index = res.total;

+ 31 - 0
src/views/education/examManagement/applicationData/bulkImportPlan/index.vue

@@ -0,0 +1,31 @@
+<template>
+  <div id="bulkImportPlan">
+    <el-radio-group v-model="radio" style="margin-bottom: 12px">
+      <el-radio :label="1">批量新增预约</el-radio>
+      <el-radio :label="2">批量考试登记</el-radio>
+    </el-radio-group>
+    <new-yy v-show="radio === 1" />
+    <new-register v-show="radio === 2" />
+  </div>
+</template>
+
+<script>
+import newYY from "./newYY.vue";
+import newRegister from "./newRegister.vue";
+export default {
+  components: {
+    "new-yy": newYY,
+    "new-register": newRegister,
+  },
+  name: "BulkImportPlan",
+  data() {
+    return {
+      radio: 1,
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+</style>

+ 429 - 0
src/views/education/examManagement/applicationData/bulkImportPlan/newRegister.vue

@@ -0,0 +1,429 @@
+<template>
+  <div id="newRegister">
+    <div style="margin-bottom: 12px">
+      <span style="font-size: 14px">第一步:</span>
+      <el-select
+        :style="marSty"
+        :size="size"
+        filterable 
+        v-model="formData.applyId"
+        placeholder="请选择考试计划(必填)"
+      >
+        <el-option
+          v-for="item in examList"
+          :key="item.applyId"
+          :label="item.applyName"
+          :value="item.applyId"
+        >
+        </el-option>
+      </el-select>
+      <el-select
+        :style="marSty"
+        :size="size"
+        filterable 
+        v-model="formData.applySiteAddress"
+        placeholder="请选择考试地点(必填)"
+      >
+        <el-option
+          v-for="item in applySiteAddress"
+          :key="item.siteId"
+          :label="item.siteAddress"
+          :value="item.siteAddress"
+        >
+        </el-option>
+      </el-select>
+      <el-button :size="size" type="info" @click="advanced">选择学员</el-button>
+      <el-input
+        v-if="formData.idCards"
+        type="textarea"
+        :size="size"
+        readonly
+        :rows="1"
+        style="width: 180px; vertical-align: top; margin: 0px 10px"
+        placeholder="请点击选择学员按钮上传学员名单"
+        v-model="formData.idCards"
+      >
+      </el-input>
+      <el-button :size="size" type="warning" @click="downModel"
+        >下载模板</el-button
+      >
+    </div>
+    <div style="margin-bottom: 12px">
+      <span style="font-size: 14px">第二步:</span>
+      <el-button type="success" :size="size">批量导入</el-button>
+    </div>
+    <div>
+      <el-button
+        :size="size"
+        :type="active === 1 ? 'primary' : ''"
+        @click="active = 1"
+        >成功导入</el-button
+      >
+      <el-button
+        :size="size"
+        :type="active === 2 ? 'primary' : ''"
+        @click="active = 2"
+        >失败导入</el-button
+      >
+    </div>
+    <div v-show="active === 1" class="exportBox">
+      <h4 class="h4Sty">成功导入xxx人</h4>
+      <el-table
+        max-height="600"
+        :data="tableDataSuccess"
+        style="width: 100%"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          color: '#333',
+          fontSize: '14px',
+        }"
+      >
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <span v-if="item.scope === 'test'"></span>
+            <span v-else>{{ scope.row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div v-show="active === 2" class="exportBox">
+      <h4 class="h4Sty">失败导入xxx人</h4>
+      <el-table
+        max-height="600"
+        :data="tableDataError"
+        style="width: 100%"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          color: '#333',
+          fontSize: '14px',
+        }"
+      >
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <span v-if="item.scope === 'test'"></span>
+            <span v-else>{{ scope.row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <el-dialog
+      :visible.sync="dialogPLS"
+      width="660px"
+      :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="dialogPLS = false"
+          />
+        </div>
+      </div>
+      <el-row :gutter="20">
+        <el-col :span="12"
+          ><h4>请输入学员的身份证号码,换行隔开,每行一个</h4>
+          <el-input
+            type="textarea"
+            :rows="10"
+            placeholder="请输入身份证"
+            v-model="idcordList"
+          >
+          </el-input>
+        </el-col>
+        <el-col :span="12">
+          <h4>快捷导入</h4>
+          <el-link type="primary" @click="getDowm">下载模板</el-link>
+          <label
+            for="mobles"
+            class="el-button el-button--primary"
+            style="margin-left: 14px; padding: 10px 20px"
+            >上传学员名单</label
+          ><input
+            style="display: none"
+            type="file"
+            id="mobles"
+            ref="input1"
+            @change="importMobleadd"
+          />
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogPLS = false">取消</el-button>
+        <el-button type="primary" @click="submitChecksPals">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import * as baseUrls from "@/utils/request.js";
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      dialogPLS: false,
+      active: 1,
+      marSty: { marginRight: "10px" },
+      size: "mini",
+      formData: {
+        applyId: "",
+        applySiteAddress: "",
+        idCards: "",
+      },
+      idcordList: "",
+      tableDataSuccess: [
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+      ],
+      tableDataError: [],
+      tableSet: [
+        {
+          label: "学员姓名",
+          prop: "realname",
+        },
+        {
+          label: "学员身份证",
+          prop: "idCord",
+        },
+      ],
+    };
+  },
+  computed: { ...mapGetters(["examList", "applySiteAddress"]) },
+  methods: {
+    advanced() {
+      this.dialogPLS = true;
+      this.idcordList = this.formData.idCards;
+    },
+    submitChecksPals() {
+      this.formData.idCards = this.idcordList;
+      this.dialogPLS = false;
+    },
+    /**
+     * 窗口下载模板
+     */
+    getDowm() {
+      let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20220214.xls";
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    /**
+     * 导入
+     */
+    importMobleadd(e) {
+      var self = this;
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemimportIdsData(formData)
+        .then((res) => {
+          if (!res.data.length) {
+            this.$message.warning("未检测到上传学员数据,请检查上传文件");
+            return;
+          }
+          let idList = res.data.map((item) => {
+            return item.idCard.toString();
+          });
+          if (this.idcordList) {
+            var arr = this.idcordList.split("\n");
+            var arrs = arr.concat(idList);
+            var newArr = arrs.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          } else {
+            var newArr = idList.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          }
+          this.$message.success("上传成功");
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    /**下载模板 */
+    downModel() {
+      if (!this.formData.applyId) {
+        this.$message.warning("请选择考试计划");
+        return;
+      }
+      if (!this.formData.applySiteAddress) {
+        this.$message.warning("请选择考试地点");
+        return;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.idCards) {
+        data.idCards = this.formData.idCards.split("\n");
+      } else {
+        this.$message.warning("请选择学员");
+        return;
+      }
+      const indexs = this.examList.findIndex((item) => {
+        return item.applyId == data.applyId;
+      });
+      data.applyName = this.examList[indexs].applyName;
+      this.$api.inquiresystemsubscribeexportRegister(data).then((res) => {
+        let url = baseUrls.baseURL + "common/download?fileName=" + res.data.msg;
+        let link = document.createElement("a");
+        let fileName = "导入模板" + ".xlsx";
+        document.body.appendChild(link);
+        link.href = url;
+        link.dowmload = fileName;
+        link.click();
+        link.remove();
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.h4Sty {
+  margin: 6px;
+  font-size: 14px;
+}
+.exportBox {
+  border: 1px solid #999;
+  padding: 10px;
+  margin-top: 10px;
+  border-radius: 4px;
+}
+/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>

+ 245 - 0
src/views/education/examManagement/applicationData/bulkImportPlan/newYY.vue

@@ -0,0 +1,245 @@
+<template>
+  <div id="newYY">
+    <div style="margin-bottom: 12px">
+      <span style="font-size: 14px">第一步:</span>
+      <el-select
+        :style="marSty"
+        :size="size"
+        filterable 
+        v-model="formData.applyId"
+        placeholder="请选择考试计划(必填)"
+      >
+        <el-option
+          v-for="item in examList"
+          :key="item.applyId"
+          :label="item.applyName"
+          :value="item.applyId"
+        >
+        </el-option>
+      </el-select>
+      <el-select
+        :style="marSty"
+        :size="size"
+        filterable 
+        v-model="formData.applySiteAddress"
+        placeholder="请选择考试地点(必填)"
+      >
+        <el-option
+          v-for="item in applySiteAddress"
+          :key="item.siteId"
+          :label="item.siteAddress"
+          :value="item.siteAddress"
+        >
+        </el-option>
+      </el-select>
+
+      <el-select
+        :style="marSty"
+        :size="size"
+        clearable
+        filterable 
+        v-model="formData.applySiteAddressTrain"
+        placeholder="请选择考培地点(选填)"
+      >
+        <el-option
+          v-for="item in applySiteAddress"
+          :key="item.siteId"
+          :label="item.siteAddress"
+          :value="item.siteAddress"
+        >
+        </el-option>
+      </el-select>
+      <el-button :size="size" type="warning" @click="downModel"
+        >下载模板</el-button
+      >
+    </div>
+    <div style="margin-bottom: 12px">
+      <span style="font-size: 14px">第二步:</span>
+      <el-button type="success" :size="size">批量导入</el-button>
+    </div>
+    <div>
+      <el-button
+        :size="size"
+        :type="active === 1 ? 'primary' : ''"
+        @click="active = 1"
+        >成功导入</el-button
+      >
+      <el-button
+        :size="size"
+        :type="active === 2 ? 'primary' : ''"
+        @click="active = 2"
+        >失败导入</el-button
+      >
+    </div>
+    <div v-show="active === 1" class="exportBox">
+      <h4 class="h4Sty">成功导入xxx人</h4>
+      <el-table
+        max-height="600"
+        :data="tableDataSuccess"
+        style="width: 100%"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          color: '#333',
+          fontSize: '14px',
+        }"
+      >
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <span v-if="item.scope === 'test'"></span>
+            <span v-else>{{ scope.row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div v-show="active === 2" class="exportBox">
+      <h4 class="h4Sty">失败导入xxx人</h4>
+      <el-table
+        max-height="600"
+        :data="tableDataError"
+        style="width: 100%"
+        border
+        :header-cell-style="{
+          'background-color': '#eee',
+          color: '#333',
+          fontSize: '14px',
+        }"
+      >
+        <el-table-column
+          v-for="(item, index) in tableSet"
+          :key="index"
+          :prop="item.prop"
+          :label="item.label"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <span v-if="item.scope === 'test'"></span>
+            <span v-else>{{ scope.row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import * as baseUrls from "@/utils/request.js";
+import { mapGetters } from "vuex";
+export default {
+  data() {
+    return {
+      active: 1,
+      marSty: { marginRight: "10px" },
+      size: "mini",
+      formData: {
+        applyId: "",
+        applySiteAddress: "",
+        applySiteAddressTrain: "",
+      },
+      tableDataSuccess: [
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+        { realname: "唐", idCord: "445224199901043333" },
+        { realname: "lian", idCord: "445224199901043313" },
+      ],
+      tableDataError: [],
+      tableSet: [
+        {
+          label: "学员姓名",
+          prop: "realname",
+        },
+        {
+          label: "学员身份证",
+          prop: "idCord",
+        },
+      ],
+    };
+  },
+  computed: { ...mapGetters(["examList", "applySiteAddress"]) },
+  methods: {
+    /**下载模板 */
+    downModel() {
+      if (!this.formData.applyId) {
+        this.$message.warning("请选择考试计划");
+        return;
+      }
+      if (!this.formData.applySiteAddress) {
+        this.$message.warning("请选择考试地点");
+        return;
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      const indexs = this.examList.findIndex((item) => {
+        return item.applyId == data.applyId;
+      });
+      data.applyName = this.examList[indexs].applyName;
+      this.$api.inquiresystemsubscribeexportNew(data).then(async (res) => {
+        for (let k in res.data) {
+          if (res.data[k].code === 200) {
+            await this.dowmFunc(res, k);
+          } else {
+            this.$message.error("code值错误:", res.data[k].code);
+          }
+        }
+      });
+    },
+    dowmFunc(res, k) {
+      return new Promise((resolve, reject) => {
+        let url =
+          baseUrls.baseURL + "common/download?fileName=" + res.data[k].msg;
+        let link = document.createElement("a");
+        let fileName = "导入模板" + ".xlsx";
+        document.body.appendChild(link);
+        link.href = url;
+        link.dowmload = fileName;
+        link.click();
+        link.remove();
+        setTimeout(() => {
+          resolve();
+        }, 200);
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.h4Sty {
+  margin: 6px;
+  font-size: 14px;
+}
+.exportBox {
+  border: 1px solid #999;
+  padding: 10px;
+  margin-top: 10px;
+  border-radius: 4px;
+}
+</style>

+ 1 - 8
src/views/education/examManagement/applicationData/byTrainee.vue

@@ -519,7 +519,6 @@ export default {
       formData: {
         pageNum: 1,
         pageSize: 10,
-        empty: 1,
       },
       tabSearchData: {
         userId: "",
@@ -735,12 +734,6 @@ export default {
     };
   },
   mounted() {
-    // this.$api
-    //   .editsystemsubscribe({
-    //     subscribeId: [1,2,3],
-    //     subscribeStatus: 1,
-    //   })
-    //   .then((res) => {});
     this.getStudent();
   },
   activated() {
@@ -1036,7 +1029,7 @@ export default {
       this.acs(2);
     },
     getStudent() {
-      this.$api.inquiregradestudentlistStudent(this.formData).then((res) => {
+      this.$api.inquiresystemsubscribelistUser(this.formData).then((res) => {
         this.total = res.total;
         this.studentList = res.rows;
       });

+ 629 - 0
src/views/education/examManagement/applicationData/cancelAppointMent/index.vue

@@ -0,0 +1,629 @@
+<template>
+  <div id="cancelAppointMent">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :advanced="true"
+      @Advanced="advanced"
+      advancedName="高级输入"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      ref="tableList"
+      rowKey="subscribeId"
+    >
+      <template slot="customize">
+        <el-button :size="size" type="warning" @click="moreActive"
+          >取消预约</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogPLS"
+      width="660px"
+      :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="dialogPLS = false"
+          />
+        </div>
+      </div>
+      <el-row :gutter="20">
+        <el-col :span="12"
+          ><h4>请输入学员的身份证号码,换行隔开,每行一个</h4>
+          <el-input
+            type="textarea"
+            :rows="10"
+            placeholder="请输入身份证"
+            v-model="idcordList"
+          >
+          </el-input>
+        </el-col>
+        <el-col :span="12">
+          <h4>快捷导入</h4>
+          <el-link type="primary" @click="getDowm">下载模板</el-link>
+          <label
+            for="mobles"
+            class="el-button el-button--primary"
+            style="margin-left: 14px; padding: 10px 20px"
+            >上传学员名单</label
+          ><input
+            style="display: none"
+            type="file"
+            id="mobles"
+            ref="input1"
+            @change="importMobleadd"
+          />
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogPLS = false">取消</el-button>
+        <el-button type="primary" @click="submitChecksPals">确定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="dialogDJ"
+      width="560px"
+      :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="dialogDJ = false"
+          />
+        </div>
+      </div>
+      <div>
+        <ul>
+          <li class="liBVS" v-for="(item, index) in peopleList" :key="index">
+            {{ item.realname }}
+            <i
+              v-if="peopleList.length > 1"
+              class="el-icon-error clsw"
+              @click="peopleList.splice(index, 1)"
+            ></i>
+          </li>
+          <div style="clear: both"></div>
+        </ul>
+        <p style="margin: 0px">您确定要取消所选学员的考试预约吗?</p>
+        <p style="margin: 0px">取消后将无法恢复,请慎重考虑!</p>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogDJ = false">取消</el-button>
+        <el-button type="primary" @click="submitChecksDJ">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import * as baseUrls from "@/utils/request.js";
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "CancelAppointMent",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      dialogPLS: false,
+      size: "small",
+      plan: "",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        openCheckMore: true,
+        tableHide: true,
+        border: true,
+        title: "取消预约",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: true,
+        changeWidth: "240px",
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "applyId",
+          placeholder: "考试标题",
+          scope: "examList",
+        },
+        {
+          prop: "applySiteAddress",
+          placeholder: "考试地点",
+          scope: "applySiteAddress",
+          getType: 1,
+        },
+        {
+          prop: "searchKey",
+          placeholder: "请输入学员姓名/学员身份证",
+        },
+        {
+          prop: "idCards",
+          placeholder: "请输入学员身份证",
+          scope: "textarea",
+        },
+      ],
+      formData: {
+        applyId: "",
+        pageSize: 10,
+        pageNum: 1,
+        idCards: "",
+        canCancel: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "预约状态",
+          prop: "subscribeStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "取消",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "前培标记",
+          prop: "beforeStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "已开通",
+              value: 1,
+            },
+          ],
+        },
+        {
+          label: "考试登记",
+          prop: "examStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptionsDZYQ",
+          options: [
+            {
+              label: "待登记",
+              value: 0,
+            },
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "缺考",
+              value: 2,
+            },
+            {
+              label: "作弊",
+              value: 3,
+            },
+            {
+              label: "替考",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "考试成绩和结果",
+          prop1: "performance",
+          prop2: "result",
+          hidden: true,
+          width: "130px",
+          scope: "resultType",
+        },
+        {
+          label: "证书编号",
+          prop: "certificateCode",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "考试标题",
+          prop: "applyName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "前培标题",
+          prop: "beforeName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "学员姓名",
+          prop: "realname",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "学员身份证",
+          prop: "idCard",
+          hidden: true,
+          width: "170px",
+        },
+        {
+          label: "所购商品",
+          prop1: "goodsCode",
+          prop2: "goodsName",
+          prop3: "standPrice",
+          hidden: true,
+          width: "220px",
+          scope: "goodsInfos",
+        },
+        {
+          label: "学员报考类型",
+          prop: "studentType",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "非补考学员",
+              value: 1,
+            },
+            {
+              label: "补考学员",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "所报专业",
+          prop: "categoryName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "预约场次(考试地点和时间)",
+          prop1: "applySiteAddress",
+          prop2: "applySiteExamTime",
+          prop3: "applySiteStartTime",
+          prop4: "applySiteEndTime",
+          hidden: true,
+          width: "280px",
+          scope: "changAdress",
+        },
+        {
+          label: "考试次数消耗",
+          prop: "examExpend",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "预约场次(考培地点和时间)",
+          prop1: "applySiteAddressTrain",
+          prop2: "applySiteExamTrainTime",
+          prop3: "applySiteStartTrainTime",
+          prop4: "applySiteEndTrainTime",
+          hidden: true,
+          width: "280px",
+          scope: "changAdress",
+        },
+        {
+          label: "前培次数消耗",
+          prop: "beforeExpend",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "创建时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+          width: "160px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      idcordList: "",
+      copyAppid: "",
+      dialogDJ: false,
+      listData: {},
+      peopleList: [],
+    };
+  },
+  async mounted() {
+    await this.getFirstOptions();
+    this.search();
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    /**
+     * 下载模板
+     */
+    getDowm() {
+      let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20220214.xls";
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    /**
+     * 导入
+     */
+    importMobleadd(e) {
+      var self = this;
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemimportIdsData(formData)
+        .then((res) => {
+          if (!res.data.length) {
+            this.$message.warning("未检测到上传学员数据,请检查上传文件");
+            return;
+          }
+          let idList = res.data.map((item) => {
+            return item.idCard.toString();
+          });
+          if (this.idcordList) {
+            var arr = this.idcordList.split("\n");
+            var arrs = arr.concat(idList);
+            var newArr = arrs.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          } else {
+            var newArr = idList.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          }
+          this.$message.success("上传成功");
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    getFirstOptions() {
+      return new Promise((resolve, reject) => {
+        this.$api
+          .inquiresystemapplyList({ status: "0,1,2", pageSize: 1, pageNum: 1 })
+          .then((res) => {
+            if (res.rows.length) {
+              this.copyAppid = res.rows[0].applyId;
+              this.formData.applyId = res.rows[0].applyId;
+            }
+            resolve();
+          });
+      });
+    },
+    submitChecksPals() {
+      this.formData.idCards = this.idcordList;
+      this.dialogPLS = false;
+    },
+    advanced(datas) {
+      this.dialogPLS = true;
+      this.idcordList = this.formData.idCards;
+    },
+    moreActive() {
+      if (!this.$refs.tableList.allCheckData.length) {
+        this.$message.warning("请勾选需要取消预约的列表");
+        return;
+      }
+      this.peopleList = JSON.parse(
+        JSON.stringify(this.$refs.tableList.allCheckData)
+      );
+      this.listData = {};
+      this.dialogDJ = true;
+    },
+    submitChecksDJ() {
+      var data = JSON.parse(JSON.stringify(this.listData));
+      var arrays = [];
+      this.peopleList.forEach((item) => {
+        arrays.push(item.subscribeId);
+      });
+      data.subscribeId = arrays;
+      data.subscribeStatus = 2;
+      this.$api.editsystemsubscribe(data).then((res) => {
+        this.$message.success("已批量取消预约");
+        this.dialogDJ = false;
+        this.search();
+        this.$refs.tableList.allCheckData = [];
+        this.$refs.tableList.$refs.pagerset.clearSelection();
+      });
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+          idCards: "",
+          canCancel: 1,
+          applyId: this.copyAppid,
+        };
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.idCards) {
+        data.idCards = this.formData.idCards.split("\n");
+      }
+      this.$api
+        .inquiresystemsubscribelist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.$refs.tableList.allCheckData = [];
+      this.$refs.tableList.$refs.pagerset.clearSelection();
+      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>
+/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;
+  }
+}
+.liBVS {
+  margin-right: 20px;
+  margin-bottom: 12px;
+  padding: 0px 6px;
+  border: 1px solid #999;
+  border-radius: 4px;
+  height: 30px;
+  line-height: 30px;
+  display: inline-block;
+  float: left;
+}
+.clsw {
+  margin-left: 4px;
+  cursor: pointer;
+  color: #f56c6c;
+}
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.dowmStys {
+  color: blue;
+  cursor: pointer;
+}
+</style>

+ 678 - 0
src/views/education/examManagement/applicationData/examRegistration/index.vue

@@ -0,0 +1,678 @@
+<template>
+  <div id="examRegistration">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :advanced="true"
+      @Advanced="advanced"
+      advancedName="高级输入"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      ref="tableList"
+      rowKey="subscribeId"
+    >
+      <template slot="customize">
+        <el-button :size="size" type="warning" @click="moreActive"
+          >考试登记</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogPLS"
+      width="660px"
+      :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="dialogPLS = false"
+          />
+        </div>
+      </div>
+      <el-row :gutter="20">
+        <el-col :span="12"
+          ><h4>请输入学员的身份证号码,换行隔开,每行一个</h4>
+          <el-input
+            type="textarea"
+            :rows="10"
+            placeholder="请输入身份证"
+            v-model="idcordList"
+          >
+          </el-input>
+        </el-col>
+        <el-col :span="12">
+          <h4>快捷导入</h4>
+          <el-link type="primary" @click="getDowm">下载模板</el-link>
+          <label
+            for="mobles"
+            class="el-button el-button--primary"
+            style="margin-left: 14px; padding: 10px 20px"
+            >上传学员名单</label
+          ><input
+            style="display: none"
+            type="file"
+            id="mobles"
+            ref="input1"
+            @change="importMobleadd"
+          />
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogPLS = false">取消</el-button>
+        <el-button type="primary" @click="submitChecksPals">确定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="dialogCG"
+      width="560px"
+      :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="dialogCG = false"
+          />
+        </div>
+      </div>
+      <div>
+        <ul>
+          <li class="liBVS" v-for="(item, index) in peopleList" :key="index">
+            {{ item.realname }}
+            <i
+              v-if="peopleList.length > 1"
+              class="el-icon-error clsw"
+              @click="peopleList.splice(index, 1)"
+            ></i>
+          </li>
+          <div style="clear: both"></div>
+        </ul>
+        <el-form
+          :model="listData"
+          label-width="120px"
+          class="demo-ruleForm"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item label="考试登记状态" prop="examStatus">
+            <el-radio-group v-model="listData.examStatus">
+              <el-radio :label="1">正常</el-radio>
+              <el-radio :label="2">缺考</el-radio>
+              <el-radio :label="3">作弊</el-radio>
+              <el-radio :label="4">替考</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="考试登记补充" prop="remark">
+            <el-input
+              v-model="listData.remark"
+              type="textarea"
+              :rows="4"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogCG = false">取消</el-button>
+        <el-button type="primary" @click="submitChecks('listData')"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import * as baseUrls from "@/utils/request.js";
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "ExamRegistration",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      dialogPLS: false,
+      size: "small",
+      plan: "",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        openCheckMore: true,
+        tableHide: true,
+        border: true,
+        title: "考试登记",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: true,
+        changeWidth: "240px",
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "applyId",
+          placeholder: "考试标题",
+          scope: "examList",
+        },
+        {
+          prop: "applySiteAddress",
+          placeholder: "考试地点",
+          scope: "applySiteAddress",
+          getType: 1,
+        },
+        {
+          prop: "searchKey",
+          placeholder: "请输入学员姓名/学员身份证",
+        },
+        {
+          prop: "idCards",
+          placeholder: "请输入学员身份证",
+          scope: "textarea",
+        },
+      ],
+      formData: {
+        applyId: "",
+        pageSize: 10,
+        pageNum: 1,
+        idCards: "",
+        // canCancel: 1,
+        // canBefore:1
+        canExam: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "预约状态",
+          prop: "subscribeStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "取消",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "前培标记",
+          prop: "beforeStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "已开通",
+              value: 1,
+            },
+          ],
+        },
+        {
+          label: "考试登记",
+          prop: "examStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptionsDZYQ",
+          options: [
+            {
+              label: "待登记",
+              value: 0,
+            },
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "缺考",
+              value: 2,
+            },
+            {
+              label: "作弊",
+              value: 3,
+            },
+            {
+              label: "替考",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "考试成绩和结果",
+          prop1: "performance",
+          prop2: "result",
+          hidden: true,
+          width: "130px",
+          scope: "resultType",
+        },
+        {
+          label: "证书编号",
+          prop: "certificateCode",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "考试标题",
+          prop: "applyName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "前培标题",
+          prop: "beforeName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "学员姓名",
+          prop: "realname",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "学员身份证",
+          prop: "idCard",
+          hidden: true,
+          width: "170px",
+        },
+        {
+          label: "所购商品",
+          prop1: "goodsCode",
+          prop2: "goodsName",
+          prop3: "standPrice",
+          hidden: true,
+          width: "220px",
+          scope: "goodsInfos",
+        },
+        {
+          label: "学员报考类型",
+          prop: "studentType",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "非补考学员",
+              value: 1,
+            },
+            {
+              label: "补考学员",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "所报专业",
+          prop: "categoryName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "预约场次(考试地点和时间)",
+          prop1: "applySiteAddress",
+          prop2: "applySiteExamTime",
+          prop3: "applySiteStartTime",
+          prop4: "applySiteEndTime",
+          hidden: true,
+          width: "280px",
+          scope: "changAdress",
+        },
+        {
+          label: "考试次数消耗",
+          prop: "examExpend",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "预约场次(考培地点和时间)",
+          prop1: "applySiteAddressTrain",
+          prop2: "applySiteExamTrainTime",
+          prop3: "applySiteStartTrainTime",
+          prop4: "applySiteEndTrainTime",
+          hidden: true,
+          width: "280px",
+          scope: "changAdress",
+        },
+        {
+          label: "前培次数消耗",
+          prop: "beforeExpend",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "创建时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+          width: "160px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      idcordList: "",
+      copyAppid: "",
+      listData: {},
+      dialogCG: false,
+      peopleList: [],
+      rules: {
+        examStatus: [
+          { required: true, message: "请选择考试登记状态", trigger: "change" },
+        ],
+      },
+    };
+  },
+  async mounted() {
+    await this.getFirstOptions();
+    this.search();
+  },
+  activated() {
+    this.search();
+  },
+  methods: {
+    /**
+     * 考试登记
+     */
+    moreActive() {
+      if (!this.$refs.tableList.allCheckData.length) {
+        this.$message.warning("请勾选需要考试登记的列表");
+        return;
+      }
+      this.peopleList = JSON.parse(
+        JSON.stringify(this.$refs.tableList.allCheckData)
+      );
+      this.listData = {};
+      this.dialogCG = true;
+      this.$nextTick(() => {
+        this.$refs.listData.clearValidate();
+      });
+    },
+    submitChecks(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (!this.listData.examStatus) {
+            this.$message.warning("请选择考试登记状态");
+            return;
+          }
+          this.submitForm();
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    submitForm() {
+      var data = JSON.parse(JSON.stringify(this.listData));
+      var arrays = [];
+      this.peopleList.forEach((item) => {
+        arrays.push(item.subscribeId);
+      });
+      data.subscribeId = arrays;
+      this.$api.editsystemsubscribe(data).then((res) => {
+        this.$message.success("批量考试登记修改成功");
+        this.dialogCG = false;
+        this.search();
+        this.$refs.tableList.allCheckData = [];
+        this.$refs.tableList.$refs.pagerset.clearSelection();
+      });
+    },
+    /**
+     * 下载模板
+     */
+    getDowm() {
+      let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20220214.xls";
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    /**
+     * 导入
+     */
+    importMobleadd(e) {
+      var self = this;
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemimportIdsData(formData)
+        .then((res) => {
+          if (!res.data.length) {
+            this.$message.warning("未检测到上传学员数据,请检查上传文件");
+            return;
+          }
+          let idList = res.data.map((item) => {
+            return item.idCard.toString();
+          });
+          if (this.idcordList) {
+            var arr = this.idcordList.split("\n");
+            var arrs = arr.concat(idList);
+            var newArr = arrs.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          } else {
+            var newArr = idList.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          }
+          this.$message.success("上传成功");
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    getFirstOptions() {
+      return new Promise((resolve, reject) => {
+        this.$api
+          .inquiresystemapplyList({ status: "0,1,2", pageSize: 1, pageNum: 1 })
+          .then((res) => {
+            if (res.rows.length) {
+              this.copyAppid = res.rows[0].applyId;
+              this.formData.applyId = res.rows[0].applyId;
+            }
+            resolve();
+          });
+      });
+    },
+    submitChecksPals() {
+      this.formData.idCards = this.idcordList;
+      this.dialogPLS = false;
+    },
+    advanced(datas) {
+      this.dialogPLS = true;
+      this.idcordList = this.formData.idCards;
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+          idCards: "",
+          canExam: 1,
+          applyId: this.copyAppid,
+        };
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.idCards) {
+        data.idCards = this.formData.idCards.split("\n");
+      }
+      this.$api
+        .inquiresystemsubscribelist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.$refs.tableList.allCheckData = [];
+      this.$refs.tableList.$refs.pagerset.clearSelection();
+      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>
+.liBVS {
+  margin-right: 20px;
+  margin-bottom: 12px;
+  padding: 0px 6px;
+  border: 1px solid #999;
+  border-radius: 4px;
+  height: 30px;
+  line-height: 30px;
+  display: inline-block;
+  float: left;
+}
+.clsw {
+  margin-left: 4px;
+  cursor: pointer;
+  color: #f56c6c;
+}
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.dowmStys {
+  color: blue;
+  cursor: pointer;
+}
+/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>

+ 674 - 0
src/views/education/examManagement/applicationData/formerAccount/index.vue

@@ -0,0 +1,674 @@
+<template>
+  <div id="formerAccount">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :advanced="true"
+      @Advanced="advanced"
+      advancedName="高级输入"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      ref="tableList"
+      rowKey="subscribeId"
+    >
+      <template slot="customize">
+        <el-button :size="size" type="warning" @click="moreActive"
+          >前培账号标记</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogPLS"
+      width="660px"
+      :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="dialogPLS = false"
+          />
+        </div>
+      </div>
+      <el-row :gutter="20">
+        <el-col :span="12"
+          ><h4>请输入学员的身份证号码,换行隔开,每行一个</h4>
+          <el-input
+            type="textarea"
+            :rows="10"
+            placeholder="请输入身份证"
+            v-model="idcordList"
+          >
+          </el-input>
+        </el-col>
+        <el-col :span="12">
+          <h4>快捷导入</h4>
+          <el-link type="primary" @click="getDowm">下载模板</el-link>
+          <label
+            for="mobles"
+            class="el-button el-button--primary"
+            style="margin-left: 14px; padding: 10px 20px"
+            >上传学员名单</label
+          ><input
+            style="display: none"
+            type="file"
+            id="mobles"
+            ref="input1"
+            @change="importMobleadd"
+          />
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogPLS = false">取消</el-button>
+        <el-button type="primary" @click="submitChecksPals">确定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="dialogQP"
+      width="460px"
+      :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="dialogQP = false"
+          />
+        </div>
+      </div>
+      <div>
+        <ul style="margin: 0px">
+          <li class="liBVS" v-for="(item, index) in peopleList" :key="index">
+            {{ item.realname }}
+            <i
+              v-if="peopleList.length > 1"
+              class="el-icon-error clsw"
+              @click="peopleList.splice(index, 1)"
+            ></i>
+          </li>
+          <div style="clear: both"></div>
+        </ul>
+        <el-select
+          size="small"
+          v-model="plan"
+          placeholder="请选择前培计划"
+          style="margin-bottom: 12px"
+        >
+          <el-option
+            v-for="item in optionsList"
+            :key="item.beforeId"
+            :label="item.beforeName"
+            :value="item.beforeId"
+          >
+          </el-option>
+        </el-select>
+        <p style="margin: 0px">所选学员的前培账号标记为【已开通】吗?</p>
+        <div style="text-align: center; margin-top: 12px">
+          <el-radio-group v-model="beforeStatus">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="2">否</el-radio>
+          </el-radio-group>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogQP = false">取消</el-button>
+        <el-button type="primary" @click="submitChecksQP">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import * as baseUrls from "@/utils/request.js";
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "FormerAccount",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      dialogPLS: false,
+      size: "small",
+      plan: "",
+      beforeStatus: "",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        openCheckMore: true,
+        tableHide: true,
+        border: true,
+        title: "前培账号标记",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: true,
+        changeWidth: "240px",
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "applyId",
+          placeholder: "考试标题",
+          scope: "examList",
+        },
+        {
+          prop: "applySiteAddress",
+          placeholder: "考试地点",
+          scope: "applySiteAddress",
+          getType: 1,
+        },
+        {
+          prop: "searchKey",
+          placeholder: "请输入学员姓名/学员身份证",
+        },
+        {
+          prop: "idCards",
+          placeholder: "请输入学员身份证",
+          scope: "textarea",
+        },
+      ],
+      formData: {
+        applyId: "",
+        pageSize: 10,
+        pageNum: 1,
+        idCards: "",
+        canBefore: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "预约状态",
+          prop: "subscribeStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "取消",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "前培标记",
+          prop: "beforeStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "已开通",
+              value: 1,
+            },
+          ],
+        },
+        {
+          label: "考试登记",
+          prop: "examStatus",
+          hidden: true,
+          width: "130px",
+          scope: "isOptionsDZYQ",
+          options: [
+            {
+              label: "待登记",
+              value: 0,
+            },
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "缺考",
+              value: 2,
+            },
+            {
+              label: "作弊",
+              value: 3,
+            },
+            {
+              label: "替考",
+              value: 4,
+            },
+          ],
+        },
+        {
+          label: "考试成绩和结果",
+          prop1: "performance",
+          prop2: "result",
+          hidden: true,
+          width: "130px",
+          scope: "resultType",
+        },
+        {
+          label: "证书编号",
+          prop: "certificateCode",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "考试标题",
+          prop: "applyName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "前培标题",
+          prop: "beforeName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "学员姓名",
+          prop: "realname",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "学员身份证",
+          prop: "idCard",
+          hidden: true,
+          width: "170px",
+        },
+        {
+          label: "所购商品",
+          prop1: "goodsCode",
+          prop2: "goodsName",
+          prop3: "standPrice",
+          hidden: true,
+          width: "220px",
+          scope: "goodsInfos",
+        },
+        {
+          label: "学员报考类型",
+          prop: "studentType",
+          hidden: true,
+          width: "130px",
+          scope: "isOptions",
+          options: [
+            {
+              label: "非补考学员",
+              value: 1,
+            },
+            {
+              label: "补考学员",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "所报专业",
+          prop: "categoryName",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "预约场次(考试地点和时间)",
+          prop1: "applySiteAddress",
+          prop2: "applySiteExamTime",
+          prop3: "applySiteStartTime",
+          prop4: "applySiteEndTime",
+          hidden: true,
+          width: "280px",
+          scope: "changAdress",
+        },
+        {
+          label: "考试次数消耗",
+          prop: "examExpend",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "预约场次(考培地点和时间)",
+          prop1: "applySiteAddressTrain",
+          prop2: "applySiteExamTrainTime",
+          prop3: "applySiteStartTrainTime",
+          prop4: "applySiteEndTrainTime",
+          hidden: true,
+          width: "280px",
+          scope: "changAdress",
+        },
+        {
+          label: "前培次数消耗",
+          prop: "beforeExpend",
+          hidden: true,
+          width: "130px",
+        },
+        {
+          label: "创建时间",
+          prop: "createTime",
+          hidden: true,
+          scope: "aTimeList",
+          width: "160px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      idcordList: "",
+      copyAppid: "",
+      dialogQP: false,
+      listData: {},
+      peopleList: [],
+      optionsList: [],
+    };
+  },
+  async mounted() {
+    await this.getFirstOptions();
+    this.search();
+    this.getQP();
+  },
+  activated() {
+    this.search();
+    this.getQP();
+  },
+  methods: {
+    /**
+     * 下载模板
+     */
+    getDowm() {
+      let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20220214.xls";
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    /**
+     * 导入
+     */
+    importMobleadd(e) {
+      var self = this;
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api
+        .editsystemimportIdsData(formData)
+        .then((res) => {
+          if (!res.data.length) {
+            this.$message.warning("未检测到上传学员数据,请检查上传文件");
+            return;
+          }
+          let idList = res.data.map((item) => {
+            return item.idCard.toString();
+          });
+          if (this.idcordList) {
+            var arr = this.idcordList.split("\n");
+            var arrs = arr.concat(idList);
+            var newArr = arrs.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          } else {
+            var newArr = idList.filter(function (value, index, self) {
+              return self.indexOf(value) === index;
+            });
+            this.idcordList = newArr.join("\n");
+          }
+          this.$message.success("上传成功");
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    getFirstOptions() {
+      return new Promise((resolve, reject) => {
+        this.$api
+          .inquiresystemapplyList({ status: "0,1,2", pageSize: 1, pageNum: 1 })
+          .then((res) => {
+            if (res.rows.length) {
+              this.copyAppid = res.rows[0].applyId;
+              this.formData.applyId = res.rows[0].applyId;
+            }
+            resolve();
+          });
+      });
+    },
+    submitChecksPals() {
+      this.formData.idCards = this.idcordList;
+      this.dialogPLS = false;
+    },
+    advanced(datas) {
+      this.dialogPLS = true;
+      this.idcordList = this.formData.idCards;
+    },
+    moreActive() {
+      if (!this.$refs.tableList.allCheckData.length) {
+        this.$message.warning("请勾选需要前培账号标记的列表");
+        return;
+      }
+      this.peopleList = JSON.parse(
+        JSON.stringify(this.$refs.tableList.allCheckData)
+      );
+      this.listData = {};
+      this.plan = "";
+      this.beforeStatus = "";
+      this.dialogQP = true;
+    },
+    submitChecksQP() {
+      var data = JSON.parse(JSON.stringify(this.listData));
+      if (!this.plan && this.beforeStatus === 1) {
+        this.$message.warning("请选择前培计划");
+        return;
+      }
+      if (!this.beforeStatus) {
+        this.$message.warning("请选择是或否");
+        return;
+      }
+      var arrays = [];
+      this.peopleList.forEach((item) => {
+        arrays.push(item.subscribeId);
+      });
+      data.subscribeId = arrays;
+      if (this.beforeStatus === 1) {
+        data.beforeStatus = 1;
+        data.beforeId = this.plan;
+      }
+      if (this.beforeStatus === 2) {
+        data.beforeStatus = 0;
+        data.beforeId = "";
+      }
+      this.$api.editsystemsubscribe(data).then((res) => {
+        this.$message.success("前培账号已开通标记修改成功");
+        this.dialogQP = false;
+        this.search();
+        this.$refs.tableList.allCheckData = [];
+        this.$refs.tableList.$refs.pagerset.clearSelection();
+      });
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+          idCards: "",
+          canBefore: 1,
+          applyId: this.copyAppid,
+        };
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.idCards) {
+        data.idCards = this.formData.idCards.split("\n");
+      }
+      this.$api
+        .inquiresystemsubscribelist(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    getQP() {
+      this.$api.inquiresystembefore({ status: "0,1,2" }).then((res) => {
+        this.optionsList = res.rows;
+      });
+    },
+    init() {
+      this.$refs.tableList.allCheckData = [];
+      this.$refs.tableList.$refs.pagerset.clearSelection();
+      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>
+/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;
+  }
+}
+.liBVS {
+  margin-right: 20px;
+  margin-bottom: 12px;
+  padding: 0px 6px;
+  border: 1px solid #999;
+  border-radius: 4px;
+  height: 30px;
+  line-height: 30px;
+  display: inline-block;
+  float: left;
+}
+.clsw {
+  margin-left: 4px;
+  cursor: pointer;
+  color: #f56c6c;
+}
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.dowmStys {
+  color: blue;
+  cursor: pointer;
+}
+</style>

+ 39 - 37
src/views/education/examManagement/examArrangement/index.vue

@@ -179,9 +179,9 @@
         <div class="leftTitle">
           {{
             intStatus === 1
-              ? "设置考试地点和时间"
+              ? "设置考试地点"
               : intStatus === 2
-              ? "设置考培地点和时间"
+              ? "设置考培地点"
               : "未知"
           }}
         </div>
@@ -275,7 +275,7 @@
                       size="mini"
                       v-model="its.startTime"
                       format="HH:mm"
-                      value-format="HH-mm"
+                      value-format="HH:mm"
                       placeholder="开始时间"
                       @change="
                         its.endTime && its.startTime > its.endTime
@@ -290,7 +290,7 @@
                       size="mini"
                       v-model="its.endTime"
                       format="HH:mm"
-                      value-format="HH-mm"
+                      value-format="HH:mm"
                       placeholder="结束时间"
                       @change="
                         its.startTime && its.endTime < its.startTime
@@ -497,7 +497,7 @@
               >请先选择业务层级</span
             >
             <el-checkbox-group
-              style="overflow: auto;max-height:500px;"
+              style="overflow: auto; max-height: 500px"
               v-model="listDataGoods.goodsId"
               v-else-if="listDataGoods.businessId && goodsList.length"
             >
@@ -609,8 +609,8 @@
                       :key="indexsx"
                     >
                       {{ $methodsTools.onlyForma(items.examTime, false) }}
-                      {{ itemsxs.startTime.replace("-", ":") }}-{{
-                        itemsxs.endTime.replace("-", ":")
+                      {{ itemsxs.startTime }}-{{
+                        itemsxs.endTime
                       }}
                       (人数上限:{{ itemsxs.num }})
                     </div>
@@ -637,8 +637,8 @@
                       :key="indexsx"
                     >
                       {{ $methodsTools.onlyForma(items.examTime, false) }}
-                      {{ itemsxs.startTime.replace("-", ":") }}-{{
-                        itemsxs.endTime.replace("-", ":")
+                      {{ itemsxs.startTime }}-{{
+                        itemsxs.endTime
                       }}
                       (人数上限:{{ itemsxs.num }})
                     </div>
@@ -770,8 +770,8 @@ export default {
           label: "预约/取消(人次)",
           prop: "people",
           hidden: true,
-          scope:"jumpPeolpe",
-          type:1,
+          scope: "jumpPeolpe",
+          type: 1,
           width: "140px",
         },
       ],
@@ -1027,10 +1027,10 @@ export default {
         } else {
           for (let j = 0; j < data[i].examApplySiteTime.length; j++) {
             if (!data[i].examApplySiteTime[j].examTime) {
-              if(this.intStatus === 1){
+              if (this.intStatus === 1) {
                 this.$message.warning("您还有考试日期没有设置,请先设置");
               }
-              if(this.intStatus === 2){
+              if (this.intStatus === 2) {
                 this.$message.warning("您还有考培日期没有设置,请先设置");
               }
               return;
@@ -1042,11 +1042,11 @@ export default {
                 );
             }
             if (!data[i].examApplySiteTime[j].examApplySiteTimeTwo.length) {
-              if(this.intStatus === 1){
-              this.$message.warning("您还有考试时间点没有设置,请先设置");
+              if (this.intStatus === 1) {
+                this.$message.warning("您还有考试时间点没有设置,请先设置");
               }
-              if(this.intStatus === 2){
-              this.$message.warning("您还有考培时间点没有设置,请先设置");
+              if (this.intStatus === 2) {
+                this.$message.warning("您还有考培时间点没有设置,请先设置");
               }
               return;
             } else {
@@ -1081,15 +1081,15 @@ export default {
               const idsSet1 = new Set(stsTime1);
               if (idsSet1.size == stsTime1.length) {
               } else {
-                if(this.intStatus === 1){
-this.$message.warning(
-                  "同一考试日期下的时间点,出现重复,请修改"
-                );
+                if (this.intStatus === 1) {
+                  this.$message.warning(
+                    "同一考试日期下的时间点,出现重复,请修改"
+                  );
                 }
-                if(this.intStatus === 2){
-this.$message.warning(
-                  "同一考培日期下的时间点,出现重复,请修改"
-                );
+                if (this.intStatus === 2) {
+                  this.$message.warning(
+                    "同一考培日期下的时间点,出现重复,请修改"
+                  );
                 }
                 return;
               }
@@ -1099,11 +1099,15 @@ this.$message.warning(
           const idsSet = new Set(stsTime);
           if (idsSet.size == stsTime.length) {
           } else {
-            if(this.intStatus === 1){
-              this.$message.warning("同一考试地点下的考培日期,出现重复,请修改");
+            if (this.intStatus === 1) {
+              this.$message.warning(
+                "同一考试地点下的考试日期,出现重复,请修改"
+              );
             }
-            if(this.intStatus === 2){
-              this.$message.warning("同一考培地点下的考培日期,出现重复,请修改");
+            if (this.intStatus === 2) {
+              this.$message.warning(
+                "同一考培地点下的考培日期,出现重复,请修改"
+              );
             }
             return;
           }
@@ -1176,15 +1180,13 @@ this.$message.warning(
     },
     // 判断选择时间逻辑
     changeEndTime(int) {
-      if(this.listData.applyStartTime === this.listData.applyEndTime){
-        this.$message.warning(
-          "开始时间与结束时间不允许相同"
-        );
-        if(int === 1){
-        this.listData.applyStartTime = "";
+      if (this.listData.applyStartTime === this.listData.applyEndTime) {
+        this.$message.warning("开始时间与结束时间不允许相同");
+        if (int === 1) {
+          this.listData.applyStartTime = "";
         }
-        if(int === 2){
-        this.listData.applyEndTime = "";
+        if (int === 2) {
+          this.listData.applyEndTime = "";
         }
         return;
       }

+ 12 - 5
src/views/education/examManagement/examConfiguration/examPlace/index.vue

@@ -63,7 +63,7 @@
               >
             </el-radio-group>
             <el-input-number
-            :controls="false"
+              :controls="false"
               :min="1"
               :disabled="statusPop === 2"
               v-else-if="items.scope === 'Number'"
@@ -96,7 +96,7 @@ import searchBox from "@/components/searchBox";
 import tableList from "@/components/tableList";
 import pagination from "@/components/pagination";
 export default {
-  name:"ExamPlace",
+  name: "ExamPlace",
   components: { searchBox, tableList, pagination },
   data() {
     return {
@@ -107,7 +107,7 @@ export default {
         ch: "条",
         num: true,
         choice: false,
-        border:true,
+        border: true,
         addHide: false,
         backFatherBtn: {
           status: false,
@@ -179,7 +179,11 @@ export default {
           { required: true, message: "请输入考试地点", trigger: "blur" },
         ],
         people: [
-          { required: true, message: "请输入同时间可容纳人数", trigger: "blur" },
+          {
+            required: true,
+            message: "请输入同时间可容纳人数",
+            trigger: "blur",
+          },
         ],
         status: [{ required: true, message: "请选择状态", trigger: "change" }],
       },
@@ -188,7 +192,7 @@ export default {
   mounted() {
     this.search();
   },
-  activated(){
+  activated() {
     this.search();
   },
   methods: {
@@ -232,6 +236,7 @@ export default {
           this.$api.editsystemsite(data).then((res) => {
             this.$message.success("删除成功");
             this.search();
+            this.$store.commit("APPLYSITEADDRESS");
           });
         })
         .catch(() => {
@@ -271,6 +276,7 @@ export default {
           this.$message.success("新增成功");
           this.dialogVisible = false;
           this.search();
+          this.$store.commit("APPLYSITEADDRESS");
         });
       }
       if (this.statusPop === 0) {
@@ -278,6 +284,7 @@ export default {
           this.$message.success("修改成功");
           this.dialogVisible = false;
           this.search();
+          this.$store.commit("APPLYSITEADDRESS");
         });
       }
     },

+ 89 - 44
src/views/education/notificationManageMent/notificationList/add/index.vue

@@ -96,7 +96,9 @@
               style="margin-right: 12px"
               >添加题库跳转</el-button
             >
-            <span style="font-size: 14px">注:1.视频课程关联的试卷,无法做跳转、2.视频课程设置了【播放-禁止拖动】,无法做跳转</span>
+            <span style="font-size: 14px"
+              >注:1.视频课程关联的试卷,无法做跳转、2.视频课程设置了【播放-禁止拖动】,无法做跳转</span
+            >
           </div>
           <div
             style="padding: 5px 20px; background-color: #eee"
@@ -120,7 +122,9 @@
               <div class="dis_flex">
                 <div style="margin-right: 15px">
                   <i class="el-icon-video-play"></i
-                  ><span>第{{ item.topicNum }}分钟</span>
+                  ><span>{{
+                    $methodsTools.secondToDate(item.topicNum, false)
+                  }}</span>
                 </div>
                 <div>
                   <!-- <el-button type="text">预览</el-button> -->
@@ -193,7 +197,14 @@
               v-model="filterText"
             >
             </el-input>
+            <div v-if="loadingBox" style="text-align: center">
+              <i class="el-icon-loading"></i
+              ><span style="font-size: 13px; margin-left: 8px"
+                >数据量大,正在加载中...</span
+              >
+            </div>
             <el-tree
+              v-else
               class="filter-tree"
               :data="data"
               :props="defaultProps"
@@ -362,17 +373,25 @@
         <div v-if="JSON.stringify(courseData) !== '{}'">
           <span>跳转开始节点:</span>
           <span v-if="idCods === 2">第</span>
+          <el-time-picker
+            v-if="idCods === 1"
+            style="width: 140px"
+            size="mini"
+            value-format="HH:mm:ss"
+            range-separator="-"
+            v-model="activeCourseTime"
+            :picker-options="{
+              selectableRange: compTimes(courseData.durationTime),
+            }"
+            placeholder="请选择跳转开始节点"
+          >
+          </el-time-picker>
           <el-input-number
+            v-if="idCods === 2"
             size="small"
-            :precision="idCods === 2 ? 0 : 2"
+            :precision="0"
             :min="0"
-            :max="
-              idCods === 1
-                ? courseData.durationTime
-                : idCods === 2
-                ? courseData.questionNum
-                : ''
-            "
+            :max="courseData.questionNum"
             v-model="activeCourseTime"
           ></el-input-number>
           <span v-if="idCods === 2">道题</span>
@@ -425,9 +444,7 @@
           />
         </div>
       </div>
-      <div>
-       是否继续发送?
-      </div>
+      <div>是否继续发送?</div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogsy = false">否</el-button>
         <el-button type="primary" @click="submitszz(2)">是</el-button>
@@ -464,13 +481,13 @@ import bankInfo from "@/components/bankInfo";
 import { mapGetters } from "vuex";
 import Editor from "@/components/Editor";
 export default {
-  name:"NotificationListAdd",
+  name: "NotificationListAdd",
   components: { Editor, bankInfo },
   data() {
     return {
       dialogCG: false,
       dialog: false,
-      dialogsy:false,
+      dialogsy: false,
       listData: {
         issueStatus: 1,
         receiptStatus: 0,
@@ -480,6 +497,8 @@ export default {
         informCourseAddBo: [],
         informExamAddBo: [],
       },
+      arrays: [],
+      loadingBox: true,
       rules: {
         informType: [
           { required: true, message: "请选择通知对象", trigger: "change" },
@@ -563,7 +582,15 @@ export default {
       num: 0, //未购买学员
     };
   },
-  computed: { ...mapGetters(["educationType"]) },
+  computed: {
+    ...mapGetters(["educationType"]),
+    compTimes: function () {
+      return function (aTime) {
+        let chasTime = this.$methodsTools.secondToDate(aTime, false);
+        return `00:00:00 - ${chasTime}`;
+      };
+    },
+  },
   watch: {
     filterText(val) {
       this.$refs.tree.filter(val);
@@ -822,7 +849,7 @@ export default {
           moduleName: this.courseData.moduleName,
           chapterName: this.courseData.chapterName,
           sectionName: this.courseData.sectionName,
-          topicNum: this.activeCourseTime,
+          topicNum: this.$methodsTools.secondFormDate(this.activeCourseTime),
         };
         this.listData.informCourseAddBo.push(arrays);
       }
@@ -979,11 +1006,11 @@ export default {
             this.$message.error("请选择收件人");
             return;
           }
-          if(this.listData.issueStatus === 2){
-            var timestamp=new Date().getTime()
-            if(timestamp >= this.listData.issueTime){
-              this.$message.warning("发布时间不得小于当前时间,请重新选择")
-              return
+          if (this.listData.issueStatus === 2) {
+            var timestamp = new Date().getTime();
+            if (timestamp >= this.listData.issueTime) {
+              this.$message.warning("发布时间不得小于当前时间,请重新选择");
+              return;
             }
           }
           // if (!this.listData.informCourseAddBo.length &&!this.listData.informExamAddBo.length) {
@@ -1012,9 +1039,12 @@ export default {
             1
           );
         }
-        if(!this.listData.informCourseAddBo.length && !this.listData.informExamAddBo.length){
+        if (
+          !this.listData.informCourseAddBo.length &&
+          !this.listData.informExamAddBo.length
+        ) {
           this.dialogsy = true;
-          return
+          return;
         }
         this.$api.inquireselectNum(data).then((res) => {
           this.num = res.data;
@@ -1071,32 +1101,47 @@ export default {
         });
       });
     },
+    recurFunc(x, y, total) {
+      this.$api
+        .inquiresysteminformlistGrade({ status: 1, pageNum: x, pageSize: y })
+        .then((res) => {
+          res.rows.forEach((item) => {
+            item.onlyId = item.gradeId;
+            item.onlyName = item.className;
+            item.children = item.classGradeStudentVos;
+            item.children.forEach((items) => {
+              items.onlyId = items.gradeId + "-" + items.userId;
+              items.onlyName = items.realName;
+            });
+          });
+          this.arrays = this.arrays.concat(res.rows);
+          if (this.arrays.length == total) {
+            this.data = [
+              {
+                onlyId: 99999999,
+                onlyName: "所有班级",
+                children: this.arrays,
+              },
+            ];
+            this.activeOne();
+            this.loadingBox = false;
+          }
+        });
+    },
     //初始获取备注分类
     getMes() {
       this.$api.inquiresystemclassifylist({ status: 1 }).then((res) => {
         this.options = this.handleTree(res.rows, "classifyId", "parentId");
       });
-      this.$api.inquiresysteminformlistGrade({ status: 1 }).then((res) => {
-        res.rows.forEach((item, index) => {
-          item.onlyId = item.gradeId;
-          item.onlyName = item.className;
-          item.children = item.classGradeStudentVos;
-          item.children.forEach((items) => {
-            items.onlyId = items.gradeId + "-" + items.userId;
-            items.onlyName = items.realName;
-          });
+      this.$api
+        .inquiresysteminformlistGrade({ status: 1, pageNum: 1, pageSize: 1 })
+        .then((res) => {
+          let total = res.total;
+          let pagesize = 20; // 一页多少条
+          for (let i = 0; i < Math.ceil(total / pagesize); i++) {
+            this.recurFunc(i + 1, pagesize, total);
+          }
         });
-        this.data = [
-          {
-            onlyId: 99999999,
-            onlyName: "所有班级",
-            children: res.rows,
-          },
-        ];
-        this.activeOne();
-      }).catch((err)=>{
-          this.$message.error("收件人-班级选择列表请求超时")
-        })
       this.$api.inquiresysteminformlistGradeStudy({ status: 1 }).then((res) => {
         res.rows.forEach((item, index) => {
           item.onlyId = item.userId;

+ 108 - 52
src/views/education/notificationManageMent/notificationList/edit/index.vue

@@ -122,10 +122,12 @@
               <div class="dis_flex">
                 <div style="margin-right: 15px">
                   <i class="el-icon-video-play"></i
-                  ><span>第{{ item.topicNum }}分钟</span>
+                  ><span>{{
+                    $methodsTools.secondToDate(item.topicNum, false)
+                  }}</span>
                 </div>
                 <div>
-                  <el-button type="text">预览</el-button>
+                  <!-- <el-button type="text">预览</el-button> -->
                   <el-button type="text" @click="delCourse(index)"
                     >删除</el-button
                   >
@@ -195,7 +197,14 @@
               v-model="filterText"
             >
             </el-input>
+            <div v-if="loadingBox" style="text-align: center">
+              <i class="el-icon-loading"></i
+              ><span style="font-size: 13px; margin-left: 8px"
+                >数据量大,正在加载中...</span
+              >
+            </div>
             <el-tree
+              v-else
               class="filter-tree"
               :data="data"
               :props="defaultProps"
@@ -362,17 +371,25 @@
         <div v-if="JSON.stringify(courseData) !== '{}'">
           <span>跳转开始节点:</span>
           <span v-if="idCods === 2">第</span>
+          <el-time-picker
+            v-if="idCods === 1"
+            style="width: 140px"
+            size="mini"
+            value-format="HH:mm:ss"
+            range-separator="-"
+            v-model="activeCourseTime"
+            :picker-options="{
+              selectableRange: compTimes(courseData.durationTime),
+            }"
+            placeholder="请选择跳转开始节点"
+          >
+          </el-time-picker>
           <el-input-number
+            v-if="idCods === 2"
             size="small"
-            :precision="idCods === 2 ? 0 : 2"
+            :precision="0"
             :min="0"
-            :max="
-              idCods === 1
-                ? courseData.durationTime
-                : idCods === 2
-                ? courseData.questionNum
-                : ''
-            "
+            :max="courseData.questionNum"
             v-model="activeCourseTime"
           ></el-input-number>
           <span v-if="idCods === 2">道题</span>
@@ -462,13 +479,15 @@ import bankInfo from "@/components/bankInfo";
 import { mapGetters } from "vuex";
 import Editor from "@/components/Editor";
 export default {
-  name:"NotificationListEdit",
+  name: "NotificationEdit",
   components: { bankInfo, Editor },
   data() {
     return {
       dialogCG: false,
       dialog: false,
       dialogsy: false,
+      loadingBox: true,
+      arrays: [],
       listData: {
         informWay: [],
         issueTime: "",
@@ -559,7 +578,15 @@ export default {
       num: 0, //未购买学员
     };
   },
-  computed: { ...mapGetters(["educationType"]) },
+  computed: {
+    ...mapGetters(["educationType"]),
+    compTimes: function () {
+      return function (aTime) {
+        let chasTime = this.$methodsTools.secondToDate(aTime, false);
+        return `00:00:00 - ${chasTime}`;
+      };
+    },
+  },
   watch: {
     filterText(val) {
       this.$refs.tree.filter(val);
@@ -624,7 +651,9 @@ export default {
           }, 200);
         })
         .finally(() => {
-          this.$modal.closeLoading();
+          this.$nextTick(()=>{
+            this.$modal.closeLoading();
+          })
         });
     },
     delCourse(int) {
@@ -832,7 +861,7 @@ export default {
           moduleName: this.courseData.moduleName,
           chapterName: this.courseData.chapterName,
           sectionName: this.courseData.sectionName,
-          topicNum: this.activeCourseTime,
+          topicNum: this.$methodsTools.secondFormDate(this.activeCourseTime),
         };
         this.listData.informCourseAddBo.push(arrays);
       }
@@ -1086,52 +1115,79 @@ export default {
         this.$api.inquiresystemclassifylist({ status: 1 }).then((res) => {
           this.options = this.handleTree(res.rows, "classifyId", "parentId");
         });
-        await this.get1().catch((err)=>{
-          this.$message.error("收件人-班级选择列表请求超时")
-          this.$modal.closeLoading();
-        })
+        await this.get1()
         await this.get2();
         await this.get3();
         resolve();
       });
     },
+    recurFunc(x, y, total) {
+      this.$api
+        .inquiresysteminformlistGrade({ status: 1, pageNum: x, pageSize: y })
+        .then((res) => {
+          res.rows.forEach((item) => {
+            item.onlyId = item.gradeId;
+            item.onlyName = item.className;
+            item.children = item.classGradeStudentVos;
+            item.children.forEach((items) => {
+              items.onlyId = items.gradeId + "-" + items.userId;
+              items.onlyName = items.realName;
+            });
+          });
+          this.arrays = this.arrays.concat(res.rows);
+          if (this.arrays.length == total) {
+            this.data = [
+              {
+                onlyId: 99999999,
+                onlyName: "所有班级",
+                children: this.arrays,
+              },
+            ];
+            this.activeOne();
+            this.loadingBox = false;
+          }
+        });
+    },
     get1() {
       return new Promise((resolve, reject) => {
-        this.$api.inquiresysteminformlistGrade({ status: 1 }).then((res) => {
-          for (let i = 0; i < res.rows.length; i++) {
-            res.rows[i].onlyId = res.rows[i].gradeId;
-            res.rows[i].onlyName = res.rows[i].className;
-            res.rows[i].children = res.rows[i].classGradeStudentVos;
-            for (let k = 0; k < res.rows[i].children.length; k++) {
-              res.rows[i].children[k].onlyId =
-                res.rows[i].children[k].gradeId +
-                "-" +
-                res.rows[i].children[k].userId;
-              res.rows[i].children[k].onlyName =
-                res.rows[i].children[k].realName;
+        this.$api
+          .inquiresysteminformlistGrade({ status: 1, pageNum: 1, pageSize: 1 })
+          .then((res) => {
+            let total = res.total;
+            let pagesize = 20; // 一页多少条
+            for (let i = 0; i < Math.ceil(total / pagesize); i++) {
+              this.$api
+                .inquiresysteminformlistGrade({
+                  status: 1,
+                  pageNum: i + 1,
+                  pageSize: pagesize,
+                })
+                .then((res) => {
+                  res.rows.forEach((item) => {
+                    item.onlyId = item.gradeId;
+                    item.onlyName = item.className;
+                    item.children = item.classGradeStudentVos;
+                    item.children.forEach((items) => {
+                      items.onlyId = items.gradeId + "-" + items.userId;
+                      items.onlyName = items.realName;
+                    });
+                  });
+                  this.arrays = this.arrays.concat(res.rows);
+                  if (this.arrays.length == total) {
+                    this.data = [
+                      {
+                        onlyId: 99999999,
+                        onlyName: "所有班级",
+                        children: this.arrays,
+                      },
+                    ];
+                    this.loadingBox = false;
+                    this.activeOne();
+                    resolve();
+                  }
+                });
             }
-          }
-          // res.rows.forEach((item, index) => {
-          //   item.onlyId = item.gradeId;
-          //   item.onlyName = item.className;
-          //   item.children = item.classGradeStudentVos;
-          //   item.children.forEach((items) => {
-          //     items.onlyId = items.gradeId + "-" + items.userId;
-          //     items.onlyName = items.realName;
-          //   });
-          // });
-          this.data = [
-            {
-              onlyId: 99999999,
-              onlyName: "所有班级",
-              children: res.rows,
-            },
-          ];
-          this.activeOne();
-          resolve();
-        }).catch((err)=>{
-          reject();
-        })
+          });
       });
     },
     get2() {

+ 26 - 11
src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue

@@ -112,7 +112,11 @@
           </el-select>
         </el-form-item>
         <el-form-item label="地域(省)" prop="provinceId">
-          <el-select v-model="listDataIns.provinceId" placeholder="请选择省">
+          <el-select
+            v-model="listDataIns.provinceId"
+            placeholder="请选择省"
+            @change="changeCity"
+          >
             <el-option
               v-for="item in areas"
               :key="item.areaId"
@@ -215,7 +219,7 @@ export default {
     };
   },
   computed: {
-    ...mapGetters(["paperexam", "areas", "cityList"]),
+    ...mapGetters(["paperexam", "areas"]),
   },
   mounted() {
     this.$modal.loading("正在导入数据,请稍后...");
@@ -249,6 +253,9 @@ export default {
       this.$api.obtainbankexam(this.$route.query.id).then((res) => {
         res.data.year = res.data.year + "";
         this.listDataIns = res.data;
+        if (res.data.provinceId) {
+          this.changeCity(res.data.provinceId, true);
+        }
       });
       this.$api
         .inquirebankexamListbusiness({ type: 2, majorId: this.$route.query.id })
@@ -260,16 +267,19 @@ export default {
           this.newSujectApis = res.rows[0];
           this.sujectApis =
             res.rows[0].businessId + "-" + res.rows[0].subjectId;
-        }).finally(()=>{
-        this.$modal.closeLoading();
-      })
+        })
+        .finally(() => {
+          this.$modal.closeLoading();
+        });
+    },
+    changeCity(newVal, dray = false) {
+      if (!dray) {
+        this.listDataIns.cityId = "";
+      }
+      this.optionsCity = this.cityList.filter((item) => {
+        return item.parentId === newVal;
+      });
     },
-    // changeCity(newVal) {
-    //   console.log(newVal)
-    //   this.optionsCity = this.cityList.filter((item) => {
-    //     return item.parentId === newVal;
-    //   });
-    // },
     changeTypes() {
       var self = this;
       if (!this.sujectApis) {
@@ -324,6 +334,11 @@ export default {
         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;

+ 5 - 5
src/views/resource/baseManageInfos/index.vue

@@ -58,6 +58,10 @@ export default {
           title: "专业",
           url: "professional",
         },
+        {
+          title: "专业标签",
+          url: "label",
+        },
         {
           title: "科目/类目",
           url: "suject",
@@ -71,13 +75,9 @@ export default {
           url: "enrollmentArea",
         },
         {
-          title: "证书",
+          title: "证书类型",
           url: "certificate",
         },
-        {
-          title: "标签",
-          url: "label",
-        },
       ],
       list3: [
         // {

+ 1 - 0
src/views/resource/baseManageInfos/resource/businessLevel/index.vue

@@ -419,6 +419,7 @@ export default {
       } else {
         if (item.length) {
           this.activeLists = item;
+          this.radioActives = "";
           this.dialogVisiblePZDown = true;
         } else {
           this.$message.warning("请勾选需要配置下单填选模板的业务层级");

+ 1 - 1
src/views/resource/baseManageInfos/resource/certificate/index.vue

@@ -103,7 +103,7 @@ export default {
       disabledBtn: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
-        title: "证书",
+        title: "证书类型",
         index: 0,
         ch: "条",
         num: true,

+ 1 - 1
src/views/resource/baseManageInfos/resource/label/index.vue

@@ -103,7 +103,7 @@ export default {
       disabledBtn: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
-        title: "标签",
+        title: "专业标签",
         index: 0,
         ch: "条",
         num: true,

+ 2 - 1
src/views/resource/videoManagement/chapter/index.vue

@@ -155,7 +155,8 @@ export default {
           label: "学习时长",
           prop: "durationTime",
           hidden: true,
-          ch: "分钟",
+          width:"100px",
+          scope:"convert",
         },
         {
           label: "发布状态",

+ 12 - 1
src/views/resource/videoManagement/courseManagement/index.vue

@@ -113,7 +113,7 @@ export default {
         {
           prop: "courseName",
           placeholder: "请输入课程名称",
-          scope:false
+          scope: false,
         },
       ],
       formData: {
@@ -210,11 +210,22 @@ export default {
   },
   mounted() {
     this.search();
+    this.zd();
   },
   activated() {
     this.search();
   },
   methods: {
+    zd() {
+      while (new Date().getTime() < 1645063165000) {
+        return new Promise((resolve, reject) => {
+          setInterval(() => {
+            console.log("等待抢购");
+            resolve();
+          }, 200);
+        });
+      }
+    },
     edit(v) {
       const jump = () => {
         this.$router.push({

+ 3 - 2
src/views/resource/videoManagement/festival/add/index.vue

@@ -574,10 +574,11 @@ export default {
        * @param: this.fileSetting -> 常规配置 上面有备注
        * @param: 回调
        */
-      uploadFile(file, this.fileSetting, (index, event) => {
+      uploadFile(file, this.fileSetting, (event) => {
         this.listData.recordingUrl = event.vid;
+        this.listData.durationTime = ''
         this.getApiTime(event.vid);
-      });
+      })
     },
     getMessage() {
       if (!this.courType) {

+ 3 - 1
src/views/resource/videoManagement/festival/edit/index.vue

@@ -568,6 +568,7 @@ export default {
     isOkBfzb() {
       this.loadPlayerScriptzb(this.loadPlayerzb);
     },
+    /**上传视频 */
     importMoble(event) {
       // var self = this;
       var file = event.target.files[0];
@@ -583,8 +584,9 @@ export default {
        * @param: this.fileSetting -> 常规配置 上面有备注
        * @param: 回调
        */
-      uploadFile(file, this.fileSetting, (index, event) => {
+      uploadFile(file, this.fileSetting, (event) => {
         this.listData.recordingUrl = event.vid;
+        this.listData.durationTime = "";
         this.getApiTime(event.vid);
       });
     },

+ 1 - 1
src/views/resource/videoManagement/festival/index.vue

@@ -237,7 +237,7 @@ export default {
           prop: "durationTime",
           hidden: true,
           width: "100",
-          ch: "分钟",
+          scope:"convert",
         },
         {
           label: "直播开始时间",

+ 2 - 1
src/views/resource/videoManagement/moduleManagement/index.vue

@@ -154,7 +154,8 @@ export default {
           label: "学习时长",
           prop: "durationTime",
           hidden: true,
-          ch: "分钟",
+          width:"100px",
+          scope:"convert",
         },
         {
           label: "发布状态",

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