Tang 2 년 전
부모
커밋
f5f2a4e33b
71개의 변경된 파일4117개의 추가작업 그리고 755개의 파일을 삭제
  1. 14 0
      .env.pre
  2. 2 5
      .env.staging
  3. 1 0
      .gitignore
  4. BIN
      dist.rar
  5. 2 0
      package.json
  6. 14 3
      src/components/Study/StudentInfo.vue
  7. 1 7
      src/layout/components/Navbar.vue
  8. 2 0
      src/main.js
  9. 16 16
      src/mixin/fpFile.js
  10. 8 0
      src/newApi/applicationData.js
  11. 8 3
      src/newApi/classTab.js
  12. 16 0
      src/newApi/examapply.js
  13. 9 0
      src/newApi/goods.js
  14. 8 0
      src/newApi/systemRemind.js
  15. 39 28
      src/permission.js
  16. 0 2
      src/store/modules/user.js
  17. 60 0
      src/utils/compress.js
  18. 5 1
      src/utils/methodsTool.js
  19. 1 1
      src/utils/request.js
  20. 74 73
      src/utils/spotCheck.js
  21. 5 1
      src/utils/uploadFile.js
  22. 1 1
      src/views/2Cport/adSlotManagement/tab1.vue
  23. 2 2
      src/views/2Cport/adSlotManagement/tab2.vue
  24. 5 2
      src/views/Marketing/goods/commodityManageMent/add/courseContent/courseCheck.vue
  25. 20 1
      src/views/Marketing/goods/commodityManageMent/add/index.vue
  26. 43 27
      src/views/Marketing/goods/commodityManageMent/add/productInformation.vue
  27. 11 5
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/handoutView.vue
  28. 72 26
      src/views/Marketing/goods/commodityManageMent/edit/courseContent/index.vue
  29. 23 1
      src/views/Marketing/goods/commodityManageMent/edit/index.vue
  30. 41 28
      src/views/Marketing/goods/commodityManageMent/edit/productInformation.vue
  31. 1 1
      src/views/Marketing/goods/commodityManageMent/index.vue
  32. 77 30
      src/views/Marketing/order/bill/index.vue
  33. 6 0
      src/views/classHoursReview/component/ChapterTable.vue
  34. 12 3
      src/views/classHoursReview/component/LessonTable.vue
  35. 136 83
      src/views/classHoursReview/component/StudyTables.vue
  36. 13 13
      src/views/classHoursReview/studyTimes.vue
  37. 2 33
      src/views/education/classManageMent/classHours/index.vue
  38. 7 2
      src/views/education/classManageMent/classHoursReview/component/ChapterTable.vue
  39. 12 1
      src/views/education/classManageMent/classHoursReview/component/LessonTable.vue
  40. 89 37
      src/views/education/classManageMent/classHoursReview/component/StudyTables.vue
  41. 7 2
      src/views/education/classManageMent/classHoursReview/studyTimes.vue
  42. 1 1
      src/views/education/classManageMent/classList/index.vue
  43. 1 2
      src/views/education/classManageMent/classList/manageClass/baseInfo.vue
  44. 2 0
      src/views/education/classManageMent/hoursTimesRecord/index.vue
  45. 3 34
      src/views/education/classManageMent/learningHoursRecordList/index.vue
  46. 5 3
      src/views/education/classManageMent/learningHoursRecordListMonth/index.vue
  47. 2 34
      src/views/education/classManageMent/listOfhoursToBeReviewed/index.vue
  48. 1054 0
      src/views/education/dataReview/dataConfigSeven/index.vue
  49. 23 19
      src/views/education/dataReview/informationTemplate/index.vue
  50. 113 2
      src/views/education/examManagement/applicationData/asPlanned.vue
  51. 326 0
      src/views/education/examManagement/applicationData/goodsListOpen.vue
  52. 2 5
      src/views/index.vue
  53. 12 1
      src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue
  54. 7 1
      src/views/resource/bankManagement/testPaperManagement/addPaper/topicAddPaper/index.vue
  55. 12 0
      src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue
  56. 21 9
      src/views/resource/bankManagement/testPaperManagement/editPaper/topicEditPaper/index.vue
  57. 12 4
      src/views/resource/handoutManagement/handoutList/add/index.vue
  58. 10 5
      src/views/resource/handoutManagement/handoutList/edit/index.vue
  59. 11 0
      src/views/resource/videoManagement/chapter/add/index.vue
  60. 10 0
      src/views/resource/videoManagement/chapter/edit/index.vue
  61. 18 2
      src/views/resource/videoManagement/courseManagement/chapterContent/index.vue
  62. 403 0
      src/views/secondBuild/completionList/index.vue
  63. 846 0
      src/views/secondBuild/courseList/index.vue
  64. 344 0
      src/views/secondBuild/learningList/index.vue
  65. 2 33
      src/views/secondJian/completionList/index.vue
  66. 1 32
      src/views/secondJian/learningList/index.vue
  67. 2 33
      src/views/secondSeven/completionList/index.vue
  68. 1 32
      src/views/secondSeven/learningList/index.vue
  69. 2 33
      src/views/secondZao/completionList/index.vue
  70. 1 32
      src/views/secondZao/learningList/index.vue
  71. 5 0
      vue.config.js

+ 14 - 0
.env.pre

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

+ 2 - 5
.env.staging

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

+ 1 - 0
.gitignore

@@ -10,6 +10,7 @@ yarn-error.log*
 tests/**/coverage/
 tests/e2e/reports
 selenium-debug.log
+/dist.rar
 
 # Editor directories and files
 .idea

BIN
dist.rar


+ 2 - 0
package.json

@@ -9,6 +9,7 @@
     "dev": "vue-cli-service serve",
     "build:prod": "vue-cli-service build --mode production",
     "build:stage": "vue-cli-service build --mode staging",
+    "build:pre": "vue-cli-service build --mode pre",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src"
   },
@@ -46,6 +47,7 @@
     "core-js": "3.8.1",
     "echarts": "4.9.0",
     "element-ui": "^2.15.13",
+    "exif-js": "^2.3.0",
     "file-saver": "^2.0.5",
     "fuse.js": "6.4.3",
     "gsap": "^3.11.4",

+ 14 - 3
src/components/Study/StudentInfo.vue

@@ -9,7 +9,9 @@
           <!-- <span v-if="item.key != 'num' && item.key != 'time'">{{
             userData[item.key]
           }}</span> -->
-          <span v-if="item.key == 'goodsName'">{{ userData[item.key] }}</span>
+          <span v-if="item.key == 'officialName'">{{
+            userData[item.key]
+          }}</span>
           <span v-else-if="item.key == 'className'">{{
             userData[item.key]
           }}</span>
@@ -34,7 +36,9 @@
           <span v-else-if="item.key == 'time'"
             >{{ $methodsTools.onlyForma(totalTimes[0]) }} -
             {{ $methodsTools.onlyForma(totalTimes[1]) }}</span
-          >
+          ><span v-else>{{
+            userData[item.key]
+          }}</span>
         </span>
       </div>
 
@@ -48,7 +52,7 @@
         <li>学员编码:{{ userData.studentCode }}</li>
         <li>学员姓名:{{ userData.realName }}</li>
         <li>学员身份证号码:{{ userData.idCard }}</li>
-        <li>绑定手机号码:{{ userData.telPhone }}</li>
+        <!-- <li>绑定手机号码:{{ userData.telPhone }}</li> -->
       </ul>
       <div class="img_by">
         <div class="photoSty1">
@@ -161,8 +165,15 @@ export default {
       ) {
         list.push({ label: "班级有效期:", key: "classTimes" });
       }
+      if(this.userData.sevenYear){
+        list.unshift({ label: "学习年份:", key: "sevenYear" });
+      }
       if (this.all) {
         list.unshift({ label: "所购商品:", key: "goodsName" });
+      } else {
+        if (this.userData.fullName !== "考前培训施工现场专业人员七大员") {
+          list.splice(1, 0, { label: "班号:", key: "officialName" });
+        }
       }
       return list;
     },

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

@@ -65,7 +65,6 @@
         </el-tooltip>
       </template>
       <el-dropdown
-        v-if="!spotDataStatus"
         class="avatar-container right-menu-item hover-effect"
         trigger="click"
       >
@@ -161,7 +160,6 @@ export default {
       dialog_haveRead: false,
       tableData: [], //未读列表
       total: 0, //未读数量
-      spotDataStatus: false,
     };
   },
   computed: {
@@ -184,11 +182,7 @@ export default {
     },
   },
   mounted() {
-    this.spotDataStatus = sessionStorage.getItem("spotData") ? true : false;
-    if (
-      this.$route.name !== "StationLetter" &&
-      !sessionStorage.getItem("spotData")
-    ) {
+    if (this.$route.name !== "StationLetter") {
       this.$api.inquireinformsys_userinformUnReadSum().then((res) => {
         if (res.data > 0) {
           this.getDontReadList();

+ 2 - 0
src/main.js

@@ -14,6 +14,7 @@ import store from './store'
 import api from '@/api/api'
 import gsap from 'gsap'
 import upload from '@/utils/uploadFile'
+import {checkSession} from '@/utils/spotCheck'
 import router from './router'
 import directive from './directive' //directive
 import plugins from './plugins' // plugins
@@ -58,6 +59,7 @@ Vue.prototype.$upload = upload
 Vue.prototype.$methodsTools = methodsTools
 Vue.prototype.$bus = bus
 Vue.prototype.gsap = gsap
+Vue.prototype.checkSession = checkSession
 
 // 全局组件挂载
 Vue.component('DictTag', DictTag)

+ 16 - 16
src/mixin/fpFile.js

@@ -125,7 +125,7 @@ function checkMd5(md5, file) {
  * @param {*} vm 虚拟 dom 指向组件 this
  * @returns {Promise}
  */
-function PostFile(file, i, md5, vm) {
+function PostFile(timeSign,file, i, md5, vm) {
     const name = file.name // 文件名
     const size = file.size // 总大小
     const shardCount = Math.ceil(size / CHUNK_SIZE) // 总片数
@@ -136,7 +136,7 @@ function PostFile(file, i, md5, vm) {
     const start = i * CHUNK_SIZE
     const end = start + CHUNK_SIZE
     const packet = file.slice(start, end) // 将文件进行切片
-    const param = { "shardCount": shardCount, "name": name, "index": i + 1, "fileSign": md5, "fileMd5": md5 }
+    const param = { "timeSign": timeSign, "shardCount": shardCount, "name": name, "index": i + 1, "fileSign": md5, "fileMd5": md5 }
     /*  构建form表单进行提交  */
     const form = new FormData()
     form.append('file', packet) // slice方法用于切出文件的一部分
@@ -172,15 +172,15 @@ function PostFile(file, i, md5, vm) {
  * @param {*} fileSize 文件大小
  * @returns {Promise}
  */
-function merge(fileMd5, name) {
-    return new Promise((resolve,reject) => {
-        handoutApi.commonmergefile({ fileMd5, name}).then(res => {
-            if(res.code === 200){
+function merge(timeSign, fileMd5, name) {
+    return new Promise((resolve, reject) => {
+        handoutApi.commonmergefile({ timeSign, fileMd5, name }).then(res => {
+            if (res.code === 200) {
                 resolve(true)
-            }else{
+            } else {
                 resolve(false)
             }
-        }).catch(()=>{
+        }).catch(() => {
             resolve(false)
         })
     })
@@ -201,7 +201,7 @@ export default {
          * @param {*} file 文件
          * @returns {Object} 包含成功的文件地址、名称等
         */
-        async chunksUpload(file) {
+        async chunksUpload(file, timeSign) {
             this.chunks = []
             // step1 获取文件切片
             const initChunks = createFileChunk(file)
@@ -225,7 +225,7 @@ export default {
             //   }
 
             // step4 如果文件未传成功,执行切片上传
-            const { uploadedList } = await PostFile(file, 0, md5, this)
+            const { uploadedList } = await PostFile(timeSign, file, 0, md5, this)
             // todo 方法1:逐次发送请求
             // const requestList = [] // 请求集合
             // initChunks.forEach(async (chunk, index) => {
@@ -273,18 +273,18 @@ export default {
             const requestList = initChunks.map(async (chunk, index) => {
                 // 过滤掉已上传的切片
                 if (uploadedList.indexOf(md5 + '_' + (index + 1)) < 0) {
-                    return PostFile(file, index, md5, this)
+                    return PostFile(timeSign, file, index, md5, this)
                 }
             })
             return Promise.all(requestList)
-                .then(async() => {
-                    const res = await merge(md5, file.name, md5)
-                    console.log(res,"-------res")
-                    return {status:res,md5}
+                .then(async () => {
+                    const res = await merge(timeSign, md5, file.name, md5)
+                    console.log(res, "-------res")
+                    return { status: res, md5 }
                 })
                 .catch(() => {
                     this.$message.error('出错了,请稍后重试!')
-                    return {status:false,md5}
+                    return { status: false, md5 }
                 })
         },
 

+ 8 - 0
src/newApi/applicationData.js

@@ -72,6 +72,14 @@ export default {
             params: data
         })
     },
+    //七大员题库商品开通
+    orderquestionopen(data) {
+        return request({
+            url: '/order/question/open',
+            method: 'post',
+            data
+        })
+    },
     //导出新增预约模板
     inquiresystemsubscribeexportNew(data) {
         return request({

+ 8 - 3
src/newApi/classTab.js

@@ -72,6 +72,14 @@ export default {
             params: data
         })
     },
+    //查询班级列表-s
+    inquireGradegradesearchList(data) {
+        return request({
+            url: '/grade/grade/search/list',
+            method: 'get',
+            params: data
+        })
+    },
     //查询班级学员列表
     inquireGradegradelistGrade(data) {
         return request({
@@ -189,9 +197,6 @@ export default {
         return request({
             url: '/grade/grade/listPeriodAuditStatus',
             method: 'get',
-            headers: {
-                isToken: false,
-            },
             params: data
         })
     },

+ 16 - 0
src/newApi/examapply.js

@@ -149,4 +149,20 @@ export default {
             data
         })
     },
+    //七大员学员资料导出
+    systemapplyuserprofileexport(data) {
+        return request({
+            url: '/system/apply/user/profile/export',
+            method: 'post',
+            data
+        })
+    },
+    //七大员学员资料批量变更
+    systemapplyuserprofile(data) {
+        return request({
+            url: '/system/apply/user/profile',
+            method: 'post',
+            data
+        })
+    },
 }

+ 9 - 0
src/newApi/goods.js

@@ -179,4 +179,13 @@ export default {
             data
         })
     },
+    //商品修改-复制讲义
+    goodshandoutscopyadd(data) {
+        return request({
+            url: '/goods/handouts/copy/add',
+            method: 'post',
+            data
+        })
+    },
+    
 }

+ 8 - 0
src/newApi/systemRemind.js

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

+ 39 - 28
src/permission.js

@@ -4,12 +4,12 @@ import { MessageBox, Message } from 'element-ui'
 import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import methods from '@/utils/methodsTool';
-import { getToken } from '@/utils/auth'
+import { getToken, setToken } from '@/utils/auth'
 import { checkSession, spotCheckFunc } from '@/utils/spotCheck'
 import $api from "@/api/api"
 
 NProgress.configure({ showSpinner: false })
-
+let spotCheckData = {}
 const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
 router.beforeEach(async (to, from, next) => {
   if (to.path !== from.path) {
@@ -30,27 +30,46 @@ router.beforeEach(async (to, from, next) => {
     }
   }
   //监管人员抽查处理
-  if (to.path.includes('/spotCheck')) {
+  if (to.path.includes('/spotCheck') || to.path.includes('/spotCheck2')) {
     let array = to.path.split('/').filter(i => !!i)
     sessionStorage.TenantId = array[1]
     if (to.query.data) {
       to.query.data = to.query.data.replace(/\s/g, '+')
       store.dispatch('FedLogOut')
       await new Promise((resolve) => {
-        $api.commonfreedecryptOfficialInfo({ data: to.query.data }).then(res => {
+        let url = ''
+        switch (array[0]) {
+          case "spotCheck":
+            url = 'commonfreedecryptOfficialInfo'
+            break;
+          case "spotCheck2":
+            url = 'commonfreedecryptSevenOfficialInfo'
+            break;
+
+          default:
+            break;
+        }
+        $api[url]({ data: to.query.data }).then(res => {
           let data = {
-            type: res.data.gradeType,
             userId: res.data.userId,
             realName: res.data.realName,
             id: res.data.gradeId,
             className: res.data.className,
             goodsId: res.data.goodsId,
             goodsName: res.data.goodsName,
-            fullName:res.data.fullName,
-            keyId: `${res.data.userId}-${res.data.goodsId}-${res.data.gradeId}`,
+            orderGoodsId:res.data.orderGoodsId,
+            fullName: res.data.fullName,
+            token: res.data.token,
+            keyId: `${res.data.userId}-${res.data.goodsId}-${res.data.gradeId}-${res.data.orderGoodsId}`,
           };
-          sessionStorage.spotData = JSON.stringify(data)
+          setToken(data.token)
+          store.commit('SET_TOKEN', data.token)
+          spotCheckData = data
           resolve()
+        }).catch(() => {
+          Message.error("数据错误,解析失败")
+          store.dispatch('FedLogOut')
+          next(`/login?TenantId=${sessionStorage.TenantId}`)
         })
       })
     }
@@ -72,7 +91,18 @@ router.beforeEach(async (to, from, next) => {
           store.dispatch('GenerateRoutes').then(accessRoutes => {
             // 根据roles权限生成可访问的路由表
             router.addRoutes(accessRoutes) // 动态添加可访问路由表
-            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+            if (to.path.includes('/spotCheck')) {
+              checkSession(spotCheckData)
+                .then(() => {
+                  //学时审核
+                  next({ path: '/classHoursReviews', replace: true })
+                })
+                .catch(() => {
+                  Message.error("存在异常,请联系开发人员")
+                });
+            } else {
+              next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+            }
           })
         }).catch(err => {
           store.dispatch('LogOut').then(() => {
@@ -92,25 +122,6 @@ router.beforeEach(async (to, from, next) => {
     if (whiteList.indexOf(to.path) !== -1) {
       // 在免登录白名单,直接进入
       next()
-    } else if (sessionStorage.getItem('spotData')) {
-      if (store.state.permission.addRoutes.length === 0) {
-        let li = JSON.parse(sessionStorage.getItem('spotData'))
-        spotCheckFunc(li)
-        if (to.path.includes('/spotCheck') && sessionStorage.getItem('TenantId')) {
-          checkSession(li)
-            .then(() => {
-              //学时审核
-              next({ path: '/classHoursReviews', replace: true })
-            })
-            .catch(() => {
-              this.$message.error("存在异常,请联系开发人员");
-            });
-        } else {
-          next({ ...to, replace: true })
-        }
-      } else {
-        next() // hack方法 确保addRoutes已完成
-      }
     } else {
       if (sessionStorage.TenantId == undefined) {
         next(`/login`) // 否则全部重定向到登录页

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

@@ -116,7 +116,6 @@ const user = {
         login(username, password, code, uuid, phonenumber, smsCode).then(res => {
           setToken(res.token)
           commit('SET_TOKEN', res.token)
-          sessionStorage.removeItem('spotData')
           resolve()
         }).catch(error => {
           reject(error)
@@ -155,7 +154,6 @@ const user = {
           commit('SET_ROLES', [])
           commit('SET_PERMISSIONS', [])
           sessionStorage.removeItem('TenantId')
-          sessionStorage.removeItem('spotData')
           removeToken()
           resolve()
         }).catch(error => {

+ 60 - 0
src/utils/compress.js

@@ -0,0 +1,60 @@
+// 压缩前将file转换成img对象
+export const readImg = (file) => {
+  return new Promise((resolve, reject) => {
+    const img = new Image()
+    const reader = new FileReader()
+    reader.onload = function (e) {
+      img.src = e.target.result
+    }
+    reader.onerror = function (e) {
+      reject(e)
+    }
+    reader.readAsDataURL(file)
+    img.onload = function () {
+      resolve(img)
+    }
+    img.onerror = function (e) {
+      reject(e)
+    }
+  })
+}
+
+/**
+ * 压缩图片
+ *@param img 被压缩的img对象
+* @param type 压缩后转换的文件类型
+* @param mx 触发压缩的图片最大宽度限制
+* @param mh 触发压缩的图片最大高度限制
+*/
+export const compressImg = (img, type, mx, mh) => {
+  return new Promise((resolve, reject) => {
+    const canvas = document.createElement('canvas')
+    const context = canvas.getContext('2d')
+    const { width: originWidth, height: originHeight } = img
+    // 最大尺寸限制
+    const maxWidth = mx
+    const maxHeight = mh
+    // 目标尺寸
+    let targetWidth = originWidth
+    let targetHeight = originHeight
+    if (originWidth > maxWidth || originHeight > maxHeight) {
+      if (originWidth / originHeight > 1) {
+        // 宽图片
+        targetWidth = maxWidth
+        targetHeight = Math.round(maxWidth * (originHeight / originWidth))
+      } else {
+        // 高图片
+        targetHeight = maxHeight
+        targetWidth = Math.round(maxHeight * (originWidth / originHeight))
+      }
+    }
+    canvas.width = targetWidth
+    canvas.height = targetHeight
+    context.clearRect(0, 0, targetWidth, targetHeight)
+    // 图片绘制
+    context.drawImage(img, 0, 0, targetWidth, targetHeight)
+    canvas.toBlob(function (blob) {
+      resolve(blob)
+    }, type || 'image/png')
+  })
+}

+ 5 - 1
src/utils/methodsTool.js

@@ -28,7 +28,11 @@ export default {
 			{
 				label: "讲义资料",
 				value: 8,
-			},]
+			},
+			{
+				label: "其他题库",
+				value: 9,
+			}]
 		if (status) {
 			return type
 		} else {

+ 1 - 1
src/utils/request.js

@@ -15,7 +15,7 @@ const service = axios.create({
   baseURL: baseURL,
   // 超时
   timeout: 600000
-})
+}) 
 // request拦截器
 service.interceptors.request.use(config => {
   // 是否需要设置 token

+ 74 - 73
src/utils/spotCheck.js

@@ -22,41 +22,41 @@ let spotRouter = [{
         "noCache": false
     },
     "children": [
-    //     {
-    //     "menuId": 11219,
-    //     "name": "CourseListJian",
-    //     "path": "courseListJian",
-    //     "hidden": false,
-    //     "component": "secondJian/courseList",
-    //     "meta": {
-    //         "title": "课程列表",
-    //         "icon": "#",
-    //         "noCache": false
-    //     }
-    // }, 
-    {
-        "menuId": 11222,
-        "name": "CompletionListJian",
-        "path": "completionListJian",
-        "hidden": false,
-        "component": "secondJian/completionList",
-        "meta": {
-            "title": "完成列表",
-            "icon": "#",
-            "noCache": false
-        }
-    }, {
-        "menuId": 11223,
-        "name": "LearningListJian",
-        "path": "learningListJian",
-        "hidden": false,
-        "component": "secondJian/learningList",
-        "meta": {
-            "title": "学习列表",
-            "icon": "#",
-            "noCache": false
-        }
-    }]
+        {
+            "menuId": 11219,
+            "name": "CourseListJian",
+            "path": "courseListJian",
+            "hidden": false,
+            "component": "secondJian/courseList",
+            "meta": {
+                "title": "课程列表",
+                "icon": "#",
+                "noCache": false
+            }
+        },
+        {
+            "menuId": 11222,
+            "name": "CompletionListJian",
+            "path": "completionListJian",
+            "hidden": false,
+            "component": "secondJian/completionList",
+            "meta": {
+                "title": "完成列表",
+                "icon": "#",
+                "noCache": false
+            }
+        }, {
+            "menuId": 11223,
+            "name": "LearningListJian",
+            "path": "learningListJian",
+            "hidden": false,
+            "component": "secondJian/learningList",
+            "meta": {
+                "title": "学习列表",
+                "icon": "#",
+                "noCache": false
+            }
+        }]
 }, {
     "menuId": 11221,
     "name": "SecondZao",
@@ -71,41 +71,41 @@ let spotRouter = [{
         "noCache": false
     },
     "children": [
-    //     {
-    //     "menuId": 11224,
-    //     "name": "CourseListZao",
-    //     "path": "courseListZao",
-    //     "hidden": false,
-    //     "component": "secondZao/courseList",
-    //     "meta": {
-    //         "title": "课程列表",
-    //         "icon": "#",
-    //         "noCache": false
-    //     }
-    // },
-     {
-        "menuId": 11225,
-        "name": "CompletionListZao",
-        "path": "completionListZao",
-        "hidden": false,
-        "component": "secondZao/completionList",
-        "meta": {
-            "title": "完成列表",
-            "icon": "#",
-            "noCache": false
-        }
-    }, {
-        "menuId": 11226,
-        "name": "LearningListZao",
-        "path": "learningListZao",
-        "hidden": false,
-        "component": "secondZao/learningList",
-        "meta": {
-            "title": "学习列表",
-            "icon": "#",
-            "noCache": false
-        }
-    }]
+        {
+            "menuId": 11224,
+            "name": "CourseListZao",
+            "path": "courseListZao",
+            "hidden": false,
+            "component": "secondZao/courseList",
+            "meta": {
+                "title": "课程列表",
+                "icon": "#",
+                "noCache": false
+            }
+        },
+        {
+            "menuId": 11225,
+            "name": "CompletionListZao",
+            "path": "completionListZao",
+            "hidden": false,
+            "component": "secondZao/completionList",
+            "meta": {
+                "title": "完成列表",
+                "icon": "#",
+                "noCache": false
+            }
+        }, {
+            "menuId": 11226,
+            "name": "LearningListZao",
+            "path": "learningListZao",
+            "hidden": false,
+            "component": "secondZao/learningList",
+            "meta": {
+                "title": "学习列表",
+                "icon": "#",
+                "noCache": false
+            }
+        }]
 }, {
     "menuId": 11227,
     "path": "/",
@@ -147,17 +147,18 @@ export function checkSession(row) {
                     return (
                         item.userId == row.userId &&
                         item.goodsId == row.goodsId &&
-                        item.id == row.id
+                        item.id == row.id &&
+                        item.orderGoodsId == row.orderGoodsId
                     );
                 });
                 if (!STATUS) {
                     parseSession.options.push(row);
                 }
-                parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
+                parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}-${row.orderGoodsId}`;
                 sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
             } else {
                 let data = {
-                    activeData: `${row.userId}-${row.goodsId}-${row.id}`,
+                    activeData: `${row.userId}-${row.goodsId}-${row.id}-${row.orderGoodsId}`,
                     options: [row],
                 };
                 sessionStorage.setItem("hoursAudit", JSON.stringify(data));

+ 5 - 1
src/utils/uploadFile.js

@@ -1,13 +1,17 @@
 import api from '@/api/api'
+import {readImg,compressImg} from "./compress"
 export default {
     // 上传图片标识 0头像 1身份证 2题库 3指南指引图片 4广告图片 5身份证或学信网图片 6文件excel,word,zip等
     //file: 类似this.$refs.file.files[0]
     upload: function (file, int) {
         return new Promise((resolve, reject) => {
+            // const img = await readImg(file)
+            // const blob = await compressImg(img, file.type, 256, 256)
             var datas = {
                 imageStatus: int
             }
             api.getPolicy(datas).then(res => {
+
                 var ossToken = res.data.resultContent
                 // const filename = file.name;
                 // const fileExtension = filename.split('.').pop().toLowerCase()
@@ -17,7 +21,7 @@ export default {
                 formData.append('OSSAccessKeyId', ossToken.accessid); //accessKeyId
                 formData.append('policy', ossToken.policy); //policy
                 formData.append('Signature', ossToken.signature); //签名
-                formData.append('callback', ossToken.callback); //回调
+                // formData.append('callback', ossToken.callback); //回调
                 formData.append('success_action_status', 200); //成功后返回的操作码
                 //如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
                 formData.append("file", file);

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

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

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

@@ -152,7 +152,7 @@
               </label>
               <div style="font-size: 12px; color: #999; line-height: 17px">
                 注:请上传小于300kb,尺寸为
-                <span style="color: red">750*320</span>
+                <span style="color: red">1272*400</span>
                 的像素图片,支持jpg、jpeg、png等类型
               </div>
             </div>
@@ -347,7 +347,7 @@ export default {
         {
           label: "内部接口地址",
           value: 3,
-        }
+        },
       ],
     };
   },

+ 5 - 2
src/views/Marketing/goods/commodityManageMent/add/courseContent/courseCheck.vue

@@ -166,6 +166,10 @@ export default {
      * 提交回调数据
      */
     submitTab() {
+      if (this.activeLists.length > 1) {
+        this.$message.error("只能添加一个课程");
+        return;
+      }
       this.$message.success("添加成功");
       this.dialogVisibleTableBoxs = false;
       this.$emit("backData", this.activeLists);
@@ -196,5 +200,4 @@ export default {
 };
 </script>
 
-<style lang="less" scoped>
-</style>
+<style lang="less" scoped></style>

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

@@ -215,6 +215,7 @@ export default {
         showStatus: 1,
         externalLinkStatus: 0,
         commitPeriodStatus: 0,
+        sevenYear: "",
       },
       rules: {
         year: [
@@ -270,6 +271,21 @@ export default {
             trigger: "change",
           },
         ],
+        examLimitClient: [
+          {
+            type: "array",
+            required: true,
+            message: "请选择",
+            trigger: "change",
+          },
+        ],
+        sevenYear: [
+          {
+            required: true,
+            message: "请选择七大员年份",
+            trigger: "change",
+          },
+        ],
         businessId: [
           {
             type: "number",
@@ -671,6 +687,9 @@ export default {
       //商品是否上架
       data.goodsStatus = int;
       data.subjectIds = data.subjectIds.toString();
+      if(data.goodsType == 9){
+        data.examLimitClient = data.examLimitClient.toString();
+      }
       data.projectId = await this.getProjectId(data.businessId);
       //--------------------------通用处理END------------------------------
       if (this.listData.goodsType === 1 || this.listData.goodsType === 6) {
@@ -753,7 +772,7 @@ export default {
             this.disabledBtn = false;
           });
       }
-      if (this.listData.goodsType === 8) {
+      if (this.listData.goodsType === 8 || this.listData.goodsType === 9) {
         this.$api
           .addGoodshandouts(data)
           .then((res) => {

+ 43 - 27
src/views/Marketing/goods/commodityManageMent/add/productInformation.vue

@@ -32,7 +32,7 @@
             @change="changeTypes"
           >
             <el-option
-              v-for="(item, index) in goodsTypeOptions"
+              v-for="(item, index) in $methodsTools.getGoodsType()"
               :key="index"
               :label="item.label"
               :value="item.value"
@@ -139,6 +139,16 @@
             v-model="listData.goodsName"
           ></el-input>
         </el-form-item>
+        <el-form-item label="商品试卷限制终端学习" prop="examLimitClient" v-if="listData.goodsType == 9">
+          <el-select
+            v-model="listData.examLimitClient"
+            multiple
+            placeholder="请选择"
+          >
+            <el-option label="公众号" value="1"></el-option
+            ><el-option label="小程序" value="2"> </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="是否外链商品" prop="externalLinkStatus">
           <el-radio-group
             v-model="listData.externalLinkStatus"
@@ -155,6 +165,19 @@
             @change="judgeUrl"
           ></el-input>
         </el-form-item>
+        <el-form-item
+          label="七大员继教可选年份"
+          prop="sevenYear"
+          v-if="showSevenStatus && listData.goodsType == 1"
+        >
+          <el-date-picker
+            v-model="listData.sevenYear"
+            type="year"
+            value-format="yyyy"
+            placeholder="请选择年份"
+          >
+          </el-date-picker>
+        </el-form-item>
         <el-form-item
           :key="listData.goodsType ? listData.goodsType : 10"
           label="学时"
@@ -230,37 +253,12 @@ export default {
           value: 3,
         },
       ],
-      goodsTypeOptions: [
-        {
-          label: "视频",
-          value: 1,
-        },
-        {
-          label: "题库",
-          value: 2,
-        },
-        {
-          label: "补考",
-          value: 3,
-        },
-        {
-          label: "前培",
-          value: 4,
-        },
-        {
-          label: "直播",
-          value: 6,
-        },
-        {
-          label: "讲义资料",
-          value: 8,
-        },
-      ], //商品类型
       newCourTypeOptions: [], //业务层次
       newSchoolOption: [], //院校
       newMajorOption: [], //专业
       newSubjectOption: [], //科目
       inputWidth: 217,
+      showSevenStatus: false, //七大员可选年份--显示状态
     };
   },
   watch: {
@@ -283,6 +281,7 @@ export default {
       this.$set(this.listData, "handoutsId", "");
       this.$set(this.listData, "handoutsName", "");
       this.$set(this.listData, "handoutsCode", "");
+      this.$set(this.listData, "sevenYear", "");
       this.$bus.$emit("sendBybus");
       this.$bus.$emit("sendBybusBank");
       if (val) {
@@ -295,10 +294,26 @@ export default {
         }
       }
       this.setListDataBusinessName(val);
+      this.showSeven(val);
     },
   },
   computed: { ...mapGetters(["paysupply", "educationType"]) },
   methods: {
+    showSeven(val) {
+      if (!val) {
+        this.showSevenStatus = false;
+      } else {
+        let data = this.newCourTypeOptions.find((i) => i.id == val);
+        if (
+          data.educationName === "继续教育" &&
+          data.projectName === "施工现场专业人员"
+        ) {
+          this.showSevenStatus = true;
+        } else {
+          this.showSevenStatus = false;
+        }
+      }
+    },
     //根据业务层级提前设置拍照配置
     setListDataBusinessName(val) {
       new Promise((resolve, reject) => {
@@ -362,6 +377,7 @@ export default {
      */
     changeTypes(val) {
       this.$set(this.listData, "gradeType", ""); //班级类型
+      this.$set(this.listData, "sevenYear", ""); //七大员继教可选年份
       this.$set(this.listData, "examNumber", "0"); //考试次数
       this.$set(this.listData, "doNumber", "0"); //刷题次数
       this.$set(this.listData, "studyCount", "1"); //学习次数

+ 11 - 5
src/views/Marketing/goods/commodityManageMent/edit/courseContent/handoutView.vue

@@ -27,6 +27,7 @@
         ></i>
       </div>
       <span slot="footer" class="dialog-footer">
+        <el-button @click="copyHandout" v-if="handoutsIdTable" type="success">复 制</el-button>
         <el-button @click="aboutJYBox = false">取 消</el-button>
         <el-button type="primary" @click="submitJYs">确 定</el-button>
       </span>
@@ -52,7 +53,7 @@
       <div style="margin-bottom: 10px">
         <!-- 搜索框 -->
         <el-input
-          style="width: 230px;margin-right:10px;"
+          style="width: 230px; margin-right: 10px"
           :size="size"
           v-model="formData['key']"
           placeholder="请输入讲义标题/讲义编码"
@@ -170,7 +171,7 @@ export default {
   components: { pagination },
   data() {
     return {
-      size:"small",
+      size: "small",
       aboutJYBox: false,
       handoutsName: "", //讲义名称
       handoutsIdTable: "",
@@ -194,14 +195,19 @@ export default {
     };
   },
   methods: {
+    copyHandout() {
+      this.$emit("handoutCopy", 2);
+    },
     /**
      * 初始化
      */
     openBox(id) {
       if (id && !this.handoutsName) {
-        this.$api.inquireCourseHandoutsfiledetail({handoutsId:id}).then((res) => {
-          this.handoutsName = res.data.handoutsName;
-        });
+        this.$api
+          .inquireCourseHandoutsfiledetail({ handoutsId: id })
+          .then((res) => {
+            this.handoutsName = res.data.handoutsName;
+          });
       }
       this.handoutsIdTable = id;
       this.aboutJYBox = true;

+ 72 - 26
src/views/Marketing/goods/commodityManageMent/edit/courseContent/index.vue

@@ -141,7 +141,7 @@
             >分享</el-button
           ><el-button
             type="text"
-            @click="handelCopy(scope.row)"
+            @click="handelCopy(scope.row, 1)"
             v-if="copyShowStatus"
             >复制</el-button
           >
@@ -162,14 +162,18 @@
     <play-photo ref="playPhoto" @backData="backPlayPhotoData" />
     <share ref="share" />
     <every-day-study-num ref="everyDayStudyNum" @backData="backEveryDaySet" />
-    <handout-view ref="handoutView" @backData="backHandoutView" />
+    <handout-view
+      ref="handoutView"
+      @backData="backHandoutView"
+      @handoutCopy="handoutCopy"
+    />
     <Base-dialog
       title="商品复制机构选择"
       :isShow.sync="dialogCopyVisible"
       @submit="goodsCopy"
       :disabledBtn="copyLoading"
     >
-      <el-radio-group v-model="tenantId">
+      <el-radio-group v-model="tenantId" v-if="CopyType === 1">
         <el-radio
           style="display: block; margin-bottom: 10px"
           :label="item.tenantId"
@@ -178,6 +182,14 @@
           >{{ item.tenantName }}</el-radio
         >
       </el-radio-group>
+      <el-checkbox-group v-model="tenantIdList" v-if="CopyType === 2">
+        <el-checkbox
+          :label="item.tenantId"
+          v-for="item in tenantList"
+          :key="item.tenantId"
+          >{{ item.tenantName }}</el-checkbox
+        >
+      </el-checkbox-group>
     </Base-dialog>
   </div>
 </template>
@@ -209,7 +221,9 @@ export default {
       copyLoading: false,
       activeKeyId: [],
       activeKeyType: "",
-      tenantId: "",
+      CopyType: 1,
+      tenantId: "", //单选
+      tenantIdList: [], //多选
       tenantList: [],
       tableSetVideo: [
         { label: "排序", prop: "sort", scope: "inputs", width: "100" },
@@ -255,8 +269,11 @@ export default {
     },
   },
   computed: {
-    copyShowStatus(){
-      return this.listData.goodsType === 1 && sessionStorage.getItem('TenantId') == '867735392558919680'
+    copyShowStatus() {
+      return (
+        this.listData.goodsType === 1 &&
+        sessionStorage.getItem("TenantId") == "867735392558919680"
+      );
     },
     compayTypes: function () {
       return function (array) {
@@ -286,33 +303,62 @@ export default {
     });
   },
   methods: {
-    handelCopy(item) {
+    handelCopy(item, type) {
+      //type 1 课程复制 2讲义复制
+      this.CopyType = type;
       this.activeKeyId = item.keyId.split("-").map(Number);
       this.activeKeyType = item.type;
       this.tenantId = "";
+      this.tenantIdList = [];
+      this.copyLoading = false;
+      this.dialogCopyVisible = true;
+    },
+    handoutCopy(type) {
+      //type 1 课程复制 2讲义复制
+      this.CopyType = type;
+      this.tenantIdList = [];
       this.copyLoading = false;
       this.dialogCopyVisible = true;
     },
     goodsCopy() {
-      var data = {
-        tenantId: [this.tenantId],
-        goodsId: this.$route.query.id,
-        courseId: this.activeKeyId[0] || undefined,
-        modelId: this.activeKeyId[1] || undefined,
-        chapterId: this.activeKeyId[2] || undefined,
-        sectionId: this.activeKeyId[3] || undefined,
-        type: this.activeKeyType + 1,
-      };
-      this.copyLoading = true;
-      this.$api
-        .goodsnodecopyadd(JSON.parse(JSON.stringify(data)))
-        .then((res) => {
-          this.$message.success("复制成功");
-          this.dialogCopyVisible = false;
-        })
-        .finally(() => {
-          this.copyLoading = false;
-        });
+      if (this.CopyType === 1) {
+        var data = {
+          tenantId: [this.tenantId],
+          goodsId: this.$route.query.id,
+          courseId: this.activeKeyId[0] || undefined,
+          modelId: this.activeKeyId[1] || undefined,
+          chapterId: this.activeKeyId[2] || undefined,
+          sectionId: this.activeKeyId[3] || undefined,
+          type: this.activeKeyType + 1,
+        };
+        this.copyLoading = true;
+        this.$api
+          .goodsnodecopyadd(JSON.parse(JSON.stringify(data)))
+          .then((res) => {
+            this.$message.success("复制成功");
+            this.dialogCopyVisible = false;
+          })
+          .finally(() => {
+            this.copyLoading = false;
+          });
+      }
+      if (this.CopyType === 2) {
+        var data = {
+          tenantId: this.tenantIdList,
+          handoutsId: this.$refs.handoutView.handoutsIdTable,
+          goodsId: this.$route.query.id,
+        };
+        this.copyLoading = true;
+        this.$api
+          .goodshandoutscopyadd(data)
+          .then((res) => {
+            this.$message.success("复制成功");
+            this.dialogCopyVisible = false;
+          })
+          .finally(() => {
+            this.copyLoading = false;
+          });
+      }
     },
     /**
      * 打开分享窗口

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

@@ -307,6 +307,13 @@ export default {
             trigger: "change",
           },
         ],
+        sevenYear: [
+          {
+            required: true,
+            message: "请选择七大员年份",
+            trigger: "change",
+          },
+        ],
         schoolId: [
           {
             required: false,
@@ -362,6 +369,14 @@ export default {
             trigger: "change",
           },
         ],
+        examLimitClient: [
+          {
+            type: "array",
+            required: true,
+            message: "请选择",
+            trigger: "change",
+          },
+        ],
         standPrice: [
           {
             required: true,
@@ -723,6 +738,12 @@ export default {
         } else {
           res.data.subjectIds = [];
         }
+        //科目转数值
+        if (res.data.examLimitClient) {
+          res.data.examLimitClient = res.data.examLimitClient.split(",");
+        } else {
+          res.data.examLimitClient = [];
+        }
         //商品标准价格明细表转换
         if (res.data.standPriceJson) {
           res.data.standPriceJson = JSON.parse(res.data.standPriceJson);
@@ -899,6 +920,7 @@ export default {
         data.goodsStatus = int;
       }
       data.subjectIds = data.subjectIds.toString();
+      data.examLimitClient = data.examLimitClient.toString();
       data.projectId = await this.getProjectId(data.businessId);
       //--------------------------通用处理END------------------------------
       if (this.listData.goodsType === 1 || this.listData.goodsType === 6) {
@@ -981,7 +1003,7 @@ export default {
             this.disabledBtn = false;
           });
       }
-      if (this.listData.goodsType === 8) {
+      if (this.listData.goodsType === 8 || this.listData.goodsType === 9) {
         this.$api
           .editGoodshandouts(data)
           .then((res) => {

+ 41 - 28
src/views/Marketing/goods/commodityManageMent/edit/productInformation.vue

@@ -33,7 +33,7 @@
             disabled
           >
             <el-option
-              v-for="(item, index) in goodsTypeOptions"
+              v-for="(item, index) in $methodsTools.getGoodsType()"
               :key="index"
               :label="item.label"
               :value="item.value"
@@ -145,7 +145,16 @@
             v-model="listData.goodsName"
           ></el-input>
         </el-form-item>
-
+        <el-form-item label="商品试卷限制终端学习" prop="examLimitClient" v-if="listData.goodsType == 9">
+          <el-select
+            v-model="listData.examLimitClient"
+            multiple
+            placeholder="请选择"
+          >
+            <el-option label="公众号" value="1"></el-option
+            ><el-option label="小程序" value="2"> </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="是否外链商品" prop="externalLinkStatus">
           <el-radio-group
             v-model="listData.externalLinkStatus"
@@ -162,6 +171,19 @@
             @change="judgeUrl"
           ></el-input>
         </el-form-item>
+        <el-form-item
+          label="七大员继教可选年份"
+          prop="sevenYear"
+          v-if="showSevenStatus && listData.goodsType == 1"
+        >
+          <el-date-picker
+            v-model="listData.sevenYear"
+            type="year"
+            value-format="yyyy"
+            placeholder="请选择年份"
+          >
+          </el-date-picker>
+        </el-form-item>
         <el-form-item
           :key="listData.goodsType ? listData.goodsType : 10"
           label="学时"
@@ -237,37 +259,12 @@ export default {
           value: 3,
         },
       ],
-      goodsTypeOptions: [
-        {
-          label: "视频",
-          value: 1,
-        },
-        {
-          label: "题库",
-          value: 2,
-        },
-        {
-          label: "补考",
-          value: 3,
-        },
-        {
-          label: "前培",
-          value: 4,
-        },
-        {
-          label: "直播",
-          value: 6,
-        },
-        {
-          label: "讲义资料",
-          value: 8,
-        },
-      ], //商品类型
       newCourTypeOptions: [], //业务层次
       newSchoolOption: [], //院校
       newMajorOption: [], //专业
       newSubjectOption: [], //科目
       inputWidth: 217,
+      showSevenStatus: false, //七大员可选年份--显示状态
     };
   },
   watch: {
@@ -376,8 +373,24 @@ export default {
         .inquirebusinessList({ status: 1, educationId: val })
         .then((res) => {
           this.newCourTypeOptions = res.rows;
+          this.showSeven(this.listData.businessId)
         });
     },
+    showSeven(val) {
+      if (!val) {
+        this.showSevenStatus = false;
+      } else {
+        let data = this.newCourTypeOptions.find((i) => i.id == val);
+        if (
+          data.educationName === "继续教育" &&
+          data.projectName === "施工现场专业人员"
+        ) {
+          this.showSevenStatus = true;
+        } else {
+          this.showSevenStatus = false;
+        }
+      }
+    },
     /**
      * 根据条件获取院校、专业列表
      */

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

@@ -39,7 +39,7 @@
       </template>
       <template slot="btn" slot-scope="props">
         <el-button
-          v-if="
+          v-if="false&&
             props.scope.row.goodsType == 1 &&
             props.scope.row.courseNum &&
             props.scope.row.courseNum > 0 &&

+ 77 - 30
src/views/Marketing/order/bill/index.vue

@@ -18,7 +18,7 @@
         <el-button type="text" @click="addClick(props.scope.row, 1)"
           >详情</el-button
         >
-        <!-- <el-button type="text" @click="addClick(props.scope.row, 2)"
+        <el-button type="text" @click="addClick(props.scope.row, 2)"
           >审核</el-button
         >
         <el-button
@@ -42,7 +42,7 @@
           type="text"
           @click="addClick(props.scope.row, 5)"
           >发票标记</el-button
-        > -->
+        >
       </template>
     </table-list>
     <pagination
@@ -151,7 +151,7 @@
     <el-dialog
       @closed="loadingClose"
       :visible.sync="billSendStatus"
-      width="530px"
+      width="730px"
       :show-close="false"
       :close-on-click-modal="false"
     >
@@ -204,7 +204,7 @@
 
               <span
                 style="font-size: 12px; margin-left: 12px; margin-right: 10px"
-                >上传文件必须为(png/jpg/jpeg)文件</span
+                >上传文件必须为(pdf/png/jpg/jpeg)文件</span
               >
               <el-button
                 v-if="billSendData.invoiceImg"
@@ -215,20 +215,20 @@
               >
             </div>
           </el-form-item>
-          <div v-if="billSendData.invoiceImg" style="text-align: center">
-            <el-image
-              style="
-                max-width: 100%;
-                padding: 20px;
-                max-height: 400px;
-                overflow: auto;
+          <div
+            v-if="billSendData.invoiceImg"
+            style="text-align: center; height: 430px"
+          >
+            <iframe
+              style="height: 100%"
+              width="690"
+              frameborder="0"
+              scrolling="auto"
+              :src="
+                'https://preview.xyyxt.net?src=' +
+                $methodsTools.splitImgHost(billSendData.invoiceImg)
               "
-              :src="$methodsTools.splitImgHost(billSendData.invoiceImg)"
-              :preview-src-list="[
-                $methodsTools.splitImgHost(billSendData.invoiceImg),
-              ]"
-            >
-            </el-image>
+            ></iframe>
           </div>
           <el-form-item label="发票代码">
             <el-input
@@ -396,14 +396,31 @@
               >
               <div v-else-if="item.scope === 'img'">
                 {{ item.label }}:
-                <el-image
-                  style="max-width: 100%; vertical-align: top"
-                  :src="$methodsTools.splitImgHost(auditData[item.prop])"
-                  :preview-src-list="[
-                    $methodsTools.splitImgHost(auditData[item.prop]),
-                  ]"
-                >
-                </el-image>
+                <div v-if="auditData[item.prop]">
+                  <p style="margin-top: 10px">
+                    <el-button
+                      size="mini"
+                      @click="
+                        openBigPage(
+                          $methodsTools.splitImgHost(auditData[item.prop])
+                        )
+                      "
+                      type="primary"
+                      >全屏预览</el-button
+                    >
+                  </p>
+
+                  <iframe
+                    width="445"
+                    scrolling="auto"
+                    frameborder="0"
+                    :src="
+                      'https://preview.xyyxt.net?src=' +
+                      $methodsTools.splitImgHost(auditData[item.prop])
+                    "
+                  ></iframe>
+                </div>
+                <span v-else>---</span>
               </div>
 
               <div v-else-if="item.scope === 'isOptions'">
@@ -441,7 +458,7 @@ export default {
       disabledBtn: false,
       loading: false, //当前表单加载是否加载动画
       navText: {
-        title: "发票申请列表",
+        title: "发票管理",
         index: 0,
         ch: "条",
         num: false,
@@ -689,6 +706,11 @@ export default {
           hidden: true,
           scope: "aTimeList",
         },
+        {
+          label: "邮箱",
+          prop: "email",
+          hidden: true,
+        },
         {
           label: "开票时间",
           prop: "makeOutTime",
@@ -740,6 +762,10 @@ export default {
           label: "发票抬头",
           prop: "invoiceTitle",
         },
+        {
+          label: "邮箱",
+          prop: "email",
+        },
         {
           label: "单位地址",
           prop: "companyAddress",
@@ -852,13 +878,30 @@ export default {
       ],
     };
   },
+  created() {},
   mounted() {
     this.search();
   },
   activated() {
     this.search();
   },
+  computed: {
+    getTypeName: function () {
+      return function (url) {
+        if (url) {
+          var type = url.toLowerCase().split(".").splice(-1);
+          if (type[0] == "pdf") {
+            return "pdf";
+          }
+        }
+        return "";
+      };
+    },
+  },
   methods: {
+    openBigPage(u) {
+      window.open(u, "_blank");
+    },
     loadingClose() {
       this.disabledBtn = false;
     },
@@ -1030,12 +1073,17 @@ export default {
         return;
       }
       if (file.size > 0.3 * 1024 * 1024) {
-        self.$message.error("图片不得大于300kb");
+        self.$message.error("文件不得大于300kb");
         return;
       }
       var type = self.$refs.file.value.toLowerCase().split(".").splice(-1);
-      if (type[0] != "jpg" && type[0] != "png" && type[0] != "jpeg") {
-        self.$message.error("上传格式需为:.jpg/.png/.jpeg");
+      if (
+        type[0] != "jpg" &&
+        type[0] != "png" &&
+        type[0] != "jpeg" &&
+        type[0] != "pdf"
+      ) {
+        self.$message.error("上传格式需为:.jpg/.png/.jpeg/.pdf");
         self.$refs.file.value = "";
         return;
       }
@@ -1204,4 +1252,3 @@ export default {
   }
 }
 </style>
-

+ 6 - 0
src/views/classHoursReview/component/ChapterTable.vue

@@ -23,6 +23,12 @@
       <el-table-column align="center" prop="realName" label="姓名">
       </el-table-column>
       <el-table-column align="center" prop="typeName" :label="label + '标题'">
+        <template slot-scope="scope">
+          {{ scope.row.typeName }}
+          <el-tag size="mini" v-if="scope.row.commonSign == 1"
+            >公共章</el-tag
+          ></template
+        >
       </el-table-column>
       <el-table-column align="center" prop="classHours" label="学时">
         <template slot-scope="scope">

+ 12 - 3
src/views/classHoursReview/component/LessonTable.vue

@@ -149,9 +149,11 @@
             {{ (scope2.row[item.prop] / 60 / 45).toFixed(2) }}
           </span>
           <span v-else-if="item.scope === 'durTime' && scope2.row.type !== 5">
-            <!-- {{ $methodsTools.secondToDate(scope2.row[item.prop], false) }} -->
-            {{ (scope2.row[item.prop] / 60).toFixed(0) || 0 }}分钟
-            <!-- {{ (scope2.row[item.prop] / 60 / 45).toFixed(2) }} -->
+            {{
+              scope2.row["type"] == 3
+                ? (scope2.row[item.prop] / 60).toFixed(0) + "分钟" || "0分钟"
+                : "分数:" + scope2.row["performance"]
+            }}
           </span>
           <span
             v-else-if="
@@ -293,6 +295,12 @@
 import CheatDialog from "./CheatDialog.vue";
 export default {
   props: {
+    setData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
     tabledata: {
       type: Array,
       default: () => {
@@ -458,6 +466,7 @@ export default {
         userId,
         goodsId,
         gradeId,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;

+ 136 - 83
src/views/classHoursReview/component/StudyTables.vue

@@ -1,97 +1,141 @@
 <template>
   <div class="studyRecordTable">
-    <div style="height: 62px;">
-    <div class="studyStyle" :class="{ 'isFixed': headerFixed }" :style="{'left':left}">
-      <div class="a_style">
-        <i></i>
-        <span>视频审核进度</span>
-        <div class="flex_style_study">
-          <div class="num_style" style="color: #0047d0">
-            待审:{{ userData.pending }}节
+    <div style="height: 62px">
+      <div
+        class="studyStyle"
+        :class="{ isFixed: headerFixed }"
+        :style="{ left: left }"
+      >
+        <div class="a_style">
+          <i></i>
+          <span>视频审核进度</span>
+          <div class="flex_style_study">
+            <div class="num_style" style="color: #0047d0">
+              待审:{{ userData.pending }}节
+            </div>
+            <div class="num_style" style="color: #e53935">
+              作弊:{{ userData.cheat }}节
+            </div>
+            <div class="num_style" style="color: #43a047">
+              通过:{{ userData.pass }}节
+            </div>
+            <div style="clear: both"></div>
           </div>
-          <div class="num_style" style="color: #e53935">
-            作弊:{{ userData.cheat }}节
-          </div>
-          <div class="num_style" style="color: #43a047">
-            通过:{{ userData.pass }}节
-          </div>
-          <div style="clear: both"></div>
         </div>
-      </div>
-      <div class="a_style">
-        <i></i>
-        <span>做题审核进度</span>
-        <div class="flex_style_study">
-          <div class="num_style" style="color: #0047d0">
-            待审:{{ userData.examPending }}节
-          </div>
-          <div class="num_style" style="color: #e53935">
-            作弊:{{ userData.examCheat }}节
-          </div>
-          <div class="num_style" style="color: #43a047">
-            通过:{{ userData.examPass }}节
+        <div class="a_style">
+          <i></i>
+          <span>做题审核进度</span>
+          <div class="flex_style_study">
+            <div class="num_style" style="color: #0047d0">
+              待审:{{ userData.examPending }}节
+            </div>
+            <div class="num_style" style="color: #e53935">
+              作弊:{{ userData.examCheat }}节
+            </div>
+            <div class="num_style" style="color: #43a047">
+              通过:{{ userData.examPass }}节
+            </div>
+            <div style="clear: both"></div>
           </div>
-          <div style="clear: both"></div>
         </div>
-      </div>
-      <div class="a_style" style="width: 280px">
-        <i></i>
-        <span>学时审批状态</span>
-        <div class="flex_style_study">
-          <div class="num_style" style="color: #0047d0">
-            {{
+        <div class="a_style" style="width: 280px">
+          <i></i>
+          <span>学时审批状态</span>
+          <div class="flex_style_study">
+            <div class="num_style" style="color: #0047d0">
+              {{
                 ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
-                periodStatus + 1
+                  periodStatus + 1
                 ]
-            }}
+              }}
+            </div>
+            <div style="clear: both"></div>
           </div>
-          <div style="clear: both"></div>
         </div>
-      </div>
-      <div class="s_sd">
-        <template v-if="periodStatus === 2">
-          <el-checkbox :disabled="!allIds.length" :indeterminate="isIndeterminate" v-model="checkAll"
-            @change="handleCheckAllChange">待审全选</el-checkbox>
-          <el-button style="margin-left: 10px" size="mini" type="success" @click="getChangeStatus(1)">勾选通过</el-button>
-          <el-button size="mini" type="danger" @click="getChangeStatus(2)">勾选作弊</el-button>
-        </template>
+        <div class="s_sd">
+          <template v-if="periodStatus === 2">
+            <el-checkbox
+              :disabled="!allIds.length"
+              :indeterminate="isIndeterminate"
+              v-model="checkAll"
+              @change="handleCheckAllChange"
+              >待审全选</el-checkbox
+            >
+            <el-button
+              style="margin-left: 10px"
+              size="mini"
+              type="success"
+              @click="getChangeStatus(1)"
+              >勾选通过</el-button
+            >
+            <el-button size="mini" type="danger" @click="getChangeStatus(2)"
+              >勾选作弊</el-button
+            >
+          </template>
 
-        <template v-if="periodStatus === 3">
-          <el-button style="margin-left: 10px" size="mini" @click="checkBack">勾选数据,打回待审核状态</el-button>
-          <el-button size="mini" type="warning" @click="approvedOK = true">确认审核通过结果</el-button>
-        </template>
-        <!-- <el-button
+          <template v-if="periodStatus === 3">
+            <el-button style="margin-left: 10px" size="mini" @click="checkBack"
+              >勾选数据,打回待审核状态</el-button
+            >
+            <el-button size="mini" type="warning" @click="approvedOK = true"
+              >确认审核通过结果</el-button
+            >
+          </template>
+          <!-- <el-button
           v-if="periodStatus === 1"
           style="margin-left: 10px"
           size="mini"
           @click="backToAudit"
           >打回待审核状态</el-button
         > -->
+        </div>
       </div>
     </div>
-  </div>
     <el-checkbox-group v-model="checkList" @change="handleCheckedCitiesChange">
-      <component :is="keys[key]" v-for="key in Object.keys(tablesData)" :key="key" :tabledata="tablesData[key]"
-        :label="key == 5 ? '卷' : '章'" :userImg="userImg"></component>
+      <component
+        :is="keys[key]"
+        v-for="key in Object.keys(tablesData)"
+        :key="key"
+        :tabledata="tablesData[key]"
+        :label="key == 5 ? '卷' : '章'"
+        :userImg="userImg"
+        :setData="setData"
+      ></component>
     </el-checkbox-group>
 
-    <Cheat-dialog :disabledBtn="disabledBtn" :vidBoxHours.sync="vidBoxHours" @close="loadingClose" @submit="
-      (reason) => {
-        submitOK(2, reason);
-      }
-    "></Cheat-dialog>
-    <Base-dialog title="操作提示:" :disabledBtn="disabledBtn" :isShow.sync="through" @close="loadingClose" @submit="
-      () => {
-        submitOK(1);
-      }
-    ">
+    <Cheat-dialog
+      :disabledBtn="disabledBtn"
+      :vidBoxHours.sync="vidBoxHours"
+      @close="loadingClose"
+      @submit="
+        (reason) => {
+          submitOK(2, reason);
+        }
+      "
+    ></Cheat-dialog>
+    <Base-dialog
+      title="操作提示:"
+      :disabledBtn="disabledBtn"
+      :isShow.sync="through"
+      @close="loadingClose"
+      @submit="
+        () => {
+          submitOK(1);
+        }
+      "
+    >
       <div>
         确定所勾选的内容,审核结果为【通过】?<br />
         确认后,初审不可再修改,请检查清楚再操作!
       </div>
     </Base-dialog>
-    <Base-dialog title="操作提示:" :disabledBtn="disabledBtn" :isShow.sync="popback" @close="loadingClose"
-      @submit="uploadForm">
+    <Base-dialog
+      title="操作提示:"
+      :disabledBtn="disabledBtn"
+      :isShow.sync="popback"
+      @close="loadingClose"
+      @submit="uploadForm"
+    >
       <div>
         <div style="color: red">
           <h4 style="margin: 0px">当前勾选了{{ checkList.length }}条数据:</h4>
@@ -107,8 +151,13 @@
         </div>
       </div>
     </Base-dialog>
-    <Base-dialog title="操作提示:" :disabledBtn="disabledBtn" :isShow.sync="approvedOK" @close="loadingClose"
-      @submit="approvedOKFunc">
+    <Base-dialog
+      title="操作提示:"
+      :disabledBtn="disabledBtn"
+      :isShow.sync="approvedOK"
+      @close="loadingClose"
+      @submit="approvedOKFunc"
+    >
       <div>
         <div style="color: red">
           <h4 style="margin: 0px">确认审核通过结果后:</h4>
@@ -135,7 +184,7 @@ import ChapterTable from "./ChapterTable.vue";
 import LessonTable from "./LessonTable.vue";
 import CheatDialog from "./CheatDialog.vue";
 import { rollBackPeriod } from "@/api/education/classManageMent";
-import { debounce } from '@/utils'
+import { debounce } from "@/utils";
 import { mapGetters } from "vuex";
 export default {
   props: {
@@ -159,7 +208,7 @@ export default {
     },
     getUserInfo: {
       type: Function,
-      default: () => { },
+      default: () => {},
     },
   },
   provide() {
@@ -167,7 +216,7 @@ export default {
       getPeriodStatus: () => this.periodStatus,
       getUserInfo: this.getUserInfo,
       getAllIds: () => this.allIds,
-      getUserImgPhoto:() => this.userData.oneInchPhotos
+      getUserImgPhoto: () => this.userData.oneInchPhotos,
     };
   },
   data() {
@@ -213,15 +262,18 @@ export default {
       offsetTop: 0,
       offsetHeight: 0,
       headerFixed: false,
-      userImg:"",
+      userImg: "",
     };
   },
   methods: {
     handleScroll() {
       // 得到页面滚动的距离
-      let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
+      let scrollTop =
+        window.pageYOffset ||
+        document.documentElement.scrollTop ||
+        document.body.scrollTop;
       // 判断页面滚动的距离是否大于吸顶元素的位置
-      this.headerFixed = scrollTop > (this.offsetTop + this.offsetHeight);
+      this.headerFixed = scrollTop > this.offsetTop + this.offsetHeight;
     },
     submitAllSlect(reason) {
       this.submitOK(2, reason);
@@ -344,6 +396,7 @@ export default {
         gradeId: Number(this.setData.id),
         userId: Number(this.setData.userId),
         goodsId: Number(this.setData.goodsId),
+        orderGoodsId: Number(this.setData.orderGoodsId),
         ids: this.checkList,
       };
       this.$api
@@ -368,6 +421,7 @@ export default {
         gradeId: Number(this.setData.id),
         userId: Number(this.setData.userId),
         goodsId: Number(this.setData.goodsId),
+        orderGoodsId: Number(this.setData.orderGoodsId),
       };
       this.$api
         .editGradeUsereditrollconfirmPeriod(data)
@@ -431,7 +485,7 @@ export default {
     },
     userData: {
       handler(val) {
-        this.userImg = val.oneInchPhotos
+        this.userImg = val.oneInchPhotos;
       },
       immediate: true,
       deep: true,
@@ -443,8 +497,8 @@ export default {
     },
     ...mapGetters(["sidebar"]),
     left() {
-      return this.sidebar.opened ? '206px' : '60px'
-    }
+      return this.sidebar.opened ? "206px" : "60px";
+    },
   },
   mounted() {
     this.$nextTick(function () {
@@ -452,8 +506,8 @@ export default {
       this.offsetTop = header.offsetTop;
       this.offsetHeight = header.offsetHeight;
     });
-    window.addEventListener('scroll', debounce(this.handleScroll, 50));
-  }
+    window.addEventListener("scroll", debounce(this.handleScroll, 50));
+  },
 };
 </script>
 
@@ -464,7 +518,7 @@ export default {
     display: flex;
     align-items: center;
 
-    &>.a_style {
+    & > .a_style {
       display: flex;
       align-items: center;
       margin-right: 16px;
@@ -526,6 +580,5 @@ export default {
     padding: 0 20px;
     margin: 0;
   }
-
 }
-</style>
+</style>

+ 13 - 13
src/views/classHoursReview/studyTimes.vue

@@ -4,8 +4,9 @@
       :userData="userData"
       :totalTime="totalTime"
       :numTotal="numTotal"
+      :all="false"
     ></StudentInfo>
-    <Study-tables
+    <study-tables
       class="box"
       ref="study"
       v-if="tablesData"
@@ -13,7 +14,7 @@
       :userData="userData"
       :setData="setData"
       :getUserInfo="getUserInfo"
-    ></Study-tables>
+    ></study-tables>
   </div>
 </template>
 
@@ -130,6 +131,7 @@ export default {
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
         gradeId: this.setData.id,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;
@@ -164,6 +166,7 @@ export default {
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
         gradeId: this.setData.id,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;
@@ -187,20 +190,16 @@ export default {
           gradeId: this.setData.id,
           userId: this.setData.userId,
           goodsId: this.setData.goodsId,
+          orderGoodsId: this.setData.orderGoodsId,
         })
         .then(async (res) => {
           let data = res.rows[0];
-          if (sessionStorage.getItem("spotData")) {
-            var result = JSON.parse(sessionStorage.getItem("spotData"));
-            console.log("fullName",result)
-            data["fullName"] = result.fullName;
-          } else {
-            var result = await this.$api.obtainGoods(this.setData.goodsId);
-            data["fullName"] =
-              result.data.educationName +
-              result.data.projectName +
-              result.data.businessName;
-          }
+          var result = await this.$api.obtainGoods(this.setData.goodsId);
+          data["fullName"] =
+            result.data.educationName +
+            result.data.projectName +
+            result.data.businessName;
+
           data["supervise"] = true;
           this.userData = data;
           isS && this.search();
@@ -237,6 +236,7 @@ export default {
         gradeId: this.setData.id,
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       this.loading = true;
       this.$api

+ 2 - 33
src/views/education/classManageMent/classHours/index.vue

@@ -447,7 +447,8 @@ export default {
                   className: v.className,
                   goodsId: v.goodsId,
                   goodsName: v.goodsName,
-                  keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+                  orderGoodsId:v.orderGoodsId,
+                  keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
                 };
                 this.checkSession(data)
                   .then(() => {
@@ -473,38 +474,6 @@ export default {
         }
       }
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     changeActive(int) {
       if (int == this.active) {
         return;

+ 7 - 2
src/views/education/classManageMent/classHoursReview/component/ChapterTable.vue

@@ -23,6 +23,12 @@
       <el-table-column align="center" prop="realName" label="姓名">
       </el-table-column>
       <el-table-column align="center" prop="typeName" :label="label + '标题'">
+        <template slot-scope="scope">
+          {{ scope.row.typeName }}
+          <el-tag size="mini" v-if="scope.row.commonSign == 1"
+            >公共章</el-tag
+          ></template
+        >
       </el-table-column>
       <el-table-column align="center" prop="classHours" label="学时">
         <template slot-scope="scope">
@@ -89,5 +95,4 @@ export default {
 };
 </script>
 
-<style>
-</style>
+<style></style>

+ 12 - 1
src/views/education/classManageMent/classHoursReview/component/LessonTable.vue

@@ -135,7 +135,11 @@
             {{ $methodsTools.onlyForma(scope2.row[item.prop]) }}
           </span>
           <span v-else-if="item.scope === 'durTime' && scope2.row.type !== 5">
-            {{ $methodsTools.secondToDate(scope2.row[item.prop], false) }}
+            {{
+              scope2.row["type"] == 3
+                ? $methodsTools.secondToDate(scope2.row[item.prop], false)
+                : "分数:" + scope2.row["performance"]
+            }}
           </span>
           <div v-else-if="item.scope === 'aTimeSE'">
             <div
@@ -206,6 +210,12 @@
 import CheatDialog from "./CheatDialog.vue";
 export default {
   props: {
+    setData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
     tabledata: {
       type: Array,
       default: () => {
@@ -347,6 +357,7 @@ export default {
         userId,
         goodsId,
         gradeId,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;

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

@@ -1,6 +1,10 @@
 <template>
   <div class="studyRecordTable">
-    <div class="studyStyle" :class="{ 'isFixed': headerFixed }" :style="{'left':left}">
+    <div
+      class="studyStyle"
+      :class="{ isFixed: headerFixed }"
+      :style="{ left: left }"
+    >
       <div class="a_style">
         <i></i>
         <span>视频审核进度</span>
@@ -39,9 +43,9 @@
         <div class="flex_style_study">
           <div class="num_style" style="color: #0047d0">
             {{
-                ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
+              ["不可审核", "未通过", "通过审核", "待审核", "审核中"][
                 periodStatus + 1
-                ]
+              ]
             }}
           </div>
           <div style="clear: both"></div>
@@ -49,15 +53,32 @@
       </div>
       <div class="s_sd">
         <template v-if="periodStatus === 2">
-          <el-checkbox :disabled="!allIds.length" :indeterminate="isIndeterminate" v-model="checkAll"
-            @change="handleCheckAllChange">待审全选</el-checkbox>
-          <el-button style="margin-left: 10px" size="mini" type="success" @click="getChangeStatus(1)">勾选通过</el-button>
-          <el-button size="mini" type="danger" @click="getChangeStatus(2)">勾选作弊</el-button>
+          <el-checkbox
+            :disabled="!allIds.length"
+            :indeterminate="isIndeterminate"
+            v-model="checkAll"
+            @change="handleCheckAllChange"
+            >待审全选</el-checkbox
+          >
+          <el-button
+            style="margin-left: 10px"
+            size="mini"
+            type="success"
+            @click="getChangeStatus(1)"
+            >勾选通过</el-button
+          >
+          <el-button size="mini" type="danger" @click="getChangeStatus(2)"
+            >勾选作弊</el-button
+          >
         </template>
 
         <template v-if="periodStatus === 3">
-          <el-button style="margin-left: 10px" size="mini" @click="checkBack">勾选数据,打回待审核状态</el-button>
-          <el-button size="mini" type="warning" @click="approvedOK = true">确认审核通过结果</el-button>
+          <el-button style="margin-left: 10px" size="mini" @click="checkBack"
+            >勾选数据,打回待审核状态</el-button
+          >
+          <el-button size="mini" type="warning" @click="approvedOK = true"
+            >确认审核通过结果</el-button
+          >
         </template>
         <!-- <el-button
           v-if="periodStatus === 1"
@@ -70,27 +91,49 @@
     </div>
 
     <el-checkbox-group v-model="checkList" @change="handleCheckedCitiesChange">
-      <component :is="keys[key]" v-for="key in Object.keys(tablesData)" :key="key" :tabledata="tablesData[key]"
-        :label="key == 5 ? '卷' : '章'"></component>
+      <component
+        :is="keys[key]"
+        v-for="key in Object.keys(tablesData)"
+        :key="key"
+        :tabledata="tablesData[key]"
+        :label="key == 5 ? '卷' : '章'"
+        :setData="setData"
+      ></component>
     </el-checkbox-group>
 
-    <Cheat-dialog :disabledBtn="disabledBtn" :vidBoxHours.sync="vidBoxHours" @close="loadingClose" @submit="
-      (reason) => {
-        submitOK(2, reason);
-      }
-    "></Cheat-dialog>
-    <Base-dialog title="操作提示:" :disabledBtn="disabledBtn" :isShow.sync="through" @close="loadingClose" @submit="
-      () => {
-        submitOK(1);
-      }
-    ">
+    <Cheat-dialog
+      :disabledBtn="disabledBtn"
+      :vidBoxHours.sync="vidBoxHours"
+      @close="loadingClose"
+      @submit="
+        (reason) => {
+          submitOK(2, reason);
+        }
+      "
+    ></Cheat-dialog>
+    <Base-dialog
+      title="操作提示:"
+      :disabledBtn="disabledBtn"
+      :isShow.sync="through"
+      @close="loadingClose"
+      @submit="
+        () => {
+          submitOK(1);
+        }
+      "
+    >
       <div>
         确定所勾选的内容,审核结果为【通过】?<br />
         确认后,初审不可再修改,请检查清楚再操作!
       </div>
     </Base-dialog>
-    <Base-dialog title="操作提示:" :disabledBtn="disabledBtn" :isShow.sync="popback" @close="loadingClose"
-      @submit="uploadForm">
+    <Base-dialog
+      title="操作提示:"
+      :disabledBtn="disabledBtn"
+      :isShow.sync="popback"
+      @close="loadingClose"
+      @submit="uploadForm"
+    >
       <div>
         <div style="color: red">
           <h4 style="margin: 0px">当前勾选了{{ checkList.length }}条数据:</h4>
@@ -106,8 +149,13 @@
         </div>
       </div>
     </Base-dialog>
-    <Base-dialog title="操作提示:" :disabledBtn="disabledBtn" :isShow.sync="approvedOK" @close="loadingClose"
-      @submit="approvedOKFunc">
+    <Base-dialog
+      title="操作提示:"
+      :disabledBtn="disabledBtn"
+      :isShow.sync="approvedOK"
+      @close="loadingClose"
+      @submit="approvedOKFunc"
+    >
       <div>
         <div style="color: red">
           <h4 style="margin: 0px">确认审核通过结果后:</h4>
@@ -134,7 +182,7 @@ import ChapterTable from "./ChapterTable.vue";
 import LessonTable from "./LessonTable.vue";
 import CheatDialog from "./CheatDialog.vue";
 import { rollBackPeriod } from "@/api/education/classManageMent";
-import { debounce } from '@/utils'
+import { debounce } from "@/utils";
 import { mapGetters } from "vuex";
 export default {
   props: {
@@ -158,7 +206,7 @@ export default {
     },
     getUserInfo: {
       type: Function,
-      default: () => { },
+      default: () => {},
     },
   },
   provide() {
@@ -210,15 +258,18 @@ export default {
       allType3List: [],
       offsetTop: 0,
       offsetHeight: 0,
-      headerFixed: false
+      headerFixed: false,
     };
   },
   methods: {
     handleScroll() {
       // 得到页面滚动的距离
-      let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
+      let scrollTop =
+        window.pageYOffset ||
+        document.documentElement.scrollTop ||
+        document.body.scrollTop;
       // 判断页面滚动的距离是否大于吸顶元素的位置
-      this.headerFixed = scrollTop > (this.offsetTop + this.offsetHeight);
+      this.headerFixed = scrollTop > this.offsetTop + this.offsetHeight;
     },
     submitAllSlect(reason) {
       this.submitOK(2, reason);
@@ -341,6 +392,7 @@ export default {
         gradeId: Number(this.setData.id),
         userId: Number(this.setData.userId),
         goodsId: Number(this.setData.goodsId),
+        orderGoodsId: Number(this.setData.orderGoodsId),
         ids: this.checkList,
       };
       this.$api
@@ -365,6 +417,7 @@ export default {
         gradeId: Number(this.setData.id),
         userId: Number(this.setData.userId),
         goodsId: Number(this.setData.goodsId),
+        orderGoodsId: Number(this.setData.orderGoodsId),
       };
       this.$api
         .editGradeUsereditrollconfirmPeriod(data)
@@ -433,8 +486,8 @@ export default {
     },
     ...mapGetters(["sidebar"]),
     left() {
-      return this.sidebar.opened ? '206px' : '60px'
-    }
+      return this.sidebar.opened ? "206px" : "60px";
+    },
   },
   mounted() {
     this.$nextTick(function () {
@@ -442,8 +495,8 @@ export default {
       this.offsetTop = header.offsetTop;
       this.offsetHeight = header.offsetHeight;
     });
-    window.addEventListener('scroll', debounce(this.handleScroll, 50));
-  }
+    window.addEventListener("scroll", debounce(this.handleScroll, 50));
+  },
 };
 </script>
 
@@ -454,7 +507,7 @@ export default {
     display: flex;
     align-items: center;
 
-    &>.a_style {
+    & > .a_style {
       display: flex;
       align-items: center;
       margin-right: 16px;
@@ -516,6 +569,5 @@ export default {
     padding: 0 20px;
     margin: 0;
   }
-
 }
-</style>
+</style>

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

@@ -28,7 +28,7 @@ export default {
       userData: {},
       setTimeDOM: null, //定时器
       totalTime: [],
-      numTotal:0,
+      numTotal: 0,
       tablesData: undefined,
     };
   },
@@ -101,6 +101,7 @@ export default {
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
         gradeId: this.setData.id,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;
@@ -130,6 +131,7 @@ export default {
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
         gradeId: this.setData.id,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;
@@ -164,6 +166,7 @@ export default {
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
         gradeId: this.setData.id,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       if (item.type === 3) {
         data.sectionId = item.id;
@@ -187,6 +190,7 @@ export default {
           gradeId: this.setData.id,
           userId: this.setData.userId,
           goodsId: this.setData.goodsId,
+          orderGoodsId: this.setData.orderGoodsId,
         })
         .then((res) => {
           this.userData = res.rows[0];
@@ -224,6 +228,7 @@ export default {
         gradeId: this.setData.id,
         userId: this.setData.userId,
         goodsId: this.setData.goodsId,
+        orderGoodsId: this.setData.orderGoodsId,
       };
       this.loading = true;
       this.$api
@@ -235,7 +240,7 @@ export default {
               res.rows[0].startTotalTime,
               res.rows[0].endTotalTime,
             ];
-            this.numTotal = res.rows[0].secTotalTime
+            this.numTotal = res.rows[0].secTotalTime;
           }
         })
         .finally(() => {

+ 1 - 1
src/views/education/classManageMent/classList/index.vue

@@ -349,7 +349,7 @@ export default {
         data.classEndTime = parseInt(data.classEndTime / 1000);
       }
       this.$api
-        .inquireGradegradeList(data)
+        .inquireGradegradesearchList(data)
         .then((res) => {
           this.tableData = res.rows;
           this.total = res.total;

+ 1 - 2
src/views/education/classManageMent/classList/manageClass/baseInfo.vue

@@ -12,7 +12,6 @@
           <el-col :span="24">
             <el-form-item label="所属商品课程">
               <div class="flex_s">
-                <div>商品编码:{{ listData.goodsList[0].code }}</div>
                 <div style="display: flex">
                   <div>商品业务层级:</div>
                   <div style="flex: 1">
@@ -22,7 +21,7 @@
                   </div>
                 </div>
                 <div>学时:{{ listData.goodsList[0].classHours }}</div>
-                <div>年份:{{ listData.goodsList[0].year }}</div>
+                <div>年份:{{ listData.sevenYear || listData.goodsList[0].year }}</div>
                 <div>商品名称:{{ listData.goodsList[0].goodsName }}</div>
               </div>
             </el-form-item>

+ 2 - 0
src/views/education/classManageMent/hoursTimesRecord/index.vue

@@ -262,6 +262,7 @@ export default {
           gradeId: this.objs.gradeId,
           userId: this.objs.userId,
           goodsId: this.objs.goodsId,
+          orderGoodsId:this.objs.orderGoodsId
         })
         .then((res) => {
           this.userData = res.rows[0];
@@ -275,6 +276,7 @@ export default {
           gradeId: this.objs.gradeId,
           userId: this.objs.userId,
           goodsId: this.objs.goodsId,
+          orderGoodsId:this.objs.orderGoodsId,
           courseId: newName,
         };
         if (this.objs.activeMonth || this.objs.activeMonth == 0) {

+ 3 - 34
src/views/education/classManageMent/learningHoursRecordList/index.vue

@@ -445,6 +445,7 @@ export default {
             classHours: options.classHours,
             studyStartTime: options.studyStartTime,
             studyEndTime: options.studyEndTime,
+            orderGoodsId: options.orderGoodsId,
           },
         });
       };
@@ -489,9 +490,9 @@ export default {
               className: v.className,
               goodsId: v.goodsId,
               goodsName: v.goodsName,
-              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+              orderGoodsId:v.orderGoodsId,
+              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
             };
-            console.log(data, v);
             this.checkSession(data)
               .then(() => {
                 //学员详情
@@ -505,38 +506,6 @@ export default {
           }
         });
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     /**
      * 搜索列表
      */

+ 5 - 3
src/views/education/classManageMent/learningHoursRecordListMonth/index.vue

@@ -350,14 +350,14 @@ export default {
       delete data.pageSize;
       data.status = [data.status];
       data.weekList = array;
-      this.exputs(data)
+      this.exputs(data);
     },
     /**
      *
      * @param {Object} data
      * @remards 导出条件
      */
-     exputs(data) {
+    exputs(data) {
       this.$modal.loading("正在导出数据,请稍后...");
       this.$api
         .gradegradeexportWeek(data)
@@ -536,6 +536,7 @@ export default {
             studyEndTime: options.studyEndTime,
             time: parentItem.time,
             activeMonth: parentItem.activeMonth,
+            orderGoodsId: options.orderGoodsId,
           },
         });
       };
@@ -580,7 +581,8 @@ export default {
               className: v.className,
               goodsId: v.goodsId,
               goodsName: v.goodsName,
-              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+              orderGoodsId: v.orderGoodsId,
+              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
             };
             this.checkSession(data)
               .then(() => {

+ 2 - 34
src/views/education/classManageMent/listOfhoursToBeReviewed/index.vue

@@ -420,7 +420,8 @@ export default {
               className: v.className,
               goodsId: v.goodsId,
               goodsName: v.goodsName,
-              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+              orderGoodsId: v.orderGoodsId,
+              keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
             };
             this.checkSession(data)
               .then(() => {
@@ -435,38 +436,6 @@ export default {
           }
         });
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {
@@ -616,4 +585,3 @@ export default {
   }
 }
 </style>
-

+ 1054 - 0
src/views/education/dataReview/dataConfigSeven/index.vue

@@ -0,0 +1,1054 @@
+<template>
+  <div id="dataConfig">
+    <input v-show="false" id="file" type="file" @change="exportFunc" />
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="init"
+      :shType="shType"
+    >
+      <template slot="customize" v-if="false">
+        <el-button size="small" type="success" @click="moreActive"
+          >批量导出</el-button
+        >
+      </template>
+    </search-box-new>
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+      @editInfo="editInfo"
+    >
+      <template slot="customize" v-if="formData.status == 1">
+        <el-button size="small" type="success" @click="studentLeadInfo"
+          >学员资料导入</el-button
+        ><el-button size="small" type="success" @click="studentExport"
+          >学员资料导出</el-button
+        >
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button
+          type="text"
+          @click="addClick(props.scope.row, 0)"
+          :disabled="
+            !(
+              props.scope.row.changeStatus === 2 || props.scope.row.status === 2
+            )
+          "
+          >审核</el-button
+        >
+        <el-button type="text" @click="openRecord(props.scope.row)"
+          >审核记录</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      @closed="loadingClose"
+      :visible.sync="dialogVisible"
+      width="1000px"
+      :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="close" />
+        </div>
+      </div>
+      <div slot="title" class="topStys">
+        <div class="btnsTys">学员编码:{{ listData.userAccount }}</div>
+        <div class="btnsTys">学员姓名:{{ listData.realname }}</div>
+        <div class="btnsTys">学员身份证号码:{{ listData.idCard }}</div>
+        <div class="btnsTys">绑定手机号码:{{ listData.telphone }}</div>
+        <div style="clear: both"></div>
+      </div>
+      <div class="heightstybox gdt">
+        <ul>
+          <li class="dissty" v-for="(item, index) in listInfos" :key="index">
+            <div
+              style="
+                width: 50px;
+                color: red;
+                align-self: flex-start;
+                flex-shrink: 0;
+              "
+            >
+              {{ item.status === 1 ? "有变更" : "" }}
+            </div>
+            <div class="stys">{{ item.fieldName }}:</div>
+            <div v-if="pdStatus(item.fieldKey)">
+              <div
+                v-if="item.fieldKey === 'recent_photos'"
+                style="width: 145px; height: 160px"
+              >
+                <el-image
+                  v-if="item.value"
+                  style="width: 100%; height: 100%"
+                  :src="$methodsTools.splitImgHost(item.value)"
+                  :preview-src-list="[$methodsTools.splitImgHost(item.value)]"
+                >
+                </el-image>
+                <p v-else>暂无上传图片</p>
+              </div>
+              <div v-else-if="item.fieldKey === 'commitment_electr_signature'">
+                <div>
+                  本人自愿做出如下承诺:本人己仔细阅读《广东
+                  省住房和城乡建设厅关于推进住房和城乡建设领域施
+                  工现场专业人员职业培训工作的通知》
+                  全部内容并知晓和理解,本人的学历证书、身份证、工作年限、相片等所有资料完全真实、符合报名条件、资格审查要求和相关规定,本人在报名、审查、培训、测试等有关的事项中会严格道守相关规定和要求,如有虛假或与实际规定不符等情况造成的一切后果由本人承担。
+                  特此承诺!
+                </div>
+                <div
+                  style="width: 300px; height: 150px; border: 1px solid #999"
+                  v-if="item.value"
+                >
+                  <el-image
+                    style="width: 100%; height: 100%"
+                    :src="$methodsTools.splitImgHost(item.value)"
+                    :preview-src-list="[$methodsTools.splitImgHost(item.value)]"
+                  >
+                  </el-image>
+                </div>
+                <p v-else>暂无上传图片</p>
+              </div>
+              <div v-else style="width: 224px; height: 160px">
+                <el-image
+                  v-if="item.value"
+                  style="width: 100%; height: 100%"
+                  :src="$methodsTools.splitImgHost(item.value)"
+                  :preview-src-list="[$methodsTools.splitImgHost(item.value)]"
+                >
+                </el-image>
+                <p v-else>暂无上传图片</p>
+              </div>
+            </div>
+            <div v-else>{{ item.value }}</div>
+          </li>
+          <li class="dissty" style="border-bottom: none">
+            <div class="stys">审核结果反馈:</div>
+            <el-input
+              v-model="listData.text"
+              type="textarea"
+              :rows="5"
+            ></el-input>
+          </li>
+        </ul>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button :loading="disabledBtn" @click="submitTable(1)" type="success"
+          >审核通过</el-button
+        >
+        <el-button :loading="disabledBtn" @click="submitTable(3)" type="danger"
+          >审核不通过</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="dialogVisibleRecord"
+      width="1000px"
+      :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="dialogVisibleRecord = false"
+          />
+        </div>
+      </div>
+      <div slot="title" class="topStys">
+        <div class="btnsTys">
+          学员编码:{{ recordList[activeIndex].userAccount }}
+        </div>
+        <div class="btnsTys">
+          学员姓名:{{ recordList[activeIndex].realname }}
+        </div>
+        <div class="btnsTys">
+          学员身份证号码:{{ recordList[activeIndex].idCard }}
+        </div>
+        <div class="btnsTys">
+          绑定手机号码:{{ recordList[activeIndex].telphone }}
+        </div>
+        <div style="clear: both"></div>
+      </div>
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <ul class="max_heightAuto">
+            <li
+              class="lsTYs"
+              v-for="(item, index) in recordList"
+              :key="index"
+              :class="index === activeIndex ? 'active' : ''"
+              @click="changeIndex(index)"
+            >
+              {{ $methodsTools.onlyForma(item.auditTime) }}
+            </li>
+          </ul>
+        </el-col>
+        <el-col :span="18">
+          <transition>
+            <div class="heightstybox gdt" v-if="showIS">
+              <ul>
+                <li>
+                  <div class="float_lefts">
+                    审核人:{{ recordList[activeIndex].createByName }}
+                  </div>
+                  <div class="float_lefts">
+                    {{
+                      recordList[activeIndex].status === 1
+                        ? "审核通过"
+                        : recordList[activeIndex].status === 2
+                        ? "待审核"
+                        : recordList[activeIndex].status === 3
+                        ? "审核不通过"
+                        : "无审核状态"
+                    }}
+                  </div>
+                  <div style="clear: both"></div>
+                </li>
+                <li
+                  class="dissty"
+                  v-for="(item, index) in recordList[activeIndex]
+                    .keyValueArrays"
+                  :key="index"
+                >
+                  <div class="stys">{{ item.fieldName }}:</div>
+                  <div v-if="pdStatus(item.fieldKey)">
+                    <div
+                      v-if="item.fieldKey === 'recent_photos'"
+                      style="width: 145px; height: 160px"
+                    >
+                      <el-image
+                        v-if="item.value"
+                        style="width: 100%; height: 100%"
+                        :src="$methodsTools.splitImgHost(item.value)"
+                        :preview-src-list="[
+                          $methodsTools.splitImgHost(item.value),
+                        ]"
+                      >
+                      </el-image>
+                      <p v-else>暂无上传图片</p>
+                    </div>
+                    <div
+                      v-else-if="
+                        item.fieldKey === 'commitment_electr_signature'
+                      "
+                    >
+                      <div>
+                        本人自愿做出如下承诺:本人己仔细阅读《广东
+                        省住房和城乡建设厅关于推进住房和城乡建设领域施
+                        工现场专业人员职业培训工作的通知》
+                        全部内容并知晓和理解,本人的学历证书、身份证、工作年限、相片等所有资料完全真实、符合报名条件、资格审查要求和相关规定,本人在报名、审查、培训、测试等有关的事项中会严格道守相关规定和要求,如有虛假或与实际规定不符等情况造成的一切后果由本人承担。
+                        特此承诺!
+                      </div>
+                      <div
+                        style="
+                          width: 300px;
+                          height: 150px;
+                          border: 1px solid #999;
+                        "
+                        v-if="item.value"
+                      >
+                        <el-image
+                          style="width: 100%; height: 100%"
+                          :src="$methodsTools.splitImgHost(item.value)"
+                          :preview-src-list="[
+                            $methodsTools.splitImgHost(item.value),
+                          ]"
+                        >
+                        </el-image>
+                      </div>
+                      <p v-else>暂无上传图片</p>
+                    </div>
+                    <div v-else style="width: 224px; height: 160px">
+                      <el-image
+                        v-if="item.value"
+                        style="width: 100%; height: 100%"
+                        :src="$methodsTools.splitImgHost(item.value)"
+                        :preview-src-list="[
+                          $methodsTools.splitImgHost(item.value),
+                        ]"
+                      >
+                      </el-image>
+                      <p v-else>暂无上传图片</p>
+                    </div>
+                  </div>
+                  <div v-else>{{ item.value }}</div>
+                </li>
+                <li class="dissty" style="border-bottom: none">
+                  <div class="stys">审核结果反馈:</div>
+                  <div>
+                    {{ recordList[activeIndex].text }}
+                  </div>
+                </li>
+              </ul>
+            </div>
+          </transition>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisibleRecord = false">取 消</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="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>
+        <div class="swq">
+          <img
+            style="width: 182px; height: 168px"
+            src="@/assets/images/dc.png"
+            alt=""
+          />
+        </div>
+        <div style="padding: 40px">
+          <el-row>
+            <el-col :span="12"
+              ><div style="text-align: end; padding-right: 14px">
+                填写资料审核状态:
+              </div></el-col
+            >
+            <el-col :span="12">
+              <el-radio-group v-model="activeDCIndex">
+                <el-radio
+                  style="display: block; margin-bottom: 16px"
+                  v-for="(items, indexs) in DCLIST"
+                  :key="indexs"
+                  :label="items.value"
+                  >{{ items.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogDR = false">取消</el-button>
+        <el-button type="primary" @click="exputs">确定</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: "DataConfig",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      dialogDR: false,
+      disabledBtn: false,
+      dialogVisibleRecord: false,
+      shType: true,
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "填写资料审核",
+        index: 0,
+        ch: "条",
+        num: true,
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          prop: "changeStatus",
+          placeholder: "变更状态",
+          scope: "select",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+            {
+              label: "有变更",
+              value: 2,
+            },
+          ],
+        },
+        {
+          prop1: "applyStartTime",
+          prop2: "applyEndTime",
+          placeholder1: "报名开始时间",
+          placeholder2: "报名结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        },
+        {
+          prop: "companyName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          prop: "realname",
+          placeholder: "请输入学员姓名",
+        },
+      ],
+      formData: {
+        status: "",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      showIS: true,
+      // 表单
+      tableSet: [
+        {
+          label: "学员编码",
+          prop: "userAccount",
+          hidden: true,
+        },
+        {
+          label: "学员姓名",
+          prop: "realname",
+          hidden: true,
+        },
+
+        {
+          label: "学员身份证",
+          prop: "idCard",
+          hidden: true,
+        },
+        {
+          label: "绑定手机号",
+          prop: "telphone",
+          hidden: true,
+        },
+        {
+          label: "公司名称",
+          prop: "companyName",
+          hidden: true,
+        },
+        {
+          label: "所购商品",
+          hidden: true,
+          scope: "getShops",
+        },
+        {
+          label: "填写资料审核状态",
+          prop: "status",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "通过",
+              value: 1,
+            },
+            {
+              label: "待审核",
+              value: 2,
+            },
+            {
+              label: "不通过",
+              value: 3,
+            },
+          ],
+        },
+        {
+          label: "填写资料变更状态",
+          prop: "changeStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "正常",
+              value: 1,
+            },
+
+            {
+              label: "有变更",
+              value: 2,
+              style: "color:red",
+            },
+          ],
+        },
+        {
+          label: "报名时间",
+          prop: "applyTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "第一次提交资料时间",
+          prop: "oneTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "最后一次提交资料时间",
+          prop: "lastTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "最后一次审核人",
+          prop: "createByName",
+          hidden: true,
+        },
+        {
+          label: "最后一次审核时间",
+          prop: "auditTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      //   弹窗数据
+      listData: {},
+      statusPop: -1,
+      dialogVisible: false,
+      //表单验证
+      rules: {
+        natureName: [
+          { required: true, message: "请输入收费性质名称", trigger: "blur" },
+        ],
+        status: [{ required: true, message: "请选择状态", trigger: "change" }],
+      },
+      listInfos: [],
+      recordList: [{ keyValueArrays: [] }], //记录列表
+      activeIndex: 0,
+      activeDCIndex: 0, //导出按钮索引
+      DCLIST: [
+        { label: "全部", value: 0 },
+        { label: "待审核", value: 2 },
+        { label: "审核通过", value: 1 },
+        { label: "审核不通过", value: 3 },
+      ], //导出按钮列表
+    };
+  },
+  async mounted() {
+    await this.moRenBus()
+    this.search();
+  },
+  async activated() {
+    await this.moRenBus()
+    this.search();
+  },
+  methods: {
+    /**
+     * 默认选择考前培训-施工七大员
+     */
+    moRenBus() {
+      return new Promise((resolve, reject) => {
+        this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
+          for (let i = 0; i < res.rows.length; i++) {
+            if (res.rows[i].educationName === "考前培训") {
+              this.$api
+                .inquirebusinessList({ status: 1, educationId: res.rows[i].id })
+                .then((result) => {
+                  for (let j = 0; j < result.rows.length; j++) {
+                    if (
+                      result.rows[j].projectName === "施工现场专业人员" &&
+                      result.rows[j].businessName === "七大员"
+                    ) {
+                      this.$set(
+                        this.formData,
+                        "educationTypeId",
+                        res.rows[i].id
+                      );
+                      this.$set(this.formData, "businessId", result.rows[j].id);
+                      resolve();
+                      break;
+                    }
+                  }
+                });
+              break;
+            }
+          }
+        });
+      });
+    },
+    exputs(data) {
+      // if (!data.businessId) {
+      //   this.$message.warning("请选择业务层次");
+      //   return;
+      // }
+      this.$modal.loading("正在导出数据,请稍后...");
+      this.$api
+        .inquirebaseprofileExport(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);
+            }
+          }
+        })
+        .catch((err) => {
+          let { message } = err;
+          if (message.includes("timeout")) {
+            this.$message.error(
+              "数据体量过大,无法正常导出,请调整导出的日期范围,缩小数据体量"
+            );
+          }
+        })
+        .finally(() => {
+          this.$modal.closeLoading();
+        });
+    },
+    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);
+      });
+    },
+    studentLeadInfo() {
+      document.getElementById("file").click();
+    },
+    //学员资料导入
+    exportFunc(e) {
+      let formData = new FormData();
+      formData.append("file", e.target.files[0]);
+      this.$api
+        .systemapplyuserprofile(formData)
+        .then((res) => {
+          this.search(2);
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+    studentExport() {
+      let data = {
+        changeStatus: this.formData.changeStatus || "",
+        companyName: this.formData.companyName || "",
+        status:
+          this.formData.status && this.formData.status !== 0
+            ? [this.formData.status]
+            : [],
+        educationTypeId: this.formData.educationTypeId || "",
+        businessId: this.formData.businessId || "",
+        realname: this.formData.realname || "",
+        applyStartTime: this.formData.applyStartTime / 1000 || "",
+        applyEndTime: this.formData.applyEndTime / 1000 || "",
+      };
+      this.$api.systemapplyuserprofileexport(data).then((res) => {
+        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();
+      });
+    },
+    moreActive() {
+      let data = {
+        changeStatus: this.formData.changeStatus || "",
+        companyName: this.formData.companyName || "",
+        status: this.formData.status || 0,
+        educationTypeId: this.formData.educationTypeId || "",
+        businessId: this.formData.businessId || "",
+        realname: this.formData.realname || "",
+        applyStartTime: this.formData.applyStartTime / 1000 || "",
+        applyEndTime: this.formData.applyEndTime / 1000 || "",
+      };
+      this.exputs(data);
+    },
+    changeIndex(v) {
+      if (this.activeIndex === v) {
+        return;
+      }
+      this.showIS = false;
+      this.activeIndex = v;
+      setTimeout(() => {
+        this.showIS = true;
+      }, 50);
+    },
+    openRecord(v) {
+      this.$api
+        .inquirebaseprofilelistRecord({ userId: v.userId, goodsId: v.goodsId })
+        .then((res) => {
+          if (!res.rows.length) {
+            this.$message.warning("该条数据无审核记录");
+            return;
+          }
+          res.rows.forEach((item) => {
+            item.keyValue = JSON.parse(item.keyValue);
+            var arst = [];
+            for (let k in item.keyValue) {
+              if (item.keyValue[k].fieldName) {
+                arst.push(item.keyValue[k]);
+              }
+            }
+            item.keyValueArrays = arst;
+          });
+          this.activeIndex = 0;
+          this.recordList = res.rows;
+          this.dialogVisibleRecord = true;
+        });
+    },
+    pdStatus(int) {
+      if (
+        int === "recent_photos" ||
+        int === "idcard_face_photo" ||
+        int === "idcard_national_photo" ||
+        int === "commitment_electr_signature" ||
+        int === "commitment_seal"
+      ) {
+        return true;
+      }
+    },
+    //1通过 3不通过
+    submitTable(int) {
+      this.disabledBtn = true;
+      var data = JSON.parse(JSON.stringify(this.listData));
+      for (let k in data.keyValue) {
+        data.keyValue[k].status = 0;
+      }
+      data.keyValue = JSON.stringify(data.keyValue);
+      data.status = int;
+      data.changeStatus = 1;
+      this.$api
+        .editbaseprofilesss(data)
+        .then((res) => {
+          this.$message.success("提交成功");
+          this.search();
+          this.dialogVisible = false;
+        })
+        .catch(() => {
+          this.disabledBtn = false;
+        });
+    },
+    loadingClose() {
+      this.disabledBtn = false;
+    },
+    editInfo(v) {
+      this.addClick(v, 0);
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          status: "",
+          pageSize: 10,
+          pageNum: 1,
+          educationTypeId:this.formData.educationTypeId,
+          businessId:this.formData.businessId,
+        };
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      console.log(this.formData,'data')
+      if (this.formData.applyStartTime) {
+        data.applyStartTime = data.applyStartTime / 1000;
+      }
+      if (this.formData.applyEndTime) {
+        data.applyEndTime = data.applyEndTime / 1000;
+      }
+      this.$api
+        .inquirebaseprofile(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    init() {
+      this.search(2);
+    },
+    del(v) {
+      this.$alert(
+        "确定删除此内容?<br />内容删除后将无法恢复,请慎重考虑",
+        "提示",
+        {
+          dangerouslyUseHTMLString: true,
+        }
+      )
+        .then(() => {
+          var data = {
+            natureId: v.natureId,
+            status: -1,
+          };
+          this.$api.editpaynature(data).then((res) => {
+            this.$message.success("删除成功");
+            this.search();
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    addClick(v, int) {
+      if (v === undefined) {
+        this.listData = {};
+      } else {
+        this.$api.obtainbaseprofile(v.id).then((res) => {
+          res.data.keyValue = JSON.parse(res.data.keyValue);
+          this.listData = res.data;
+          var arst = [];
+          for (let k in res.data.keyValue) {
+            if (res.data.keyValue[k].fieldName) {
+              arst.push(res.data.keyValue[k]);
+            }
+          }
+          this.listInfos = arst;
+        });
+      }
+      this.dialogVisible = true;
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    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>
+// 进入前和结束后的状态
+.v-enter,
+.v-leave-to {
+  opacity: 0;
+  // transform: translateX(80px);
+}
+// 进入和离开的动画时间段
+.v-enter-active,
+.v-leave-active {
+  transition: all 0.5s ease;
+}
+.gdt {
+  /* 设置滚动条的样式 */
+  &::-webkit-scrollbar {
+    width: 8px;
+  }
+  /* 滚动槽 */
+  &::-webkit-scrollbar-track {
+    box-shadow: inset 6px rgba(0, 0, 0, 0.3);
+    border-radius: 10px;
+  }
+  /* 滚动条滑块 */
+  &::-webkit-scrollbar-thumb {
+    border-radius: 10px;
+    background: rgba(0, 0, 0, 0.1);
+    box-shadow: inset 6px rgba(0, 0, 0, 0.5);
+  }
+  &::-webkit-scrollbar-thumb:window-inactive {
+    background: rgba(182, 182, 182, 0.4);
+  }
+}
+.max_heightAuto {
+  padding: 0px 10px;
+  max-height: 560px;
+  overflow-y: auto;
+}
+.float_lefts {
+  float: left;
+  padding: 0px 10px;
+  border-radius: 12px;
+  background-color: #eee;
+  height: 35px;
+  line-height: 35px;
+  margin-right: 10px;
+}
+.lsTYs {
+  height: 40px;
+  border-top: 1px solid #999;
+  border-left: 1px solid #999;
+  border-right: 1px solid #999;
+  line-height: 39px;
+  cursor: pointer;
+  text-align: center;
+  &:last-child {
+    border-bottom: 1px solid #999 !important;
+  }
+}
+.swq {
+  text-align: center;
+  border-bottom: 1px solid #eee;
+}
+.active {
+  color: blue;
+}
+.heightstybox {
+  padding: 20px;
+  height: 600px;
+  overflow-y: auto;
+}
+.dissty {
+  display: flex;
+  align-items: center;
+  padding: 20px;
+  border-bottom: 1px dotted #999;
+}
+.stys {
+  flex-shrink: 0;
+  align-self: flex-start;
+  width: 200px;
+  padding-left: 50px;
+}
+.topStys {
+  padding: 20px;
+  background-color: rgb(215, 215, 215);
+  display: flex;
+  align-items: center;
+  overflow-x: auto;
+
+  .btnsTys {
+    flex-shrink: 0;
+    margin-right: 16px;
+    padding: 0px 7px;
+    background-color: #fff;
+    border-radius: 4px;
+    font-size: 14px;
+    height: 40px;
+    line-height: 40px;
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/ .el-dialog__body {
+  padding: 10px 0px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+}
+.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>

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

@@ -602,7 +602,10 @@
             ><span>{{ item.fieldName }}</span>
           </div>
           <!-- @click="item.disable == true ? '' : changeStatus2s(item, index)" (旧)下面按钮事件 -->
-          <div class="disChild" @click="titleFunc">
+          <div
+            class="disChild"
+            @click="item.disable == true ? '' : changeStatus2s(item, index)"
+          >
             <i class="radiosty" :class="item.disable === true ? 'disable' : ''"
               ><div :class="item.required ? 'activeRadio' : ''"></div></i
             ><span>必填</span>
@@ -872,15 +875,16 @@ export default {
           prop: "status",
           hidden: true,
           scope: "isOptions",
-          options:[
+          options: [
             {
-              label:"启用",
-              value:1
-            },{
-              label:"停用",
-              value:0
-            }
-          ]
+              label: "启用",
+              value: 1,
+            },
+            {
+              label: "停用",
+              value: 0,
+            },
+          ],
         },
       ],
       tableData: [], //表单数据
@@ -1202,8 +1206,10 @@ export default {
       });
     },
     getDowm() {
-      let url = baseUrls.BASE_IMG_URL + "/oss/images/file/20211214.docx" +
-        `?time=${this.$methodsTools.getNewTime()}`;;
+      let url =
+        baseUrls.BASE_IMG_URL +
+        "/oss/images/file/20211214.docx" +
+        `?time=${this.$methodsTools.getNewTime()}`;
       let link = document.createElement("a");
       let fileName = "导入模板" + ".xlsx";
       document.body.appendChild(link);
@@ -1505,9 +1511,9 @@ export default {
       }
       this.pzList2sss = JSON.parse(JSON.stringify(this.listData.keyValue2));
       data = data.filter((item) => {
-        if (item.fieldKey === "commitment_seal") {
-          item.required = true;
-        }
+        // if (item.fieldKey === "commitment_seal") {
+        //   item.required = true;
+        // }
         return item.fieldKey === "commitment_seal";
       });
       this.pzList2 = data;
@@ -1676,13 +1682,12 @@ export default {
     rulesTableSumbit() {
       this.disabledBtn = true;
       var data = JSON.parse(JSON.stringify(this.listData));
-      var pushRays = [];
-      this.zhType.map((item) => {
-        pushRays.push({
+      var pushRays = this.zhType.map((item) => {
+        return {
           businessId: item.id,
           educationTypeId: item.educationId,
           projectId: item.projectId,
-        });
+        };
       });
       data.businessList = pushRays;
       data.keyValue = JSON.stringify(this.listData.keyValue);
@@ -1960,4 +1965,3 @@ export default {
   margin-bottom: 6px;
 }
 </style>
-

+ 113 - 2
src/views/education/examManagement/applicationData/asPlanned.vue

@@ -57,6 +57,7 @@
       </template>
     </search-box-new>
     <table-list
+      rowKey="subscribeId"
       :tableSets="tableSet"
       :tableData="tableData"
       :navText="navText"
@@ -66,6 +67,23 @@
       ref="tableList"
     >
       <template slot="customize">
+        <el-popover title="" width="200" trigger="click">
+          <div>
+            <el-button size="small" type="primary" @click="controlsType(1)"
+              >快捷筛选</el-button
+            >
+            <el-button size="small" type="primary" @click="controlsType(2)"
+              >开通题库</el-button
+            >
+          </div>
+          <el-button
+            :size="size"
+            slot="reference"
+            type="success"
+            style="margin-right: 10px"
+            >更多</el-button
+          >
+        </el-popover>
         <el-button :size="size" type="warning" @click="moreActive(2)"
           >取消预约</el-button
         >
@@ -383,17 +401,19 @@
         <!-- <el-button type="primary" @click="submitChecksDR">确定</el-button> -->
       </span>
     </el-dialog>
+    <goodsList ref="goodsList" @backMsg="search(3)" />
   </div>
 </template>
 
 <script>
+import goodsList from "./goodsListOpen";
 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: "AsPlanned",
-  components: { searchBoxNew, tableList, pagination },
+  components: { searchBoxNew, tableList, pagination, goodsList },
   data() {
     return {
       month: "",
@@ -427,6 +447,7 @@ export default {
         tableHide: true,
         choice: true,
         changeWidth: "240px",
+        openCheckMore: true,
         addHide: true,
         backFatherBtn: {
           status: false,
@@ -435,6 +456,17 @@ export default {
       },
       //搜索
       formList: [
+        {
+          prop: "educationTypeId",
+          placeholder: "教育类型",
+          scope: "educationType",
+        },
+        {
+          prop: "businessId",
+          placeholder: "业务层次",
+          scope: "businessLevel",
+          edu: "educationTypeId",
+        },
         {
           prop: "subscribeStatus",
           placeholder: "预约状态",
@@ -509,6 +541,18 @@ export default {
       },
       // 表单
       tableSet: [
+        {
+          label: "教育类型",
+          prop: "educationTypeName",
+          hidden: true,
+        },
+        {
+          label: "业务层次",
+          prop1: "projectName",
+          prop2: "businessName",
+          hidden: true,
+          scope: "InfoMore",
+        },
         {
           label: "考试机会",
           prop1: "examNumber",
@@ -729,6 +773,71 @@ export default {
     this.getQP();
   },
   methods: {
+    /**
+     * 默认选择考前培训-施工七大员
+     */
+    moRenBus() {
+      return new Promise((resolve, reject) => {
+        this.$api.inquireCourseEducationType({ status: 1 }).then((res) => {
+          for (let i = 0; i < res.rows.length; i++) {
+            if (res.rows[i].educationName === "考前培训") {
+              this.$set(this.formData, "educationTypeId", res.rows[i].id);
+              this.$refs.searchBox.changeEducationType(res.rows[i].id, true);
+              this.$api
+                .inquirebusinessList({ status: 1, educationId: res.rows[i].id })
+                .then((result) => {
+                  for (let j = 0; j < result.rows.length; j++) {
+                    if (
+                      result.rows[j].projectName === "施工现场专业人员" &&
+                      result.rows[j].businessName === "七大员"
+                    ) {
+                      this.$set(this.formData, "businessId", result.rows[j].id);
+                      this.$refs.searchBox.changeBusinessLevel(
+                        result.rows[j].id
+                      );
+                      resolve();
+                      break;
+                    }
+                  }
+                });
+              break;
+            }
+          }
+        });
+      });
+    },
+    async controlsType(type) {
+      if (type == 1) {
+        await this.moRenBus();
+        this.$set(this.formData, "subscribeStatus", 1);
+        this.search(1);
+        this.$refs.tableList.clearMoreActive();
+      }
+      if (type == 2) {
+        if (this.$refs.tableList.allCheckData.length === 0) {
+          this.$message.warning("请选择需要开通题库的数据");
+          return;
+        }
+        const STATUS = this.$refs.tableList.allCheckData.every((i) => {
+          return (
+            i.subscribeStatus == 1 &&
+            i.educationTypeName == "考前培训" &&
+            i.projectName == "施工现场专业人员" &&
+            i.businessName == "七大员"
+          );
+        });
+        if (STATUS) {
+          this.$refs.goodsList.showBox(
+            this.$refs.tableList.allCheckData.map((i) => i.subscribeId)
+          );
+        } else {
+          this.$message.error(
+            `请选择业务类型为《考前培训-施工现场专业人员-七大员》及预约状态为正常的数据`
+          );
+          return;
+        }
+      }
+    },
     getMonthDays(target) {
       let date = new Date(target + "-01"); // 移动端使用格式要转成: "2018/10/01"
       date.setMonth(date.getMonth() + 1); // 先设置为下个月
@@ -1114,6 +1223,9 @@ export default {
           pageNum: 1,
         };
       }
+      if (int == 3) {
+        this.$refs.tableList.clearMoreActive();
+      }
       var data = JSON.parse(JSON.stringify(this.formData));
       if (this.month) {
         var year = new Date().getFullYear();
@@ -1134,7 +1246,6 @@ export default {
       this.$api
         .inquiresystemsubscribelist(data)
         .then((res) => {
-          this.$refs.tableList.allCheckData = [];
           this.tableData = res.rows;
           this.total = res.total;
           this.navText.index = res.total;

+ 326 - 0
src/views/education/examManagement/applicationData/goodsListOpen.vue

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

+ 2 - 5
src/views/index.vue

@@ -810,7 +810,7 @@ export default {
   },
   computed: {
     educationType(){
-      return sessionStorage.getItem('spotData')?[]: this.$store.getters['educationType']
+      return this.$store.getters['educationType']
     },
     changeDateTime: function () {
       return function (date) {
@@ -826,16 +826,13 @@ export default {
     },
   },
   created() {
-    if (!sessionStorage.getItem("spotData")) {
       getInfo().then((res) => {
         this.user = res.data.user;
       });
-    }
   },
   mounted() {
     if (
-      this.$store.state.user.roles.includes("supervisory") ||
-      sessionStorage.getItem("spotData")
+      this.$store.state.user.roles.includes("supervisory")
     ) {
       this.ShowStatus = false;
     }

+ 12 - 1
src/views/resource/bankManagement/testPaperManagement/addPaper/baseAddPaper/index.vue

@@ -176,6 +176,16 @@
         <el-form-item label="试卷名称" prop="examName">
           <el-input v-model="listDataIns.examName"></el-input>
         </el-form-item>
+        <el-form-item label="商品试卷限制终端学习" prop="examLimitClient">
+          <el-select
+            v-model="listDataIns.examLimitClient"
+            multiple
+            placeholder="请选择"
+          >
+            <el-option label="公众号" value="1"></el-option
+            ><el-option label="小程序" value="2"> </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listDataIns.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -1281,7 +1291,7 @@ export default {
       });
     },
     async rulesTableSumbit() {
-      this.disabledBtn = true;
+      this.disabledBtn = true
       var data1 = {
         examPaperId: this.listDataIns.examPaperId,
         examName: this.listDataIns.examName,
@@ -1292,6 +1302,7 @@ export default {
         cityId: this.listDataIns.cityId,
         year: this.listDataIns.year,
         status: 1,
+        examLimitClient: this.listDataIns.examLimitClient.join(",") || null,
       };
       this.$api
         .addbankexam(data1)

+ 7 - 1
src/views/resource/bankManagement/testPaperManagement/addPaper/topicAddPaper/index.vue

@@ -982,6 +982,7 @@ export default {
       djNumType: 0, //0无限1有限
       djNum: 0, //答卷次数
       examsType: 1,
+      examLimitClient:"",
       businObj: {},
       draftBox: [], //草稿箱
       copytableData: [],
@@ -1146,6 +1147,7 @@ export default {
         };
         this.djTime = res.data.answerTime;
         this.djNum = res.data.answerNum;
+        this.examLimitClient = res.data.examLimitClient
         this.examsType = res.data.doType;
         this.passScore = res.data.passScore;
         this.simulateStatus = res.data.simulateStatus;
@@ -1561,7 +1563,7 @@ export default {
             self.$message.error("请添加选项");
             return;
           }
-          if (data.type != 3 && data.type != 4 && data.optionsList.length) {
+          if (data.type != 3 && data.type != 4 && data.type != 5 && data.optionsList.length) {
             var ast = data.optionsList.some((item) => {
               return !item.content && !item.imgUrl;
             });
@@ -1685,6 +1687,9 @@ export default {
             self.showHide = false;
           }
           if (this.statusPop === 0) {
+            if (!data.status && data.status !== 0) {
+              data.status = 1;
+            }
             this.tableData.splice(this.indexZB, 1, data);
             self.$message.success("修改成功");
             self.innerVisiblePaperTopic = false;
@@ -1762,6 +1767,7 @@ export default {
             ? this.$refs["papersort"].form
             : null,
         simulateStatus: this.simulateStatus,
+        examLimitClient: this.examLimitClient,
       };
       if (this.djTimeType === 0) {
         data.answerTime = 0;

+ 12 - 0
src/views/resource/bankManagement/testPaperManagement/editPaper/baseEditPaper/index.vue

@@ -157,6 +157,16 @@
         <el-form-item label="试卷名称" prop="examName">
           <el-input v-model="listDataIns.examName"></el-input>
         </el-form-item>
+        <el-form-item label="商品试卷限制终端学习" prop="examLimitClient">
+          <el-select
+            v-model="listDataIns.examLimitClient"
+            multiple
+            placeholder="请选择"
+          >
+            <el-option label="公众号" value="1"></el-option
+            ><el-option label="小程序" value="2"> </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listDataIns.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -256,6 +266,7 @@ export default {
     search() {
       this.$api.obtainbankexam(this.$route.query.id).then((res) => {
         res.data.year = res.data.year + "";
+        res.data.examLimitClient = res.data.examLimitClient?.split(",") || []
         this.listDataIns = res.data;
         if (res.data.provinceId) {
           this.changeCity(res.data.provinceId, true);
@@ -421,6 +432,7 @@ export default {
         provinceId: this.listDataIns.provinceId,
         cityId: this.listDataIns.cityId,
         year: this.listDataIns.year,
+        examLimitClient: this.listDataIns.examLimitClient.join(",") || null,
       };
       this.$api
         .editbankexam(data1)

+ 21 - 9
src/views/resource/bankManagement/testPaperManagement/editPaper/topicEditPaper/index.vue

@@ -70,14 +70,15 @@
         </template>
       </table-list>
       <el-pagination
-      @size-change="handleSizeChangepage"
-      @current-change="handleCurrentChangepage"
-      :current-page="page.pageNum"
-      :page-sizes="[10, 20, 50, 100]"
-      :page-size="page.pageSize"
-      layout="total, sizes, prev, pager, next, jumper"
-      :total="navText.index">
-    </el-pagination>
+        @size-change="handleSizeChangepage"
+        @current-change="handleCurrentChangepage"
+        :current-page="page.pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="page.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="navText.index"
+      >
+      </el-pagination>
       <div class="centerStys">
         <el-button size="small" @click="backPage">取消</el-button>
         <!-- <el-button size="small" type="warning" @click="preview">预览</el-button> -->
@@ -1010,6 +1011,7 @@ export default {
         anli: 0,
         jiand: 0,
       },
+      examLimitClient: "",
       passScore: "", //及格分数
       djTimeType: 0, //0无限1有限
       djTime: 0, //答卷时长
@@ -1206,6 +1208,7 @@ export default {
         };
         this.djTime = res.data.answerTime;
         this.djNum = res.data.answerNum;
+        this.examLimitClient = res.data.examLimitClient;
         this.examsType = res.data.doType;
         this.passScore = res.data.passScore;
         this.simulateStatus = res.data.simulateStatus;
@@ -1655,7 +1658,12 @@ export default {
             self.$message.error("请添加选项");
             return;
           }
-          if (data.type != 3 && data.type != 4 && data.optionsList.length) {
+          if (
+            data.type != 3 &&
+            data.type != 4 &&
+            data.type != 5 &&
+            data.optionsList.length
+          ) {
             var ast = data.optionsList.some((item) => {
               return !item.content && !item.imgUrl;
             });
@@ -1780,6 +1788,9 @@ export default {
             self.showHide = false;
           }
           if (this.statusPop === 0) {
+            if (!data.status && data.status !== 0) {
+              data.status = 1;
+            }
             this.tableData.splice(this.indexZB, 1, data);
             self.$message.success("修改成功");
             self.innerVisiblePaperTopic = false;
@@ -1854,6 +1865,7 @@ export default {
         passScore: this.passScore,
         doType: this.examsType,
         simulateStatus: this.simulateStatus,
+        examLimitClient: this.examLimitClient,
       };
       if (this.examsType === 2 && this.simulateStatus == 1) {
         if (this.$refs["papersort"] && this.$refs["papersort"].form) {

+ 12 - 4
src/views/resource/handoutManagement/handoutList/add/index.vue

@@ -222,13 +222,13 @@
 </template>
 
 <script>
-import JSZip from "jszip";
 import fpFile from "@/mixin/fpFile";
 export default {
   name: "HandoutListAdd",
   mixins: [fpFile],
   data() {
     return {
+      timeSign: new Date().getTime() + '',
       fileList: [],
       // --------------------------------------------
       disabledBtn: false,
@@ -283,7 +283,11 @@ export default {
     delList(data) {
       this.fileList = this.fileList.filter((d) => d.md5 !== data.md5);
       this.$api
-        .commondeletefile({ name: data.name, fileMd5: data.md5 })
+        .commondeletefile({
+          name: data.name,
+          fileMd5: data.md5,
+          timeSign: this.timeSign,
+        })
         .then(() => {});
     },
     unTime(val) {
@@ -482,6 +486,7 @@ export default {
         status: this.listData.status,
         canDownload: this.listData.canDownload,
         coverUrl: this.listData.coverUrl,
+        timeSign: this.timeSign,
         fileList:
           this.fileList.map((i) => {
             return { urlName: i.name };
@@ -524,7 +529,10 @@ export default {
         for (let i = 0; i < e.target.files.length; i++) {
           var type = e.target.files[i].name.toLowerCase().split(".").splice(-1);
           if (["docx", "xlsx", "pdf", "zip"].includes(type[0])) {
-            const obj = await this.chunksUpload(e.target.files[i]);
+            const obj = await this.chunksUpload(
+              e.target.files[i],
+              this.timeSign
+            );
             e.target.files[i].blob = window.URL.createObjectURL(
               e.target.files[i]
             );
@@ -532,7 +540,7 @@ export default {
             if (obj.status) {
               self.fileList.push(e.target.files[i]);
               this.uploadStatus--;
-            }else{
+            } else {
               this.uploadStatus--;
             }
           } else {

+ 10 - 5
src/views/resource/handoutManagement/handoutList/edit/index.vue

@@ -144,7 +144,7 @@
                 <span>{{ node.label }}</span>
                 <span>
                   <label
-                    style="margin-right: 6px;"
+                    style="margin-right: 6px"
                     @click.stop="submitClickData = data"
                     for="uplose1"
                     v-if="data.type === 2 && data.fileId"
@@ -221,6 +221,7 @@ export default {
   mixins: [fpFile],
   data() {
     return {
+      timeSign: new Date().getTime()+ '',
       filterText: "",
       submitClickData: {},
       fileList: [],
@@ -301,7 +302,7 @@ export default {
         var index = children.findIndex((d) => d.md5 === data.md5);
         this.fileList = this.fileList.filter((d) => d.md5 !== data.md5);
         this.$api
-          .commondeletefile({ name: data.urlName, fileMd5: data.md5 })
+          .commondeletefile({ name: data.urlName, fileMd5: data.md5,timeSign:this.timeSign })
           .then(() => {});
       }
       children.splice(index, 1);
@@ -537,6 +538,7 @@ export default {
         status: this.listData.status,
         canDownload: this.listData.canDownload,
         fileList: this.listData.fileList,
+        timeSign: this.timeSign,
       };
       // var formdata = new FormData();
       // formdata.append("param", JSON.stringify(dataInfos));
@@ -581,7 +583,10 @@ export default {
             // e.target.files[i].blob = window.URL.createObjectURL(
             //   e.target.files[i]
             // );
-            const obj = await this.chunksUpload(e.target.files[i]);
+            const obj = await this.chunksUpload(
+              e.target.files[i],
+              this.timeSign
+            );
             if (obj.status) {
               e.target.files[i].md5 = obj.md5;
               this.fileList.push(e.target.files[i]);
@@ -603,8 +608,8 @@ export default {
                 }
                 this.submitClickData.children.push(newChild);
               }
-            }else{
-              this.uploadStatus--
+            } else {
+              this.uploadStatus--;
             }
           } else {
             this.uploadStatus--;

+ 11 - 0
src/views/resource/videoManagement/chapter/add/index.vue

@@ -195,6 +195,12 @@
             >删除</el-button
           >
         </el-form-item>
+        <el-form-item label="公共标识" prop="commonSign">
+          <el-radio-group v-model="listData.commonSign">
+            <el-radio :label="1">公共章</el-radio>
+            <el-radio :label="0">非公共章</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -454,6 +460,7 @@ export default {
       changeHeight: true,
       bfImg: "oss/images/avatar/20211013/1634097664410_1397766697",
       listData: {
+        commonSign: 0,
         publishStatus: 1,
         recordingUrl: "",
         liveUrl: "",
@@ -480,6 +487,9 @@ export default {
         //   { required: true, message: "节时长不能为空" },
         //   { type: "number", message: "节时长必须为数字值" },
         // ],
+        commonSign: [
+          { required: true, message: "请选择公共标识", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -964,6 +974,7 @@ export default {
         name: this.listData.name,
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
+        commonSign: this.listData.commonSign,
       };
       this.$api
         .addCoursechapter(dataInfos)

+ 10 - 0
src/views/resource/videoManagement/chapter/edit/index.vue

@@ -167,6 +167,12 @@
             >删除</el-button
           >
         </el-form-item>
+        <el-form-item label="公共标识" prop="commonSign">
+          <el-radio-group v-model="listData.commonSign">
+            <el-radio :label="1">公共章</el-radio>
+            <el-radio :label="0">非公共章</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="是否发布" prop="publishStatus">
           <el-radio-group v-model="listData.publishStatus">
             <el-radio :label="1">是</el-radio>
@@ -452,6 +458,9 @@ export default {
         //   { required: true, message: "节时长不能为空" },
         //   { type: "number", message: "节时长必须为数字值" },
         // ],
+        commonSign: [
+          { required: true, message: "请选择公共标识", trigger: "change" },
+        ],
         publishStatus: [
           { required: true, message: "请选择是否发布", trigger: "change" },
         ],
@@ -1009,6 +1018,7 @@ export default {
         name: this.listData.name,
         prefixName: this.listData.prefixName,
         publishStatus: this.listData.publishStatus,
+        commonSign: this.listData.commonSign,
       };
       this.$api
         .editCoursechapter(dataInfos)

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

@@ -560,11 +560,27 @@ export default {
     this.search();
   },
   methods: {
+    allowDrag(node) {
+      if (node.level == 1) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+    allowDrop(draggingNode, dropNode, type) {
+      if (
+        (type === "prev" || type === "next") &&
+        draggingNode.level == 1 &&
+        dropNode.level == 1
+      ) {
+        return true;
+      }
+    },
     selectionChangeExam(a) {
       this.nowActiveCheck = a;
     },
     preview(node, data) {
-      if (data.type === 1||data.type === 2) {
+      if (data.type === 1 || data.type === 2) {
         var ints = data.id.split("-").map(Number);
         if (ints[0] === 1) {
           var atys = `${ints[1]}-${ints[2] || 0}-${ints[3] || 0}`;
@@ -576,7 +592,7 @@ export default {
           var atys = `0-0-${ints[1]}`;
         }
         if (this.menuExamList.some((items) => items.onlyId == atys)) {
-          const array = this.menuExamList.filter(item => item.onlyId == atys)
+          const array = this.menuExamList.filter((item) => item.onlyId == atys);
           this.$refs.testPaperPreview.openBox(1, array);
         }
       }

+ 403 - 0
src/views/secondBuild/completionList/index.vue

@@ -0,0 +1,403 @@
+<template>
+  <div id="">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="search(2)"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="jumpPage(props.scope.row)"
+          >学习记录</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      size: "small",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "完成列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      formList: [
+        {
+          placeholder: "学员姓名",
+          prop: "searchKey",
+        },
+        {
+          placeholder: "身份证",
+          prop: "idCard",
+        },
+      ],
+      formData: {
+        searchKey: "",
+        idCard: "",
+        profileStatus: "",
+        periodStatus: 1,
+        status: 1,
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "学员编码",
+          prop: "studentCode",
+          hidden: false,
+        },
+        {
+          label: "学员姓名",
+          prop: "realName",
+          hidden: true,
+        },
+        {
+          label: "学习年份",
+          prop: "sevenYear",
+          hidden: true,
+        },
+        {
+          label: "学员身份证",
+          prop: "idCard",
+          hidden: true,
+        },
+        {
+          label: "绑定手机号码",
+          prop: "telPhone",
+          hidden: false,
+        },
+        {
+          label: "所购商品",
+          prop: "goodsName",
+          hidden: true,
+        },
+        {
+          label: "所在班级",
+          prop: "className",
+          hidden: true,
+        },
+        {
+          label: "班级有效期",
+          prop1: "classStartTime",
+          prop2: "classEndTime",
+          hidden: false,
+          scope: "TimeLists",
+        },
+        {
+          label: "学时",
+          prop: "classHours",
+          hidden: false,
+        },
+        {
+          label: "视频学习进度(节)",
+          prop1: "stuAllNum",
+          prop2: "secAllNum",
+          hidden: false,
+          scope: "computer",
+        },
+        {
+          label: "做题进度(章卷)",
+          prop1: "recordNum",
+          prop2: "examNum",
+          hidden: false,
+          scope: "computer",
+        },
+        {
+          label: "学习开始时间",
+          prop: "startTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "学习结束时间",
+          prop: "endTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "学习服务期",
+          prop1: "serviceStartTime",
+          prop2: "serviceEndTime",
+          hidden: false,
+          Diszing: true,
+          scope: "TimeLists",
+        },
+        {
+          label: "填写资料审核状态",
+          prop: "profileStatus",
+          hidden: true,
+          scope: "isOptions",
+          options: [
+            {
+              label: "审核通过",
+              value: 1,
+            },
+            {
+              label: "待审核",
+              value: 2,
+            },
+            {
+              label: "审核不通过",
+              value: 3,
+            },
+          ],
+        },
+        {
+          label: "学时审批状态",
+          prop: "periodStatus",
+          hidden: true,
+          scope: "statusPeriod",
+        },
+        {
+          label: "审核通过时间",
+          prop: "periodTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "待重修(视频节和题卷)",
+          prop: "waitRebuildNum",
+          prop1: "rebuildNum",
+          hidden: false,
+          scope: "againStudent",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.$api
+      .inquireCourseEducationType({
+        educationName: "继续教育",
+        status: 1,
+      })
+      .then((res) => {
+        this.tableData = res.rows;
+        if (res.rows && res.rows.length > 0) {
+          this.$api
+            .inquireCourseProjectType({
+              educationId: res.rows[0].id,
+              projectName: "施工现场专业人员",
+              status: 1,
+            })
+            .then((result) => {
+              if (result.rows && result.rows.length > 0) {
+                this.formData.educationId = result.rows[0].educationId;
+                this.formData.projectId = result.rows[0].id;
+                this.search();
+              } else {
+                this.$message.error("项目类型未查询到施工现场专业人员");
+                return;
+              }
+            });
+        } else {
+          this.$message.error("教育类型未查询到继续教育");
+          return;
+        }
+      });
+  },
+  methods: {
+    jumpPage(v) {
+      // this.$api
+      //   .inquireGradegradelockPeriodStatus({
+      //     gradeId: v.gradeId,
+      //     userId: v.userId,
+      //     goodsId: v.goodsId,
+      //   })
+      //   .then((res) => {
+      //     if (res.msg) {
+      //       this.$message.warning(res.msg + "正在操作");
+      //       return;
+      //     } else {
+      let data = {
+        userId: v.userId,
+        realName: v.realName,
+        id: v.gradeId,
+        className: v.className,
+        goodsId: v.goodsId,
+        goodsName: v.goodsName,
+        orderGoodsId: v.orderGoodsId,
+        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
+      };
+      this.checkSession(data)
+        .then(() => {
+          //学员详情
+          this.$router.push({
+            name: "ClassHoursReviews",
+          });
+        })
+        .catch(() => {
+          this.$message.error("存在异常,请联系开发人员");
+        });
+      //   }
+      // });
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          educationId: this.formData.educationId,
+          projectId: this.formData.projectId,
+          businessId: this.formData.businessId,
+          searchKey: "",
+          idCard: "",
+          profileStatus: "",
+          periodStatus: 1,
+          status: 1,
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      this.$api
+        .inquireGradegradelistUserPeriods(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    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;
+  }
+}
+</style>

+ 846 - 0
src/views/secondBuild/courseList/index.vue

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

+ 344 - 0
src/views/secondBuild/learningList/index.vue

@@ -0,0 +1,344 @@
+<template>
+  <div id="">
+    <search-box-new
+      ref="searchBox"
+      :formData="formData"
+      :formList="formList"
+      @search="search"
+      @init="search(2)"
+    />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="jumpPage(props.scope.row)"
+          >学习记录</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  name: "",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    return {
+      size: "small",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "学习列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        border: true,
+        choice: true,
+        tableHide: true,
+        addHide: true,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      formList: [
+        {
+          placeholder: "学员姓名",
+          prop: "realname",
+        },
+        {
+          placeholder: "身份证",
+          prop: "idCard",
+        },
+        {
+          placeholder: "公司名称",
+          prop: "companyName",
+        },
+        {
+          placeholder: "手机号码",
+          prop: "telphone",
+        },
+      ],
+      formData: {
+        realname: "",
+        idcard: "",
+        companyName: "",
+        telphone: "",
+        profileStatus: "",
+        periodStatus: "",
+        status: 1,
+        pageSize: 10,
+        pageNum: 1,
+      },
+      // 表单
+      tableSet: [
+        {
+          label: "基本信息",
+          prop1: "realName",
+          prop2: "idCard",
+          prop3: "companyName",
+          hidden: true,
+          scope: "baseInfo",
+        },
+        {
+          label: "头像",
+          prop: "oneInchPhotos",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+        {
+          label: "最新拍照",
+          prop: "idCardImg1",
+          hidden: true,
+          scope: "img",
+          width: "120px",
+        },
+        {
+          label: "学习班名称",
+          prop: "className",
+          hidden: true,
+        },
+        {
+          label: "视频名称",
+          prop: "sectionName",
+          hidden: true,
+        },
+        {
+          label: "在线时间",
+          prop: "recordEndTime",
+          hidden: true,
+          scope: "aTimeList",
+        },
+        {
+          label: "学习时间",
+          prop1: "recordStartTime",
+          prop2: "recordEndTime",
+          scope: "TimeLists",
+          hidden: true,
+        },
+        {
+          label: "时长",
+          prop: "durationTime",
+          hidden: true,
+          scope: "convert",
+        },
+        {
+          label: "是否完成",
+          prop: "recordEndTime",
+          hidden: true,
+          scope: "recordEndTime",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+    };
+  },
+  mounted() {
+    this.$api
+      .inquireCourseEducationType({
+        educationName: "继续教育",
+        status: 1,
+      })
+      .then((res) => {
+        this.tableData = res.rows;
+        if (res.rows && res.rows.length > 0) {
+          this.$api
+            .inquireCourseProjectType({
+              educationId: res.rows[0].id,
+              projectName: "施工现场专业人员",
+              status: 1,
+            })
+            .then((result) => {
+              if (result.rows && result.rows.length > 0) {
+                this.formData.educationId = result.rows[0].educationId;
+                this.formData.projectId = result.rows[0].id;
+                this.search();
+              } else {
+                this.$message.error("项目类型未查询到施工现场专业人员");
+                return;
+              }
+            });
+        } else {
+          this.$message.error("教育类型未查询到继续教育");
+          return;
+        }
+      });
+  },
+  methods: {
+    jumpPage(options) {
+      const jump = () => {
+        //班级详情
+        this.$router.push({
+          name: "HoursTimesRecord",
+          query: {
+            gradeId: options.gradeId,
+            userId: options.userId,
+            goodsId: options.goodsId,
+            goodsName: options.goodsName,
+            className: options.className,
+            classHours: options.classHours,
+            studyStartTime: options.studyStartTime,
+            studyEndTime: options.studyEndTime,
+            orderGoodsId: options.orderGoodsId,
+          },
+        });
+      };
+      const statusPage = this.$store.state.tagsView.visitedViews.some(
+        (item) => {
+          return item.name == "HoursTimesRecord";
+        }
+      );
+      if (statusPage) {
+        this.$store
+          .dispatch("tagsView/delCachedView", {
+            name: "HoursTimesRecord",
+          })
+          .then((res) => {
+            jump();
+          });
+      } else {
+        jump();
+      }
+    },
+    search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData.pageNum = 1;
+        this.formData.realname = "";
+        this.formData.idCard = "";
+        this.formData.companyName = "";
+        this.formData.telphone = "";
+      }
+      var data = JSON.parse(JSON.stringify(this.formData));
+      this.$api
+        .inquireGradegradelistUserVideoRecord(data)
+        .then((res) => {
+          this.tableData = res.rows;
+          this.total = res.total;
+          this.navText.index = res.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    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;
+  }
+}
+</style>

+ 2 - 33
src/views/secondJian/completionList/index.vue

@@ -228,7 +228,8 @@ export default {
         className: v.className,
         goodsId: v.goodsId,
         goodsName: v.goodsName,
-        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+        orderGoodsId:v.orderGoodsId,
+        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
       };
       this.checkSession(data)
         .then(() => {
@@ -243,38 +244,6 @@ export default {
       //   }
       // });
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {

+ 1 - 32
src/views/secondJian/learningList/index.vue

@@ -176,6 +176,7 @@ export default {
             classHours: options.classHours,
             studyStartTime: options.studyStartTime,
             studyEndTime: options.studyEndTime,
+            orderGoodsId:options.orderGoodsId
           },
         });
       };
@@ -196,38 +197,6 @@ export default {
         jump();
       }
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {

+ 2 - 33
src/views/secondSeven/completionList/index.vue

@@ -228,7 +228,8 @@ export default {
         className: v.className,
         goodsId: v.goodsId,
         goodsName: v.goodsName,
-        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+        orderGoodsId:v.orderGoodsId,
+        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
       };
       this.checkSession(data)
         .then(() => {
@@ -243,38 +244,6 @@ export default {
       //   }
       // });
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {

+ 1 - 32
src/views/secondSeven/learningList/index.vue

@@ -176,6 +176,7 @@ export default {
             classHours: options.classHours,
             studyStartTime: options.studyStartTime,
             studyEndTime: options.studyEndTime,
+            orderGoodsId:options.orderGoodsId
           },
         });
       };
@@ -196,38 +197,6 @@ export default {
         jump();
       }
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {

+ 2 - 33
src/views/secondZao/completionList/index.vue

@@ -228,7 +228,8 @@ export default {
         className: v.className,
         goodsId: v.goodsId,
         goodsName: v.goodsName,
-        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}`,
+        orderGoodsId:v.orderGoodsId,
+        keyId: `${v.userId}-${v.goodsId}-${v.gradeId}-${v.orderGoodsId}`,
       };
       this.checkSession(data)
         .then(() => {
@@ -243,38 +244,6 @@ export default {
       //   }
       // });
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {

+ 1 - 32
src/views/secondZao/learningList/index.vue

@@ -176,6 +176,7 @@ export default {
             classHours: options.classHours,
             studyStartTime: options.studyStartTime,
             studyEndTime: options.studyEndTime,
+            orderGoodsId:options.orderGoodsId
           },
         });
       };
@@ -196,38 +197,6 @@ export default {
         jump();
       }
     },
-    checkSession(row) {
-      return new Promise((resolve, reject) => {
-        const SESSION = sessionStorage.getItem("hoursAudit");
-        try {
-          if (SESSION) {
-            let parseSession = JSON.parse(SESSION);
-            const STATUS = parseSession.options.some((item) => {
-              return (
-                item.userId == row.userId &&
-                item.goodsId == row.goodsId &&
-                item.id == row.id
-              );
-            });
-            if (!STATUS) {
-              parseSession.options.push(row);
-            }
-            parseSession.activeData = `${row.userId}-${row.goodsId}-${row.id}`;
-            sessionStorage.setItem("hoursAudit", JSON.stringify(parseSession));
-          } else {
-            let data = {
-              activeData: `${row.userId}-${row.goodsId}-${row.id}`,
-              options: [row],
-            };
-            sessionStorage.setItem("hoursAudit", JSON.stringify(data));
-          }
-
-          resolve();
-        } catch (error) {
-          reject();
-        }
-      });
-    },
     search(int) {
       this.loading = true;
       if (int === 1) {

+ 5 - 0
vue.config.js

@@ -41,6 +41,11 @@ module.exports = {
     disableHostCheck: true
   },
   configureWebpack: {
+    output: { // 输出重构  打包编译后的 文件名称  【模块名称.版本号.时间戳】
+      filename: `js/[name].[hash].js`,
+      chunkFilename: `js/[id].[hash].js`
+
+    },
     name: name,
     // 生产环境,则添加不参与打包的包名和依赖包的名称
     externals: {