فهرست منبع

Merge branch 'live-video-im' into 11/24SAAS

lex 2 سال پیش
والد
کامیت
8b7fbd2afc
49فایلهای تغییر یافته به همراه6351 افزوده شده و 4449 حذف شده
  1. 17 2
      src/api/teacherManager.js
  2. 221 204
      src/api/vipSeting.js
  3. 26 21
      src/constant/index.js
  4. 5 5
      src/main.js
  5. 3 1
      src/router/index.js
  6. 221 179
      src/store/modules/permission.js
  7. 29 13
      src/utils/searchArray.js
  8. 176 162
      src/utils/vueFilter.js
  9. 46 47
      src/views/accompanyManager/index.vue
  10. 46 169
      src/views/backManager/index.vue
  11. 13 2
      src/views/baseRulesClassSetting/index.vue
  12. 200 0
      src/views/baseRulesClassSetting/live-class-setting.vue
  13. 58 215
      src/views/businessManager/orderManager/income.vue
  14. 71 260
      src/views/businessManager/shopManager/shopOperation.vue
  15. 35 42
      src/views/categroyManager/generalSettings/vipCourseType.vue
  16. 67 215
      src/views/categroyManager/insideSetting/addressManager.vue
  17. 29 22
      src/views/categroyManager/specialSetup/modals/courseTimeForm.vue
  18. 36 90
      src/views/groupChatManager/component/chatList.vue
  19. 19 20
      src/views/groupChatManager/model/eidtPostMsg.vue
  20. 72 0
      src/views/liveClassManager/api.js
  21. 755 0
      src/views/liveClassManager/createLiveClass.vue
  22. 22 561
      src/views/liveClassManager/index.vue
  23. 270 0
      src/views/liveClassManager/liveClassManager.vue
  24. 503 0
      src/views/liveClassManager/liveClassTwo/components/courseAdjust.vue
  25. 395 0
      src/views/liveClassManager/liveClassTwo/components/courseOverview.vue
  26. 163 0
      src/views/liveClassManager/liveClassTwo/components/studentList.vue
  27. 72 0
      src/views/liveClassManager/liveClassTwo/index.vue
  28. 498 0
      src/views/liveClassManager/liveRoomManager.vue
  29. 533 0
      src/views/liveClassManager/modals/addLiveCourse.vue
  30. 123 311
      src/views/liveClassManager/newLiveClass.vue
  31. 278 0
      src/views/studentManager/components/studentLive.vue
  32. 20 74
      src/views/studentManager/index.vue
  33. 33 22
      src/views/teacherManager/teacherDetail/components/courseInfo1.vue
  34. 173 0
      src/views/teacherManager/teacherDetail/components/live-course.vue
  35. 24 91
      src/views/teacherManager/teacherDetail/index.vue
  36. 202 191
      src/views/teacherManager/teacherOperation/components/salarySet.vue
  37. 18 31
      src/views/teamDetail/componentCourse/gpsLocation.vue
  38. 36 101
      src/views/teamDetail/componentCourse/resetClass.vue
  39. 5 19
      src/views/teamDetail/components/modals/school-location.vue
  40. 75 214
      src/views/teamDetail/teamClassList.vue
  41. 136 386
      src/views/teamDetail/teamCourseList.vue
  42. 2 1
      src/views/vipClass/vipDetail/components/fnanceInfo.vue
  43. 47 41
      src/views/vipClass/vipDetail/components/teacherRecord.vue
  44. 43 43
      src/views/vipClass/vipDetail/components/vipBaseInfo.vue
  45. 82 82
      src/views/vipClass/vipDetail/components/vipStudentList.vue
  46. 68 71
      src/views/vipClass/vipList.vue
  47. 233 384
      src/views/vipClass/vipReset.vue
  48. 151 153
      src/views/workBenchManager/journal/model/leave.vue
  49. 1 4
      vue.config.js

+ 17 - 2
src/api/teacherManager.js

@@ -2,6 +2,7 @@
 import request from "@/utils/request";
 import qs from "qs";
 let api = "/api-web";
+import request2 from "@/utils/request2";
 // 分页查询教师列表
 export function teacherQueryPage(data) {
   return request({
@@ -93,8 +94,15 @@ export function vipGroupSalaryList(data) {
 }
 
 // 修改教师vip课酬
+// export function vipGroupSalarySet(data) {
+//   return request({
+//     url: api + "/teacherDefaultVipGroupSalary/upSet",
+//     method: "post",
+//     data: data
+//   });
+// }
 export function vipGroupSalarySet(data) {
-  return request({
+  return request2({
     url: api + "/teacherDefaultVipGroupSalary/upSet",
     method: "post",
     data: data,
@@ -207,8 +215,15 @@ export function teacherDefaultPracticeGroupSalary(data) {
 }
 
 // 修改网管课课酬
+// export function PracticeGroupSalaryUpdate(data) {
+//   return request({
+//     url: api + "/teacherDefaultPracticeGroupSalary/update",
+//     method: "post",
+//     data
+//   });
+// }
 export function PracticeGroupSalaryUpdate(data) {
-  return request({
+  return request2({
     url: api + "/teacherDefaultPracticeGroupSalary/update",
     method: "post",
     data,

+ 221 - 204
src/api/vipSeting.js

@@ -1,484 +1,501 @@
-import request from '@/utils/request'
-import request2 from '@/utils/request2'
-import qs from 'qs'
-let api = '/api-web'
+import request from "@/utils/request";
+import request2 from "@/utils/request2";
+import qs from "qs";
+let api = "/api-web";
 // 获取vip 分类列表
 export function vipGroupCategory(data) {
   return request({
-    url: api + '/vipGroupCategory/queryAll',
-    method: 'get',
+    url: api + "/vipGroupCategory/queryAll",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 获取vip 老师默认分类列表
 export function findTeacherDefaultSalary(data) {
   return request({
-    url: api + '/vipGroupCategory/findTeacherDefaultSalary',
-    method: 'post',
+    url: api + "/vipGroupCategory/findTeacherDefaultSalary",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 获取 vip循环列表
 export function getDefaultClassesCycle(data) {
   return request({
-    url: api + '/vipGroupDefaultClassesCycle/queryAll',
-    method: 'get',
-    params: data,
-  })
+    url: api + "/vipGroupDefaultClassesCycle/queryAll",
+    method: "get",
+    params: data
+  });
 }
 
 // 单个添加vip课程类型
 export function addVipGroupCategory(data) {
   return request({
-    url: api + '/vipGroupCategory/add',
-    method: 'post',
+    url: api + "/vipGroupCategory/add",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 单个修改vip课程类型
 export function resetVipGroupCategory(data) {
   return request({
-    url: api + '/vipGroupCategory/update',
-    method: 'post',
+    url: api + "/vipGroupCategory/update",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 // 删除单个vip类型
 export function removeVipGroupCategory(data) {
   return request({
-    url: api + '/vipGroupCategory/delete',
-    method: 'post',
+    url: api + "/vipGroupCategory/delete",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 新增排课周期
 export function addDefaultClassesCycle(data) {
   return request({
-    url: api + '/vipGroupDefaultClassesCycle/add',
-    method: 'post',
+    url: api + "/vipGroupDefaultClassesCycle/add",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 修改排课周期
 export function resetDefaultClassesCycle(data) {
   return request({
-    url: api + '/vipGroupDefaultClassesCycle/update',
-    method: 'post',
+    url: api + "/vipGroupDefaultClassesCycle/update",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 删除排课周期
 export function removeDefaultClassesCycle(data) {
   return request({
-    url: api + '/vipGroupDefaultClassesCycle/delete',
-    method: 'post',
+    url: api + "/vipGroupDefaultClassesCycle/delete",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 新增默认单价
 export function defaultClassesUnitPrice(data) {
   return request({
-    url: api + '/vipGroupDefaultClassesUnitPrice/add',
-    method: 'post',
+    url: api + "/vipGroupDefaultClassesUnitPrice/add",
+    method: "post",
+    data: qs.stringify(data)
+  });
+}
+
+// 单个添加vip课程类型
+export function updatevipGroupDefaultClassesUnitPrice(data) {
+  return request({
+    url: api + "/vipGroupDefaultClassesUnitPrice/update",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 查询活动方案列表
 export function vipGroupActivity(data) {
   return request({
-    url: api + '/vipGroupActivity/queryPage',
-    method: 'get',
+    url: api + "/vipGroupActivity/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 根据课程类型获取活动方案
 export function vipGroupActivityFind(data) {
   return request({
-    url: api + '/vipGroupActivity/findByVipGroupCategory',
-    method: 'get',
+    url: api + "/vipGroupActivity/findByVipGroupCategory",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 新增vip课活动方案
 export function addVipActive(data) {
   return request({
-    url: api + '/vipGroupActivity/addVipGroupActivity',
-    method: 'POST',
+    url: api + "/vipGroupActivity/addVipGroupActivity",
+    method: "POST",
     data
-  })
+  });
 }
 // 修改vio课活动方案
 export function resetVipActive(data) {
   return request({
-    url: api + '/vipGroupActivity/update',
-    method: 'POST',
+    url: api + "/vipGroupActivity/update",
+    method: "POST",
     data
-  })
+  });
 }
 
 // 删除vip课
 
 export function removeVipActive(data) {
   return request({
-    url: api + '/vipGroupActivity/delete',
-    method: 'POST',
+    url: api + "/vipGroupActivity/delete",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 获取vip列表
 export function getVipList(data) {
   return request({
-    url: api + '/vipGroupManage/queryAll',
-    method: 'GET',
-    params: data
-  })
+    url: api + "/vipGroupManage/queryAll",
+    method: "post",
+    data
+  });
 }
 // 根据id获取vip详情
 export function getVipGroupDetail(data) {
   return request({
     url: api + `/vipGroupManage/getVipGroupDetail`,
-    method: 'GET',
+    method: "GET",
     params: data
-  })
+  });
 }
 
 // 根据id获取vip详情
 export function getVipGroupDetailForAudit(data) {
   return request({
     url: api + `/vipGroupManage/getVipGroupDetailForAudit`,
-    method: 'GET',
+    method: "GET",
     params: data
-  })
+  });
 }
 
 // 根据vipid获取学员
 export function findVipGroupStudents(data) {
   return request({
-    url: api + '/vipGroupManage/findVipGroupStudents',
-    method: 'GET',
-    params: data
-  })
+    url: api + "/vipGroupManage/findVipGroupStudents",
+    method: "post",
+    data
+  });
 }
 
 // 根据vipid和学生id 退学
 export function leaveSchool(data) {
   return request({
-    url: api + '/vipGroupManage/applyRefundForStudent',
-    method: 'POST',
+    url: api + "/vipGroupManage/applyRefundForStudent",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 获取vip教学记录
 export function findVipGroupTeachingRecord(data) {
   return request({
-    url: api + '/vipGroupManage/findVipGroupTeachingRecord',
-    method: 'get',
-    params: data
-  })
+    url: api + "/vipGroupManage/findVipGroupTeachingRecord",
+    method: "post",
+    data
+  });
 }
 
 // 获取vip财务信息
 export function getVipGroupSalarys(data) {
   return request({
-    url: api + '/vipGroupManage/findVipGroupSalarys',
-    method: 'get',
-    params: data
-  })
+    url: api + "/vipGroupManage/findVipGroupSalarys",
+    method: "post",
+    data
+  });
 }
 
 // 获取当前课程上课学员
 export function getStudyStudents(data) {
   return request({
-    url: api + '/vipGroupManage/findVipGroupAttendanceStudents',
-    method: 'get',
+    url: api + "/vipGroupManage/findVipGroupAttendanceStudents",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // vip课时调整
 export function resetVipClass(data) {
   return request({
-    url: api + '/vipGroupManage/classStartDateAdjust',
-    method: 'POST',
+    url: api + "/vipGroupManage/classStartDateAdjust",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 计算vip课酬
 export function getVipGroupCostCount(data) {
   return request({
-    url: api + '/vipGroupManage/getVipGroupCostCount',
-    method: 'POST',
+    url: api + "/vipGroupManage/getVipGroupCostCount",
+    method: "POST",
     data: data
-  })
+  });
 }
 
 // 计算网管课课酬
 export function getPracticeGroupCostCount(data) {
   return request({
-    url: api + '/practiceGroupManage/getPracticeGroupCostCount',
-    method: 'POST',
+    url: api + "/practiceGroupManage/getPracticeGroupCostCount",
+    method: "POST",
     data: data
-  })
+  });
 }
 // 网管课申请
 export function createPractice(data) {
   return request({
-    url: api + '/practiceGroupManage/practiceGroupApply',
-    method: 'POST',
+    url: api + "/practiceGroupManage/practiceGroupApply",
+    method: "POST",
     data
-  })
+  });
 }
 
 // 获取网管课单价 practiceGroupManage/queryPracticeGroupSellPrice
 export function getPracticeGroupSellPrice(data) {
   return request({
-    url: api + '/practiceGroupManage/queryPracticeGroupSellPrice',
-    method: 'GET',
-    params:data
-  })
+    url: api + "/practiceGroupManage/queryPracticeGroupSellPrice",
+    method: "GET",
+    params: data
+  });
 }
 // vip课申请
 export function createVip(data) {
   return request({
-    url: api + '/vipGroupManage/vipGroupApply',
-    method: 'POST',
+    url: api + "/vipGroupManage/vipGroupApply",
+    method: "POST",
     data
-  })
+  });
 }
 
 // 暂停vip
 export function closeVip(data) {
   return request({
-    url: api + '/vipGroupManage/stopVipGroup',
-    method: 'POST',
+    url: api + "/vipGroupManage/stopVipGroup",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 修改vip基本信息
 
 export function updateVipBaseInfo(data) {
   return request({
-    url: api + '/vipGroupManage/updateVipBaseInfo',
-    method: 'POST',
+    url: api + "/vipGroupManage/updateVipBaseInfo",
+    method: "POST",
     data
-  })
+  });
 }
 
 // 获取vip课程计划
 export function findVipGroupCourseSchedules(data) {
   return request({
-    url: api + '/courseSchedule/findVipGroupCourseSchedules',
-    method: 'POST',
-    data: qs.stringify(data)
-  })
+    url: api + "/courseSchedule/findVipGroupCourseSchedules",
+    method: "POST",
+    data
+  });
 }
 
 // 批量删除课程 删除vip
 export function bathDelete(data) {
   return request({
-
-    url: api + '/courseSchedule/batchDelete',
-    method: 'POST',
+    url: api + "/courseSchedule/batchDelete",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 // vip批量修改
 export function vipCourseAdjust(data) {
   return request({
-    url: api + '/courseSchedule/vipCourseAdjust',
-    method: 'POST',
+    url: api + "/courseSchedule/vipCourseAdjust",
+    method: "POST",
     data
-  })
+  });
 }
 
 // 新增vip课程计划
 export function appendVipGroupCourseSchedules(data) {
   return request({
-    url: api + '/vipGroupManage/appendVipGroupCourseSchedules',
-    method: 'POST',
+    url: api + "/vipGroupManage/appendVipGroupCourseSchedules",
+    method: "POST",
     data
-  })
+  });
 }
 
 // vip退费查询
 export function getStudentSurplusCourseFee(data) {
   return request({
-    url: api + '/vipGroupManage/getStudentSurplusCourseFee',
-    method: 'get',
+    url: api + "/vipGroupManage/getStudentSurplusCourseFee",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // vip搜索课程余额的学生
 export function getHaveCourseBalanceStudents(data) {
   return request({
-    url: api + '/vipGroupManage/findHaveCourseBalanceStudents',
-    method: 'get',
-    params: data
-  })
+    url: api + "/vipGroupManage/findHaveCourseBalanceStudents",
+    method: "post",
+    data
+  });
 }
 
 // vip添加学员 addVipGroupStudents
 export function addVipGroupStudents(data) {
   return request({
-    url: api + '/vipGroupManage/addVipGroupStudents',
-    method: 'post',
+    url: api + "/vipGroupManage/addVipGroupStudents",
+    method: "post",
     data
-  })
+  });
 }
 // /courseSchedule/batchAppendVipGroupCourses
 // vip课批量新增
 export function batchAppendVipGroupCourses(data) {
   return request({
-    url: api + '/courseSchedule/batchAppendVipGroupCourses',
-    method: 'POST',
+    url: api + "/courseSchedule/batchAppendVipGroupCourses",
+    method: "POST",
     data
-  })
+  });
 }
 
 // vip休学
 export function vipPauseForStudent(data) {
   return request({
-    url: api + '/vipGroupManage/pauseForStudent',
-    method: 'POST',
+    url: api + "/vipGroupManage/pauseForStudent",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 获取学生休学信息
 export function getStudentPauseInfo(data) {
   return request({
-    url: api + '/vipGroupManage/getStudentPauseInfo',
-    method: 'POST',
+    url: api + "/vipGroupManage/getStudentPauseInfo",
+    method: "POST",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 恢复休学
 export function recoverForStudent(data) {
   return request({
-    url: api + '/vipGroupManage/recoverForStudent',
-    method: 'POST',
+    url: api + "/vipGroupManage/recoverForStudent",
+    method: "POST",
     data
-  })
+  });
 }
 
 // 根据vip课所在部门与声部获取教师
 export function findTeacherWithVipGroupOrganAndSubject(data) {
   return request({
-    url: api + '/vipGroupManage/findTeacherWithVipGroupOrganAndSubject',
-    method: 'get',
+    url: api + "/vipGroupManage/findTeacherWithVipGroupOrganAndSubject",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 删除VIP课
 export function deleteVipGroup(data) {
   return request({
-    url: api + '/vipGroupManage/deleteVipGroup',
-    method: 'post',
+    url: api + "/vipGroupManage/deleteVipGroup",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 查询公用部分,分部
 export function getPublicOrgans(data) {
   return request({
-    url: api + '/vipGroupManage/getPublicOrgans',
-    method: 'get',
+    url: api + "/vipGroupManage/getPublicOrgans",
+    method: "get",
     params: data
-  })
+  });
 }
 // 修改vip课程组 vipGroupManageUpdate
 export function vipGroupManageUpdate(data) {
   return request({
-    url: api + '/vipGroupManage/update',
-    method: 'post',
+    url: api + "/vipGroupManage/update",
+    method: "post",
     data: qs.stringify(data)
-  })
-}
-export const getVipGroupActivity = data => request2({
-  url:api +  '/vipGroupActivity/get',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+  });
+}
+export const getVipGroupActivity = data =>
+  request2({
+    url: api + "/vipGroupActivity/get",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 // 启用停用活动方案
-export const enableVipGroupActivity = data => request2({
-  url:api +  '/vipGroupActivity/enable',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const enableVipGroupActivity = data =>
+  request2({
+    url: api + "/vipGroupActivity/enable",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 // 查询资格列表  权限
 
-export const getActivityUserMapperList = data => request2({
-  url:api +  '/activityUserMapper/queryActivityUserMapper',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const getActivityUserMapperList = data =>
+  request2({
+    url: api + "/activityUserMapper/queryActivityUserMapper",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 // 查询学生列表 studentManage/queryStudent
-export const getStudentList = data => request2({
-  url:api +  '/studentManage/queryStudent',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const getStudentList = data =>
+  request2({
+    url: api + "/studentManage/queryStudent",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 //添加排课资格
-export const addActivityUserMapperStudents= data => request2({
-  url:api +  '/activityUserMapper/add',
-  data:data,
-  method: 'post',
-  requestType: 'json'
-})
+export const addActivityUserMapperStudents = data =>
+  request2({
+    url: api + "/activityUserMapper/add",
+    data: data,
+    method: "post",
+    requestType: "json"
+  });
 
 // 获取学生资格详情
 
-export const getStudentactivityList = data => request2({
-  url:api +  '/activityUserMapper/queryPage',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const getStudentactivityList = data =>
+  request2({
+    url: api + "/activityUserMapper/queryPage",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 // 取消资格
-export const cutActivityrMapper = data => request2({
-  url:api +  '/activityUserMapper/cut',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const cutActivityrMapper = data =>
+  request2({
+    url: api + "/activityUserMapper/cut",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 // 资格记录
-export const activityrMapperInfo = data => request2({
-  url:api +  '/activityUserMapperAdjustLog/queryPage',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const activityrMapperInfo = data =>
+  request2({
+    url: api + "/activityUserMapperAdjustLog/queryPage",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });
 
 // 查询当前线上课数
-export const getOnlineMun = data => request2({
-  url:api +  '/tenantConfig/get',
-  params:data,
-  method: 'get',
-  requestType: 'form'
-})
+export const getOnlineMun = data =>
+  request2({
+    url: api + "/tenantConfig/get",
+    params: data,
+    method: "get",
+    requestType: "form"
+  });

+ 26 - 21
src/constant/index.js

@@ -43,7 +43,8 @@ export const courseType = {
   DEMO: "试听课",
   PRACTICE: "网管课",
   COMM: "对外课",
-  MEMBER: "会员"
+  MEMBER: "会员",
+  LIVE: "直播课"
 };
 
 export const boolOptions = {
@@ -376,7 +377,8 @@ export const orderType = {
   PERSONAL: "个人订单",
   OTHER: "其他",
   ACTIVITY: "活动购买",
-  LIVE_BUY: "直播购物"
+  LIVE_BUY: "直播购物",
+  LIVE_GROUP_BUY: "直播课购买"
 };
 
 export const backType = {
@@ -385,7 +387,8 @@ export const backType = {
   MUSIC: "乐团退团",
   GOODS: "商品退费",
   SUBJECT_CHANGE: "声部更换",
-  CANCEL_ACTIVITY_COURSE: "取消活动资格"
+  CANCEL_ACTIVITY_COURSE: "取消活动资格",
+  LIVE: "直播课退学"
 };
 
 export const paymentMode = {
@@ -445,7 +448,7 @@ export const coupontypeDetail = {
   SINGLE: "声部课",
   MIX: "合奏课",
   VIP: "VIP",
-
+  LIVE: "直播课",
   MEMBER: "云教练"
 };
 
@@ -500,7 +503,8 @@ export const catgGoupType = {
   MUSIC_NETWORK: "乐团网管课",
   PARENT_MEETING: "家长会",
   TRAINING: "训练营",
-  REPERTOIRE_PLAY: "曲目演奏课"
+  REPERTOIRE_PLAY: "曲目演奏课",
+  LIVE: "直播课"
 };
 
 export const catType = {
@@ -508,7 +512,8 @@ export const catType = {
   CLASS: "班级群",
   REPERTOIRE_PLAY: "曲目演奏课",
   TRAINING: "训练营",
-  VIP: "VIP课群"
+  VIP: "VIP课群",
+  LIVE: "直播课群"
 };
 export const catDotType = {
   MUSIC: "乐团",
@@ -540,7 +545,7 @@ export const quiteReason = {
 export const osType = {
   pc: "web",
   mobile: "手机",
-  client: "客户端"
+  client: "乐直播"
 };
 
 export const serviceProvider = {
@@ -564,25 +569,25 @@ export const levelStatus = {
 export const schoolUserType = {
   SCHOOLMASTER: "校长",
   ORCHESTRA_LEADER: "乐团领队",
-  SCHOOL_LEADER:'分管领导',
+  SCHOOL_LEADER: "分管领导",
   TEACHER: "负责老师"
 };
 
 // 巡堂评价
 export const evaluateStatus = {
-  EXCELLENT:'优秀',
-  GOOD:'良好',
-  QUALIFIED:'合格',
-  UNQUALIFIED:'不合格'
-}
+  EXCELLENT: "优秀",
+  GOOD: "良好",
+  QUALIFIED: "合格",
+  UNQUALIFIED: "不合格"
+};
 
 // 问题类型
 export const problemType = {
-  CLASSROOM_DISCIPLINE:'课堂纪律',
-  AFTER_SCHOOL_ORGANIZATION:'放学组织',
-  ENVIRONMENTAL_SANITATION:'环境卫生',
-  TEACHING_DEMEANOR:'教态仪表',
-  COMMUNICATION_EXPRESSION:'沟通表达',
-  PROFESSIONAL_ABILITY:'专业能力',
-  OTHER:'其他'
-}
+  CLASSROOM_DISCIPLINE: "课堂纪律",
+  AFTER_SCHOOL_ORGANIZATION: "放学组织",
+  ENVIRONMENTAL_SANITATION: "环境卫生",
+  TEACHING_DEMEANOR: "教态仪表",
+  COMMUNICATION_EXPRESSION: "沟通表达",
+  PROFESSIONAL_ABILITY: "专业能力",
+  OTHER: "其他"
+};

+ 5 - 5
src/main.js

@@ -43,10 +43,10 @@ import "./utils/directive";
 import "@/icons"; // icon
 import "@/permission"; // permission control
 import { Message } from "element-ui";
-import VueCoreVideoPlayer from 'vue-core-video-player'
-Vue.use(VueCoreVideoPlayer,{
-  lang: 'zh-CN'
-})
+import VueCoreVideoPlayer from "vue-core-video-player";
+Vue.use(VueCoreVideoPlayer, {
+  lang: "zh-CN"
+});
 const showMessage = Symbol("showMessage");
 
 // imkit 为核心模块
@@ -182,7 +182,7 @@ Vue.mixin({
       }
       return val;
     },
-    keyupEvent(e, input) {
+    keyupEvent(e) {
       // 正数,小数2位 @keyup.native='keyupEvent($event)'
       e.target.value = e.target.value.replace(/[^\d.]/g, "");
       e.target.value = e.target.value.replace(/\.{2,}/g, ".");

+ 3 - 1
src/router/index.js

@@ -365,7 +365,7 @@ export const asyncRoutes = {
   // afterWorkList:()=>import('@/views/afterSchoolManager/afterWorkList'),
   // 课外管理
   afterSchoolManager: () => import("@/views/afterSchoolManager"),
-  examination:()=>import("@/views/afterSchoolManager/examination"),
+  examination: () => import("@/views/afterSchoolManager/examination"),
   afterSchoolDetail: () =>
     import("@/views/afterSchoolManager/afterSchoolDetail"),
   // 运营管理 学员列表
@@ -610,8 +610,10 @@ export const asyncRoutes = {
   liveClassManager: () => import("@/views/liveClassManager"),
   // 新建直播课
   createLiveClass: () => import("@/views/liveClassManager/newLiveClass"),
+  createLiveCourse: () => import("@/views/liveClassManager/createLiveClass"),
   // 直播课详情
   liveClassDetail: () => import("@/views/liveClassManager/liveClassDetail"),
+  liveClassTwo: () => import("@/views/liveClassManager/liveClassTwo"),
   // 平台员工管理
   platformAdminManger: () => import("@/views/platformManager/paltformAdmin"),
   // 小课学员管理

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 221 - 179
src/store/modules/permission.js


+ 29 - 13
src/utils/searchArray.js

@@ -12,8 +12,8 @@ import {
   downListType,
   musicGroupType,
   conclusion,
-  vipResetType,
-  courseViewType,
+  // vipResetType,
+  // courseViewType,
   clientType,
   couponType,
   backType,
@@ -134,6 +134,10 @@ if (tenantId == 1) {
     {
       label: "对外课",
       value: "COMM"
+    },
+    {
+      label: "直播课",
+      value: "LIVE"
     }
   ];
 } else {
@@ -213,6 +217,10 @@ if (tenantId == 1) {
     {
       label: "对外课",
       value: "COMM"
+    },
+    {
+      label: "直播课",
+      value: "LIVE"
     }
   ];
 }
@@ -231,6 +239,10 @@ export const courseListType = [
   {
     label: "网管课",
     value: "PRACTICE"
+  },
+  {
+    label: "直播课",
+    value: "LIVE"
   }
 ];
 
@@ -412,6 +424,10 @@ export const orderStatus = [
   {
     value: "LIVE_BUY",
     label: "直播购物"
+  },
+  {
+    value: "LIVE_GROUP_BUY",
+    label: "直播课购买"
   }
 ];
 
@@ -444,10 +460,10 @@ export const vipGroupStatus = [
     value: "1",
     text: "报名中"
   },
-  {
-    value: "5",
-    text: "报名结束"
-  },
+  // {
+  //   value: "5",
+  //   text: "报名结束"
+  // },
   {
     value: "2",
     text: "进行中"
@@ -459,11 +475,11 @@ export const vipGroupStatus = [
   {
     value: "3",
     text: "取消"
-  },
-  {
-    value: "6",
-    text: "暂停"
   }
+  // {
+  //   value: "6",
+  //   text: "暂停"
+  // }
 ];
 
 // 课程状态
@@ -883,9 +899,9 @@ export const catTypeList = getValueForKey(catType);
 export const quiteReasonList = getValueForKey(quiteReason);
 export const payUserTypeList = getValueForKey(payUserType);
 export const levelStatusList = getValueForKey(levelStatus);
-export const evaluateStatusList = getValueForKey(evaluateStatus)
-export const problemTypeList = getValueForKey(problemType)
-export const schoolUserTypeList = getValueForKey(schoolUserType)
+export const evaluateStatusList = getValueForKey(evaluateStatus);
+export const problemTypeList = getValueForKey(problemType);
+export const schoolUserTypeList = getValueForKey(schoolUserType);
 //downListType
 function getValueForKey(obj) {
   let arr = [];

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 176 - 162
src/utils/vueFilter.js


+ 46 - 47
src/views/accompanyManager/index.vue

@@ -1,47 +1,46 @@
-<!--  -->
-<template>
-  <div class="m-container">
-    <h2>
-      <div class="squrt"></div>
-      网管课管理
-    </h2>
-    <div class="m-core">
-      <tab-router
-        v-model.trim="activeIndex"
-        type="card"
-        @tab-click="handleClick"
-      >
-        <el-tab-pane label="网管课管理" lazy name="1">
-          <accompanyList v-if="activeIndex === '1'" />
-        </el-tab-pane>
-        <el-tab-pane label="网管课购买" lazy name="2">
-          <accompanyBuys v-if="activeIndex === '2'" />
-        </el-tab-pane>
-      </tab-router>
-    </div>
-  </div>
-</template>
-
-<script>
-import accompanyList from "@/views/accompanyManager/accompanyList";
-import accompanyBuys from "@/views/accompanyManager/accompanyBuys";
-export default {
-  components: { accompanyList, accompanyBuys },
-  data() {
-    return {
-      activeIndex: "1",
-    };
-  },
-  //生命周期 - 创建完成(可以访问当前this实例)
-  created() {},
-  //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted() {},
-  methods: {
-    handleClick(evt) {
-      // this.changeHash(evt.name);
-    },
-  },
-};
-</script>
-<style lang='scss' scoped>
-</style>
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      网管课管理
+    </h2>
+    <div class="m-core">
+      <tab-router
+        v-model.trim="activeIndex"
+        type="card"
+        @tab-click="handleClick"
+      >
+        <el-tab-pane label="网管课管理" lazy name="1">
+          <accompanyList v-if="activeIndex === '1'" />
+        </el-tab-pane>
+        <el-tab-pane label="网管课购买" lazy name="2">
+          <accompanyBuys v-if="activeIndex === '2'" />
+        </el-tab-pane>
+      </tab-router>
+    </div>
+  </div>
+</template>
+
+<script>
+import accompanyList from "@/views/accompanyManager/accompanyList";
+import accompanyBuys from "@/views/accompanyManager/accompanyBuys";
+export default {
+  components: { accompanyList, accompanyBuys },
+  data() {
+    return {
+      activeIndex: "1"
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {},
+  methods: {
+    handleClick(evt) {
+      // this.changeHash(evt.name);
+    }
+  }
+};
+</script>
+<style lang="scss" scoped></style>

+ 46 - 169
src/views/backManager/index.vue

@@ -6,126 +6,62 @@
       退费记录
     </h2>
     <div class="m-core">
-      <save-form
-        :inline="true"
-        :model="searchForm"
-        ref="searchForm"
-        @submit="search"
-        @reset="onReSet"
-      >
+      <save-form :inline="true" :model="searchForm" ref="searchForm" @submit="search" @reset="onReSet">
         <el-form-item prop="search">
-          <el-input
-            class="search"
-            v-model.trim="searchForm.search"
-            clearable
-           @keyup.enter.native="
-              (e) => {
-                e.target.blur();
-                $refs.searchForm.save();
-                search();
-              }
-            "
-            placeholder="退费编号/学员/课程组/流水号"
-          ></el-input>
+          <el-input class="search" v-model.trim="searchForm.search" clearable @keyup.enter.native="(e) => {
+              e.target.blur();
+              $refs.searchForm.save();
+              search();
+            }
+            " placeholder="退费编号/学员/课程组/流水号"></el-input>
         </el-form-item>
         <el-form-item prop="organId">
-          <el-select
-            class="multiple"
-            v-model.trim="searchForm.organId"
-            filterable
-            clearable
-            multiple
-            collapse-tags
-            placeholder="请选择分部"
-          >
-            <el-option
-              v-for="(item, index) in selects.branchs"
-              :key="index"
-              :label="item.name"
-              :value="item.id"
-            ></el-option>
+          <el-select class="multiple" v-model.trim="searchForm.organId" filterable clearable multiple collapse-tags
+            placeholder="请选择分部">
+            <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+              :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="returnFeeType">
-          <el-select
-            class="multiple"
-            v-model.trim="searchForm.returnFeeType"
-            filterable
-            clearable
-            placeholder="请选择退费类型"
-          >
-            <el-option
-              v-for="(item, index) in backTypeList"
-              :key="index"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select class="multiple" v-model.trim="searchForm.returnFeeType" filterable clearable placeholder="请选择退费类型">
+            <el-option v-for="(item, index) in backTypeList" :key="index" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="returnFeeFlag">
-          <el-select
-            class="multiple"
-            v-model.trim="searchForm.returnFeeFlag"
-            filterable
-            clearable
-            placeholder="退费状态"
-          >
+          <el-select class="multiple" v-model.trim="searchForm.returnFeeFlag" filterable clearable placeholder="退费状态">
             <el-option label="已打款" value="1"></el-option>
             <el-option label="未打款" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="backTime">
-          <el-date-picker
-            v-model.trim="searchForm.backTime"
-            style="width: 400px"
-            type="daterange"
-            range-separator="至"
-            start-placeholder="退费开始日期"
-            end-placeholder="退费结束日期"
-            value-format="yyyy-MM-dd"
-            :picker-options="{
+          <el-date-picker v-model.trim="searchForm.backTime" style="width: 400px" type="daterange" range-separator="至"
+            start-placeholder="退费开始日期" end-placeholder="退费结束日期" value-format="yyyy-MM-dd" :picker-options="{
               firstDayOfWeek: 1,
-            }"
-          ></el-date-picker>
+            }"></el-date-picker>
         </el-form-item>
         <el-form-item prop="payTime">
-          <el-date-picker
-            v-model.trim="searchForm.payTime"
-            style="width: 400px"
-            type="daterange"
-            range-separator="至"
-            start-placeholder="打款开始日期"
-            end-placeholder="打款结束日期"
-            value-format="yyyy-MM-dd"
-            :picker-options="{
+          <el-date-picker v-model.trim="searchForm.payTime" style="width: 400px" type="daterange" range-separator="至"
+            start-placeholder="打款开始日期" end-placeholder="打款结束日期" value-format="yyyy-MM-dd" :picker-options="{
               firstDayOfWeek: 1,
-            }"
-          ></el-date-picker>
+            }"></el-date-picker>
         </el-form-item>
         <el-form-item>
           <el-button native-type="submit" type="primary">搜索</el-button>
           <el-button native-type="reset" type="danger">重置</el-button>
         </el-form-item>
-        <el-form-item>
+        <!-- <el-form-item>
           <el-button
             type="primary"
             @click="exportBack"
             v-permission="'export/userCashAccountLog'"
             >导出</el-button
           >
-        </el-form-item>
+        </el-form-item> -->
       </save-form>
       <div class="tableWrap">
-        <el-table
-          style="width: 100%"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-          :data="tableList"
-        >
-          <el-table-column
-            align="center"
-            prop="id"
-            label="退费编号"
-          ></el-table-column>
+        <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList">
+          <el-table-column align="center" prop="id" label="退费编号"></el-table-column>
           <el-table-column align="center" prop="studentId" label="学员">
             <template slot-scope="scope">
               <div>
@@ -134,16 +70,8 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="organName"
-            label="分部"
-          ></el-table-column>
-          <el-table-column
-            align="center"
-            prop="groupId"
-            label="课程组编号"
-          ></el-table-column>
+          <el-table-column align="center" prop="organName" label="分部"></el-table-column>
+          <el-table-column align="center" prop="groupId" label="课程组编号"></el-table-column>
           <el-table-column align="center" prop="studentId" label="退费金额">
             <template slot-scope="scope">
               <div>
@@ -158,29 +86,15 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="studentId"
-            label="退费时间"
-            width="100px"
-          >
+          <el-table-column align="center" prop="studentId" label="退费时间" width="100px">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.createTime }}
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="transNo"
-            label="交易流水号"
-          ></el-table-column>
-          <el-table-column
-            align="center"
-            prop="payTime"
-            label="打款时间"
-            width="100px"
-          ></el-table-column>
+          <el-table-column align="center" prop="transNo" label="交易流水号"></el-table-column>
+          <el-table-column align="center" prop="payTime" label="打款时间" width="100px"></el-table-column>
           <el-table-column align="center" prop="studentId" label="退费状态">
             <template slot-scope="scope">
               <div>
@@ -192,65 +106,27 @@
             <template slot-scope="scope">
               <div>
                 <auth auths="userCashAccountLog/update">
-                  <el-button type="text" @click="resetBackForm(scope.row)"
-                    >修改</el-button
-                  >
+                  <el-button type="text" @click="resetBackForm(scope.row)">修改</el-button>
                 </auth>
               </div>
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          sync
-          :total.sync="rules.total"
-          :page.sync="rules.page"
-          :limit.sync="rules.limit"
-          :page-sizes="rules.page_size"
-          @pagination="getList"
-        />
+        <pagination sync :total.sync="rules.total" :page.sync="rules.page" :limit.sync="rules.limit"
+          :page-sizes="rules.page_size" @pagination="getList" />
       </div>
     </div>
     <el-dialog :visible.sync="resetVisible" title="修改退费记录" width="400px">
-      <el-form
-        :model="form"
-        :rules="rules"
-        :inline="true"
-        label-width="100px"
-        class="form"
-        ref="form"
-      >
-        <el-form-item label="编号"
-          ><el-input :disabled="true" v-model="form.id"></el-input
-        ></el-form-item>
-        <el-form-item label="学员"
-          ><el-input :disabled="true" v-model="form.username"></el-input
-        ></el-form-item>
-        <el-form-item label="课程组编号"
-          ><el-input :disabled="true" v-model="form.groupId"></el-input
-        ></el-form-item>
-        <el-form-item label="金额"
-          ><el-input
-            :disabled="true"
-            :value="form.amount | moneyFormat"
-          ></el-input>
+      <el-form :model="form" :rules="rules" :inline="true" label-width="100px" class="form" ref="form">
+        <el-form-item label="编号"><el-input :disabled="true" v-model="form.id"></el-input></el-form-item>
+        <el-form-item label="学员"><el-input :disabled="true" v-model="form.username"></el-input></el-form-item>
+        <el-form-item label="课程组编号"><el-input :disabled="true" v-model="form.groupId"></el-input></el-form-item>
+        <el-form-item label="金额"><el-input :disabled="true" :value="form.amount | moneyFormat"></el-input>
         </el-form-item>
-        <el-form-item label="交易流水号"
-          ><el-input v-model="form.transNo"></el-input
-        ></el-form-item>
-        <el-form-item
-          v-if="form.transNo"
-          prop="payTime"
-          label="打款时间"
-          :rules="[{ required: true, message: '请选择打款时间' }]"
-        >
-          <el-date-picker
-            v-model="form.payTime"
-            clearable
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            :picker-options="{ firstDayOfWeek: 1 }"
-            placeholder="打款时间"
-          >
+        <el-form-item label="交易流水号"><el-input v-model="form.transNo"></el-input></el-form-item>
+        <el-form-item v-if="form.transNo" prop="payTime" label="打款时间" :rules="[{ required: true, message: '请选择打款时间' }]">
+          <el-date-picker v-model="form.payTime" clearable type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+            :picker-options="{ firstDayOfWeek: 1 }" placeholder="打款时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item label="退费时间">
@@ -286,7 +162,7 @@ export default {
         organId: [],
         backTime: [],
         payTime: [],
-        returnFeeFlag:null
+        returnFeeFlag: null
       },
       backTypeList,
       tableList: [],
@@ -305,7 +181,7 @@ export default {
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created() {},
+  created() { },
   //生命周期 - 挂载完成(可以访问DOM元素)
   async mounted() {
     // 获取分部
@@ -351,7 +227,7 @@ export default {
       this.$refs.form.validate(async (flag) => {
         if (flag) {
           try {
-            if(!this.form.transNo){
+            if (!this.form.transNo) {
               this.form.payTime = null;
             }
             const res = await resetUserCashAccountLog(this.form);
@@ -394,6 +270,7 @@ export default {
     width: 260px !important;
   }
 }
+
 .form {
   ::v-deep .el-input {
     width: 220px;

+ 13 - 2
src/views/baseRulesClassSetting/index.vue

@@ -72,6 +72,14 @@
         >
           <practiceRules v-if="activeIndex == '5'" />
         </el-tab-pane>
+        <el-tab-pane
+          label="直播课设置"
+          lazy
+          name="9"
+          v-if="permissionList.liveCourseType"
+        >
+          <liveClassSetting v-if="activeIndex == '9'" />
+        </el-tab-pane>
       </tab-router>
     </div>
   </div>
@@ -84,6 +92,7 @@ import chargesList from "@/views/categroyManager/specialSetup/chargesList";
 import vipCourseType from "@/views/categroyManager/generalSettings/vipCourseType";
 import discountManage from "@/views/categroyManager/specialSetup/discountManage";
 import vipChargeSeting from "@/views/categroyManager/vipChargeSeting";
+import liveClassSetting from "./live-class-setting";
 import auditionSetting from "./audition";
 import practiceRules from "./practiceRules";
 import { permission } from "@/utils/directivePage";
@@ -97,7 +106,8 @@ export default {
     typesManager,
     discountManage,
     vipChargeSeting,
-    practiceRules
+    practiceRules,
+    liveClassSetting
   },
   name: "baseRulersManager",
   data() {
@@ -111,7 +121,8 @@ export default {
         typesManager: permission("/globalConfig/typesManager"),
         discountManage: permission("/specialSetup/discountManage"),
         vipChargeSeting: permission("/vipChargeSeting"),
-        practiceRules: permission("/practiceRules")
+        practiceRules: permission("/practiceRules"),
+        liveCourseType: permission("/liveCourseType")
       }
     };
   },

+ 200 - 0
src/views/baseRulesClassSetting/live-class-setting.vue

@@ -0,0 +1,200 @@
+<template>
+  <div>
+    <!-- 列表 -->
+    <el-button style="margin-bottom: 20px" type="primary" v-permission="'vipGroupCategory/add'"
+      @click="onChargeOperation('create')" icon="el-icon-plus">添加</el-button>
+    <el-table :data="topList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+      <el-table-column align="center" prop="unitPriceId" label="编号">
+      </el-table-column>
+      <el-table-column align="center" prop="singleClassMinutes" label="课程时长(分钟)">
+      </el-table-column>
+      <el-table-column align="center" prop="onlineClassesUnitPrice" label="售价">
+        <template slot-scope="scope">
+          <div>{{ scope.row.onlineClassesUnitPrice }}元/节</div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" prop="offlineClassesUnitPrice" label="原价">
+        <template slot-scope="scope">
+          <div>{{ scope.row.offlineClassesUnitPrice }}元/节</div>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="操作">
+        <template slot-scope="scope">
+          <el-button v-permission="'vipGroupDefaultClassesUnitPrice/update'"
+            @click="onChargeOperation('update', scope.row)" type="text">修改</el-button>
+          <el-button v-permission="'vipGroupCategory/delete'" @click="resetGroupCategory(scope.row)"
+            type="text">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 课程类型新增弹窗 -->
+    <el-dialog :title="liveForm.isAdd ? '添加直播课设置' : '修改直播课设置'" width="500px" @close="onVipStatusClose('vipStatus')"
+      :visible.sync="liveStatus" label-position="right" :label-width="formLabelWidth">
+      <el-form :model="liveForm" ref="vipStatus">
+        <el-form-item label="课程课时(分钟)" prop="singleClassMinutes" :rules="[{
+          required: true, validator: validStock, trigger: 'blur'
+        }]">
+          <el-input @input="val => {
+            liveForm.singleClassMinutes = val.replace(/[^\d]/g, '');
+          }
+            " :disabled="!liveForm.isAdd" v-model.trim="liveForm.singleClassMinutes" placeholder="请输入课程课时" />
+        </el-form-item>
+        <el-form-item label="售价(元/节)" prop="onlineClassesUnitPrice" :rules="[
+          {
+            required: true,
+            message: '请输入售价',
+            trigger: 'blur'
+          }
+        ]">
+          <el-input @keyup.native="keyupEvent($event)" v-model="liveForm.onlineClassesUnitPrice" placeholder="请输入售价" />
+        </el-form-item>
+        <el-form-item label="原价(元/节)" prop="offlineClassesUnitPrice" :rules="[
+          {
+            required: true,
+            message: '请输入原价',
+            trigger: 'blur'
+          }
+        ]">
+          <el-input @keyup.native="keyupEvent($event)" v-model="liveForm.offlineClassesUnitPrice" placeholder="请输入原价" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="liveStatus = false">取 消</el-button>
+        <el-button type="primary" @click="addLiveStatus('vipStatus')">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import {
+  vipGroupCategory,
+  updatevipGroupDefaultClassesUnitPrice,
+  addVipGroupCategory,
+  removeVipGroupCategory
+} from "@/api/vipSeting";
+export default {
+  name: "practiceRules",
+  data() {
+    return {
+      formLabelWidth: "100px",
+      topList: [],
+      liveStatus: false,
+      liveForm: {
+        isAdd: true,
+        musicTheory: false,
+        groupType: "LIVE",
+        onlineClassesUnitPrice: null, // 售价
+        offlineClassesUnitPrice: null, // 原价
+        singleClassMinutes: null,
+        id: ""
+      } // 弹窗内容
+    };
+  },
+  async mounted() {
+    await this.$store.dispatch("setBranchs");
+    this.getVipGroupCategoryList();
+  },
+  methods: {
+    validStock(rule, value, callback) {
+      if ((value == "" && typeof value == "string") || value == null) {
+        callback(new Error("请输入课时"));
+      } else if (value <= 0) {
+        callback(new Error("课时必须大于0"));
+      } else {
+        callback();
+      }
+    },
+    async resetGroupCategory(row) {
+      this.$confirm("是否确认删除?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(async () => {
+        await removeVipGroupCategory({
+          id: row.id
+        }).then(res => {
+          if (res.code == 200) {
+            this.$message.success("删除成功");
+            this.getVipGroupCategoryList();
+          }
+        });
+      });
+    },
+    onVipStatusClose(formName) {
+      this.$refs[formName].resetFields();
+    },
+    addLiveStatus(formName) {
+      this.$refs[formName].validate(async valid => {
+        if (valid) {
+          const liveForm = this.liveForm;
+          if (liveForm.isAdd) {
+            await addVipGroupCategory({
+              musicTheory: false,
+              groupType: "LIVE",
+              onlineClassesUnitPrice: liveForm.onlineClassesUnitPrice, // 售价
+              offlineClassesUnitPrice: liveForm.offlineClassesUnitPrice, // 原价
+              singleClassMinutes: liveForm.singleClassMinutes
+            }).then(res => {
+              if (res.code == 200) {
+                this.$message.success("添加成功");
+                this.getVipGroupCategoryList();
+                this.liveStatus = false;
+              }
+            });
+          } else {
+            await updatevipGroupDefaultClassesUnitPrice({
+              onlineClassesUnitPrice: liveForm.onlineClassesUnitPrice, // 售价
+              offlineClassesUnitPrice: liveForm.offlineClassesUnitPrice, // 原价
+              groupType: "LIVE",
+              id: liveForm.id
+            }).then(res => {
+              this.$message.success("修改成功");
+              this.getVipGroupCategoryList();
+              this.liveStatus = false;
+            });
+          }
+        }
+      });
+    },
+    async getVipGroupCategoryList() {
+      // 获取默认左边参数
+      await vipGroupCategory({
+        groupType: "live"
+      }).then(res => {
+        if (res.code == 200) {
+          this.topList = res.data;
+        }
+      });
+    },
+    onChargeOperation(type, row) {
+      if (type == "update") {
+        this.liveForm = {
+          isAdd: false,
+          musicTheory: false,
+          groupType: "LIVE",
+          onlineClassesUnitPrice: row.onlineClassesUnitPrice, // 售价
+          offlineClassesUnitPrice: row.offlineClassesUnitPrice, // 原价
+          singleClassMinutes: row.singleClassMinutes,
+          id: row.unitPriceId
+        };
+      } else {
+        this.rowDetail = null;
+        this.liveForm.isAdd = true;
+      }
+      this.liveStatus = true;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.createForm {
+  ::v-deep .el-input {
+    width: 340px !important;
+  }
+}
+
+.el-tag--info {
+  margin-right: 4px;
+}
+</style>

+ 58 - 215
src/views/businessManager/orderManager/income.vue

@@ -14,178 +14,73 @@
         报表导出
       </el-button> -->
       <div class="btnList">
-        <ExportChiose
-          v-permission="{ child: 'export/orderList', parent: '/income' }"
-          style="margin-bottom: 20px;margin-right:10px;"
-          name="订单汇总导出"
-          ExportEnum="ORDER_LIST_SUM"
-          :exportData="onOrderExport"
-          fileName="订单汇总"
-          errorMsg="请选择月份"
-          :isDownList="true"
-        />
-        <ExportChiose
-          v-permission="{ child: 'export/orderList', parent: '/income' }"
-          style="margin-bottom: 20px;margin-right:10px;"
-          name="报表导出"
-          ExportEnum="ORDER_LIST1"
-          :exportData="onOrderExport"
-          fileName="订单报表导出"
-          errorMsg="请选择月份"
-          :isDownList="true"
-        />
+        <ExportChiose v-permission="{ child: 'export/orderList', parent: '/income' }"
+          style="margin-bottom: 20px;margin-right:10px;" name="订单汇总导出" ExportEnum="ORDER_LIST_SUM"
+          :exportData="onOrderExport" fileName="订单汇总" errorMsg="请选择月份" :isDownList="true" />
+        <ExportChiose v-permission="{ child: 'export/orderList', parent: '/income' }"
+          style="margin-bottom: 20px;margin-right:10px;" name="报表导出" ExportEnum="ORDER_LIST1" :exportData="onOrderExport"
+          fileName="订单报表导出" errorMsg="请选择月份" :isDownList="true" />
 
-        <ExportChiose
-          v-permission="{ child: 'export/MALL_ORDER_LIST', parent: '/income' }"
-          style="margin-bottom: 20px"
-          name="商城订单导出"
-          ExportEnum="MALL_ORDER_LIST"
-          :exportData="onOrderExport"
-          fileName="商城订单导出"
-          errorMsg="请选择月份"
-          :isDownList="true"
-        />
+        <ExportChiose v-permission="{ child: 'export/MALL_ORDER_LIST', parent: '/income' }" style="margin-bottom: 20px"
+          name="商城订单导出" ExportEnum="MALL_ORDER_LIST" :exportData="onOrderExport" fileName="商城订单导出" errorMsg="请选择月份"
+          :isDownList="true" />
       </div>
 
       <!-- 搜索类型 -->
-      <save-form
-        :inline="true"
-        class="searchForm"
-        :model="searchForm"
-        @submit="search"
-        @reset="onReSet"
-      >
+      <save-form :inline="true" class="searchForm" :model="searchForm" @submit="search" @reset="onReSet">
         <el-form-item>
-          <el-input
-            placeholder="学生编号/姓名/手机号"
-            type="text"
-            clearable
-            v-model.trim="searchForm.search"
-          ></el-input>
+          <el-input placeholder="学生编号/姓名/手机号" type="text" clearable v-model.trim="searchForm.search"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="交易流水号"
-            clearable
-            type="text"
-            v-model.trim="searchForm.transNo"
-          ></el-input>
+          <el-input placeholder="交易流水号" clearable type="text" v-model.trim="searchForm.transNo"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="订单号"
-            clearable
-            type="text"
-            v-model.trim="searchForm.orderNo"
-          ></el-input>
+          <el-input placeholder="订单号" clearable type="text" v-model.trim="searchForm.orderNo"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="收款账户"
-            clearable
-            type="text"
-            v-model.trim="searchForm.merNos"
-          ></el-input>
+          <el-input placeholder="收款账户" clearable type="text" v-model.trim="searchForm.merNos"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="余额支付大于等于"
-            clearable
-            type="number"
-            @mousewheel.native.prevent
-            v-model.trim="searchForm.balancePaymentAmount"
-          ></el-input>
+          <el-input placeholder="余额支付大于等于" clearable type="number" @mousewheel.native.prevent
+            v-model.trim="searchForm.balancePaymentAmount"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="余额支付小于等于"
-            clearable
-            type="number"
-            @mousewheel.native.prevent
-            v-model.trim="searchForm.lessBalancePaymentAmount"
-          ></el-input>
+          <el-input placeholder="余额支付小于等于" clearable type="number" @mousewheel.native.prevent
+            v-model.trim="searchForm.lessBalancePaymentAmount"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="现金支付大于等于"
-            clearable
-            type="number"
-            @mousewheel.native.prevent
-            v-model.trim="searchForm.actualAmount"
-          ></el-input>
+          <el-input placeholder="现金支付大于等于" clearable type="number" @mousewheel.native.prevent
+            v-model.trim="searchForm.actualAmount"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-input
-            placeholder="现金支付小于等于"
-            clearable
-            type="number"
-            @mousewheel.native.prevent
-            v-model.trim="searchForm.lessActualAmount"
-          ></el-input>
+          <el-input placeholder="现金支付小于等于" clearable type="number" @mousewheel.native.prevent
+            v-model.trim="searchForm.lessActualAmount"></el-input>
         </el-form-item>
         <el-form-item prop="organId">
-          <el-select
-            class="multiple"
-            v-model.trim="searchForm.organId"
-            filterable
-            collapse-tags
-            clearable
-            multiple
-            @clear="onClear('organId')"
-            placeholder="请选择分部"
-          >
-            <el-option
-              v-for="(item, index) in selects.branchs"
-              :key="index"
-              :label="item.name"
-              :value="item.id"
-            ></el-option>
+          <el-select class="multiple" v-model.trim="searchForm.organId" filterable collapse-tags clearable multiple
+            @clear="onClear('organId')" placeholder="请选择分部">
+            <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+              :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-date-picker
-            v-model="searchForm.orderDate"
-            style="width: 410px"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="至"
-            :picker-options="{
+          <el-date-picker v-model="searchForm.orderDate" style="width: 410px" type="daterange" value-format="yyyy-MM-dd"
+            range-separator="至" :picker-options="{
               firstDayOfWeek: 1
-            }"
-            start-placeholder="订单开始日期"
-            end-placeholder="订单结束日期"
-          ></el-date-picker>
+            }" start-placeholder="订单开始日期" end-placeholder="订单结束日期"></el-date-picker>
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.paymentType"
-            clearable
-            filterable
-            @clear="onClear('paymentType')"
-            placeholder="交易类型"
-          >
-            <el-option
-              v-for="(item, index) in orderStatus"
-              :key="index"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select v-model.trim="searchForm.paymentType" clearable filterable @clear="onClear('paymentType')"
+            placeholder="交易类型">
+            <el-option v-for="(item, index) in orderStatus" :key="index" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.paymentStatus"
-            clearable
-            filterable
-            @clear="onClear('paymentStatus')"
-            placeholder="交易状态"
-          >
-            <el-option
-              v-for="(item, index) in dealStatus"
-              :key="index"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select v-model.trim="searchForm.paymentStatus" clearable filterable @clear="onClear('paymentStatus')"
+            placeholder="交易状态">
+            <el-option v-for="(item, index) in dealStatus" :key="index" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -207,64 +102,35 @@
         实收金额=应收总额(包含余额支付)
         预收金额=充值总额(发生消费,记负数)
         预收余额=充值总余额 -->
-        营收金额:{{ totalRevenueAmount | moneyFormat }}元<i
-          style="width: 10px; display: inline-block"
-        ></i>
-        实收金额:{{ totalActualAmount | moneyFormat }}元<i
-          style="width: 10px; display: inline-block"
-        ></i>
-        预收金额:{{ totalAdvanceAmount | moneyFormat }}元<i
-          style="width: 10px; display: inline-block"
-        ></i>
+        营收金额:{{ totalRevenueAmount | moneyFormat }}元<i style="width: 10px; display: inline-block"></i>
+        实收金额:{{ totalActualAmount | moneyFormat }}元<i style="width: 10px; display: inline-block"></i>
+        预收金额:{{ totalAdvanceAmount | moneyFormat }}元<i style="width: 10px; display: inline-block"></i>
         预收余额:{{ totalUserBalance | moneyFormat }}元
       </div>
       <div class="tableWrap">
-        <el-table
-          :data="tableList"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        >
-          <el-table-column
-            align="center"
-            prop="transNo"
-            label="所属分部"
-            v-if="tenantId != 28"
-          >
+        <el-table :data="tableList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+          <el-table-column align="center" prop="transNo" label="所属分部" v-if="tenantId != 28">
             <template slot-scope="scope">
               <div>
                 <copy-text>{{ scope.row.organName }}</copy-text>
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            width="100px"
-            prop="transNo"
-            label="交易流水号"
-          >
+          <el-table-column align="center" width="100px" prop="transNo" label="交易流水号">
             <template slot-scope="scope">
               <div>
                 <copy-text>{{ scope.row.transNo }}</copy-text>
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            width="100px"
-            prop="orderNo"
-            label="订单号"
-          >
+          <el-table-column align="center" width="100px" prop="orderNo" label="订单号">
             <template slot-scope="scope">
               <div>
                 <copy-text>{{ scope.row.orderNo }}</copy-text>
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            width="150"
-            prop="createTime"
-            label="订单日期"
-          >
+          <el-table-column align="center" width="150" prop="createTime" label="订单日期">
             <template slot-scope="scope">{{
               scope.row.createTime | dateForMinFormat
             }}</template>
@@ -279,7 +145,7 @@
               <div>
                 {{
                   (scope.row.couponRemitFee + scope.row.expectAmount)
-                    | moneyFormat
+                  | moneyFormat
                 }}
               </div>
             </template>
@@ -299,11 +165,7 @@
             </template>
           </el-table-column>
 
-          <el-table-column
-            align="center"
-            prop="balancePaymentAmount"
-            label="余额支付"
-          >
+          <el-table-column align="center" prop="balancePaymentAmount" label="余额支付">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.balancePaymentAmount | moneyFormat }}
@@ -320,21 +182,14 @@
           <el-table-column align="center" label="学员姓名" width="150px">
             <template slot-scope="scope">
               <copy-text v-if="scope.row.user.username">
-                {{ scope.row.user.username }}</copy-text
-              >
-              <span v-if="scope.row.user.username && scope.row.user.phone"
-                >/</span
-              >
+                {{ scope.row.user.username }}</copy-text>
+              <span v-if="scope.row.user.username && scope.row.user.phone">/</span>
               <copy-text v-if="scope.row.user.phone">
                 {{ scope.row.user.phone }}
               </copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="paymentChannel"
-            label="交易方式"
-          >
+          <el-table-column align="center" prop="paymentChannel" label="交易方式">
             <template slot-scope="scope">{{
               scope.row.paymentChannel | paymentChannelStatus
             }}</template>
@@ -355,26 +210,14 @@
           </el-table-column>
           <el-table-column align="center" width="150px" label="操作">
             <template slot-scope="scope">
-              <el-button
-                v-if="
-                  scope.row.status != 'SUCCESS' && scope.row.actualAmount > 0
-                "
-                v-permission="'order/getOrderStatus'"
-                @click="onGetOrderStatus(scope.row)"
-                type="text"
-                >查询订单状态</el-button
-              >
+              <el-button v-if="scope.row.status != 'SUCCESS' && scope.row.actualAmount > 0
+                " v-permission="'order/getOrderStatus'" @click="onGetOrderStatus(scope.row)"
+                type="text">查询订单状态</el-button>
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          sync
-          :total.sync="pageInfo.total"
-          :page.sync="pageInfo.page"
-          :limit.sync="pageInfo.limit"
-          :page-sizes="pageInfo.page_size"
-          @pagination="getList"
-        />
+        <pagination sync :total.sync="pageInfo.total" :page.sync="pageInfo.page" :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size" @pagination="getList" />
       </div>
     </div>
   </div>
@@ -439,9 +282,9 @@ export default {
   mounted() {
     this.tenantId = this.$helpers.tenantId;
     this.$store.dispatch("setBranchs");
-    if (this.$route.params?.orderNo) {
+    if (this.$route.params?.orderNo || this.$route.query?.orderNo) {
       this.searchForm.orderDate = [];
-      this.searchForm.orderNo = this.$route.params.orderNo;
+      this.searchForm.orderNo = this.$route.params.orderNo || this.$route.query?.orderNo;
       this.searchForm.paymentStatus = null;
     }
     this.getList();
@@ -608,7 +451,7 @@ export default {
             this.getList();
           });
         })
-        .catch(err => {});
+        .catch(err => { });
     },
     onReSet() {
       // 重置搜索

+ 71 - 260
src/views/businessManager/shopManager/shopOperation.vue

@@ -1,82 +1,38 @@
 <template>
   <div class="m-container">
     <h2>
-      <el-page-header
-        @back="onCancel"
-        :content="pageTitle[pageType] + '商品'"
-      ></el-page-header>
+      <el-page-header @back="onCancel" :content="pageTitle[pageType] + '商品'"></el-page-header>
     </h2>
 
     <div class="m-core">
-      <el-form
-        :model="form"
-        :rules="rules"
-        ref="form"
-        label-width="160px"
-        :inline="true"
-      >
-        <el-alert
-          title="基础信息"
-          :closable="false"
-          class="alert"
-          type="info"
-        />
+      <el-form :model="form" :rules="rules" ref="form" label-width="160px" :inline="true">
+        <el-alert title="基础信息" :closable="false" class="alert" type="info" />
         <el-form-item label="货号" prop="sn">
-          <el-input
-            v-model.trim="form.sn"
-            :disabled="pageDisabled"
-            placeholder="请输入货号"
-            style="width: 220px !important"
-          ></el-input>
+          <el-input v-model.trim="form.sn" :disabled="pageDisabled" placeholder="请输入货号"
+            style="width: 220px !important"></el-input>
         </el-form-item>
         <el-form-item label="品牌" prop="brand">
-          <el-input
-            v-model.trim="form.brand"
-            :disabled="pageDisabled"
-            placeholder="请输入品牌"
-            style="width: 220px !important"
-          ></el-input>
+          <el-input v-model.trim="form.brand" :disabled="pageDisabled" placeholder="请输入品牌"
+            style="width: 220px !important"></el-input>
         </el-form-item>
         <!-- <el-form-item label="备查货号" prop="supplyChannel" v-if="pageType == 'create'">
           <el-input v-model.trim="form.supplyChannel" placeholder="请输入备查货号" style="width: 400px"></el-input>
         </el-form-item> -->
         <el-form-item label="商品名称" prop="name">
-          <el-input
-            v-model.trim="form.name"
-            placeholder="请输入商品名称"
-            :disabled="pageDisabled"
-            style="width: 220px !important"
-          ></el-input>
+          <el-input v-model.trim="form.name" placeholder="请输入商品名称" :disabled="pageDisabled"
+            style="width: 220px !important"></el-input>
         </el-form-item>
         <el-form-item label="商品类型" prop="type">
-          <el-select
-            v-model.trim="form.type"
-            placeholder="请选择商品类型"
-            :disabled="pageDisabled"
-            style="width: 220px !important"
-          >
-            <el-option
-              v-for="(item, index) in goodsType"
-              :key="index"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select v-model.trim="form.type" placeholder="请选择商品类型" :disabled="pageDisabled"
+            style="width: 220px !important">
+            <el-option v-for="(item, index) in goodsType" :key="index" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="商品分类" prop="goodsCategoryId">
-          <el-select
-            v-model.trim="form.goodsCategoryId"
-            placeholder="请选择商品分类"
-            :disabled="pageDisabled"
-            style="width: 220px !important"
-            filterable
-          >
-            <el-option
-              v-for="item in categoryList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
+          <el-select v-model.trim="form.goodsCategoryId" placeholder="请选择商品分类" :disabled="pageDisabled"
+            style="width: 220px !important" filterable>
+            <el-option v-for="item in categoryList" :key="item.value" :label="item.label" :value="item.value">
             </el-option>
           </el-select>
         </el-form-item>
@@ -99,49 +55,24 @@
           </select-all>
         </el-form-item> -->
         <el-form-item label="商品型号" prop="specification">
-          <el-input
-            v-model.trim="form.specification"
-            placeholder="请输入商品型号"
-            :disabled="pageDisabled"
-            style="width: 220px"
-          ></el-input>
+          <el-input v-model.trim="form.specification" placeholder="请输入商品型号" :disabled="pageDisabled"
+            style="width: 220px"></el-input>
         </el-form-item>
         <el-form-item label="库存类型" prop="stockType" v-if="tenantId == 1">
-          <el-select
-            v-model="form.stockType"
-            placeholder="请选择库存类型"
-            :disabled="pageDisabled"
-            style="width: 220px !important"
-          >
-            <el-option
-              v-for="(item, index) in stockType"
-              :key="index"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select v-model="form.stockType" placeholder="请选择库存类型" :disabled="pageDisabled"
+            style="width: 220px !important">
+            <el-option v-for="(item, index) in stockType" :key="index" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item
-          label="是否库存预警"
-          prop="stockWarning"
-          v-if="tenantId == 1"
-        >
-          <el-select
-            v-model="form.stockWarning"
-            placeholder="请选择库存预警"
-            :disabled="pageDisabled"
-            style="width: 220px !important"
-          >
+        <el-form-item label="是否库存预警" prop="stockWarning" v-if="tenantId == 1">
+          <el-select v-model="form.stockWarning" placeholder="请选择库存预警" :disabled="pageDisabled"
+            style="width: 220px !important">
             <el-option label="是" :value="1"></el-option>
             <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-alert
-          title="价格信息"
-          :closable="false"
-          class="alert"
-          type="info"
-        />
+        <el-alert title="价格信息" :closable="false" class="alert" type="info" />
 
         <el-form-item label="市场价" prop="marketPrice" class="hiddenStart">
           <template slot="label">
@@ -152,26 +83,17 @@
                 <div slot="content">
                   商品标价,仅在商品购买时做展示,不以该价格向学员销售商品
                 </div>
-                <i
-                  class="el-icon-question"
-                  style="
+                <i class="el-icon-question" style="
                     font-size: 18px;
                     color: #f56c6c;
                     position: relative;
                     top: 2px;
-                  "
-                ></i>
+                  "></i>
               </el-tooltip>
             </p>
           </template>
-          <el-input
-            type="number"
-            placeholder="请输入市场价"
-            :disabled="pageDisabled"
-            @mousewheel.native.prevent
-            v-model.trim="form.marketPrice"
-            style="width: 220px"
-          ></el-input>
+          <el-input type="number" placeholder="请输入市场价" :disabled="pageDisabled" @mousewheel.native.prevent
+            v-model.trim="form.marketPrice" style="width: 220px"></el-input>
         </el-form-item>
         <el-form-item label="零售价" prop="discountPrice" class="hiddenStart">
           <template slot="label">
@@ -182,75 +104,42 @@
                 <div slot="content">
                   管理端APP、乐器维修时学员购买该商品的价格
                 </div>
-                <i
-                  class="el-icon-question"
-                  style="
+                <i class="el-icon-question" style="
                     font-size: 18px;
                     color: #f56c6c;
                     position: relative;
                     top: 2px;
-                  "
-                ></i>
+                  "></i>
               </el-tooltip>
             </p>
           </template>
-          <el-input
-            type="number"
-            placeholder="请输入零售价"
-            @mousewheel.native.prevent
-            :disabled="pageDisabled"
-            v-model.trim="form.discountPrice"
-            style="width: 220px"
-          ></el-input>
+          <el-input type="number" placeholder="请输入零售价" @mousewheel.native.prevent :disabled="pageDisabled"
+            v-model.trim="form.discountPrice" style="width: 220px"></el-input>
         </el-form-item>
-        <el-form-item
-          label="商品团购价"
-          prop="groupPurchasePrice"
-          class="hiddenStart"
-        >
+        <el-form-item label="商品团购价" prop="groupPurchasePrice" class="hiddenStart">
           <template slot="label">
             <p style="position: relative">
               <span style="color: #f56c6c; margin-right: 4px">*</span>
               团购价
               <el-tooltip placement="top" popper-class="mTooltip">
                 <div slot="content">乐团报名缴费时学员购买该商品的价格</div>
-                <i
-                  class="el-icon-question"
-                  style="
+                <i class="el-icon-question" style="
                     font-size: 18px;
                     color: #f56c6c;
                     position: relative;
                     top: 2px;
-                  "
-                ></i>
+                  "></i>
               </el-tooltip>
             </p>
           </template>
-          <el-input
-            type="number"
-            placeholder="请输入商品团购价"
-            @mousewheel.native.prevent
-            :disabled="pageDisabled"
-            v-model.trim="form.groupPurchasePrice"
-            style="width: 220px"
-          ></el-input>
+          <el-input type="number" placeholder="请输入商品团购价" @mousewheel.native.prevent :disabled="pageDisabled"
+            v-model.trim="form.groupPurchasePrice" style="width: 220px"></el-input>
         </el-form-item>
         <el-form-item label="分部成本" prop="organCostPrice">
-          <el-input
-            type="number"
-            placeholder="请输入分部成本"
-            @mousewheel.native.prevent
-            :disabled="pageDisabled"
-            v-model.trim="form.organCostPrice"
-            style="width: 220px"
-          ></el-input>
+          <el-input type="number" placeholder="请输入分部成本" @mousewheel.native.prevent :disabled="pageDisabled"
+            v-model.trim="form.organCostPrice" style="width: 220px"></el-input>
         </el-form-item>
-        <el-alert
-          title="销售渠道"
-          :closable="false"
-          class="alert"
-          type="info"
-        />
+        <el-alert title="销售渠道" :closable="false" class="alert" type="info" />
         <!-- <el-form-item label="学生端APP可售分部" prop="studentShowOrganId">
           <select-all
             v-model.trim="form.studentShowOrganId"
@@ -270,97 +159,38 @@
           </select-all>
         </el-form-item> -->
         <el-form-item label="移动端可售分部" prop="educationShowOrganId">
-          <select-all
-            v-model.trim="form.educationShowOrganId"
-            filterable
-            placeholder="请选择分部"
-            style="width: 400px !important"
-            multiple
-            :disabled="pageDisabled"
-            clearable
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id.toString()"
-            ></el-option>
+          <select-all v-model.trim="form.educationShowOrganId" filterable placeholder="请选择分部"
+            style="width: 400px !important" multiple :disabled="pageDisabled" clearable>
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name"
+              :value="item.id.toString()"></el-option>
           </select-all>
         </el-form-item>
         <el-form-item label="课程收费乐团可售分部" prop="courseFeeShowOrganId">
-          <select-all
-            v-model.trim="form.courseFeeShowOrganId"
-            filterable
-            placeholder="请选择分部"
-            style="width: 400px !important"
-            multiple
-            :disabled="pageDisabled"
-            clearable
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id.toString()"
-            ></el-option>
+          <select-all v-model.trim="form.courseFeeShowOrganId" filterable placeholder="请选择分部"
+            style="width: 400px !important" multiple :disabled="pageDisabled" clearable>
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name"
+              :value="item.id.toString()"></el-option>
           </select-all>
         </el-form-item>
         <el-form-item label="会员收费乐团可售分部" prop="memberFeeShowOrganId">
-          <select-all
-            v-model.trim="form.memberFeeShowOrganId"
-            filterable
-            placeholder="请选择分部"
-            style="width: 400px !important"
-            multiple
-            :disabled="pageDisabled"
-            clearable
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id.toString()"
-            ></el-option>
+          <select-all v-model.trim="form.memberFeeShowOrganId" filterable placeholder="请选择分部"
+            style="width: 400px !important" multiple :disabled="pageDisabled" clearable>
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name"
+              :value="item.id.toString()"></el-option>
           </select-all>
         </el-form-item>
         <el-form-item label="免费乐团可售分部" prop="freeFeeShowOrganId">
-          <select-all
-            v-model.trim="form.freeFeeShowOrganId"
-            filterable
-            placeholder="请选择分部"
-            style="width: 400px !important"
-            multiple
-            :disabled="pageDisabled"
-            clearable
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id.toString()"
-            ></el-option>
+          <select-all v-model.trim="form.freeFeeShowOrganId" filterable placeholder="请选择分部"
+            style="width: 400px !important" multiple :disabled="pageDisabled" clearable>
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name"
+              :value="item.id.toString()"></el-option>
           </select-all>
         </el-form-item>
-        <el-form-item
-          label="乐器置换可售分部"
-          prop="replacementShowOrganId"
-          v-if="tenantId == 1"
-        >
-          <select-all
-            v-model.trim="form.replacementShowOrganId"
-            filterable
-            placeholder="请选择所属分部"
-            style="width: 400px !important"
-            multiple
-            :disabled="pageDisabled"
-            clearable
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id.toString()"
-            ></el-option>
+        <el-form-item label="乐器置换可售分部" prop="replacementShowOrganId" v-if="tenantId == 1">
+          <select-all v-model.trim="form.replacementShowOrganId" filterable placeholder="请选择所属分部"
+            style="width: 400px !important" multiple :disabled="pageDisabled" clearable>
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name"
+              :value="item.id.toString()"></el-option>
           </select-all>
         </el-form-item>
         <!-- <el-form-item label="学员是否展示" prop="clientShow">
@@ -426,12 +256,7 @@
             <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item> -->
-        <el-alert
-          title="商品信息"
-          :closable="false"
-          class="alert"
-          type="info"
-        />
+        <el-alert title="商品信息" :closable="false" class="alert" type="info" />
         <el-form-item label="商品图片" prop="image">
           <!-- <el-upload
             class="avatar-uploader"
@@ -446,14 +271,8 @@
             <img v-if="form.image" :src="form.image" class="avatar" />
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload> -->
-          <image-cropper
-            :options="cropperOptions"
-            :disabled="pageDisabled"
-            :imgSize="2"
-            :imageUrl="form.image"
-            @crop-upload-success="cropSuccess"
-            bucket_name="mall"
-          />
+          <image-cropper :options="cropperOptions" :disabled="pageDisabled" :imgSize="2" :imageUrl="form.image"
+            @crop-upload-success="cropSuccess" bucket_name="mall" />
           <p class="imageSize">
             <!-- 仅支持上传尺寸为:{{ imageWidthM }}x{{ imageHeightM }}的图片 -->
             请上传大小2M以内,格式为jpg、png、gif图片
@@ -461,21 +280,11 @@
         </el-form-item>
         <br />
         <el-form-item label="商品描述" prop="brief">
-          <el-input
-            type="textarea"
-            v-model.trim="form.brief"
-            :disabled="pageDisabled"
-            style="width: 400px"
-          ></el-input>
+          <el-input type="textarea" v-model.trim="form.brief" :disabled="pageDisabled" style="width: 400px"></el-input>
         </el-form-item>
         <br />
         <el-form-item label="商品详情" prop="desc">
-          <el-input
-            type="textarea"
-            v-model.trim="form.desc"
-            :disabled="pageDisabled"
-            style="width: 400px"
-          ></el-input>
+          <el-input type="textarea" v-model.trim="form.desc" :disabled="pageDisabled" style="width: 400px"></el-input>
         </el-form-item>
         <br />
         <el-form-item v-if="!pageDisabled">
@@ -991,7 +800,7 @@ replacementShowOrganId: 6,7 */
       const _URL = window.URL || window.webkitURL;
       const isSize = new Promise((resolve, reject) => {
         const img = new Image();
-        img.onload = function() {
+        img.onload = function () {
           if (imageWidth && imageHeigh) {
             this.width === imageWidth && this.height === imageHeigh
               ? resolve()
@@ -1091,9 +900,11 @@ replacementShowOrganId: 6,7 */
   height: 120px;
   display: block;
 }
+
 .el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light {
   max-width: 95px;
 }
+
 .imageSize {
   color: red;
   line-height: 1.5;

+ 35 - 42
src/views/categroyManager/generalSettings/vipCourseType.vue

@@ -4,15 +4,13 @@
       v-permission="'vipGroupCategory/add'"
       @click="addGroupCategory"
       type="primary"
-      
       style="margin-bottom: 20px"
-       icon="el-icon-plus"
+      icon="el-icon-plus"
       >新建</el-button
     >
     <el-table
       :data="leftList"
       :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-      
     >
       <el-table-column label="课程形式" prop="name"> </el-table-column>
       <el-table-column label="课程类型" prop="singleClassMinutes">
@@ -34,7 +32,6 @@
               type="text"
               v-permission="'vipGroupCategory/update'"
               @click="resetGroupCategory(scope.row)"
-              
               >修改</el-button
             >
             <el-popover
@@ -46,19 +43,15 @@
               <p>您确定删除该课程形态吗?</p>
               <div style="text-align: right; margin: 0">
                 <el-button
-                  
                   type="text"
                   @click="scope._self.$refs[scope.row.id].doClose()"
                   >取消</el-button
                 >
-                <el-button
-                  type="primary"
-                  
-                  @click="removeGroupCategory(scope)"
+                <el-button type="primary" @click="removeGroupCategory(scope)"
                   >确定</el-button
                 >
               </div>
-              <el-button type="text" slot="reference" >删除</el-button>
+              <el-button type="text" slot="reference">删除</el-button>
             </el-popover>
           </div>
         </template>
@@ -72,12 +65,12 @@
       @close="onVipStatusClose('vipStatus')"
       :visible.sync="vipStatus"
     >
-      <el-form :model="vipStatusFrom" ref="vipStatus" >
+      <el-form :model="vipStatusFrom" ref="vipStatus">
         <el-form-item
           label="课程形式"
           prop="name"
           :rules="[
-            { required: true, message: '请输入课程形式', trigger: 'blur' },
+            { required: true, message: '请输入课程形式', trigger: 'blur' }
           ]"
           :label-width="formLabelWidth"
         >
@@ -89,15 +82,18 @@
         <el-form-item
           label="课程类型"
           :rules="[
-            { required: true, message: '请输入课程形式', trigger: 'blur' },
+            { required: true, message: '请输入课程形式', trigger: 'blur' }
           ]"
           :label-width="formLabelWidth"
           prop="musicTheory"
         >
-        <el-select v-model="vipStatusFrom.musicTheory" style="width:100%!important">
-          <el-option label="VIP" :value="false"></el-option>
-          <el-option label="乐理课" :value="true"></el-option>
-        </el-select>
+          <el-select
+            v-model="vipStatusFrom.musicTheory"
+            style="width:100%!important"
+          >
+            <el-option label="VIP" :value="false"></el-option>
+            <el-option label="乐理课" :value="true"></el-option>
+          </el-select>
         </el-form-item>
         <el-form-item
           label="班级人数"
@@ -108,8 +104,8 @@
               required: true,
               message: '班级人数最大6人',
               trigger: 'blur',
-              pattern: /^[0-6]$/,
-            }, //辜经理要求vip人数最大6人
+              pattern: /^[0-6]$/
+            } //辜经理要求vip人数最大6人
           ]"
           :label-width="formLabelWidth"
         >
@@ -126,8 +122,8 @@
             {
               required: true,
               message: '请输入课程课时',
-              trigger: 'blur, change',
-            },
+              trigger: 'blur, change'
+            }
           ]"
           :label-width="formLabelWidth"
         >
@@ -148,29 +144,26 @@
             v-model.trim="inputValue"
             ref="saveTagInput"
             style="width: 100px"
-            
             @keyup.enter.native="handleInputConfirm"
           >
           </el-input>
           <el-button
             v-if="!inputVisible"
             class="button-new-tag"
-            
             @click="showInput"
             >+ 添加</el-button
           >
           <el-button
             v-if="inputVisible"
             class="button-new-tag"
-            
             @click="handleInputConfirm"
             >保存</el-button
           >
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button  @click="vipStatus = false">取 消</el-button>
-        <el-button  type="primary" @click="addVipStatus('vipStatus')"
+        <el-button @click="vipStatus = false">取 消</el-button>
+        <el-button type="primary" @click="addVipStatus('vipStatus')"
           >确 定</el-button
         >
       </div>
@@ -182,7 +175,7 @@ import {
   removeVipGroupCategory,
   vipGroupCategory,
   addVipGroupCategory,
-  resetVipGroupCategory,
+  resetVipGroupCategory
 } from "@/api/vipSeting";
 export default {
   data() {
@@ -196,10 +189,10 @@ export default {
         num: "",
         dynamicTags: [],
         isAdd: true,
-        musicTheory:false,
-        id: "",
+        musicTheory: false,
+        id: ""
       }, // 弹窗内容
-      inputVisible: false,
+      inputVisible: false
     };
   },
   mounted() {
@@ -217,13 +210,13 @@ export default {
         vipStatusFrom.num = row.studentNum;
         vipStatusFrom.id = row.id;
         vipStatusFrom.isAdd = false;
-        vipStatusFrom.musicTheory = row.musicTheory
+        vipStatusFrom.musicTheory = row.musicTheory;
       });
     },
     async removeGroupCategory(scope) {
       await removeVipGroupCategory({
-        id: scope.row.id,
-      }).then((res) => {
+        id: scope.row.id
+      }).then(res => {
         if (res.code == 200) {
           scope._self.$refs[scope.row.id].doClose();
           this.$message.success("删除成功");
@@ -238,7 +231,7 @@ export default {
     },
     showInput() {
       this.inputVisible = true;
-      this.$nextTick((_) => {
+      this.$nextTick(_ => {
         this.$refs.saveTagInput.$refs.input.focus();
       });
     },
@@ -249,7 +242,7 @@ export default {
     },
     async getVipGroupCategoryList() {
       // 获取默认左边参数
-      await vipGroupCategory().then((res) => {
+      await vipGroupCategory().then(res => {
         if (res.code == 200) {
           this.leftList = res.data;
         }
@@ -258,7 +251,7 @@ export default {
     addVipStatus(formName) {
       // 点击添加后 发送请求单独添加=> 刷新列表
       // 判断是添加还是修改
-      this.$refs[formName].validate(async (valid) => {
+      this.$refs[formName].validate(async valid => {
         console.log(valid);
         if (valid) {
           const vipStatusFrom = this.vipStatusFrom;
@@ -267,8 +260,8 @@ export default {
               name: vipStatusFrom.name,
               singleClassMinutes: vipStatusFrom.dynamicTags.join(","),
               studentNum: vipStatusFrom.num,
-              musicTheory:vipStatusFrom.musicTheory
-            }).then((res) => {
+              musicTheory: vipStatusFrom.musicTheory
+            }).then(res => {
               if (res.code == 200) {
                 this.$message.success("添加成功");
                 this.getVipGroupCategoryList();
@@ -281,8 +274,8 @@ export default {
               singleClassMinutes: vipStatusFrom.dynamicTags.join(","),
               studentNum: vipStatusFrom.num,
               id: vipStatusFrom.id,
-               musicTheory:vipStatusFrom.musicTheory
-            }).then((res) => {
+              musicTheory: vipStatusFrom.musicTheory
+            }).then(res => {
               this.$message.success("修改成功");
               this.getVipGroupCategoryList();
               this.vipStatus = false;
@@ -304,8 +297,8 @@ export default {
         this.vipStatusFrom.dynamicTags.indexOf(tag),
         1
       );
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 67 - 215
src/views/categroyManager/insideSetting/addressManager.vue

@@ -4,54 +4,24 @@
       <div class="squrt"></div>
       教学点管理
     </h2>
-    <div
-      class="m-core"
-      v-if="
-        (tableList.length > 0 ||
-          pageInfo.page > 1 ||
-          searchForm.search ||
-          searchForm.organId ||
-          searchForm.publicFlag) &&
-        contextFlag
-      "
-    >
-      <save-form
-        :inline="true"
-        class="searchForm"
-        @submit="search"
-        @reset="onReset"
-        :model="searchForm"
-      >
+    <div class="m-core" v-if="(tableList.length > 0 ||
+      pageInfo.page > 1 ||
+      searchForm.search ||
+      searchForm.organId ||
+      searchForm.publicFlag) &&
+      contextFlag
+      ">
+      <save-form :inline="true" class="searchForm" @submit="search" @reset="onReset" :model="searchForm">
         <el-form-item>
-          <el-input
-            type="text"
-            clearable
-            v-model.trim="searchForm.search"
-            placeholder="教学点名称"
-          ></el-input>
+          <el-input type="text" clearable v-model.trim="searchForm.search" placeholder="教学点名称"></el-input>
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.organId"
-            clearable
-            filterable
-            placeholder="请选择分部"
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            ></el-option>
+          <el-select v-model.trim="searchForm.organId" clearable filterable placeholder="请选择分部">
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.publicFlag"
-            clearable
-            filterable
-            placeholder="可用状态"
-          >
+          <el-select v-model.trim="searchForm.publicFlag" clearable filterable placeholder="可用状态">
             <el-option label="个人" value="0"></el-option>
             <el-option label="公共" value="1"></el-option>
           </el-select>
@@ -59,40 +29,22 @@
         <el-form-item>
           <el-button native-type="submit" type="danger">搜索</el-button>
           <el-button native-type="reset" type="primary">重置</el-button>
-          <el-button
-            @click="onExport"
-            type="primary"
-            v-permission="'export/exportSchoolList'"
-            >导出</el-button
-          >
+          <el-button @click="onExport" type="primary" v-permission="'export/exportSchoolList'">导出</el-button>
         </el-form-item>
       </save-form>
-      <el-button
-        @click="openTeaching('create')"
-        v-permission="'school/add'"
-        type="primary"
-        style="margin-bottom: 20px"
-      >
+      <el-button @click="openTeaching('create')" v-permission="'school/add'" type="primary" style="margin-bottom: 20px">
         新建
       </el-button>
       <!-- 列表 -->
       <div class="tableWrap">
-        <el-table
-          :data="tableList"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        >
+        <el-table :data="tableList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
           <el-table-column align="center" width="55" prop="id" label="编号">
           </el-table-column>
           <el-table-column align="center" prop="name" label="教学点名称">
           </el-table-column>
           <el-table-column align="center" prop="organName" label="所属分部">
           </el-table-column>
-          <el-table-column
-            align="center"
-            label="教学点来源"
-            :formatter="filterOrgan"
-            width="120px"
-          >
+          <el-table-column align="center" label="教学点来源" :formatter="filterOrgan" width="120px">
             <!-- <template slot-scope="scope">
               {{ scope.row.cooperationOrganId ? scope.row.cooperationOrganId : '租赁' }}
             </template>  -->
@@ -125,162 +77,74 @@
           </el-table-column> -->
           <el-table-column align="center" label="操作">
             <template slot-scope="scope">
-              <el-button
-                @click="openTeaching('update', scope.row)"
-                v-if="$helpers.permission('school/update')"
-                type="text"
-                >修改</el-button
-              >
-              <el-button
-                v-if="scope.row.delFlag == 0 && $helpers.permission('school/update/stop')"
-                @click="onUpdateSubmit(scope.row, 2)"
-                type="text"
-                >停用</el-button
-              >
-              <el-button
-                v-if="scope.row.delFlag == 2 && $helpers.permission('school/update/open')"
-                @click="onUpdateSubmit(scope.row, 0)"
-                type="text"
-                >启用</el-button
-              >
-              <el-button
-                @click="onUpdateSubmit(scope.row, 1)"
-                v-if="$helpers.permission('school/update/del')"
-                type="text"
-                >删除</el-button
-              >
+              <el-button @click="openTeaching('update', scope.row)" v-if="$helpers.permission('school/update')"
+                type="text">修改</el-button>
+              <el-button v-if="scope.row.delFlag == 0 && $helpers.permission('school/update/stop')"
+                @click="onUpdateSubmit(scope.row, 2)" type="text">停用</el-button>
+              <el-button v-if="scope.row.delFlag == 2 && $helpers.permission('school/update/open')"
+                @click="onUpdateSubmit(scope.row, 0)" type="text">启用</el-button>
+              <el-button @click="onUpdateSubmit(scope.row, 1)" v-if="$helpers.permission('school/update/del')"
+                type="text">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          sync
-          :total.sync="pageInfo.total"
-          :page.sync="pageInfo.page"
-          :limit.sync="pageInfo.limit"
-          :page-sizes="pageInfo.page_size"
-          @pagination="getList"
-        />
+        <pagination sync :total.sync="pageInfo.total" :page.sync="pageInfo.page" :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size" @pagination="getList" />
       </div>
     </div>
-    <emptyPage
-      @submit="openTeaching('create')"
-      title="教学点管理"
-      btnTitle="新建教学点"
-      :context="context"
-      v-if="
-        !(
-          tableList.length > 0 ||
-          pageInfo.page > 1 ||
-          searchForm.search ||
-          searchForm.organId ||
-          searchForm.publicFlag
-        ) && contextFlag
-      "
-    />
-    <el-dialog
-      :title="formTitle[formActionTitle]"
-      :visible.sync="teachingStatus"
-      @close="onFormClose('ruleForm')"
-      width="500px"
-    >
+    <emptyPage @submit="openTeaching('create')" title="教学点管理" btnTitle="新建教学点" :context="context" v-if="!(
+      tableList.length > 0 ||
+      pageInfo.page > 1 ||
+      searchForm.search ||
+      searchForm.organId ||
+      searchForm.publicFlag
+    ) && contextFlag
+      " />
+    <el-dialog :title="formTitle[formActionTitle]" :visible.sync="teachingStatus" @close="onFormClose('ruleForm')"
+      width="500px">
       <el-form :model="form" :rules="rules" ref="ruleForm">
         <el-form-item label="教学点名称" prop="name" :label-width="formLabelWidth">
           <el-input v-model.trim="form.name" autocomplete="off"></el-input>
         </el-form-item>
         <el-form-item label="教学点来源" prop="source" :label-width="formLabelWidth">
           <template v-if="formActionTitle == 'update'">
-            <el-select
-              v-model.trim="form.source"
-              style="width: 100% !important"
-              filterable
-              clearable
-              disabled
-            >
+            <el-select v-model.trim="form.source" style="width: 100% !important" filterable clearable disabled>
               <el-option label="合作单位" value="1"></el-option>
               <el-option label="租赁" value="2"></el-option>
             </el-select>
           </template>
           <template v-else>
-            <el-select
-              v-model.trim="form.source"
-              filterable
-              style="width: 100% !important"
-              clearable
-            >
+            <el-select v-model.trim="form.source" filterable style="width: 100% !important" clearable>
               <el-option label="合作单位" value="1"></el-option>
               <el-option label="租赁" value="2"></el-option>
             </el-select>
           </template>
         </el-form-item>
-        <el-form-item
-          v-if="form.source == 1"
-          prop="cooperationOrganId"
-          label="合作单位"
-          :label-width="formLabelWidth"
-        >
-          <el-select
-            v-model.trim="form.cooperationOrganId"
-            filterable
-            style="width: 100% !important"
-            clearable
-            @change="onCooperationChange"
-          >
-            <el-option
-              v-for="item in cooperationList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+        <el-form-item v-if="form.source == 1" prop="cooperationOrganId" label="合作单位" :label-width="formLabelWidth">
+          <el-select v-model.trim="form.cooperationOrganId" filterable style="width: 100% !important" clearable
+            @change="onCooperationChange">
+            <el-option v-for="item in cooperationList" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item
-          v-if="formActionTitle == 'update'"
-          prop="user"
-          label="可用状态"
-          :label-width="formLabelWidth"
-        >
+        <el-form-item v-if="formActionTitle == 'update'" prop="user" label="可用状态" :label-width="formLabelWidth">
           <el-input v-model="form.user" disabled></el-input>
         </el-form-item>
-        <el-form-item
-          v-if="form.source == 2"
-          prop="remark"
-          label="租赁费用"
-          :label-width="formLabelWidth"
-        >
-          <el-input
-            v-model.trim="form.remark"
-            type="number"
-            autocomplete="off"
-          ></el-input>
+        <el-form-item v-if="form.source == 2" prop="remark" label="租赁费用" :label-width="formLabelWidth">
+          <el-input v-model.trim="form.remark" type="number" autocomplete="off"></el-input>
         </el-form-item>
         <!--    v-if="form.source == 2" -->
         <el-form-item prop="organId" label="所属分部" :label-width="formLabelWidth">
-          <el-select
-            :disabled="form.source != 2"
-            v-model.trim="form.organId"
-            clearable
-            style="width: 100% !important"
-            filterable
-          >
-            <el-option
-              v-for="item in selects.branchs"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            ></el-option>
+          <el-select :disabled="form.source != 2" v-model.trim="form.organId" clearable style="width: 100% !important"
+            filterable>
+            <el-option v-for="item in selects.branchs" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <!-- :show-message="addressMessage" -->
         <el-form-item prop="address" label="上课地点" :label-width="formLabelWidth">
           <el-input class="text-address" v-model.trim="form.address" :disabled="true">
             <template slot="append">
-              <el-button
-                class="addMapBtn"
-                @click="addMap"
-                type="primary"
-                icon="el-icon-plus"
-                >选择</el-button
-              >
+              <el-button class="addMapBtn" @click="addMap" type="primary" icon="el-icon-plus">选择</el-button>
             </template>
           </el-input>
         </el-form-item>
@@ -301,35 +165,16 @@
         <el-button type="primary" @click="onTeachingSubmit('ruleForm')">确 定</el-button>
       </span>
     </el-dialog>
-    <el-dialog
-      :close-on-click-modal="false"
-      title="选择地图"
-      custom-class="map-container"
-      :visible.sync="mapStatus"
-      width="800px"
-    >
+    <el-dialog :close-on-click-modal="false" title="选择地图" custom-class="map-container" :visible.sync="mapStatus"
+      width="800px">
       <div style="padding: 0 20px">
-        <el-alert
-          style="margin: 10px 0"
-          title="选中地点:"
-          :closable="false"
-          type="info"
-          :description="addressDetail.address"
-        >
+        <el-alert style="margin: 10px 0" title="选中地点:" :closable="false" type="info" :description="addressDetail.address">
         </el-alert>
-        <el-amap-search-box
-          class="search-box"
-          value="searchValue"
-          :search-option="searchOption"
-          :on-search-result="onSearchResult"
-        ></el-amap-search-box>
+        <el-amap-search-box class="search-box" value="searchValue" :search-option="searchOption"
+          :on-search-result="onSearchResult"></el-amap-search-box>
         <el-amap :zoom="zoom" :plugin="plugin" :center="center" :events="events">
-          <el-amap-marker
-            :events="markerEvents()"
-            v-for="(marker, index) in markers"
-            :key="index"
-            :position="marker"
-          ></el-amap-marker>
+          <el-amap-marker :events="markerEvents()" v-for="(marker, index) in markers" :key="index"
+            :position="marker"></el-amap-marker>
         </el-amap>
       </div>
 
@@ -357,7 +202,7 @@ import cleanDeep from "clean-deep";
     });
     document.addEventListener("testPassive", null, opts);
     document.removeEventListener("testPassive", null, opts);
-  } catch (e) {}
+  } catch (e) { }
 
   EventTarget.prototype.addEventListener = function (type, fn, capture) {
     this.func = func;
@@ -378,7 +223,7 @@ import store from "@/store";
 import VueAMap from "vue-amap";
 // Vue.use(VueAMap)
 VueAMap.initAMapApiLoader({
-  key: "b1e6ac2eb28902ce91a490edf194e000",
+  key: "ac943ac1522de0d63eb8a99b71fe2601",
   plugin: ["AMap.Geolocation", "AMap.PlaceSearch", "AMap.Geocoder", "Geocoder"],
   v: "1.4.4",
 });
@@ -433,7 +278,7 @@ export default {
         subsidy: [{ type: "number", message: "课酬补贴只能为数字", trigger: "blur" }],
       },
       events: {
-        init(o) {},
+        init(o) { },
         zoomchange: (e) => {
           // console.log(e);
         },
@@ -793,27 +638,33 @@ export default {
 .el-select {
   width: auto !important;
 }
+
 .el-vue-amap-container {
   width: 100%;
   height: 50vh !important;
 }
+
 * {
   // touch-action: pan-y;
   touch-action: none;
 }
+
 .map-container {
   .el-dialog__body {
     padding: 0;
   }
 }
+
 .addMapBtn {
   background-color: var(--color-primary) !important;
   color: #fff !important;
 }
+
 .el-input-group__append {
   background: #f5f7fa;
   border-color: #dcdfe6;
   color: #909399;
+
   &:hover,
   &:active,
   &:focus {
@@ -822,6 +673,7 @@ export default {
     color: #909399;
   }
 }
+
 .el-vue-search-box-container {
   position: absolute !important;
   left: 30px;

+ 29 - 22
src/views/categroyManager/specialSetup/modals/courseTimeForm.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-form :model="courseTimeForm" ref="courseTimeForm" >
+    <el-form :model="courseTimeForm" ref="courseTimeForm">
       <el-form-item
         label="分部"
         prop="organId"
@@ -28,7 +28,7 @@
         prop="courseType"
         :label-width="formLabelWidth"
         :rules="[
-          { required: true, message: '请选择课程类型', trigger: 'blur' },
+          { required: true, message: '请选择课程类型', trigger: 'blur' }
         ]"
       >
         <el-select
@@ -47,7 +47,11 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="单课时时长" prop="timer" :label-width="formLabelWidth">
+      <el-form-item
+        label="单课时时长"
+        prop="timer"
+        :label-width="formLabelWidth"
+      >
         <el-tag
           :key="index"
           effect="dark"
@@ -68,7 +72,9 @@
           @keyup.enter.native="handleInputConfirm"
           @blur="handleInputConfirm"
         >
-         <template slot="append">分钟</template>
+          <template slot="append"
+            >分钟</template
+          >
         </el-input>
         <el-button
           v-if="!inputVisible"
@@ -88,7 +94,10 @@
   </div>
 </template>
 <script>
-import { resetOrganizationCourseDurationSettings,addOrganizationCourseDurationSettings } from "@/api/specialSetting";
+import {
+  resetOrganizationCourseDurationSettings,
+  addOrganizationCourseDurationSettings
+} from "@/api/specialSetting";
 export default {
   props: ["activeRow", "organList", "courseType"],
   data() {
@@ -97,12 +106,12 @@ export default {
         organId: "",
         courseType: "",
         timer: [],
-        id: "",
+        id: ""
       },
       inputVisible: false,
       formLabelWidth: "100px",
       dynamicTags: [],
-      inputValue: "",
+      inputValue: ""
     };
   },
   mounted() {
@@ -130,13 +139,13 @@ export default {
 
     showInput() {
       this.inputVisible = true;
-      this.$nextTick((_) => {
+      this.$nextTick(_ => {
         this.$refs.saveTagInput.$refs.input.focus();
       });
     },
     async submitInfo(str) {
       console.log(str);
-      this.$refs.courseTimeForm.validate(async (_) => {
+      this.$refs.courseTimeForm.validate(async _ => {
         if (_) {
           if (this.dynamicTags.length <= 0) {
             this.$message.error("请至少填写一个课程课时");
@@ -148,33 +157,31 @@ export default {
                 organId: this.courseTimeForm.organId,
                 duration: this.dynamicTags.join(","),
                 courseType: this.courseTimeForm.courseType,
-                id: this.courseTimeForm.id,
+                id: this.courseTimeForm.id
               });
-                this.$message.success("修改成功");
-                this.$emit('close')
+              this.$message.success("修改成功");
+              this.$emit("close");
             } catch {}
-          }else if(str == "create"){
-                   try {
+          } else if (str == "create") {
+            try {
               const res = await addOrganizationCourseDurationSettings({
                 organId: this.courseTimeForm.organId,
                 duration: this.dynamicTags.join(","),
-                courseType: this.courseTimeForm.courseType,
+                courseType: this.courseTimeForm.courseType
               });
-                this.$message.success("新建成功");
-                this.$emit('close')
+              this.$message.success("新建成功");
+              this.$emit("close");
             } catch {}
           }
         }
       });
-
-
-    },
+    }
   },
   watch: {
     dynamicTags(val) {
       this.courseTimeForm.timer = val;
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 36 - 90
src/views/groupChatManager/component/chatList.vue

@@ -1,40 +1,19 @@
 <!--  -->
 <template>
   <div class="m-container">
-    <save-form
-      :inline="true"
-      :model="searchForm"
-      @submit="search"
-      @reset="onReSet"
-      ref="searchForm"
-    >
+    <save-form :inline="true" :model="searchForm" @submit="search" @reset="onReSet" ref="searchForm">
       <el-form-item>
-        <el-input
-          v-model.trim="searchForm.search"
-          clearable
-            @keyup.enter.native="
-              (e) => {
-                e.target.blur();
-                $refs.searchForm.save();
-                search();
-              }
-            "
-          placeholder="群聊名称"
-        ></el-input>
+        <el-input v-model.trim="searchForm.search" clearable @keyup.enter.native="e => {
+            e.target.blur();
+            $refs.searchForm.save();
+            search();
+          }
+          " placeholder="群聊名称"></el-input>
       </el-form-item>
       <el-form-item prop="groupType">
-        <el-select
-          v-model.trim="searchForm.groupType"
-          clearable
-          filterable
-          placeholder="群聊类型"
-        >
-          <el-option
-            v-for="(item, index) in catgGoupTypeList"
-            :key="index"
-            :value="item.value"
-            :label="item.label"
-          ></el-option>
+        <el-select v-model.trim="searchForm.groupType" clearable filterable placeholder="群聊类型">
+          <el-option v-for="(item, index) in catgGoupTypeList" :key="index" :value="item.value"
+            :label="item.label"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -56,30 +35,12 @@
     </div>
 
     <div class="tableWrap">
-      <el-table
-        style="width: 100%"
-        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        :data="tableList"
-        @selection-change="handleSelectionChange"
-        @select="onTableSelect"
-        ref="multipleSelection"
-      >
+      <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList"
+        @selection-change="handleSelectionChange" @select="onTableSelect" ref="multipleSelection">
         <el-table-column type="selection" width="55"> </el-table-column>
-        <el-table-column
-          align="center"
-          prop="id"
-          label="群聊"
-        ></el-table-column>
-        <el-table-column
-          align="center"
-          prop="name"
-          label="群聊名称"
-        ></el-table-column>
-        <el-table-column
-          align="center"
-          prop="memo"
-          label="群备注"
-        ></el-table-column>
+        <el-table-column align="center" prop="id" label="群聊"></el-table-column>
+        <el-table-column align="center" prop="name" label="群聊名称"></el-table-column>
+        <el-table-column align="center" prop="memo" label="群备注"></el-table-column>
         <el-table-column align="center" prop="groupType" label="群聊类型">
           <template slot-scope="scope">
             <div>
@@ -87,43 +48,29 @@
             </div>
           </template>
         </el-table-column>
-                   <el-table-column align="center" prop="groupType" label="群类型">
+        <el-table-column align="center" prop="groupType" label="群类型">
           <template slot-scope="scope">
             <div>
               {{ scope.row.type | catType }}
             </div>
           </template>
         </el-table-column>
-        <el-table-column
-          align="center"
-          prop="memberNum"
-          label="人数"
-        ></el-table-column>
+        <el-table-column align="center" prop="memberNum" label="人数"></el-table-column>
         <el-table-column align="center" prop="memberNum" label="操作">
           <template slot-scope="scope">
             <div>
               <auth auths="/chatDetail">
-                <el-button type="text" @click="gotoCatDetail(scope.row)"
-                  >详情</el-button
-                >
+                <el-button type="text" @click="gotoCatDetail(scope.row)">详情</el-button>
               </auth>
               <auth auths="imGroup/updateImGroup">
-                <el-button type="text" @click="cancelCat(scope.row)"
-                  >解散</el-button
-                >
+                <el-button type="text" @click="cancelCat(scope.row)">解散</el-button>
               </auth>
             </div>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        sync
-        :total.sync="rules.total"
-        :page.sync="rules.page"
-        :limit.sync="rules.limit"
-        :page-sizes="rules.page_size"
-        @pagination="getList"
-      />
+      <pagination sync :total.sync="rules.total" :page.sync="rules.page" :limit.sync="rules.limit"
+        :page-sizes="rules.page_size" @pagination="getList" />
     </div>
     <eidtPostMsg ref="eidtPostMsg" @clear="clearCom" />
     <eidtCatInfo ref="eidtCatInfo" @getList="getList" />
@@ -147,7 +94,7 @@ export default {
     return {
       searchForm: {
         search: null,
-        groupType: "",
+        groupType: ""
       },
       catgGoupTypeList,
       tableList: [],
@@ -157,16 +104,16 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       addMuiscVisible: false,
       multipleSelection: [],
       chioseIdList: [],
-      isNewPage: false,
+      isNewPage: false
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created() {},
+  created() { },
   //生命周期 - 挂载完成(可以访问DOM元素)
   mounted() {
     // 获取分部
@@ -189,16 +136,16 @@ export default {
         const res = await getGroupList({
           ...this.searchForm,
           page: this.rules.page,
-          rows: this.rules.limit,
+          rows: this.rules.limit
         });
         this.tableList = res.data.rows;
         this.rules.total = res.data.total;
-        let idList = this.chioseIdList.map((group) => {
+        let idList = this.chioseIdList.map(group => {
           return group.id;
         });
         this.isNewPage = true;
         this.$nextTick(() => {
-          this.tableList.forEach((course) => {
+          this.tableList.forEach(course => {
             if (idList.indexOf(course.id) != -1) {
               this.$refs.multipleSelection.toggleRowSelection(course, true);
             }
@@ -235,12 +182,12 @@ export default {
         );
       } else {
         if (this.isNewPage) return;
-        let idList = this.chioseIdList.map((group) => {
+        let idList = this.chioseIdList.map(group => {
           return group.id;
         });
         this.$nextTick(() => {
           let tableIdList = [];
-          this.tableList.forEach((group) => {
+          this.tableList.forEach(group => {
             tableIdList.push(group.id);
             if (idList.indexOf(group.id) != -1) {
               this.$refs.multipleSelection.toggleRowSelection(group, false);
@@ -263,7 +210,7 @@ export default {
       this.$refs.multipleSelection.clearSelection();
     },
     onTableSelect(rows, row) {
-      let idList = this.chioseIdList.map((group) => {
+      let idList = this.chioseIdList.map(group => {
         return group.id;
       });
       if (idList.indexOf(row.id) != -1) {
@@ -279,7 +226,7 @@ export default {
     gotoCatDetail(row) {
       this.$router.push({
         path: "/operateManager/chatDetail",
-        query: { imGroupId: row.id, name: row.name },
+        query: { imGroupId: row.id, name: row.name }
       });
       console.log(row);
     },
@@ -289,7 +236,7 @@ export default {
     async cancelCat(row) {
       try {
         await this.$confirm("是否解散群组" + row.name + "?", "提示", {
-          type: "warning",
+          type: "warning"
         });
         const res = await dismissGroup({ imGroupId: row.id });
         this.$message.success("取消成功");
@@ -297,9 +244,8 @@ export default {
       } catch (e) {
         console.log(e);
       }
-    },
-  },
+    }
+  }
 };
 </script>
-<style lang='scss' scoped>
-</style>
+<style lang="scss" scoped></style>

+ 19 - 20
src/views/groupChatManager/model/eidtPostMsg.vue

@@ -101,7 +101,7 @@
   </div>
 </template>
 <script>
-import { sendGroupMsg,resetGroupMessageList } from "../api";
+import { sendGroupMsg, resetGroupMessageList } from "../api";
 export default {
   name: "eidtPostMsg",
   data() {
@@ -111,13 +111,13 @@ export default {
         postType: "0",
         sendTime: "",
         messageContent: "",
-        messageType: "",
-        fileName: "",
+        messageType: "TXT",
+        fileName: ""
       },
       lookVisible: false,
       chioseIdList: null,
       activeRow: null,
-      type:''
+      type: ""
     };
   },
 
@@ -126,20 +126,19 @@ export default {
   },
   methods: {
     init() {},
-    openDioag(chioseIdList,type) {
+    openDioag(chioseIdList, type) {
       this.chioseIdList = chioseIdList;
 
-      this.type = type
+      this.type = type;
 
       this.lookVisible = true;
-
     },
-    openResetDioag(row,type) {
+    openResetDioag(row, type) {
       if (row.sendTime) {
         row.postType = "1";
       }
       this.activeRow = row;
-       this.type = type
+      this.type = type;
       this.formes = { ...row };
       this.lookVisible = true;
     },
@@ -150,20 +149,20 @@ export default {
         sendTime: "",
         messageContent: "",
         messageType: "",
-        fileName: "",
+        fileName: ""
       };
       this.$refs["eidtPostMsg"].resetFields();
       this.lookVisible = false;
     },
     submitMsg() {
-      this.$refs.eidtPostMsg.validate(async (flag) => {
+      this.$refs.eidtPostMsg.validate(async flag => {
         if (flag) {
           try {
             if (this.activeRow && this.activeRow.id) {
               let obj = { ...this.formes };
-              console.log(this.type,'type')
-              if(this.type){
-                obj.isIncludeSender = 0
+              console.log(this.type, "type");
+              if (this.type) {
+                obj.isIncludeSender = 0;
               }
               const res = await resetGroupMessageList({ ...obj });
               this.$message.success("修改成功");
@@ -171,13 +170,13 @@ export default {
               this.onClose();
             } else {
               let idList = this.chioseIdList
-                .map((group) => {
+                .map(group => {
                   return group.id;
                 })
                 .join(",");
               let obj = { ...this.formes, targetIds: idList };
-                  if(this.type){
-                obj.isIncludeSender = 0
+              if (this.type) {
+                obj.isIncludeSender = 0;
               }
               const res = await sendGroupMsg({ ...obj });
               this.$message.success("发送成功");
@@ -199,10 +198,10 @@ export default {
         firstDayOfWeek: 1,
         disabledDate(time) {
           return time.getTime() + 86400000 < new Date().getTime();
-        },
+        }
       };
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 72 - 0
src/views/liveClassManager/api.js

@@ -275,3 +275,75 @@ export const sysTenantConfigAll = data => {
     method: "get"
   });
 };
+
+// 直播课详情
+export const liveGroupDetail = data => {
+  return request({
+    url: "/api-web/vipGroupManage/liveGroupDetail/" + data.id,
+    method: "get"
+  });
+};
+
+// 直播课详情 - 学生列表
+export const liveStudentList = data => {
+  return request({
+    url: "/api-web/vipGroupManage/liveStudentList",
+    method: "post",
+    data
+  });
+};
+
+// 直播课详情 - 课表列表
+export const liveCourseList = data => {
+  return request({
+    url: "/api-web/vipGroupManage/liveCourseList",
+    method: "post",
+    data
+  });
+};
+
+// 获取分部
+export const findTeacherByTenantId = data => {
+  return request({
+    url: "/api-web/teacher/findTeacherByTenantId",
+    method: "get",
+    params: data
+  });
+};
+
+// vip退费查询
+export function getStudentSurplusCourseFee(data) {
+  return request({
+    url: "/api-web/vipGroupManage/getStudentSurplusCourseFee",
+    method: "get",
+    params: data
+  });
+}
+
+// 根据vipid和学生id 退学
+export function leaveSchool(data) {
+  return request({
+    url: "/api-web/vipGroupManage/applyRefundForStudent",
+    method: "POST",
+    requestType: "form",
+    data
+  });
+}
+
+// 根据 修改直播课
+export function updateLiveGroup(data) {
+  return request({
+    url: "/api-web/vipGroupManage/updateLiveGroup",
+    method: "POST",
+    data
+  });
+}
+
+export function delLiveGroup(data) {
+  return request({
+    url: "/api-web/vipGroupManage/delLiveGroup/" + data.id,
+    method: "get"
+  });
+}
+
+// vipGroupManage/delLiveGroup

+ 755 - 0
src/views/liveClassManager/createLiveClass.vue

@@ -0,0 +1,755 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <el-page-header @back="onCancel" :content="name"></el-page-header>
+    </h2>
+    <div class="m-core">
+      <el-form ref="liveForm" :model="form" label-position="top">
+        <el-alert title="课程规划" :closable="false" type="info" style="margin: 0 0 20px" />
+        <el-row :gutter="20">
+          <el-col :span="10">
+            <el-form-item label="直播课标题" prop="roomTitle" :rules="[{ required: true, message: '请输入直播课标题' }]">
+              <el-input v-model="form.roomTitle" placeholder="请输入直播课标题" maxlength="10" show-word-limit
+                :disabled="![0, 1].includes(status)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="直播课内容" prop="liveRemark" :rules="[{ required: true, message: '请输入直播课内容' }]">
+              <el-input type="textarea" v-model="form.liveRemark" placeholder="请输入直播课内容" maxlength="200" show-word-limit
+                :disabled="![0, 1].includes(status)"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="分部" prop="organIds" :rules="[{ required: true, message: '请选择分部' }]">
+              <select-all v-model.trim="form.organIds" filterable placeholder="请选择分部" multiple clearable
+                :disabled="isDisabled">
+                <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+                  :value="item.id"></el-option>
+              </select-all>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="声部" prop="subjectIdList" :rules="[{ required: true, message: '请选择声部' }]">
+              <el-select v-model.trim="form.subjectIdList" filterable clearable @change="onChangeSubject"
+                placeholder="请选择声部" style="width: 100% !important" :disabled="isDisabled">
+                <el-option v-for="(item, index) in subjectList" :key="index" :value="item.id" :label="item.name" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="指导老师" prop="teacher" :rules="[{ required: true, message: '请选择指导老师' }]">
+              <el-select v-model.trim="form.teacher" filterable clearable placeholder="请选择指导老师"
+                style="width: 100% !important" :disabled="!form.subjectIdList">
+                <el-option v-for="(item, index) in teacherList" :key="index" :label="item.realName" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="乐团主管" prop="educationalTeacherId" :rules="[{ required: true, message: '请选择乐团主管' }]">
+              <el-select v-model.trim="form.educationalTeacherId" filterable clearable style="width: 100% !important"
+                :rules="[{ required: true, message: '请选择乐团主管' }]">
+                <el-option v-for="(item, key) in educationList" :key="key" :label="item.userName" :value="item.userId" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="课程购买开始时间" prop="signUpStart" :rules="[{ required: true, message: '请选择课程购买开始时间' }]">
+              <!-- <el-date-picker style="width: 100%" v-model="form.signUpTimeList" :picker-options="pickerOptions"
+                type="daterange" :default-time="['00:00:00', '23:59:59']" range-separator="-" start-placeholder="购买开始日期"
+                end-placeholder="购买结束日期">
+              </el-date-picker> -->
+              <el-date-picker v-model="form.signUpStart" :picker-options="startBigin()" type="date"
+                style="width: 100% !important" placeholder="购买开始日期" @change="() => {
+                  form.signUpEnd = ''
+                  form.timeTable = []; // 课表重置
+                }" :disabled="isDisabled">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="课程购买结束时间" prop="signUpEnd" :rules="[{ required: true, message: '请选择课程购买结束时间' }]">
+              <el-date-picker v-model="form.signUpEnd" type="date" :picker-options="beginDate()"
+                style="width: 100% !important" placeholder="购买结束日期" @change="() => {
+                  if (status == 0) {
+                    form.timeTable = []; // 课表重置
+                  }
+                }" :disabled="type === 'update' && status === 2">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="课时数" prop="onlineClassesNum" :rules="[{
+              required: true, validator: validStock, trigger: 'blur'
+            }]">
+              <el-input v-model="form.onlineClassesNum" placeholder="请输入课时数" maxlength="2"
+                @input="(val) => { form.onlineClassesNum = val.replace(/[^\d]/g, '') }" @change="() => {
+                  form.timeTable = []; // 课表重置
+                }
+                  " :disabled="isDisabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="课程时长" prop="singleClassMinuteId" :rules="[{ required: true, message: '请选择课程时长' }]">
+              <el-select v-model.trim="form.singleClassMinuteId" filterable clearable style="width: 100% !important"
+                placeholder="请选择课程时长" @change="onSingleClassChange" :disabled="isDisabled">
+                <el-option v-for="(   item, key   ) in    liveGroupList   " :key="key" :label="item.singleClassMinutes"
+                  :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="现单价" prop="onlineClassesUnitPrice" :rules="[{ required: true, message: '请输入现单价' }]">
+              <el-input v-model="form.onlineClassesUnitPrice" placeholder="请输入现单价" maxlength="9"
+                @input="(val) => { form.onlineClassesUnitPrice = val.replace(/[^\d]/g, '') }"
+                :disabled="isDisabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="原单价" prop="offlineClassesUnitPrice" :rules="[{ required: true, message: '请输入原单价' }]">
+              <el-input v-model="form.offlineClassesUnitPrice" placeholder="请输入原单价" maxlength="9"
+                @input="(val) => { form.offlineClassesUnitPrice = val.replace(/[^\d]/g, '') }"
+                :disabled="isDisabled"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="10">
+            <el-form-item label="总现价" prop="countOnlineClassesUnitPrice">
+              <el-input v-model="countOnlineClassesUnitPrice" placeholder="请输入总现价" maxlength="9" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="总原价" prop="countOfflineClassesUnitPrice">
+              <el-input v-model="countOfflineClassesUnitPrice" placeholder="请输入总原价" maxlength="9" disabled></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-button type="danger" @click="onTimeTable" :disabled="isDisabled">点击排课</el-button>
+        <el-table style="width: 100%; margin-top: 20px;" :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="form.timeTable">
+          <el-table-column align="center" label="课时">
+            <template slot-scope="scope">
+              第{{ scope.$index + 1 }}课
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="内容" width="150px" prop="teachingContent" key="teachingContent">
+            <template slot-scope="scope">
+              <el-form-item :prop="'timeTable.' + scope.$index + '.teachingContent'"
+                :rules="[{ required: true, message: '请输入内容' }]" style="margin-bottom: 0;">
+                <el-input v-model="scope.row.teachingContent" placeholder="请输入内容" maxlength="20">
+                </el-input>
+              </el-form-item>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="技能/知识点掌握" width="220px" prop="teachingPoint" key="teachingPoint">
+            <template slot-scope="scope">
+              <el-form-item :prop="'timeTable.' + scope.$index + '.teachingPoint'"
+                :rules="[{ required: true, message: '请输入技能/知识点掌握' }]" style="margin-bottom: 0;">
+                <el-input v-model="form.timeTable[scope.$index].teachingPoint" placeholder="请输入技能/知识点掌握" maxlength="20">
+                </el-input>
+              </el-form-item>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="singleClassMinutes" label="时长"></el-table-column>
+          <el-table-column align="center" label="课程日期">
+            <template slot-scope="scope">
+              <div>{{ scope.row.classDate | formatTimer }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="startClassTimeStr" label="开始时间"></el-table-column>
+          <el-table-column align="center" prop="endClassTimeStr" label="结束时间"></el-table-column>
+          <!-- <el-table-column align="center" label="课程类型">
+            <template slot-scope="scope">
+              <div>{{ scope.row.teachMode | teachMode }}</div>
+            </template>
+          </el-table-column> -->
+        </el-table>
+
+        <el-alert title="直播课信息" :closable="false" type="info" style="margin: 20px 0" />
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="直播设备" prop="os" :rules="[{ required: true, message: '请选择推广类型' }]">
+              <el-radio-group v-model="form.os" :disabled="isDisabled">
+                <!-- 根据不同的模式,显示不同的直播设备 -->
+                <el-radio v-if="serviceProvider === 'rongCloud'" label="pc">web</el-radio>
+                <el-radio v-if="serviceProvider === 'tencentCloud'" label="client">乐直播</el-radio>
+                <el-radio label="mobile">手机</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="直播场景" prop="useScene" :rules="[{ required: true, message: '请选择直播场景' }]">
+              <el-radio-group v-model="form.useScene" :disabled="isDisabled">
+                <el-radio label="NORMAL">普通场景</el-radio>
+                <el-radio label="MUSIC">音乐场景</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
+            <el-form-item prop="roomConfig.whether_video" label="保存直播回放"
+              :rules="[{ required: true, message: '是否保存直播回放' }]">
+              <el-radio-group v-model="form.roomConfig.whether_video" :disabled="isDisabled">
+                <el-radio :label="0">是</el-radio>
+                <el-radio :label="1">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item prop="roomConfig.whether_view_shop_cart" label="是否展示购物车"
+              :rules="[{ required: true, message: '是否展示购物车' }]">
+              <el-radio-group v-model="form.roomConfig.whether_view_shop_cart" :disabled="isDisabled">
+                <el-radio :label="0">是</el-radio>
+                <el-radio :label="1">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="预热模板(模板使用于分享宣传图片)" prop="preTemplate" :rules="[{ required: true, message: '请选择预热模板' }]">
+              <el-radio-group v-model="form.preTemplate" :disabled="isDisabled">
+                <div class="chioseWrap">
+                  <div class="chioseItem" @click="setPreTemplate(1)">
+                    <img src="./images/img1.png" alt="" />
+                    <i class="dotWrap"
+                      :class="[form.preTemplate == 1 ? 'checked' : '', isDisabled ? 'disabled' : '']"></i>
+                  </div>
+                  <div class="chioseItem" @click="setPreTemplate(2)">
+                    <img src="./images/img2.png" alt="" />
+                    <i class="dotWrap"
+                      :class="[form.preTemplate == 2 ? 'checked' : '', isDisabled ? 'disabled' : '']"></i>
+                  </div>
+                  <div class="chioseItem" @click="setPreTemplate(3)">
+                    <img src="./images/img3.png" alt="" />
+                    <i class="dotWrap"
+                      :class="[form.preTemplate == 3 ? 'checked' : '', isDisabled ? 'disabled' : '']"></i>
+                  </div>
+                </div>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="24">
+            <el-button type="primary" @click="onReset" v-if="[0, 1].includes(status)">重置</el-button>
+            <el-button type="primary" @click="onSubmit">确定</el-button>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+
+    <el-dialog title="排课" ref="maskForm" width="500px" :visible.sync="dialogFormVisible">
+      <addLiveCourse :singleClassMinutes="form.singleClassMinutes" :signUpEnd="form.signUpEnd" :status="status"
+        :onlineCourseNum="form.onlineClassesNum" @close="dialogFormVisible = false" @confirm="onConfirm" />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import dayjs from "dayjs";
+import deepClone from "@/helpers/deep-clone";
+import preview from "./modals/preview.vue";
+import addLiveCourse from "./modals/addLiveCourse.vue";
+import { sysTenantConfigAll, findTeacherByTenantId, liveGroupDetail, updateLiveGroup } from "./api";
+import {
+  getSubject,
+  getOrganRole
+} from "@/api/buildTeam";
+import { vipGroupCategory, createVip } from "@/api/vipSeting";
+export default {
+  components: { preview, addLiveCourse },
+  data() {
+    const query = this.$route.query;
+    return {
+      name: query.type == 'update' ? "修改直播课" : '新建直播课',
+      id: query.id,
+      type: query.type,
+      dialogFormVisible: false,
+      form: {
+        roomTitle: "", //
+        liveRemark: "", // 内容
+        organIds: [],
+        subjectIdList: null, // 声部
+        teacher: "", // 指导老师列表
+        educationalTeacherId: null, // 乐团主管
+        preTemplate: 1, // 模板
+        signUpStart: null, // 开始时间
+        signUpEnd: null, // 结束时间
+        signUpTimeList: [], // 课程购买时间
+        onlineClassesNum: null,
+        singleClassMinuteId: null, //时长编号
+        singleClassMinutes: null, // 时长
+        onlineClassesUnitPrice: null, // 售价
+        offlineClassesUnitPrice: null, // 原价
+        os: "client", // 直播设备
+        useScene: "NORMAL", // 直播场景
+        popularizeType: "ALL", // 观看权限信息
+        viewMode: "LOGIN",
+        roomConfig: {
+          whether_like: 0,
+          whether_chat: 0,
+          whether_video: 0,
+          whether_mic: 0,
+          whether_view_shop_cart: 1
+        },
+        timeTable: [], // 排课
+        clientType: "TEACHER" // 主讲人身份 默认[老师]
+      },
+      status: 0, // 直播课状态
+      auditStatus: null, // 审核状态
+      courseStartDate: null, // 课程开始时间
+      serviceProvider: "tencentCloud", // 直播模式
+      subjectList: [], // 声部列表
+      teacherList: [], // 指导老师
+      educationList: [], // 乐团主管
+      liveGroupList: [], // 课时列表
+      pickerOptions: {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          return time.getTime() + 86400000 <= new Date().getTime();
+        }
+      }
+    };
+  },
+  async mounted() {
+    this.$store.dispatch("setBranchs");
+    await this.__init();
+  },
+  methods: {
+    async onChangeSubject(val) {
+      try {
+        // 判断声部,如果为MUSIC_THEORY则为乐理,显示普通
+        let subjectItem = {}
+        this.subjectList.forEach(item => {
+          if (val == item.id) {
+            subjectItem = item;
+          }
+        })
+        if (subjectItem.code !== 'MUSIC_THEORY') {
+          this.form.useScene = "MUSIC"
+        } else {
+          this.form.useScene = "NORMAL"
+        }
+
+        this.form.teacher = ""; // 重置指导老师
+        // 根据科目id获取相应的老师
+        await findTeacherByTenantId({
+          subjectIds: subjectItem.code == 'MUSIC_THEORY' ? null : val
+        }).then(res => {
+          this.teacherList = res.data;
+        });
+      } catch { }
+    },
+    onCancel() {
+      this.$store.dispatch("delVisitedViews", this.$route);
+      this.$router.push("/liveClassManager?tabrouter=2");
+    },
+    validStock(rule, value, callback) {
+      if ((value == "" && typeof value == "string") || value == null) {
+        callback(new Error("请输入课时数"));
+      } else if (value <= 0) {
+        callback(new Error("课时数必须大于0"));
+      } else {
+        callback();
+      }
+    },
+    setPreTemplate(index) {
+      if (this.isDisabled) return;
+      this.form.preTemplate = index;
+    },
+    async onSubmit() {
+      this.$refs.liveForm.validate(async flag => {
+        if (!flag) {
+          this.onScrollError();
+          return false;
+        }
+
+        try {
+          const form = this.form;
+          if (form.timeTable.length <= 0) {
+            this.$message.error("请点击排课");
+            return;
+          }
+          const timeTable = [];
+          form.timeTable.forEach(item => {
+            timeTable.push({
+              classDate: item.classDate,
+              actualTeacherId: form.teacher,
+              startClassTimeStr: item.startClassTimeStr,
+              endClassTimeStr: item.endClassTimeStr,
+              teachMode: item.teachMode,
+              id: item.id,
+              teachingContent: item.teachingContent,
+              teachingPoint: item.teachingPoint
+            });
+          });
+
+          let obj = {
+            courseSchedules: timeTable,
+            vipGroupApplyBaseInfo: {
+              groupType: "LIVE",
+              vipGroupStudentCoursePrices: [],
+              // coursesExpireDate: this.leftForm.courseEnd,
+              // teacherSchoolId: this.leftForm.section,
+              studentIdList: "",
+              offlineClassesNum: 0,
+              onlineClassesNum: form.onlineClassesNum || 0,
+              offlineClassesUnitPrice: form.offlineClassesUnitPrice || 0,
+              onlineClassesUnitPrice: form.onlineClassesUnitPrice || 0,
+              registrationStartTime: dayjs(form.signUpStart).format(
+                "YYYY-MM-DD"
+              ),
+              paymentExpireDate: dayjs(form.signUpEnd).format(
+                "YYYY-MM-DD"
+              ),
+              singleClassMinutes: form.singleClassMinutes,
+              userId: form.teacher,
+              // vipGroupActivityId: form.singleClassMinuteId,
+              vipGroupCategoryId: form.singleClassMinuteId,
+              onlineTeacherSalary: 0,
+              offlineTeacherSalary: 0,
+              giveTeachMode: "ONLINE",
+              subjectIdList: form.subjectIdList,
+              educationalTeacherId: form.educationalTeacherId,
+              organId: -1,
+              organIdList: form.organIds.join(",")
+            },
+            liveBroadcastRoom: {
+              speakerId: form.teacher,
+              clientType: "TEACHER",
+              roomTitle: form.roomTitle,
+              liveRemark: form.liveRemark,
+              preTemplate: form.preTemplate,
+              useScene: form.useScene,
+              os: form.os,
+              serviceProvider: form.serviceProvider,
+              viewMode: form.viewMode,
+              popularizeType: form.popularizeType,
+              roomConfig: {
+                ...form.roomConfig,
+                subjectId: form.subjectIdList,
+                groupType: "LIVE"
+              }
+            }
+          };
+          console.log(obj, "obj");
+          if (this.type === 'update') {
+            obj.vipGroupApplyBaseInfo.id = this.id
+            obj.vipGroupApplyBaseInfo.auditStatus = this.auditStatus
+            await updateLiveGroup(obj)
+            this.$message.success("修改成功");
+            this.$store.dispatch("delVisitedViews", this.$route);
+            this.$router.push({
+              path: "/liveClassManager",
+              query: {
+                tabrouter: 2
+              }
+            });
+          } else {
+            createVip(obj).then(res => {
+              if (res.code == 200) {
+                this.$message.success("创建成功");
+                this.$store.dispatch("delVisitedViews", this.$route);
+                this.$router.push({
+                  path: "/liveClassManager",
+                  query: {
+                    tabrouter: 2
+                  }
+                });
+              }
+            });
+          }
+        } catch (e) {
+          console.log(e);
+        }
+      });
+    },
+    onReset() {
+      // 重置
+      this.form.timeTable = [];
+      this.$refs.liveForm.resetFields();
+      this.$nextTick(() => {
+        let isError = document.getElementsByClassName("el-alert");
+        isError[0].scrollIntoView({
+          block: "center",
+          behavior: "smooth"
+        });
+      });
+    },
+    // 点击排课
+    async onTimeTable() {
+      let count = 0;
+      this.$refs.liveForm.validateField(
+        ["signUpStart", "signUPEnd", "onlineClassesNum", "singleClassMinuteId"],
+        valid => {
+          count += 1;
+          if (valid) {
+            this.onScrollError();
+            return;
+          }
+
+          if (count >= 3) {
+            this.dialogFormVisible = true;
+          }
+        }
+      );
+    },
+    beginDate() {
+      const timer = this.form.signUpStart || ''
+      const courseTimer = this.courseStartDate ? dayjs(this.courseStartDate).format('YYYY-MM-DD') : ''
+      const type = this.type
+      const status = this.status
+      // console.log(type, courseTimer, 'courseTimer')
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          if (timer) {
+            if (courseTimer && type === 'update' && status != 0) {
+              // console.log(new Date(timer).getTime(), time.getTime(), new Date(timer).getTime() >= time.getTime(), dayjs(time).format('YYYY-MM-DD'), new Date(courseTimer + ' 00:00:00').getTime(), time.getTime() >= new Date(courseTimer + ' 00:00:00').getTime(), courseTimer)
+              return new Date(timer).getTime() > time.getTime() || time.getTime() >= new Date(courseTimer + ' 00:00:00').getTime();
+            } else {
+              return new Date(timer).getTime() > time.getTime();
+            }
+          } else {
+            return time.getTime() + 86400000 <= new Date().getTime();
+          }
+        },
+      };
+    },
+    startBigin() {
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          // return time.getTime() >= Date.now();
+          return time.getTime() + 86400000 <= new Date().getTime();
+        },
+      };
+    },
+    onScrollError() {
+      this.$nextTick(() => {
+        let isError = document.getElementsByClassName("is-error");
+        isError[0].scrollIntoView({
+          block: "center",
+          behavior: "smooth"
+        });
+      });
+    },
+    onSingleClassChange(val) {
+      // 设置 - 课程时长切换时
+      let onlinePrice = null;
+      let offLinePrice = null;
+      let minus = null;
+      this.liveGroupList.forEach(item => {
+        if (item.id === val) {
+          onlinePrice = item.onlineClassesUnitPrice;
+          offLinePrice = item.offlineClassesUnitPrice;
+          minus = item.singleClassMinutes;
+        }
+      });
+      this.form.onlineClassesUnitPrice = onlinePrice;
+      this.form.offlineClassesUnitPrice = offLinePrice;
+      this.form.singleClassMinutes = minus;
+
+      this.form.timeTable = []; // 课表重置
+    },
+    onConfirm(val) {
+      let tempVal = deepClone(val || []);
+      tempVal.forEach(item => {
+        item.teachingContent = "";
+        item.teachingPoint = "";
+        item.singleClassMinutes = this.form.singleClassMinutes;
+      });
+      this.form.timeTable = tempVal;
+      console.log(this.form.timeTable, "time table");
+      this.$forceUpdate();
+    },
+    async __init() {
+      try {
+        const findName = await sysTenantConfigAll({
+          group: "LIVE_CLIENT"
+        });
+        if (findName.data && findName.data.length > 0) {
+          findName.data.forEach(item => {
+            if (item.paramName == "live_client") {
+              this.serviceProvider = item.paranValue;
+              this.form.os =
+                this.serviceProvider == "tencentCloud" ? "client" : "pc";
+            }
+          });
+        }
+
+        // 获取 指导老师列表
+        await getSubject({
+          tenantId: 1
+        }).then(res => {
+          if (res.code == 200) {
+            this.subjectList = [
+              ...res.data
+            ];
+          }
+        });
+
+        // 获取乐团主管
+        await getOrganRole({ all: true }).then(ruselt => {
+          this.educationList = ruselt?.data?.EDUCATION;
+        });
+
+        // 获取课时数
+        // 获取默认左边参数
+        await vipGroupCategory({
+          groupType: "live"
+        }).then(res => {
+          if (res.code == 200) {
+            this.liveGroupList = res.data;
+          }
+        });
+
+        // 获取详情
+        if (this.id) {
+          const query = this.$route.query;
+          const { data } = await liveGroupDetail({ id: query.id });
+          const liveBroadcastRoom = data.liveBroadcastRoom || {};
+          const vipGroupApplyBaseInfo = data.vipGroupApplyBaseInfo || {};
+          const courseSchedules = data.courseSchedules || [];
+          const tempCourse = [];
+          courseSchedules.forEach(item => {
+            tempCourse.push({
+              classDate: item.classDate,
+              actualTeacherId: item.teacherId,
+              startClassTimeStr: item.startClassTimeStr,
+              endClassTimeStr: item.endClassTimeStr,
+              teachMode: "ONLINE",
+              id: item.id,
+              singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes,
+              teachingContent: item.teachingContent,
+              teachingPoint: item.teachingPoint
+            });
+          });
+
+          const subjectId = vipGroupApplyBaseInfo.subjectIdList ? Number(vipGroupApplyBaseInfo.subjectIdList) : ''
+          await this.onChangeSubject(subjectId)
+
+          // 初始化数据
+          this.form = {
+            roomTitle: liveBroadcastRoom.roomTitle, //
+            liveRemark: liveBroadcastRoom.liveRemark, // 内容
+            organIds: vipGroupApplyBaseInfo.organIdList ? vipGroupApplyBaseInfo.organIdList.split(",").map(item => Number(item)) : [],
+            subjectIdList: subjectId, // 声部
+            teacher: liveBroadcastRoom.speakerId, // 指导老师列表
+            educationalTeacherId: vipGroupApplyBaseInfo.educationalTeacherId, // 乐团主管
+            preTemplate: liveBroadcastRoom.preTemplate, // 模板
+            signUpStart: vipGroupApplyBaseInfo.registrationStartTime, // 开始时间
+            signUpEnd: vipGroupApplyBaseInfo.paymentExpireDate, // 结束时间
+            // signUpTimeList: [
+            //   vipGroupApplyBaseInfo.registrationStartTime,
+            //   vipGroupApplyBaseInfo.paymentExpireDate
+            // ], // 课程购买时间
+            onlineClassesNum: vipGroupApplyBaseInfo.onlineClassesNum,
+            singleClassMinuteId: vipGroupApplyBaseInfo.vipGroupCategoryId, //时长编号
+            singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes, // 时长
+            onlineClassesUnitPrice: vipGroupApplyBaseInfo.onlineClassesUnitPrice, // 售价
+            offlineClassesUnitPrice:
+              vipGroupApplyBaseInfo.offlineClassesUnitPrice, // 原价
+            os: liveBroadcastRoom.os, // 直播设备
+            useScene: liveBroadcastRoom.useScene, // 直播场景
+            popularizeType: liveBroadcastRoom.popularizeType, // 观看权限信息
+            viewMode: liveBroadcastRoom.viewMode,
+            roomConfig: liveBroadcastRoom.roomConfig || {
+              whether_like: 0,
+              whether_chat: 0,
+              whether_video: 0,
+              whether_mic: 0,
+              whether_view_shop_cart: 0
+            },
+            timeTable: tempCourse, // 排课
+            clientType: "TEACHER" // 主讲人身份 默认[老师]
+          };
+
+          this.status = data.vipGroupApplyBaseInfo.status
+          this.courseStartDate = data.vipGroupApplyBaseInfo.courseStartDate
+          this.auditStatus = data.vipGroupApplyBaseInfo.auditStatus
+        }
+      } catch (e) {
+        //
+        console.log(e, "e info");
+      }
+    }
+  },
+  computed: {
+    countOnlineClassesUnitPrice() {
+      return this.form.onlineClassesNum * this.form.onlineClassesUnitPrice || 0
+    },
+    countOfflineClassesUnitPrice() {
+      return this.form.onlineClassesNum * this.form.offlineClassesUnitPrice || 0
+    },
+    isDisabled() {
+      console.log(this.status, this.type, 'isDisabled');
+      return this.type === 'update' && [1, 2].includes(this.status) ? true : false
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.chioseWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+
+  .chioseItem {
+    border-radius: 4px;
+    overflow: hidden;
+    position: relative;
+    margin-right: 10px;
+    width: 188px;
+    height: 188px;
+    cursor: pointer;
+
+    .dotWrap {
+      width: 21px;
+      height: 21px;
+      background: url("../../assets/images/icon_checkbox_default.png") no-repeat center;
+      background-size: contain;
+      display: block;
+      position: absolute;
+      top: 10px;
+      right: 12px;
+      overflow: hidden;
+
+      &.checked {
+        background: url("../../assets/images/icon_checkbox.png") no-repeat center;
+        background-size: contain;
+      }
+
+      &.disabled {
+        opacity: 0.6;
+      }
+    }
+  }
+}
+
+::v-deep .el-select>.el-input {
+  height: 36px !important;
+}
+
+::v-deep .el-input__inner {
+  height: 36px !important;
+}
+
+::v-deep .el-col-10 .el-form-item__content {
+  height: 36px !important;
+}
+
+::v-deep .select-all {
+  .select {
+    .el-input__inner {
+      height: 36px !important;
+      min-height: 36px !important;
+    }
+  }
+
+  .btn {
+    height: 36px !important;
+    min-height: 36px !important;
+  }
+}
+</style>

+ 22 - 561
src/views/liveClassManager/index.vue

@@ -3,583 +3,44 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      直播管理
+      直播管理
     </h2>
     <div class="m-core">
-      <auth auths="imLiveBroadcastRoom/add">
-        <el-button @click="newLiveClass" type="primary" style="margin-bottom: 20px"
-          >新建直播课</el-button
-        >
-      </auth>
-      <save-form
-        :inline="true"
-        :model="searchForm"
-        @submit="search"
-        @reset="onReSet"
-        ref="searchForm"
+      <tab-router
+        v-model.trim="activeIndex"
+        type="card"
+        @tab-click="handleClick"
       >
-        <el-form-item prop="search">
-          <el-input
-            v-model.trim="searchForm.search"
-            clearable
-            @keyup.enter.native="
-              (e) => {
-                e.target.blur();
-                $refs.searchForm.save();
-                search();
-              }
-            "
-            placeholder="直播间编号/标题"
-          ></el-input>
-        </el-form-item>
-        <el-form-item prop="popularize">
-          <el-select placeholder="是否推广" v-model="searchForm.popularize" clearable>
-            <el-option label="否" value="0"></el-option>
-            <el-option label="是" value="1"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item prop="liveState">
-          <el-select placeholder="直播状态" v-model="searchForm.liveState" clearable>
-            <el-option label="未开始" value="0"></el-option>
-            <el-option label="直播中" value="1"></el-option>
-            <el-option label="已结束" value="2"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item prop="serviceProvider">
-          <el-select
-            placeholder="直播方案"
-            v-model="searchForm.serviceProvider"
-            clearable
-          >
-            <el-option label="融云" value="rongCloud"></el-option>
-            <el-option label="腾讯云" value="tencentCloud"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item prop="timer">
-          <el-date-picker
-            v-model.trim="searchForm.timer"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="至"
-            start-placeholder="直播开始日期"
-            end-placeholder="直播结束日期"
-            :picker-options="{
-              firstDayOfWeek: 1,
-            }"
-          >
-          </el-date-picker>
-        </el-form-item>
-
-        <el-form-item>
-          <el-button native-type="submit" type="primary">搜索</el-button>
-          <el-button native-type="reset" type="danger">重置</el-button>
-        </el-form-item>
-      </save-form>
-      <div class="tableWrap">
-        <el-table
-          style="width: 100%"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-          :data="tableList"
-        >
-          <el-table-column align="center" prop="id" label="直播间编号"></el-table-column>
-          <el-table-column
-            align="center"
-            prop="roomTitle"
-            label="直播课标题"
-          ></el-table-column>
-          <el-table-column
-            align="center"
-            prop="speakerName"
-            label="主讲人"
-          ></el-table-column>
-          <el-table-column align="center" prop="liveStartTime" label="直播开始时间">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.liveStartTime | dateForMinFormat }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" prop="popularize" label="直播设备">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.os | osFilter }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" prop="popularize" label="观看权限">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.popularizeType == "ALL" ? "全员" : "部分" }}
-              </div>
-            </template>
-          </el-table-column>
-
-          <el-table-column align="center" prop="popularize" label="是否推广">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.popularize == 1 ? "是" : "否" }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" prop="liveState" label="直播状态">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.liveState | liveState }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" prop="serviceProvider" label="直播方案">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.serviceProvider | serviceProvider }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" prop="viewMode" label="观看模式">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.viewMode == "LOGIN" ? "登录" : "游客" }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column
-            align="center"
-            prop="createdByName"
-            label="创建人"
-          ></el-table-column>
-          <el-table-column align="center" prop="createdByName" label="预约人数">
-            <template slot-scope="scope">
-              <div>
-                <auth auths="imLiveBroadcastRoom/query/roomUser">
-                  <el-button type="text" @click="lookReservationDetail(scope.row)">
-                    {{ scope.row.roomReservationNum }}</el-button
-                  >
-                </auth>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" prop="studentId" label="操作">
-            <template slot-scope="scope">
-              <div>
-                <el-dropdown trigger="click" placement="bottom" :hide-on-click="false">
-                  <span class="el-dropdown-link">
-                    操作<i class="el-icon-arrow-down el-icon--right"></i>
-                  </span>
-                  <el-dropdown-menu slot="dropdown" style="width: 100px">
-                    <el-dropdown-item
-                      style="width: 100px"
-                      v-if="
-                        permission('imLiveBroadcastRoom/roomStart') &&
-                        scope.row.liveState == 0
-                      "
-                      @click.native="onStartLive(scope.row)"
-                    >
-                      <el-button type="text">开启直播</el-button>
-                    </el-dropdown-item>
-                    <el-dropdown-item
-                      style="width: 100px"
-                      v-if="
-                        permission('/liveStudentList') &&
-                        scope.row.popularizeType !== 'ALL'
-                      "
-                      @click.native="lookStudentDetail(scope.row)"
-                    >
-                      <el-button type="text">观看学员</el-button>
-                    </el-dropdown-item>
-                    <el-dropdown-item
-                      v-if="
-                        permission('imLiveBroadcastRoom/opsPopularize') &&
-                        scope.row.liveState != 2
-                      "
-                      @click.native="popularizeRoom(scope.row)"
-                    >
-                      <el-button type="text">{{
-                        scope.row.popularize == 1 ? "取消推广" : "首页推广"
-                      }}</el-button>
-                    </el-dropdown-item>
-
-                    <el-dropdown-item
-                      v-if="
-                        permission('imLiveBroadcastRoom/roomDestroy') &&
-                        scope.row.liveState == 1
-                      "
-                      @click.native="closeRoom(scope.row)"
-                    >
-                      <el-button type="text">关闭直播</el-button>
-                    </el-dropdown-item>
-
-                    <el-dropdown-item
-                      v-if="scope.row.liveState == 2"
-                      @click.native="gotoDetail(scope.row)"
-                    >
-                      <el-button type="text">直播详情</el-button>
-                    </el-dropdown-item>
-                    <auth auths="/liveBlackList">
-                      <el-dropdown-item @click.native="gotoBuylist(scope.row)">
-                        <el-button type="text">订单详情</el-button>
-                      </el-dropdown-item>
-                    </auth>
-                    <el-dropdown-item
-                      v-if="permission('liveGoodsMapper/page') && ishowCart(scope.row)"
-                      @click.native="setShop(scope.row)"
-                    >
-                      <el-button type="text">商品设置</el-button>
-                    </el-dropdown-item>
-                    <auth auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList">
-                      <el-dropdown-item @click.native="gotoBlacklist(scope.row)">
-                        <el-button type="text">黑名单</el-button>
-                      </el-dropdown-item>
-                    </auth>
-                    <el-dropdown-item
-                      v-if="permission('imLiveBroadcastRoom/shareGroup')"
-                      @click.native="shareLive(scope.row)"
-                    >
-                      <el-button type="text">分享</el-button>
-                    </el-dropdown-item>
-
-                    <el-dropdown-item
-                      v-if="
-                        permission('imLiveBroadcastRoom/update') &&
-                        scope.row.liveState == 0
-                      "
-                    >
-                      <el-button type="text" @click.native="resetLive(scope.row)"
-                        >修改</el-button
-                      >
-                    </el-dropdown-item>
-
-                    <auth
-                      auths="imLiveBroadcastRoom/delete"
-                      v-if="scope.row.liveState == 0"
-                    >
-                      <el-dropdown-item>
-                        <el-button type="text" @click.native="deteleLive(scope.row)"
-                          >删除</el-button
-                        >
-                      </el-dropdown-item>
-                    </auth>
-                  </el-dropdown-menu>
-                </el-dropdown>
-
-                <!-- <auth
-                  auths="imLiveBroadcastRoom/opsPopularize"
-                  v-if="scope.row.liveState != 2"
-                >
-                  <el-button type="text" @click="popularizeRoom(scope.row)">{{
-                    scope.row.popularize == 1 ? "取消推广" : "首页推广"
-                  }}</el-button>
-                </auth>
-                <auth auths="imLiveBroadcastRoom/roomDestroy">
-                  <el-button
-                    type="text"
-                    v-if="scope.row.liveState == 1"
-                    @click="closeRoom(scope.row)"
-                    >关闭直播</el-button
-                  >
-                </auth>
-
-                <el-button
-                  type="text"
-                  v-if="scope.row.liveState == 2"
-                  @click="gotoDetail(scope.row)"
-                  >直播详情</el-button
-                >
-                <auth auths="liveGoodsMapper/page">
-                  <el-button type="text" @click="setShop(scope.row)"
-                    >商品设置</el-button
-                  >
-                </auth>
-
-                <auth auths="imLiveBroadcastRoom/shareGroup">
-                  <el-button type="text" @click="shareLive(scope.row)"
-                    >分享</el-button
-                  >
-                </auth>
-                <auth auths="imLiveBroadcastRoom/update">
-                  <el-button
-                    type="text"
-                    v-if="scope.row.liveState == 0"
-                    @click="resetLive(scope.row)"
-                    >修改</el-button
-                  >
-                </auth>
-                <auth auths="imLiveBroadcastRoom/delete">
-                  <el-button
-                    type="text"
-                    v-if="scope.row.liveState == 0"
-                    @click="deteleLive(scope.row)"
-                    >删除</el-button
-                  >
-                </auth>
-                <auth auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList">
-                  <el-button type="text" @click="gotoBlacklist(scope.row)"
-                    >黑名单</el-button
-                  >
-                </auth>
-                <auth auths="/liveBlackList">
-                  <el-button type="text" @click="gotoBuylist(scope.row)"
-                    >订单详情</el-button
-                  >
-                </auth> -->
-              </div>
-            </template>
-          </el-table-column>
-        </el-table>
-        <pagination
-          sync
-          :total.sync="rules.total"
-          :page.sync="rules.page"
-          :limit.sync="rules.limit"
-          :page-sizes="rules.page_size"
-          @pagination="getList"
-        />
-      </div>
+        <el-tab-pane label="直播间管理" lazy name="1">
+          <liveRoomManager v-if="activeIndex === '1'" />
+        </el-tab-pane>
+        <el-tab-pane label="直播课管理" lazy name="2">
+          <liveClassManager v-if="activeIndex === '2'" />
+        </el-tab-pane>
+      </tab-router>
     </div>
-    <el-dialog
-      title="分享"
-      width="510px"
-      append-to-body
-      :visible.sync="shareVisible"
-      v-if="shareVisible"
-    >
-      <shareDetail @close="shareVisible = false" :row="activeRow" />
-    </el-dialog>
-    <popularizeRoom @getList="getList" ref="popularizeRoom" />
-    <reservationDetail ref="reservationDetail" />
-    <sellShopList ref="sellShopList" />
   </div>
 </template>
 
 <script>
-import axios from "axios";
-import { getToken } from "@/utils/auth";
-import { getTimes } from "@/utils";
-import pagination from "@/components/Pagination/index";
-import shareDetail from "./modals/shareDetail.vue";
-import load from "@/utils/loading";
-import popularizeRoom from "./modals/popularizeRoom.vue";
-import reservationDetail from "./modals/reservationDetail.vue";
-import sellShopList from "./modals/sellShopList";
-import { permission } from "@/utils/directivePage";
-import {
-  getLiveBroadcastList,
-  delLiveBroadcast,
-  closeBroadcastRoomList,
-  opsPopularize,
-  roomStart,
-} from "./api";
+import liveRoomManager from "./liveRoomManager";
+import liveClassManager from "./liveClassManager";
 export default {
-  components: {
-    pagination,
-    shareDetail,
-    popularizeRoom,
-    reservationDetail,
-    sellShopList,
-  },
+  components: { liveRoomManager, liveClassManager },
   data() {
     return {
-      searchForm: {
-        search: null,
-        timer: [],
-        serviceProvider: null,
-        liveState: null,
-        popularize: null,
-      },
-
-      tableList: [],
-      organList: [],
-      rules: {
-        // 分页规则
-        limit: 10, // 限制显示条数
-        page: 1, // 当前页
-        total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
-      shareVisible: false,
-      activeRow: null,
+      activeIndex: "1"
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
   created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted() {
-    // 获取分部
-
-    this.init();
-  },
+  mounted() {},
   methods: {
-    permission,
-    init() {
-      this.getList();
-    },
-    async getList() {
-      const { timer, ...rest } = this.searchForm;
-      try {
-        const res = await getLiveBroadcastList({
-          ...rest,
-          ...getTimes(timer, ["startTime", "endTime"]),
-          rows: this.rules.limit,
-          page: this.rules.page,
-        });
-        this.tableList = res.data.rows;
-        this.rules.total = res.data.total;
-      } catch (e) {
-        console.log(e);
-      }
-    },
-    search() {
-      this.rules.page = 1;
-      this.getList();
-    },
-    onReSet() {
-      this.$refs.searchForm.resetFields();
-      this.search();
-    },
-    newLiveClass() {
-      let params = {
-        path: "/business/createLiveClass",
-      };
-      this.$router.push(params, (route) => {
-        route.meta.title = "新建直播课";
-      });
-      this.$router.push("/business/createLiveClass");
-      //liveClassDetail
-    },
-    gotoDetail(row) {
-      this.$router.push({
-        path: "/business/liveClassDetail",
-        query: { roomUid: row.roomUid },
-      });
-      //
-    },
-    shareLive(row) {
-      this.activeRow = row;
-      this.shareVisible = true;
-    },
-    resetLive(row) {
-      let params = {
-        path: "/business/createLiveClass",
-        query: { id: row.id, roomUid: row.roomUid },
-      };
-      //  ,
-      this.$router.push(params, (route) => {
-        route.meta.title = "修改直播课";
-      });
-    },
-    deteleLive(row) {
-      this.$confirm("您确定删除该直播间", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(async () => {
-          try {
-            const res = await delLiveBroadcast({ id: row.id });
-            this.$message.success("删除成功");
-            this.getList();
-          } catch (e) {
-            console.log(e);
-          }
-        })
-        .catch(() => {});
-    },
-    closeRoom(row) {
-      this.$confirm("您确定关闭直播间", "提示", {
-        confirmButtonText: "确定",
-        type: "warning",
-      }).then(async (res) => {
-        try {
-          const res = await closeBroadcastRoomList(row.id);
-          this.$message.success("关闭成功");
-          this.getList();
-        } catch (e) {}
-      });
-    },
-    async popularizeRoom(row) {
-      let popularize, str;
-      if (row.popularize) {
-        popularize = 0;
-        str = "取消推广";
-      } else {
-        popularize = 1;
-        str = "推广";
-        // this.$refs.popularizeRoom.openDioag(row);
-      }
-      this.$confirm(`您是否${str}直播间"${row.roomTitle}"`, "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(async () => {
-          try {
-            const res = await opsPopularize({
-              popularize,
-              id: row.id,
-            });
-            this.$message.success(`${str}成功`);
-            this.getList();
-          } catch (e) {
-            console.log(e);
-          }
-        })
-        .catch(() => {});
-    },
-    setShop(row) {
-      this.$router.push({
-        path: "/business/liveShopControl",
-        query: { roomUid: row.roomUid },
-      });
-      //
-    },
-    lookReservationDetail(row) {
-      this.$refs.reservationDetail.openDioag(row);
-    },
-    gotoBlacklist(row) {
-      this.$router.push({
-        path: "/business/liveBlackList",
-        query: {
-          roomUid: row.roomUid,
-          name: row.roomTitle,
-          liveState: row.liveState,
-        },
-      });
-    },
-    gotoBuylist(row) {
-      this.$refs.sellShopList.openDioag(row);
-    },
-    lookStudentDetail(row) {
-      this.$router.push({
-        path: "/business/liveStudentList",
-        query: { roomUid: row.roomUid, name: row.roomTitle },
-      });
-    },
-    ishowCart(row) {
-      let json = JSON.parse(row.roomConfig);
-      if (json.whether_view_shop_cart == 0) {
-        return true;
-      } else {
-        return false;
-      }
-    },
-    async onStartLive(row) {
-      try {
-        await this.$confirm("确定开启直播?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning",
-        });
-        await roomStart(row.id);
-      } catch (e) {}
-    },
-  },
+    handleClick(evt) {
+      // this.changeHash(evt.name);
+    }
+  }
 };
 </script>
-<style lang="scss" scoped>
-::v-deep .el-dropdown-link {
-  cursor: pointer;
-  color: var(--color-primary);
-}
-::v-deep .el-icon-arrow-down {
-  font-size: 12px;
-}
-</style>
+<style lang="scss" scoped></style>

+ 270 - 0
src/views/liveClassManager/liveClassManager.vue

@@ -0,0 +1,270 @@
+<!--  -->
+<template>
+  <div>
+    <auth auths="vipGroupManage/vipGroupApply">
+      <el-button @click="newLiveClass" type="primary" style="margin-bottom: 20px">新建直播课</el-button>
+    </auth>
+    <save-form :inline="true" :model="searchForm" @submit="search" @reset="onReSet" ref="searchForm">
+      <el-form-item prop="search">
+        <el-input v-model.trim="searchForm.search" clearable @keyup.enter.native="e => {
+          e.target.blur();
+          $refs.searchForm.save();
+          search();
+        }
+          " placeholder="课程组名称"></el-input>
+      </el-form-item>
+      <el-form-item props="teacherId">
+        <remote-search :commit="'setTeachers'" v-model="searchForm.teacherId" :isForzenWithQueryCondition="true" />
+      </el-form-item>
+      <el-form-item prop="subjectId">
+        <el-select placeholder="课程组类型" v-model="searchForm.subjectId" clearable>
+          <el-option v-for="(item, index) in subjectList" :key="index" :value="item.id" :label="item.name" />
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="status">
+        <el-select v-model.trim="searchForm.status" filterable clearable placeholder="请选课程组状态">
+          <el-option v-for="(item, index) in statusList" :key="index" :label="item.lable" :value="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="primary">搜索</el-button>
+        <el-button native-type="reset" type="danger">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="tableWrap">
+      <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList">
+        <el-table-column align="center" prop="id" label="课程组编号"></el-table-column>
+        <el-table-column align="center" prop="name" label="课程组名称"></el-table-column>
+        <el-table-column align="center" prop="subjectName" label="课程组类型"></el-table-column>
+        <el-table-column align="center" label="课程组状态">
+          <template slot-scope="scope">
+            <div>{{ scope.row.status | formatterStatus }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="userName" label="指导老师"></el-table-column>
+        <el-table-column align="center" prop="educationalTeacherName" label="乐员主管"></el-table-column>
+
+        <el-table-column align="center" prop="studentNum" label="报名人数"></el-table-column>
+        <el-table-column align="center" prop="onlineClassesNum" label="课时数"></el-table-column>
+        <el-table-column align="center" label="分部">
+          <template slot-scope="scope">
+            <copy-text>{{ scope.row.organName }}</copy-text>
+          </template>
+        </el-table-column>
+
+        <el-table-column align="center" prop="liveStartTime" label="开课时间">
+          <template slot-scope="scope">
+            <div>
+              <p>{{ scope.row.courseStartDate | formatterTime }}</p>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="studentId" label="操作">
+          <template slot-scope="scope">
+            <div>
+              <auth auths="vipGroupManage/stopVipGroup">
+                <el-button type="text" @click="onDetail(scope.row)">详情</el-button>
+              </auth>
+              <el-popover placement="top" width="160" v-if="scope.row.status <= 3" :ref="scope.$index">
+                <p style="margin-bottom: 10px">确定关闭该直播课?</p>
+                <el-input v-model.trim="stopReason" placeholder="请输入关闭原因"></el-input>
+                <div style="text-align: right; margin-top: 20px">
+                  <el-button type="text" @click="onCancelVip(scope)">取消</el-button>
+                  <el-button type="primary" @click="onCloseVip(scope)">确定</el-button>
+                </div>
+                <el-button type="text" slot="reference">关闭</el-button>
+              </el-popover>
+
+              <auth auths="vipGroupManage/updateLiveGroup" v-if="[0, 1, 2].includes(scope.row.status)">
+                <el-button type="text" @click="onUpdate(scope.row)">修改</el-button>
+              </auth>
+
+              <auth auths="vipGroupManage/delLiveGroup" v-if="scope.row.status == 3">
+                <el-button type="text" @click="onDelete(scope.row)">删除</el-button>
+              </auth>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination sync :total.sync="rules.total" :page.sync="rules.page" :limit.sync="rules.limit"
+        :page-sizes="rules.page_size" @pagination="getList" />
+    </div>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import { getVipList, closeVip } from "@/api/vipSeting";
+import { getSubject } from "@/api/buildTeam";
+import { delLiveGroup } from './api'
+export default {
+  components: {
+    pagination
+  },
+  data() {
+    return {
+      searchForm: {
+        search: null,
+        teacherId: null,
+        subjectId: null,
+        status: null
+      },
+      tableList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      statusList: [
+        { lable: "未开始", value: "0" },
+        { lable: "报名中", value: "1" },
+        // { lable: "报名结束", value: "5" },
+        { lable: "进行中", value: "2" },
+        { lable: "已结束", value: "4" },
+        { lable: "取消", value: "3" },
+        // { lable: "暂停", value: "6" },
+      ],
+      stopReason: "",
+      subjectList: []
+    };
+  },
+  async mounted() {
+    try {
+      // 获取 指导老师列表
+      await getSubject({
+        tenantId: 1
+      }).then(res => {
+        if (res.code == 200) {
+          this.subjectList = [
+            {
+              id: -1,
+              name: "乐理"
+            },
+            ...res.data
+          ];
+        }
+      });
+    } catch {
+
+    }
+    this.getList();
+  },
+  methods: {
+    async onDelete(row) {
+      this.$confirm(`是否确认删除?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        dangerouslyUseHTMLString: true,
+        type: "warning"
+      })
+        .then(async () => {
+          try {
+            await delLiveGroup({ id: row.id })
+            this.$message.success('删除成功')
+            this.getList()
+          } catch { }
+        })
+        .catch(() => { });
+    },
+    newLiveClass() {
+      let params = {
+        path: "/business/createLiveCourse"
+      };
+      this.$router.push(params, route => {
+        route.meta.title = "新建直播课";
+      });
+    },
+    onDetail(row) {
+      this.$router.push({
+        path: "/business/liveCourseDetail",
+        query: {
+          name: row.name,
+          id: row.id
+        }
+      });
+    },
+    onUpdate(row) {
+      this.$router.push({
+        path: '/business/createLiveCourse',
+        query: {
+          type: 'update',
+          id: row.id
+        }
+      }, (route) => {
+        route.meta.title = '修改直播课'
+      })
+    },
+    onCancelVip(scope) {
+      this.stopReason = null;
+      scope._self.$refs[scope.$index].doClose();
+    },
+    onCloseVip(scope) {
+      let id = scope.row.id;
+      closeVip({ vipGroupId: id, stopReason: this.stopReason }).then(res => {
+        if (res.code == 200) {
+          this.$message.success("停止课程组成功");
+          scope._self.$refs[scope.$index].doClose();
+          this.stopReason = "";
+          this.getList();
+        }
+      });
+    },
+    async getList() {
+      await getVipList({
+        ...this.searchForm,
+        groupType: "LIVE",
+        page: this.rules.page,
+        rows: this.rules.limit
+      }).then(res => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
+        }
+      });
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.searchForm.teacherId = "";
+      this.$refs.searchForm.resetFields();
+      this.search();
+    }
+  },
+  filters: {
+    formatterTime(val) {
+      let result;
+      if (val) {
+        result = val.split(" ")[0];
+      } else {
+        result = "";
+      }
+      return result;
+    },
+    formatterStatus(val) {
+      let arr = [
+        "未开始",
+        "报名中",
+        "进行中",
+        "取消",
+        "已结束",
+        "报名结束",
+        "暂停"
+      ];
+      return arr[val];
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-dropdown-link::v-deep .el-dropdown-link {
+  cursor: pointer;
+  color: var(--color-primary);
+}
+
+::v-deep .el-icon-arrow-down {
+  font-size: 12px;
+}

+ 503 - 0
src/views/liveClassManager/liveClassTwo/components/courseAdjust.vue

@@ -0,0 +1,503 @@
+<!--  -->
+<template>
+  <div>
+    <el-button type="primary" style="margin-bottom: 12px;" @click="onAdjustment">批量调整</el-button>
+    <div class="tableWrap">
+      <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList"
+        @selection-change="handleSelectionChange">
+        <el-table-column type="selection" :selectable="isDisabled" width="55"></el-table-column>
+        <el-table-column align="center" label="课程编号">
+          <template slot-scope="scope">
+            <div>{{ scope.row.id || '' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="课程名称">
+          <template slot-scope="scope">
+            <div>{{ scope.row.name }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="课程状态">
+          <template slot-scope="scope">
+            <div>{{ scope.row.status | coursesStatus }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="classDate" label="上课日期">
+          <template slot-scope="scope">
+            {{ scope.row.classDate | dayjsFormat }}
+            {{ scope.row.startClassTime | dayjsFormat('HH:mm') }}~{{ scope.row.endClassTime | dayjsFormat('HH:mm') }}
+          </template>
+        </el-table-column>
+        <!-- <el-table-column align="center" prop="startClassTime" label="开始时间"></el-table-column>
+        <el-table-column align="center" prop="endClassTime" label="结束时间"></el-table-column> -->
+        <el-table-column label="操作" width="180" align="center">
+          <template slot-scope="scope">
+            <div>
+              <el-button type="text" v-if="scope.row.id &&
+                !scope.row.isSettlement && scope.row.status != 'UNDERWAY' &&
+                $helpers.permission(
+                  'courseSchedule/classStartDateAdjust/liveReset'
+                )
+                " @click="resetClass(scope.row)">调整</el-button>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <el-dialog :title="adjustmentName" width="800px" :visible.sync="adjustmentVisible">
+      <el-form :model="adjustmentForm" label-position="right" label-width="120px" ref="adjustmentForm"
+        :rules="adjustmentRules" :inline="true">
+        <el-form-item label="已选择课时数">
+          <el-input disabled v-model.trim="adjustmentForm.count"></el-input>
+        </el-form-item>
+
+        <!-- <el-form-item label="课程类型" prop="courseType">
+          <el-select clearable v-model.trim="adjustmentForm.courseType" disabled>
+            <el-option label="线上课" value="ONLINE"></el-option>
+            <el-option label="线下课" value="OFFLINE"></el-option>
+          </el-select>
+        </el-form-item> -->
+        <!-- <el-form-item label="教学地点" v-if="adjustmentForm.courseType == 'OFFLINE'">
+          <el-select v-model.trim="adjustmentForm.address" filterable clearable>
+            <el-option v-for="(item, index) in schoolList" :key="index" :value="item.id" :label="item.name"></el-option>
+          </el-select>
+        </el-form-item> -->
+        <br />
+        <el-form-item label="排课起始时间" prop="courseTime">
+          <el-date-picker v-model.trim="adjustmentForm.courseTime" :picker-options="pickerOptions()"
+            style="width:200px!important;" type="date" value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
+          <el-checkbox style="margin-left:10px;" v-model.trim="adjustmentForm.checked">是否跳过节假日</el-checkbox>
+        </el-form-item>
+      </el-form>
+      <div class="WeekWrap">
+        <h3 style="margin-bottom:20px;">
+          循环次数
+          <el-button type="text" style="margin-left:10px;" @click="addWeek">添加</el-button>
+        </h3>
+        <div class="countWrap" style="margin-bottom:10px;">
+          <div class="countItem" style="margin-bottom:20px;" v-for="(item, index) in weekList" :key="index">
+            <span>循环周期:</span>
+            <el-select v-model.trim="item.dayOfWeek" filterable clearable>
+              <el-option v-for="(item, index) in weekDateList" :key="index" :label="item.label"
+                :value="item.value"></el-option>
+            </el-select>
+            <span style="margin-left:10px;">开始时间</span>
+            <el-time-picker style="margin-left:10px;" placeholder v-model.trim="item.startClassTime" @change="val => {
+              changeStartTimes(val, item);
+            }" format="HH:mm" value-format="HH:mm" :picker-options="{
+  selectableRange: '06:00:00 - 21:00:00'
+}"></el-time-picker>
+            <span style="margin-left:10px;">结束时间</span>
+            <el-time-picker style="margin-left:10px;" placeholder v-model.trim="item.endClassTime" format="HH:mm"
+              value-format="HH:mm" disabled :picker-options="{
+                selectableRange: '06:00:00 - 21:00:00'
+              }"></el-time-picker>
+            <el-button style="margin-left:10px;" type="danger" :disabled="index < 1" @click="removeWeek(item)"
+              icon="el-icon-delete" circle></el-button>
+          </div>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="adjustmentVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitAdjustment">确 定</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog title="课程调整" width="400px" :before-close="handleClose" :visible.sync="courseVisible">
+      <el-form :model="maskForm" class="maskForm" ref="maskForm" :rules="maskRules" label-position="right"
+        label-width="80px" :inline="true">
+        <el-form-item label="上课日期" prop="date">
+          <el-date-picker v-model.trim="maskForm.date" type="date" :picker-options="coursesDate()"
+            value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
+        </el-form-item>
+        <el-form-item label="开始时间" prop="startTime">
+          <el-time-picker placeholder="起始时间" v-model.trim="startTime" @change="changeStartTime" format="HH:mm"
+            value-format="HH:mm" :picker-options="{
+              selectableRange: `${nowTime} - 23:30:00`
+            }"></el-time-picker>
+        </el-form-item>
+        <el-form-item label="结束时间" prop="endTime">
+          <el-time-picker placeholder="结束时间" format="HH:mm" value-format="HH:mm" v-model="maskForm.endTime" disabled>
+          </el-time-picker>
+        </el-form-item>
+        <!--v-if="maskForm.teachMode=='OFFLINE'"-->
+        <!-- <el-form-item label="课程类型" prop="courseType">
+            <el-select clearable v-model.trim="maskForm.teachMode">
+              <el-option label="线上课" value="ONLINE"></el-option>
+              <el-option label="线下课" value="OFFLINE"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="教学地点" v-if="maskForm.teachMode == 'OFFLINE'">
+            <el-select v-model.trim="maskForm.address" filterable clearable>
+              <el-option v-for="(item, index) in schoolList" :key="index" :value="item.id" :label="item.name"></el-option>
+            </el-select>
+          </el-form-item> -->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="courseVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitResetClass">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { resetCourse } from "@/api/buildTeam";
+import { vipCourseAdjust } from "@/api/vipSeting";
+import { liveCourseList } from '../../api'
+import { diffTimerFormMinute, addTimerFormMinute } from "@/utils/date";
+import dayjs from 'dayjs';
+export default {
+  data() {
+    return {
+      id: this.$route.query.id,
+      adjustmentName: "",
+      tableList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      chioseVipList: [],
+      activeList: [],
+      adjustmentVisible: false,
+      adjustmentForm: {
+        count: "",
+        courseTime: "",
+        checked: false,
+        addCount: "",
+        courseType: "ONLINE",
+        fee: "",
+        address: ""
+      },
+      adjustmentRules: {
+        courseTime: [{ required: true, message: "请选择开始时间" }],
+        addCount: [{ required: true, message: "请输入加课次数" }],
+        courseType: [{ required: true, message: "请选择课程类型" }],
+        fee: [{ required: true, message: "请输入费用" }],
+        address: [{ required: true, message: "请选择教学地点" }]
+      },
+      weekDateList: [
+        { value: "1", label: "星期一" },
+        { value: "2", label: "星期二" },
+        { value: "3", label: "星期三" },
+        { value: "4", label: "星期四" },
+        { value: "5", label: "星期五" },
+        { value: "6", label: "星期六" },
+        { value: "7", label: "星期日" }
+      ],
+      weekList: [
+        {
+          dayOfWeek: "",
+          startTime: "",
+          endTime: "",
+          moid: new Date().getTime()
+        }
+      ],
+      courseVisible: false,
+      maskForm: {
+        date: "",
+        startTime: "",
+        endTime: "",
+        id: "",
+        address: "",
+        teachMode: ""
+      },
+      maskRules: {
+        date: [{ required: true, message: "请选择上课时间", trigger: "blur" }]
+      },
+      startTime: "",
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      try {
+        const { data } = await liveCourseList({
+          liveGroupId: this.id,
+          rows: this.rules.limit,
+          page: this.rules.page,
+        })
+        this.tableList = data.list;
+        // this.rules.total = data.pageInfo.total;
+        this.courseTime = data.singleClassMinutes;
+
+      } catch {
+      }
+    },
+    isDisabled(row, index) {
+      if (row.isSettlement || !row.id || row.status == 'UNDERWAY') {
+        return false;
+      } else {
+        return true;
+      }
+    },
+    addWeek() {
+      // 添加循环周期
+      this.weekList.push({
+        dayOfWeek: "",
+        startClassTime: "",
+        endClassTime: "",
+        id: new Date()
+      });
+    },
+    // 删除循环周
+    removeWeek(item) {
+      for (let i in this.weekList) {
+        if (this.weekList[i].id == item.id) {
+          this.weekList.splice(i, 1);
+        }
+      }
+    },
+    handleSelectionChange(val) {
+      this.chioseVipList = val;
+      this.adjustmentForm.count = val.length;
+      this.activeList = val;
+    },
+    onAdjustment() {
+      this.adjustmentName = "批量调整";
+      if (this.adjustmentForm.count <= 0) {
+        this.$message.error("请至少勾选一节课");
+      } else {
+        this.adjustmentVisible = true;
+      }
+    },
+    coursesDate(dateStr) {
+      let self = this;
+      return {
+        firstDayOfWeek: 1,
+        disabledDate: time => {
+          return time.getTime() + 86400000 <= new Date().getTime();
+        }
+      };
+    },
+    pickerOptions(dateStr) {
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          return time.getTime() + 86400000 <= new Date().getTime();
+        }
+      };
+    },
+    resetClass(row) {
+      /**
+       * maskForm.startTime
+       */
+      this.maskForm.date = row.classDate.split(" ")[0];
+      this.startTime = row.startClassTimeStr.substring(0, 5);
+      this.maskForm.endTime = row.endClassTimeStr.substring(0, 5);
+      // this.maskForm.endTime = row.endClassTimeStr;
+      this.maskForm.id = row.id;
+      this.maskForm.address = row.schoolId || null;
+      this.maskForm.teachMode = row.teachMode;
+      // 修改课时
+      this.courseVisible = true;
+    },
+    handleClose() {
+      this.courseVisible = false;
+      this.startTime = "";
+      this.maskForm = {
+        date: "",
+        startTime: "",
+        endTime: "",
+        id: "",
+        address: "",
+        teachMode: ""
+      };
+      this.$refs["maskForm"].resetFields();
+    },
+    submitResetClass() {
+      //   endClassTimeStr: this.maskForm.endTime,
+      if (!this.startTime) {
+        this.$message.error("请填写修改时间");
+        return;
+      }
+      let classTime = this.maskForm.date
+        ? new Date(this.maskForm.date)
+        : new Date();
+      let ymd =
+        classTime.getFullYear() +
+        "-" +
+        (classTime.getMonth() + 1) +
+        "-" +
+        classTime.getDate();
+      let tempStartTime = this.startTime;
+      if (this.startTime.length <= 5) {
+        tempStartTime = tempStartTime + ":00";
+      }
+      let obj = {
+        startClassTime: ymd + " " + this.startTime,
+        // startClassTimeStr: this.startTime,
+        id: this.maskForm.id,
+        classDate: this.maskForm.date,
+        schoolId: this.maskForm.address || null,
+        teachMode: this.maskForm.teachMode || null,
+        groupType: "LIVE"
+      };
+      resetCourse(obj).then(res => {
+        if (res.code == 200) {
+          this.$message.success("修改成功");
+          this.courseVisible = false;
+          this.getList();
+        } //else {
+        //   this.$message.error(res.msg)
+        // }
+      });
+    },
+    submitAdjustment() {
+      this.$refs["adjustmentForm"].validate(item => {
+        if (item) {
+          let week = this.weekList;
+          if (!week[0] || !week[0].startClassTime || !week[0].dayOfWeek) {
+            this.$message.error("至少排一节课");
+            return;
+          }
+          // 开始
+          let obj = {};
+          obj.courseCreateStartTime = this.adjustmentForm.courseTime;
+          let idArr = this.activeList.map(item => {
+            return item.id;
+          });
+
+          let courseScheduleIds = idArr.join(",");
+          obj.courseScheduleIds = courseScheduleIds;
+          obj.courseTimes = this.weekList;
+          obj.holiday = this.adjustmentForm.checked;
+          obj.teachMode = this.adjustmentForm.courseType || null;
+          obj.groupType = "LIVE";
+          obj.vipGroupId = this.id;
+          obj.schoolId = this.adjustmentForm.address || null;
+          vipCourseAdjust(obj).then(res => {
+            if (res.code == 200) {
+              this.$message.success("恭喜您修改成功");
+              this.adjustmentVisible = false;
+              this.getList();
+            }
+          });
+        }
+      });
+    },
+    changeStartTime(val) {
+      this.$nextTick(res => {
+        if (val) {
+          this.$set(
+            this.maskForm,
+            "endTime",
+            addTimerFormMinute(this.maskForm.date, val, this.courseTime)
+          );
+        } else {
+          this.$set(this.maskForm, "endTime", "");
+        }
+        if (!this.maskForm.endTime) {
+          this.$set(this, "startTime", "");
+        }
+      });
+    },
+    changeStartTimes(val, item) {
+      this.$nextTick(res => {
+        if (val) {
+          let str = dayjs(new Date()).format("YYYY-MM-DD");
+          this.$set(
+            item,
+            "endClassTime",
+            addTimerFormMinute(str, val, this.courseTime)
+          );
+        } else {
+          this.$set(item, "endClassTime", "");
+        }
+        if (!item.endClassTime) {
+          console.log(item.startClassTime);
+          this.$set(item, "startClassTime", "");
+        }
+      });
+    },
+  },
+  computed: {
+    nowTime() {
+      // console.log(that.maskForm.date)
+      let str = "06:00:00";
+      if (this.maskForm.date == dayjs(new Date()).format("YYYY-MM-DD")) {
+        str = dayjs(new Date()).format("HH:mm:ss");
+      }
+
+      return str;
+    }
+  },
+  filters: {
+    formatterTime(val) {
+      let result;
+      if (val) {
+        result = val.split(" ")[0];
+      } else {
+        result = "";
+      }
+      return result;
+    },
+    formatterStatus(val) {
+      let arr = [
+        "未开始",
+        "报名中",
+        "进行中",
+        "取消",
+        "已结束",
+        "报名结束",
+        "暂停"
+      ];
+      return arr[val];
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-dropdown-link {
+  cursor: pointer;
+  color: var(--color-primary);
+}
+
+::v-deep .el-icon-arrow-down {
+  font-size: 12px;
+}
+
+.vipwrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+
+  .newBand {
+    margin-right: 20px;
+  }
+}
+
+.resetClassForm {
+
+  ::v-deep .el-date-editor.el-input,
+  ::v-deep .el-date-editor.el-input__inner {
+    width: 180px !important;
+  }
+}
+
+.countWrap {
+
+  ::v-deep .el-date-editor.el-input,
+  ::v-deep .el-date-editor.el-input__inner {
+    width: 100px !important;
+  }
+}
+
+.maskForm {
+  ::v-deep .el-input {
+    width: 220px !important;
+  }
+}
+
+.titlewrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+  align-items: center;
+}
+</style>

+ 395 - 0
src/views/liveClassManager/liveClassTwo/components/courseOverview.vue

@@ -0,0 +1,395 @@
+<!--  -->
+<template>
+  <div>
+    <div class="m-core">
+      <el-form ref="liveForm" :model="form" label-position="top">
+        <el-alert title="课程规划" :closable="false" type="info" style="margin: 0 0 20px" />
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="直播课标题" prop="roomTitle" :rules="[{ required: false, message: '请输入直播课标题' }]">
+              <el-input v-model="form.roomTitle" placeholder="请输入直播课标题" maxlength="25" :disabled="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="分部" prop="organIds" :rules="[{ required: false, message: '请选择分部' }]">
+              <select-all v-model.trim="form.organIds" filterable placeholder="请选择分部" multiple clearable
+                :disabled="disabled">
+                <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+                  :value="item.id"></el-option>
+              </select-all>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="直播课内容" prop="liveRemark" :rules="[{ required: false, message: '请输入直播课内容' }]">
+              <el-input type="textarea" v-model="form.liveRemark" placeholder="请输入直播课内容" maxlength="200" show-word-limit
+                :disabled="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="声部" prop="subjectIdList" :rules="[{ required: false, message: '请选择声部' }]">
+              <el-select v-model.trim="form.subjectIdList" filterable clearable placeholder="请选择声部"
+                style="width: 100% !important" :disabled="disabled">
+                <el-option v-for="(item, index) in subjectList" :key="index" :value="item.id" :label="item.name" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="指导老师" prop="teacher" :rules="[{ required: false, message: '请选择指导老师' }]">
+              <el-select v-model.trim="form.teacher" filterable clearable placeholder="请选择指导老师"
+                style="width: 100% !important" :disabled="!form.subjectIdList || disabled">
+                <el-option v-for="(item, index) in teacherList" :key="index" :label="item.realName" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="乐团主管" prop="educationalTeacherId" :rules="[{ required: false, message: '请选择乐团主管' }]">
+              <el-select v-model.trim="form.educationalTeacherId" filterable clearable style="width: 100% !important"
+                :disabled="disabled">
+                <el-option v-for="(item, key) in educationList" :key="key" :label="item.userName" :value="item.userId" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="8">
+            <el-form-item label="课程购买时间" prop="signUpTimeList" :rules="[{ required: false, message: '请选择课程购买时间' }]">
+              <el-date-picker style="width: 100%" v-model="form.signUpTimeList" type="daterange" range-separator="-"
+                start-placeholder="购买开始日期" end-placeholder="购买结束日期" :disabled="disabled">
+              </el-date-picker>
+            </el-form-item>
+          </el-col> -->
+          <el-col :span="8">
+            <el-form-item label="课程购买开始时间" prop="signUpStart" :rules="[{ required: true, message: '请选择课程购买开始时间' }]">
+              <el-date-picker v-model="form.signUpStart" type="date" style="width: 100% !important" placeholder="购买开始日期"
+                disabled>
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="课程购买结束时间" prop="signUpEnd" :rules="[{ required: true, message: '请选择课程购买结束时间' }]">
+              <el-date-picker v-model="form.signUpEnd" type="date" style="width: 100% !important" placeholder="购买结束日期"
+                disabled>
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="课时数" prop="onlineClassesNum" :rules="[{ required: false, message: '请输入课时数' }]">
+              <el-input v-model="form.onlineClassesNum" placeholder="请输入课时数" maxlength="2"
+                :disabled="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="课程时长" prop="singleClassMinuteId" :rules="[{ required: false, message: '请选择课程时长' }]">
+              <el-select v-model.trim="form.singleClassMinuteId" filterable clearable style="width: 100% !important"
+                placeholder="请选择课程时长" :disabled="disabled">
+                <el-option v-for="(item, key) in liveGroupList" :key="key" :label="item.singleClassMinutes"
+                  :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="现价" prop="onlineClassesUnitPrice" :rules="[{ required: false, message: '请输入现价' }]">
+              <el-input v-model="form.onlineClassesUnitPrice" placeholder="请输入现价" @keyup.native="keyupEvent($event)"
+                :disabled="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="原价" prop="offlineClassesUnitPrice" :rules="[{ required: false, message: '请输入原价' }]">
+              <el-input v-model="form.offlineClassesUnitPrice" placeholder="请输入原价" @keyup.native="keyupEvent($event)"
+                :disabled="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="总现价" prop="countOnlineClassesUnitPrice">
+              <el-input v-model="countOnlineClassesUnitPrice" placeholder="请输入总现价" maxlength="9" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="总原价" prop="countOfflineClassesUnitPrice">
+              <el-input v-model="countOfflineClassesUnitPrice" placeholder="请输入总原价" maxlength="9" disabled></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-table style="width: 100%; margin-top: 20px;" :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="form.timeTable">
+          <el-table-column align="center" label="课时">
+            <template slot-scope="scope">
+              第{{ scope.$index + 1 }}课
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="内容" width="150px" prop="teachingContent" key="teachingContent">
+            <template slot-scope="scope">
+              <!-- {{ scope.row.teachingContent }} -->
+              <Tooltip :content="scope.row.teachingContent" />
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="技能/知识点掌握" width="220px" prop="teachingPoint" key="teachingPoint">
+            <template slot-scope="scope">
+              <!-- {{ scope.row.teachingPoint }} -->
+              <Tooltip :content="scope.row.teachingPoint" />
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="singleClassMinutes" label="时长"></el-table-column>
+          <el-table-column align="center" label="课程日期">
+            <template slot-scope="scope">
+              <div>{{ scope.row.classDate | formatTimer }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="startClassTimeStr" label="开始时间"></el-table-column>
+          <el-table-column align="center" prop="endClassTimeStr" label="结束时间"></el-table-column>
+          <!-- <el-table-column align="center" label="课程类型">
+            <template slot-scope="scope">
+              <div>{{ scope.row.teachMode | teachMode }}</div>
+            </template>
+          </el-table-column> -->
+        </el-table>
+
+        <el-alert title="直播课信息" :closable="false" type="info" style="margin: 20px 0" />
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="直播设备" prop="os" :rules="[{ required: false, message: '请选择推广类型' }]">
+              <el-radio-group v-model="form.os" :disabled="disabled">
+                <!-- 根据不同的模式,显示不同的直播设备 -->
+                <el-radio v-if="serviceProvider === 'rongCloud'" label="pc">web</el-radio>
+                <el-radio v-if="serviceProvider === 'tencentCloud'" label="client">客户端</el-radio>
+                <el-radio label="mobile">手机</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="直播场景" prop="useScene" :rules="[{ required: false, message: '请选择直播场景' }]">
+              <el-radio-group v-model="form.useScene" :disabled="disabled">
+                <el-radio label="NORMAL">普通模式</el-radio>
+                <el-radio label="MUSIC">音乐模式</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
+            <el-form-item prop="roomConfig.whether_video" label="保存直播回放"
+              :rules="[{ required: false, message: '是否保存直播回放' }]">
+              <el-radio-group v-model="form.roomConfig.whether_video" :disabled="disabled">
+                <el-radio :label="0">是</el-radio>
+                <el-radio :label="1">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item prop="roomConfig.whether_view_shop_cart" label="是否展示购物车"
+              :rules="[{ required: false, message: '是否展示购物车' }]">
+              <el-radio-group v-model="form.roomConfig.whether_view_shop_cart" :disabled="disabled">
+                <el-radio :label="0">是</el-radio>
+                <el-radio :label="1">否</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="24">
+            <el-form-item label="预热模板(模板使用于分享宣传图片)" prop="preTemplate" :rules="[{ required: false, message: '请选择预热模板' }]">
+              <el-radio-group v-model="form.preTemplate" :disabled="disabled">
+                <div class="chioseWrap">
+                  <div class="chioseItem">
+                    <img src="../../images/img1.png" alt="" />
+                    <i class="dotWrap" :class="form.preTemplate == 1 ? 'checked' : ''"></i>
+                  </div>
+                  <div class="chioseItem">
+                    <img src="../../images/img2.png" alt="" />
+                    <i class="dotWrap" :class="form.preTemplate == 2 ? 'checked' : ''"></i>
+                  </div>
+                  <div class="chioseItem">
+                    <img src="../../images/img3.png" alt="" />
+                    <i class="dotWrap" :class="form.preTemplate == 3 ? 'checked' : ''"></i>
+                  </div>
+                </div>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import Tooltip from "@/components/Tooltip/index";
+import { liveGroupDetail } from "../../api";
+export default {
+  components: {
+    Tooltip
+  },
+  data() {
+    return {
+      disabled: true,
+      tableList: [],
+      form: {
+        roomTitle: "", //
+        liveRemark: "", // 内容
+        organIds: [],
+        subjectIdList: null, // 声部
+        teacher: "", // 指导老师列表
+        educationalTeacherId: null, // 乐团主管
+        preTemplate: 1, // 模板
+        signUpStart: null, // 开始时间
+        signUpEnd: null, // 结束时间
+        signUpTimeList: [], // 课程购买时间
+        onlineClassesNum: null,
+        singleClassMinuteId: null, //时长编号
+        singleClassMinutes: null, // 时长
+        onlineClassesUnitPrice: null, // 售价
+        offlineClassesUnitPrice: null, // 原价
+        os: "client", // 直播设备
+        useScene: "NORMAL", // 直播场景
+        popularizeType: "ALL", // 观看权限信息
+        viewMode: "LOGIN",
+        roomConfig: {
+          whether_like: 0,
+          whether_chat: 0,
+          whether_video: 0,
+          whether_mic: 0,
+          whether_view_shop_cart: 0
+        },
+        timeTable: [], // 排课
+        clientType: "TEACHER" // 主讲人身份 默认[老师]
+      },
+      serviceProvider: "tencentCloud", // 直播模式
+      subjectList: [], // 声部列表
+      teacherList: [], // 指导老师
+      educationList: [], // 乐团主管
+      liveGroupList: [] // 课时列表
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      try {
+        const query = this.$route.query;
+        const { data } = await liveGroupDetail({ id: query.id });
+
+        const liveBroadcastRoom = data.liveBroadcastRoom || {};
+        const vipGroupApplyBaseInfo = data.vipGroupApplyBaseInfo || {};
+        const courseSchedules = data.courseSchedules || [];
+        const tempCourse = [];
+        courseSchedules.forEach(item => {
+          tempCourse.push({
+            classDate: item.classDate,
+            actualTeacherId: item.teacherId,
+            startClassTimeStr: item.startClassTimeStr,
+            endClassTimeStr: item.endClassTimeStr,
+            teachMode: "ONLINE",
+            singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes,
+            teachingContent: item.teachingContent,
+            teachingPoint: item.teachingPoint
+          });
+        });
+
+        // 初始化数据
+        this.form = {
+          roomTitle: liveBroadcastRoom.roomTitle, //
+          liveRemark: liveBroadcastRoom.liveRemark, // 内容
+          organIds: vipGroupApplyBaseInfo.organName ? vipGroupApplyBaseInfo.organName.split(",") : [],
+          subjectIdList: vipGroupApplyBaseInfo.subjectName, // 声部
+          teacher: liveBroadcastRoom.speakerName, // 指导老师列表
+          educationalTeacherId: vipGroupApplyBaseInfo.educationalTeacherName, // 乐团主管
+          preTemplate: liveBroadcastRoom.preTemplate, // 模板
+          signUpStart: vipGroupApplyBaseInfo.registrationStartTime, // 开始时间
+          signUpEnd: vipGroupApplyBaseInfo.paymentExpireDate, // 结束时间
+          signUpTimeList: [
+            vipGroupApplyBaseInfo.registrationStartTime,
+            vipGroupApplyBaseInfo.paymentExpireDate
+          ], // 课程购买时间
+          onlineClassesNum: vipGroupApplyBaseInfo.onlineClassesNum,
+          singleClassMinuteId: vipGroupApplyBaseInfo.singleClassMinutes, //时长编号
+          singleClassMinutes: vipGroupApplyBaseInfo.singleClassMinutes, // 时长
+          onlineClassesUnitPrice: vipGroupApplyBaseInfo.onlineClassesUnitPrice, // 售价
+          offlineClassesUnitPrice:
+            vipGroupApplyBaseInfo.offlineClassesUnitPrice, // 原价
+          os: liveBroadcastRoom.os, // 直播设备
+          useScene: liveBroadcastRoom.useScene, // 直播场景
+          popularizeType: liveBroadcastRoom.popularizeType, // 观看权限信息
+          viewMode: liveBroadcastRoom.viewMode,
+          roomConfig: liveBroadcastRoom.roomConfig || {
+            whether_like: 0,
+            whether_chat: 0,
+            whether_video: 0,
+            whether_mic: 0,
+            whether_view_shop_cart: 0
+          },
+          timeTable: tempCourse, // 排课
+          clientType: "TEACHER" // 主讲人身份 默认[老师]
+        };
+      } catch {
+        //
+      }
+    }
+  },
+  computed: {
+    countOnlineClassesUnitPrice() {
+      return this.form.onlineClassesNum * this.form.onlineClassesUnitPrice || 0
+    },
+    countOfflineClassesUnitPrice() {
+      return this.form.onlineClassesNum * this.form.offlineClassesUnitPrice || 0
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+.chioseWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+
+  .chioseItem {
+    border-radius: 4px;
+    overflow: hidden;
+    position: relative;
+    margin-right: 10px;
+    width: 188px;
+    height: 188px;
+    cursor: pointer;
+
+    .dotWrap {
+      width: 21px;
+      height: 21px;
+      background: url("../../../../assets/images/icon_checkbox_default.png") no-repeat center;
+      background-size: contain;
+      display: block;
+      position: absolute;
+      top: 10px;
+      right: 12px;
+      overflow: hidden;
+
+      &.checked {
+        background: url("../../../../assets/images/icon_checkbox.png") no-repeat center;
+        background-size: contain;
+      }
+    }
+  }
+}
+
+::v-deep .el-select>.el-input {
+  height: 36px !important;
+}
+
+::v-deep .el-input__inner {
+  height: 36px !important;
+}
+
+::v-deep .el-col-8 .el-form-item__content {
+  height: 36px !important;
+}
+
+::v-deep .select-all {
+  .select {
+    .el-input__inner {
+      height: 36px !important;
+      min-height: 36px !important;
+    }
+  }
+
+  .btn {
+    height: 36px !important;
+    min-height: 36px !important;
+  }
+}
+</style>

+ 163 - 0
src/views/liveClassManager/liveClassTwo/components/studentList.vue

@@ -0,0 +1,163 @@
+<!--  -->
+<template>
+  <div>
+    <div class="tableWrap">
+      <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList">
+        <el-table-column align="center" prop="studentId" label="编号"></el-table-column>
+        <el-table-column align="center" prop="organName" label="分部"></el-table-column>
+        <el-table-column align="center" label="学员姓名" prop="studentName">
+        </el-table-column>
+        <!-- <el-table-column
+          align="center"
+          prop="userName"
+          label="学校姓名"
+        ></el-table-column> -->
+        <el-table-column align="center" prop="subjectName" label="声部"></el-table-column>
+        <el-table-column align="center" prop="phone" label="手机号"></el-table-column>
+        <el-table-column align="center" prop="applyDate" label="报名时间">
+          <template slot-scope="scope">
+            <p>{{ scope.row.createTime | formatTimer }}</p>
+          </template>
+        </el-table-column>
+        <el-table-column prop="studentStatus" align="center" label="学员状态">
+          <template slot-scope="scope">
+            <div>
+              {{ scope.row.studentStatus | studentStatus }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="studentId" label="操作">
+          <template slot-scope="scope">
+            <div>
+              <auth auths="/liveBlackList">
+                <el-button type="text" v-if="scope.row.studentStatus == 0 || scope.row.studentStatus == 3
+                  " @click="lookFee(scope)">退学</el-button>
+              </auth>
+
+              <el-button type="text" @click="onDetail(scope.row)">查看订单</el-button>
+
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination sync saveKey="liveClass-courseOverview" :total.sync="rules.total" :page.sync="rules.page"
+        :limit.sync="rules.limit" :page-sizes="rules.page_size" @pagination="getStudents" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { liveStudentList, leaveSchool, getStudentSurplusCourseFee } from '../../api';
+import pagination from "@/components/Pagination/index";
+export default {
+  components: {
+    pagination
+  },
+  data() {
+    return {
+      id: this.$route.query.id,
+      tableList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    };
+  },
+  mounted() {
+    this.getStudents();
+  },
+  methods: {
+    onDetail(row) {
+      console.log(row, '111')
+      this.$router.push({
+        path: '/orderManager/income',
+        query: {
+          orderNo: row.orderNo
+        }
+      })
+    },
+    async getStudents() {
+      try {
+        const { data } = await liveStudentList({
+          liveGroupId: this.id,
+          page: this.rules.page,
+          rows: this.rules.limit
+        })
+        console.log(data, 'data')
+        this.tableList = data.rows
+        for (let i in this.tableList) {
+          this.tableList[i].fee = 0;
+          this.tableList[i].visible = false;
+        }
+        this.rules.total = data.total;
+      } catch {
+        //
+      }
+    },
+    async leaveSchool(scope) {
+      let studentId = scope.row.studentId;
+      let vipGroupId = this.id;
+      let amount = scope.row.fee;
+      await leaveSchool({ studentId, vipGroupId, amount }).then(res => {
+        if (res.code == 200) {
+          this.$message.success("退学成功");
+          this.getStudents();
+        }
+        if (res.code == 206) {
+          this.$confirm(res.msg, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消"
+          }).then(() => {
+            leaveSchool({
+              studentId,
+              vipGroupId,
+              amount,
+              confirmReturnActivityGive: true
+            }).then(res => {
+              if (res.code == 200) {
+                this.$message.success("退学成功");
+                this.getStudents();
+              }
+            });
+          });
+        }
+      });
+    },
+    lookFee(scope) {
+      this.$confirm(`是否确认将该学员退学?<p style="color: red;marginTop:20px">如需退款请在OA中操作</p>`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        dangerouslyUseHTMLString: true,
+        type: "warning"
+      })
+        .then(async () => {
+          let id = scope.row.studentId;
+          if (scope.row.studentStatus == 3) {
+            this.leaveSchool(scope);
+          } else {
+            const { data } = await getStudentSurplusCourseFee({
+              studentId: id,
+              vipGroupId: this.id
+            })
+            scope.row.fee = data.suplusCourseFee;
+            this.leaveSchool(scope);
+          }
+        })
+        .catch(() => { });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-dropdown-link {
+  cursor: pointer;
+  color: var(--color-primary);
+}
+
+::v-deep .el-icon-arrow-down {
+  font-size: 12px;
+}
+</style>

+ 72 - 0
src/views/liveClassManager/liveClassTwo/index.vue

@@ -0,0 +1,72 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <el-page-header @back="onCancel" :content="className"></el-page-header>
+    </h2>
+    <div class="m-core">
+      <!-- navMenu -->
+      <tab-router
+        v-model.trim="activeName"
+        type="card"
+        @tab-click="handleClick"
+      >
+        <el-tab-pane label="课程总览" lazy name="1">
+          <!-- v-if="permissionList.vipBase" -->
+          <courseOverview v-if="activeName == '1'" />
+        </el-tab-pane>
+        <el-tab-pane label="学生列表" lazy name="2">
+          <studentList v-if="activeName == '2'" />
+        </el-tab-pane>
+        <el-tab-pane label="课表调整" lazy name="3">
+          <courseAdjust v-if="activeName == '3'" />
+        </el-tab-pane>
+      </tab-router>
+    </div>
+  </div>
+</template>
+<script>
+import courseOverview from "./components/courseOverview.vue";
+import studentList from "./components/studentList.vue";
+import courseAdjust from "./components/courseAdjust.vue";
+import { permission } from "@/utils/directivePage"; // 权限
+export default {
+  components: { courseOverview, courseAdjust, studentList },
+  name: "vipDetail",
+  data() {
+    return {
+      activeName: "1",
+      className: "",
+      rules: null,
+      searchForm: null,
+      vipDetail: null
+      // permissionList: {
+      //   vipBase: permission("/vipDetail/vipBase"),
+      //   teacherRecord: permission("/vipDetail/teacherRecord"),
+      //   fnanceInfo: permission("/vipDetail/fnanceInfo"),
+      //   vipStudentList: permission("/vipDetail/vipStudentList"),
+      //   vipReset: permission("/vipReset")
+      // }
+    };
+  },
+  mounted() {
+    this.__init();
+  },
+  methods: {
+    __init() {
+      let querys = this.$route.query;
+      this.className = querys.name;
+      // 获取vip基本信息
+      // let id = this.$route.query.id;
+      // 根据id 获取vip详情
+    },
+    handleClick(val) {
+      this.activeName = val.name;
+    },
+    onCancel() {
+      this.$store.dispatch("delVisitedViews", this.$route);
+      this.$router.push({ path: "/liveClassManager?tabrouter=2" });
+    }
+  }
+};
+</script>
+<style lang="scss"></style>

+ 498 - 0
src/views/liveClassManager/liveRoomManager.vue

@@ -0,0 +1,498 @@
+<!--  -->
+<template>
+  <div>
+    <!-- <h2>
+      <div class="squrt"></div>
+      直播间管理
+    </h2> -->
+    <div>
+      <auth auths="imLiveBroadcastRoom/add">
+        <el-button @click="newLiveClass" type="primary" style="margin-bottom: 20px">新建直播间</el-button>
+      </auth>
+      <save-form :inline="true" :model="searchForm" @submit="search" @reset="onReSet" ref="searchForm">
+        <el-form-item prop="search">
+          <el-input v-model.trim="searchForm.search" clearable @keyup.enter.native="e => {
+            e.target.blur();
+            $refs.searchForm.save();
+            search();
+          }
+            " placeholder="直播间编号/标题"></el-input>
+        </el-form-item>
+        <el-form-item prop="popularize">
+          <el-select placeholder="是否推广" v-model="searchForm.popularize" clearable>
+            <el-option label="否" value="0"></el-option>
+            <el-option label="是" value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="liveState">
+          <el-select placeholder="直播状态" v-model="searchForm.liveState" clearable>
+            <el-option label="未开始" value="0"></el-option>
+            <el-option label="直播中" value="1"></el-option>
+            <el-option label="已结束" value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="serviceProvider">
+          <el-select placeholder="直播方案" v-model="searchForm.serviceProvider" clearable>
+            <el-option label="融云" value="rongCloud"></el-option>
+            <el-option label="腾讯云" value="tencentCloud"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="timer">
+          <el-date-picker v-model.trim="searchForm.timer" type="daterange" value-format="yyyy-MM-dd" range-separator="至"
+            start-placeholder="直播开始日期" end-placeholder="直播结束日期" :picker-options="{
+              firstDayOfWeek: 1
+            }">
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <div class="tableWrap">
+        <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList">
+          <el-table-column align="center" prop="id" label="直播间编号"></el-table-column>
+          <el-table-column align="center" prop="roomTitle" label="直播间标题"></el-table-column>
+          <el-table-column align="center" prop="speakerName" label="主讲人"></el-table-column>
+          <el-table-column align="center" prop="liveStartTime" label="直播开始时间">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.liveStartTime | dateForMinFormat }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="popularize" label="直播设备">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.os | osFilter }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="popularize" label="观看权限">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.popularizeType == "ALL" ? "公开模式" : "私密模式" }}
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column align="center" prop="popularize" label="是否推广">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.popularize == 1 ? "是" : "否" }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="liveState" label="直播状态">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.liveState | liveState }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="serviceProvider" label="直播方案">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.serviceProvider | serviceProvider }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="viewMode" label="观看模式">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.viewMode == "LOGIN" ? "登录" : "游客" }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="createdByName" label="创建人"></el-table-column>
+          <el-table-column align="center" prop="createdByName" label="预约人数">
+            <template slot-scope="scope">
+              <div>
+                <auth auths="imLiveBroadcastRoom/query/roomUser">
+                  <el-button type="text" @click="lookReservationDetail(scope.row)">
+                    {{ scope.row.roomReservationNum }}</el-button>
+                </auth>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="studentId" label="操作">
+            <template slot-scope="scope">
+              <div>
+                <el-dropdown trigger="click" placement="bottom" :hide-on-click="false">
+                  <span class="el-dropdown-link">
+                    操作<i class="el-icon-arrow-down el-icon--right"></i>
+                  </span>
+                  <el-dropdown-menu slot="dropdown" style="width: 100px">
+                    <el-dropdown-item style="width: 100px" v-if="permission('imLiveBroadcastRoom/roomStart') &&
+                      scope.row.liveState == 0
+                      " @click.native="onStartLive(scope.row)">
+                      <el-button type="text">开启直播</el-button>
+                    </el-dropdown-item>
+                    <el-dropdown-item style="width: 100px" v-if="permission('/liveStudentList') &&
+                      scope.row.popularizeType !== 'ALL'
+                      " @click.native="lookStudentDetail(scope.row)">
+                      <el-button type="text">观看学员</el-button>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="permission('imLiveBroadcastRoom/opsPopularize') &&
+                      scope.row.liveState != 2
+                      " @click.native="popularizeRoom(scope.row)">
+                      <el-button type="text">{{
+                        scope.row.popularize == 1 ? "取消推广" : "首页推广"
+                      }}</el-button>
+                    </el-dropdown-item>
+
+                    <el-dropdown-item v-if="permission('imLiveBroadcastRoom/roomDestroy') &&
+                      scope.row.liveState == 1
+                      " @click.native="closeRoom(scope.row)">
+                      <el-button type="text">关闭直播</el-button>
+                    </el-dropdown-item>
+
+                    <el-dropdown-item v-if="scope.row.liveState == 2" @click.native="gotoDetail(scope.row)">
+                      <el-button type="text">直播详情</el-button>
+                    </el-dropdown-item>
+                    <auth auths="/liveBlackList">
+                      <el-dropdown-item @click.native="gotoBuylist(scope.row)">
+                        <el-button type="text">订单详情</el-button>
+                      </el-dropdown-item>
+                    </auth>
+                    <el-dropdown-item v-if="permission('liveGoodsMapper/page') &&
+                      ishowCart(scope.row)
+                      " @click.native="setShop(scope.row)">
+                      <el-button type="text">商品设置</el-button>
+                    </el-dropdown-item>
+                    <auth auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList">
+                      <el-dropdown-item @click.native="gotoBlacklist(scope.row)">
+                        <el-button type="text">黑名单</el-button>
+                      </el-dropdown-item>
+                    </auth>
+                    <el-dropdown-item v-if="permission('imLiveBroadcastRoom/shareGroup')"
+                      @click.native="shareLive(scope.row)">
+                      <el-button type="text">分享</el-button>
+                    </el-dropdown-item>
+
+                    <el-dropdown-item v-if="permission('imLiveBroadcastRoom/update') &&
+                      scope.row.liveState == 0
+                      ">
+                      <el-button type="text" @click.native="resetLive(scope.row)">修改</el-button>
+                    </el-dropdown-item>
+
+                    <auth auths="imLiveBroadcastRoom/delete" v-if="scope.row.liveState == 0">
+                      <el-dropdown-item>
+                        <el-button type="text" @click.native="deteleLive(scope.row)">删除</el-button>
+                      </el-dropdown-item>
+                    </auth>
+                  </el-dropdown-menu>
+                </el-dropdown>
+
+                <!-- <auth
+                  auths="imLiveBroadcastRoom/opsPopularize"
+                  v-if="scope.row.liveState != 2"
+                >
+                  <el-button type="text" @click="popularizeRoom(scope.row)">{{
+                    scope.row.popularize == 1 ? "取消推广" : "首页推广"
+                  }}</el-button>
+                </auth>
+                <auth auths="imLiveBroadcastRoom/roomDestroy">
+                  <el-button
+                    type="text"
+                    v-if="scope.row.liveState == 1"
+                    @click="closeRoom(scope.row)"
+                    >关闭直播</el-button
+                  >
+                </auth>
+
+                <el-button
+                  type="text"
+                  v-if="scope.row.liveState == 2"
+                  @click="gotoDetail(scope.row)"
+                  >直播详情</el-button
+                >
+                <auth auths="liveGoodsMapper/page">
+                  <el-button type="text" @click="setShop(scope.row)"
+                    >商品设置</el-button
+                  >
+                </auth>
+
+                <auth auths="imLiveBroadcastRoom/shareGroup">
+                  <el-button type="text" @click="shareLive(scope.row)"
+                    >分享</el-button
+                  >
+                </auth>
+                <auth auths="imLiveBroadcastRoom/update">
+                  <el-button
+                    type="text"
+                    v-if="scope.row.liveState == 0"
+                    @click="resetLive(scope.row)"
+                    >修改</el-button
+                  >
+                </auth>
+                <auth auths="imLiveBroadcastRoom/delete">
+                  <el-button
+                    type="text"
+                    v-if="scope.row.liveState == 0"
+                    @click="deteleLive(scope.row)"
+                    >删除</el-button
+                  >
+                </auth>
+                <auth auths="imLiveBroadcastRoom/queryLiveRoomGoodsOrderList">
+                  <el-button type="text" @click="gotoBlacklist(scope.row)"
+                    >黑名单</el-button
+                  >
+                </auth>
+                <auth auths="/liveBlackList">
+                  <el-button type="text" @click="gotoBuylist(scope.row)"
+                    >订单详情</el-button
+                  >
+                </auth> -->
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination sync :total.sync="rules.total" :page.sync="rules.page" :limit.sync="rules.limit"
+          :page-sizes="rules.page_size" @pagination="getList" />
+      </div>
+    </div>
+    <el-dialog title="分享" width="510px" append-to-body :visible.sync="shareVisible" v-if="shareVisible">
+      <shareDetail @close="shareVisible = false" :row="activeRow" />
+    </el-dialog>
+    <popularizeRoom @getList="getList" ref="popularizeRoom" />
+    <reservationDetail ref="reservationDetail" />
+    <sellShopList ref="sellShopList" />
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import { getTimes } from "@/utils";
+import pagination from "@/components/Pagination/index";
+import shareDetail from "./modals/shareDetail.vue";
+import load from "@/utils/loading";
+import popularizeRoom from "./modals/popularizeRoom.vue";
+import reservationDetail from "./modals/reservationDetail.vue";
+import sellShopList from "./modals/sellShopList";
+import { permission } from "@/utils/directivePage";
+import {
+  getLiveBroadcastList,
+  delLiveBroadcast,
+  closeBroadcastRoomList,
+  opsPopularize,
+  roomStart
+} from "./api";
+export default {
+  components: {
+    pagination,
+    shareDetail,
+    popularizeRoom,
+    reservationDetail,
+    sellShopList
+  },
+  data() {
+    return {
+      searchForm: {
+        search: null,
+        timer: [],
+        serviceProvider: null,
+        liveState: null,
+        popularize: null
+      },
+
+      tableList: [],
+      organList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      shareVisible: false,
+      activeRow: null
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() { },
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    // 获取分部
+
+    this.init();
+  },
+  methods: {
+    permission,
+    init() {
+      this.getList();
+    },
+    async getList() {
+      const { timer, ...rest } = this.searchForm;
+      try {
+        const res = await getLiveBroadcastList({
+          ...rest,
+          ...getTimes(timer, ["startTime", "endTime"]),
+          rows: this.rules.limit,
+          page: this.rules.page
+        });
+        this.tableList = res.data.rows;
+        this.rules.total = res.data.total;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs.searchForm.resetFields();
+      this.search();
+    },
+    newLiveClass() {
+      let params = {
+        path: "/business/createLiveClass"
+      };
+      this.$router.push(params, route => {
+        route.meta.title = "新建直播间";
+      });
+      this.$router.push("/business/createLiveClass");
+      //liveClassDetail
+    },
+    gotoDetail(row) {
+      this.$router.push({
+        path: "/business/liveClassDetail",
+        query: { roomUid: row.roomUid }
+      });
+      //
+    },
+    shareLive(row) {
+      this.activeRow = row;
+      this.shareVisible = true;
+    },
+    resetLive(row) {
+      let params = {
+        path: "/business/createLiveClass",
+        query: { id: row.id, roomUid: row.roomUid }
+      };
+      //  ,
+      this.$router.push(params, route => {
+        route.meta.title = "修改直播间";
+      });
+    },
+    deteleLive(row) {
+      this.$confirm("您确定删除该直播间", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(async () => {
+          try {
+            const res = await delLiveBroadcast({ id: row.id });
+            this.$message.success("删除成功");
+            this.getList();
+          } catch (e) {
+            console.log(e);
+          }
+        })
+        .catch(() => { });
+    },
+    closeRoom(row) {
+      this.$confirm("您确定关闭直播间", "提示", {
+        confirmButtonText: "确定",
+        type: "warning"
+      }).then(async res => {
+        try {
+          const res = await closeBroadcastRoomList(row.id);
+          this.$message.success("关闭成功");
+          this.getList();
+        } catch (e) { }
+      });
+    },
+    async popularizeRoom(row) {
+      let popularize, str;
+      if (row.popularize) {
+        popularize = 0;
+        str = "取消推广";
+      } else {
+        popularize = 1;
+        str = "推广";
+        // this.$refs.popularizeRoom.openDioag(row);
+      }
+      this.$confirm(`您是否${str}直播间"${row.roomTitle}"`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(async () => {
+          try {
+            const res = await opsPopularize({
+              popularize,
+              id: row.id
+            });
+            this.$message.success(`${str}成功`);
+            this.getList();
+          } catch (e) {
+            console.log(e);
+          }
+        })
+        .catch(() => { });
+    },
+    setShop(row) {
+      this.$router.push({
+        path: "/business/liveShopControl",
+        query: { roomUid: row.roomUid }
+      });
+      //
+    },
+    lookReservationDetail(row) {
+      this.$refs.reservationDetail.openDioag(row);
+    },
+    gotoBlacklist(row) {
+      this.$router.push({
+        path: "/business/liveBlackList",
+        query: {
+          roomUid: row.roomUid,
+          name: row.roomTitle,
+          liveState: row.liveState
+        }
+      });
+    },
+    gotoBuylist(row) {
+      this.$refs.sellShopList.openDioag(row);
+    },
+    lookStudentDetail(row) {
+      this.$router.push({
+        path: "/business/liveStudentList",
+        query: { roomUid: row.roomUid, name: row.roomTitle }
+      });
+    },
+    ishowCart(row) {
+      let json = JSON.parse(row.roomConfig);
+      if (json.whether_view_shop_cart == 0) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+    async onStartLive(row) {
+      try {
+        await this.$confirm("确定开启直播?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        });
+        await roomStart(row.id);
+      } catch (e) { }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-dropdown-link {
+  cursor: pointer;
+  color: var(--color-primary);
+}
+
+::v-deep .el-icon-arrow-down {
+  font-size: 12px;
+}
+</style>

+ 533 - 0
src/views/liveClassManager/modals/addLiveCourse.vue

@@ -0,0 +1,533 @@
+<template>
+  <div>
+    <el-form :model="maskForm" label-position="right" label-width="80px">
+      <el-form-item label="开课时间">
+        <el-date-picker v-model.trim="maskForm.courseStartOnline" type="date" :picker-options="pickOptions()"
+          placeholder="请选择开课时间" style="width: 100% !important" />
+      </el-form-item>
+      <!-- <el-form-item label="课程类型" prop="type">
+        <el-radio v-if="hasOnline" v-model.trim="maskForm.type" label="ONLINE"
+          >线上课</el-radio
+        >
+        <el-radio v-if="hasOffline" v-model.trim="maskForm.type" label="OFFLINE"
+          >线下课</el-radio
+        >
+      </el-form-item> -->
+      <el-form-item label="循环周次" prop="week">
+        <el-select v-model.trim="maskForm.week" style="width: 100% !important">
+          <el-option label="星期一" value="1" />
+          <el-option label="星期二" value="2" />
+          <el-option label="星期三" value="3" />
+          <el-option label="星期四" value="4" />
+          <el-option label="星期五" value="5" />
+          <el-option label="星期六" value="6" />
+          <el-option label="星期日" value="0" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="上课时间" prop="startTime">
+        <el-time-picker style="width: 100% !important" v-model.trim="maskForm.startTime" @change="getStartTime"
+          format="HH:mm" value-format="HH:mm" placeholder="选择时间" />
+      </el-form-item>
+      <el-form-item label="下课时间" prop="endTime">
+        <el-time-picker style="width: 100% !important" v-model.trim="maskForm.endTime" disabled format="HH:mm"
+          value-format="HH:mm" :picker-options="{
+            start: '04:30',
+            step: '00:05',
+            end: '23:30'
+          }" placeholder="选择时间" />
+      </el-form-item>
+    </el-form>
+    <div class="btnWrap">
+      <div class="okBtn" @click="addWeek">确认</div>
+    </div>
+
+    <div class="planList">
+      <div class="planTop">
+        <p>已排课程</p>
+      </div>
+      <div class="planCore" v-if="lookList.length > 0">
+        <div v-for="(item, index) in lookList" class="row" :key="index">
+          <!-- <div class="name">{{ item.type }}</div> -->
+          <div class="week">{{ item.week }}</div>
+          <div class="time">{{ item.time }}</div>
+          <div class="operation">
+            <el-button type="text" @click="removeWeekCourse(item.id)">删除</el-button>
+          </div>
+        </div>
+      </div>
+      <div class="nomore" v-else>暂无数据</div>
+      <div slot="footer" style="margin-top: 20px" class="dialog-footer">
+        <el-button @click="onClose">取 消</el-button>
+        <el-button type="primary" @click="setTimeTable">确 定</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import dayjs from "dayjs";
+import { addTimerFormMinute } from "@/utils/date";
+export default {
+  name: "add-live-course",
+  props: {
+    hasOnline: {
+      type: Boolean,
+      default: true
+    },
+    hasOffline: {
+      type: Boolean,
+      default: false
+    },
+    // 课时数
+    singleClassMinutes: {
+      type: [Number, String],
+      default: 0
+    },
+    signUpEnd: {
+      type: [Date, String],
+      default: null
+    },
+    // 指导老师
+    teacher: {
+      type: String,
+      default: ""
+    },
+    // 赠送课时数
+    // giveNum: {
+    //   type: Number,
+    //   default: 0
+    // },
+    onlineCourseNum: {
+      type: [Number, String],
+      default: 0
+    },
+    offlineCourseNum: {
+      type: Number,
+      default: 0
+    },
+    status: {
+      type: Number,
+      default: 0
+    }
+  },
+  data() {
+
+    return {
+      maskForm: {
+        type: "ONLINE",
+        week: "",
+        startTime: "",
+        endTime: ""
+      },
+      weekDay: [
+        "星期日",
+        "星期一",
+        "星期二",
+        "星期三",
+        "星期四",
+        "星期五",
+        "星期六"
+      ],
+      courseOption: null,
+      lookList: [],
+      onlinelookList: [], // 展示课表线上
+      offlineLookList: [], // 展示课表线下
+      timeTable: [], // 排课数据
+
+    };
+  },
+  // watch: {
+  //   signUpEnd() {
+  //     this.pickOptions()
+  //   }
+  // },
+  methods: {
+    pickOptions() {
+      const endTime = this.signUpEnd ? dayjs(this.signUpEnd).valueOf() : new Date().getTime()
+      const status = this.status
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          if (status != 0) {
+            return endTime > time.getTime()
+          } else {
+            return endTime >= time.getTime()
+          }
+
+        }
+      }
+    },
+    onClose() {
+      this.$emit("close");
+    },
+    addWeek() {
+      let courseType = this.maskForm.type;
+      let startTime = this.maskForm.startTime;
+      if (!courseType || !this.maskForm.week || !startTime) {
+        this.$message.error("请填写完成信息");
+        return;
+      }
+      // 拿到相应的值插入数组
+      let endTime = this.MinutesTest(startTime, this.singleClassMinutes);
+      let str;
+      switch (courseType) {
+        case "ONLINE": {
+          str = "线上课";
+          break;
+        }
+        case "OFFLINE": {
+          str = "线下课";
+          break;
+        }
+      }
+      let flag = false;
+      for (let i in this.lookList) {
+        if (this.lookList[i].weekDay == this.maskForm.week) {
+          flag = true;
+        }
+      }
+      // true=> 说明有这一周 那么循环找到这一周 在判断时间
+      // flase=> 说明没有这一周的时间 直接添加
+      if (flag) {
+        // 有相同的周日
+        let arr = [];
+        for (let i in this.lookList) {
+          if (this.lookList[i].weekDay == this.maskForm.week) {
+            // 找到这一天的所有元素
+            //  && !this.timeIsrange(this.lookList[i].startTime, this.lookList[i].endTime, startTime) && !this.timeIsrange(this.lookList[i].startTime, this.lookList[i].endTime, endTime)
+            let isStartTime = this.timeIsrange(
+              startTime,
+              endTime,
+              this.lookList[i].startTime
+            );
+            let isEndTime = this.timeIsrange(
+              startTime,
+              endTime,
+              this.lookList[i].endTime
+            );
+            arr.push(!isEndTime && !isStartTime);
+          }
+        }
+        let isAdd = true;
+        for (let j = 0; j < arr.length; j++) {
+          isAdd = isAdd && arr[j];
+        }
+        if (isAdd) {
+          this.lookList.push({
+            type: str,
+            week: this.weekDay[this.maskForm.week],
+            weekDay: this.maskForm.week,
+            startTime: startTime,
+            endTime: endTime,
+            time: startTime + "-" + endTime,
+            id: Date.now()
+          });
+        } else {
+          this.$message.error("该时间段已排课请重选时间");
+          return;
+        }
+      } else {
+        this.lookList.push({
+          type: str,
+          week: this.weekDay[this.maskForm.week],
+          weekDay: this.maskForm.week,
+          startTime: startTime,
+          endTime: endTime,
+          time: startTime + "-" + endTime,
+          id: Date.now()
+        });
+      }
+      //  根据时间排序
+      this.maskForm.type = "ONLINE";
+      this.maskForm.week = "";
+      this.maskForm.startTime = "";
+      this.maskForm.endTime = "";
+    },
+    // 分钟小时相加减
+    MinutesTest(str, interval) {
+      let houer = str.split(":")[0];
+      let min = str.split(":")[1];
+      let sdate1 = new Date(1900, 1, 1, houer, min);
+      sdate1.setMinutes(sdate1.getMinutes() + parseInt(interval));
+      let H = sdate1.getHours();
+      let M = sdate1.getMinutes();
+      if (H < 10) H = "0" + H;
+      if (M < 10) M = "0" + M;
+      return H + ":" + M;
+    },
+    // 判断时间是否在时间段内
+    timeIsrange(beginTime, endTime, nowTime) {
+      var strb = beginTime.split(":");
+      if (strb.length != 2) {
+        return false;
+      }
+      var stre = endTime.split(":");
+      if (stre.length != 2) {
+        return false;
+      }
+      var strn = nowTime.split(":");
+      if (stre.length != 2) {
+        return false;
+      }
+      var b = new Date();
+      var e = new Date();
+      var n = new Date();
+      b.setHours(strb[0]);
+      b.setMinutes(strb[1]);
+      e.setHours(stre[0]);
+      e.setMinutes(stre[1]);
+      n.setHours(strn[0]);
+      n.setMinutes(strn[1]);
+
+      if (n.getTime() - b.getTime() >= 0 && n.getTime() - e.getTime() <= 0) {
+        // 在时间范围内
+        return true;
+      } else {
+        // 不在时间范围内
+        return false;
+      }
+    },
+    removeWeekCourse(id) {
+      for (let i in this.lookList) {
+        if (this.lookList[i].id == id) {
+          this.lookList.splice(i, 1);
+        }
+      }
+    },
+    setTimeTable() {
+      // 拿到线上课数与线下课数 以及
+      this.timeTable = [];
+      let online = parseInt(this.onlineCourseNum) || 0;
+      let offline = parseInt(this.offlineCourseNum) || 0;
+
+      if (!this.maskForm.courseStartOnline) {
+        this.$message.error("请选择课程开始时间");
+        return;
+      }
+      let date, date1;
+      date = new Date(this.maskForm.courseStartOnline.getTime());
+      date1 = new Date(this.maskForm.courseStartOnline.getTime());
+
+      let onlineList = []; // 装线上课的数组
+      let offlineList = []; //装线下课的数组
+      if (this.lookList.length <= 0) {
+        this.$message.error("请先排课后再点击确认按钮");
+        return;
+      }
+
+      for (let i in this.lookList) {
+        if (this.lookList[i].type == "线上课") {
+          onlineList.push({
+            week: this.lookList[i].weekDay,
+            date: this.lookList[i]
+          });
+        }
+        if (this.lookList[i].type == "线下课") {
+          offlineList.push({
+            week: this.lookList[i].weekDay,
+            date: this.lookList[i]
+          });
+        }
+      }
+
+      if (online > 0 && onlineList.length <= 0) {
+        this.$message.error("选择了线上课但未排线上课");
+        this.timeTable = [];
+        return;
+      }
+      if (offline > 0 && offlineList.length <= 0) {
+        this.$message.error("选择了线下课但未排线下课");
+        this.timeTable = [];
+        return;
+      }
+
+      // 获取要排课的总数  获取每周要排多少次
+      while (online && online > 0) {
+        // 排线上课g
+        for (let i in onlineList) {
+          let num;
+          onlineList[i].week - date.getDay() >= 0
+            ? (num = onlineList[i].week - date.getDay())
+            : (num = onlineList[i].week - date.getDay() + 7); // +差值的天数://差值的天数+7
+          //  (num);
+          let dataStr = this.getThinkDate(date, num);
+          this.timeTable.push({
+            classDate: dataStr + " 00:00:00",
+            actualTeacherId: this.teacher,
+            startClassTimeStr: onlineList[i].date.startTime,
+            endClassTimeStr: onlineList[i].date.endTime,
+            teachMode: "ONLINE"
+          });
+          online--;
+          if (online == 0) break;
+        }
+        if (onlineList.length == 1 || this.isAllEqual(onlineList)) {
+          date.setDate(date.getDate() + 7);
+        }
+
+        // 加一周
+      }
+
+      //  (date1)
+      while (offline && offline > 0) {
+        // 排线下课
+        for (let i in offlineList) {
+          let num;
+          offlineList[i].week - date1.getDay() >= 0
+            ? (num = offlineList[i].week - date1.getDay())
+            : (num = offlineList[i].week - date1.getDay() + 7); // +差值的天数://差值的天数+7
+          let dataStr = this.getThinkDate(date1, num);
+          this.timeTable.push({
+            classDate: dataStr + " 00:00:00",
+            actualTeacherId: this.teacher,
+            startClassTimeStr: offlineList[i].date.startTime,
+            endClassTimeStr: offlineList[i].date.endTime,
+            teachMode: "OFFLINE"
+          });
+          offline--;
+          if (offline == 0) break;
+        }
+        // 加一周
+        if (offlineList.length == 1 || this.isAllEqual(offlineList)) {
+          date1.setDate(date1.getDate() + 7);
+        }
+      }
+      //  (this.timeTable);
+
+      this.timeTable.sort((a, b) => {
+        let aStr = dayjs(
+          dayjs(a.classDate).format("YYYY-MM-DD") +
+          " " +
+          a.startClassTimeStr +
+          ":00"
+        ).valueOf();
+        let bStr = dayjs(
+          dayjs(b.classDate).format("YYYY-MM-DD") +
+          " " +
+          b.startClassTimeStr +
+          ":00"
+        ).valueOf();
+        return aStr - bStr;
+      });
+
+      this.onClose();
+      this.$emit("confirm", this.timeTable);
+    },
+    isAllEqual(array) {
+      if (array.length > 0) {
+        return !array.some((val, index) => {
+          return val.week != array[0].week;
+        });
+      } else {
+        return true;
+      }
+    },
+    // coursesDate() {
+    //   let self = this;
+    //   return {
+    //     firstDayOfWeek: 1,
+    //     disabledDate: time => {
+    //       if (self.leftForm.courseStart && self.leftForm.courseEnd) {
+    //         let date = new Date(self.leftForm.courseStart.replace(/-/, "/"));
+    //         let endDate = new Date(self.leftForm.courseEnd.replace(/-/, "/"));
+    //         let nowDate = new Date();
+    //         let changeDate =
+    //           date.getTime() - nowDate.getTime() > 0 ? date : nowDate;
+    //         let endChangeDate =
+    //           endDate.getTime() - nowDate.getTime() > 0 ? endDate : nowDate;
+    //         return (
+    //           time.getTime() < changeDate.getTime() ||
+    //           time.getTime() > endChangeDate.getTime()
+    //         );
+    //       }
+    //       return;
+    //     }
+    //   };
+    // },
+    getThinkDate(date, num) {
+      let Stamp = date;
+      Stamp.setDate(date.getDate() + num); // 获取当前月数的第几天
+      //  (date.getMonth() + 1)
+      //  (Stamp.getMonth() + 1)
+      var year = Stamp.getFullYear(); //获取完整的年份(4位,1970-????)
+      var month = Stamp.getMonth() + 1; //获取当前月份(0-11,0代表1月)
+      var mvar = "";
+      if (month < 10) {
+        mvar = "0" + month;
+      } else {
+        mvar = month + "";
+      }
+      var day = Stamp.getDate();
+      var dvar = "";
+      if (day < 10) {
+        dvar = "0" + day;
+      } else {
+        dvar = day + "";
+      }
+      //  (year + "-" + mvar + '-' + dvar);
+      return year + "-" + mvar + "-" + dvar;
+    },
+    getStartTime(val) {
+      if (val) {
+        let date = dayjs(new Date()).format("YYYY-MM-DD");
+        this.maskForm.endTime = addTimerFormMinute(
+          date,
+          val,
+          this.singleClassMinutes
+        );
+      } else {
+        this.maskForm.endTime = "";
+      }
+      if (!this.maskForm.endTime) {
+        this.maskForm.startTime = "";
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.planList {
+  padding: 0 25px;
+
+  .planTop {
+    height: 40px;
+    line-height: 40px;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    border-bottom: 1px solid #ccc;
+    margin-top: 20px;
+
+    >p {
+      font-size: 14px;
+    }
+  }
+
+  .planCore {
+    .row {
+      width: 100%;
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      flex-wrap: nowrap;
+      height: 40px;
+      line-height: 40px;
+      font-size: 14px;
+      text-align: center;
+
+      div {
+        width: 87px;
+      }
+    }
+  }
+
+  .nomore {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+    height: 40px;
+  }
+}
+</style>

+ 123 - 311
src/views/liveClassManager/newLiveClass.vue

@@ -4,71 +4,33 @@
       <el-page-header @back="onCancel" :content="name"></el-page-header>
     </h2>
     <div class="m-core">
-      <el-form
-        :model="form"
-        ref="form"
-        label-width="300px"
-        :inline="true"
-        label-position="left"
-      >
-        <el-alert
-          title="直播设备配置"
-          type="info"
-          :closable="false"
-          style="margin-bottom: 20px"
-        ></el-alert>
+      <el-form :model="form" ref="form" label-width="300px" :inline="true" label-position="left">
+        <el-alert title="直播设备配置" type="info" :closable="false" style="margin-bottom: 20px"></el-alert>
         <el-row class="row">
-          <el-form-item
-            class="mline"
-            label="直播设备"
-            prop="os"
-            label-width="130px"
-            :rules="[{ required: true, message: '请选择推广类型' }]"
-          >
+          <el-form-item class="mline" label="直播设备" prop="os" label-width="130px"
+            :rules="[{ required: true, message: '请选择推广类型' }]">
             <el-radio-group v-model="form.os" @input="changeOs">
               <!-- value="rongCloud"></el-option>
               <el-option label="腾讯云" value="tencentCloud" -->
               <el-radio v-if="serviceProvider === 'rongCloud'" label="pc">web</el-radio>
-              <el-radio v-if="serviceProvider === 'tencentCloud'" label="client"
-                >客户端</el-radio
-              >
+              <el-radio v-if="serviceProvider === 'tencentCloud'" label="client">乐直播</el-radio>
               <el-radio label="mobile">手机</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            class="mline"
-            label="直播场景"
-            prop="useScene"
-            label-width="130px"
-            :rules="[{ required: true, message: '请选择直播场景' }]"
-          >
+          <el-form-item class="mline" label="直播场景" prop="useScene" label-width="130px"
+            :rules="[{ required: true, message: '请选择直播场景' }]">
             <el-radio-group v-model="form.useScene">
-              <el-radio label="NORMAL">普通模式</el-radio>
-              <el-radio label="MUSIC">音乐模式</el-radio>
+              <el-radio label="NORMAL">普通场景</el-radio>
+              <el-radio label="MUSIC">音乐场景</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-row>
-        <el-alert
-          title="直播课信息"
-          type="info"
-          :closable="false"
-          style="margin-bottom: 20px"
-        ></el-alert>
+        <el-alert title="直播间信息" type="info" :closable="false" style="margin-bottom: 20px"></el-alert>
         <el-row class="row">
-          <el-form-item
-            label="直播课标题"
-            class="nomb"
-            prop="roomTitle"
-            :rules="[{ required: true, message: '请输入直播课标题' }]"
-          >
-            <el-input
-              maxlength="10"
-              show-word-limit
-              placeholder="请输入直播课标题"
-              v-model.trim="form.roomTitle"
-            ></el-input>
+          <el-form-item label="直播间标题" class="nomb" prop="roomTitle" :rules="[{ required: true, message: '请输入直播间标题' }]">
+            <el-input maxlength="10" show-word-limit placeholder="请输入直播间标题" v-model.trim="form.roomTitle"></el-input>
           </el-form-item>
           <!-- <el-form-item
             label="直播方案"
@@ -94,71 +56,30 @@
               <el-option label="腾讯云" value="tencentCloud"></el-option>
             </el-select>
           </el-form-item> -->
-          <el-form-item
-            label="直播开始时间"
-            class="nomb"
-            prop="liveStartTime"
-            :rules="[{ required: true, message: '请选择直播开始时间' }]"
-          >
-            <el-date-picker
-              v-model="form.liveStartTime"
-              :picker-options="pickerOptions"
-              type="datetime"
-              format="yyyy-MM-dd HH:mm"
-              value-format="yyyy-MM-dd HH:mm"
-              placeholder="请选择直播开始时间"
-            >
+          <el-form-item label="直播开始时间" class="nomb" prop="liveStartTime"
+            :rules="[{ required: true, message: '请选择直播开始时间' }]">
+            <el-date-picker v-model="form.liveStartTime" :picker-options="pickerOptions" type="datetime"
+              format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm" placeholder="请选择直播开始时间">
             </el-date-picker>
             <p style="color: red">主讲人可提前30分钟进入直播间准备直播</p>
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            label="主讲人身份"
-            class="nomb"
-            prop="clientType"
-            :rules="[{ required: true, message: '请选择直播方案' }]"
-          >
-            <el-select
-              placeholder="请选择主讲人身份"
-              v-model="form.clientType"
-              :disabled="form.os == 'mobile'"
-              clearable
-              @change="
-                (value) => {
-                  form.speakerId = '';
-                }
-              "
-            >
+          <el-form-item label="主讲人身份" class="nomb" prop="clientType" :rules="[{ required: true, message: '请选择直播方案' }]">
+            <el-select placeholder="请选择主讲人身份" v-model="form.clientType" :disabled="form.os == 'mobile'" clearable @change="value => {
+              form.speakerId = '';
+            }
+              ">
               <el-option label="老师" value="TEACHER"></el-option>
               <el-option label="员工" value="EDUCATION"></el-option>
             </el-select>
           </el-form-item>
 
-          <el-form-item
-            label="主讲人"
-            class="nomb"
-            prop="speakerId"
-            :rules="[{ required: true, message: '请输入主讲人' }]"
-            v-if="form.clientType == 'TEACHER'"
-          >
-            <el-select
-              v-model.trim="form.speakerId"
-              collapse-tags
-              clearable
-              placeholder="请输入主讲人"
-              remote
-              filterable
-              :remote-method="remoteMethod"
-              :loading="remoteLoading"
-              @change="changeTeacher"
-            >
-              <el-option
-                v-for="item in teacherList"
-                :key="item.id"
-                :label="item.realName"
-                :value="item.id"
-              >
+          <el-form-item label="主讲人" class="nomb" prop="speakerId" :rules="[{ required: true, message: '请输入主讲人' }]"
+            v-if="form.clientType == 'TEACHER'">
+            <el-select v-model.trim="form.speakerId" collapse-tags clearable placeholder="请输入主讲人" remote filterable
+              :remote-method="remoteMethod" :loading="remoteLoading" @change="changeTeacher">
+              <el-option v-for="item in teacherList" :key="item.id" :label="item.realName" :value="item.id">
                 <span style="float: left">{{ item.realName }}</span>
                 <span style="float: right; color: #8492a6; font-size: 13px">{{
                   item.phone
@@ -167,30 +88,10 @@
             </el-select>
           </el-form-item>
 
-          <el-form-item
-            v-else
-            label="主讲人"
-            class="nomb"
-            prop="speakerId"
-            :rules="[{ required: true, message: '请输入主讲人' }]"
-          >
-            <el-select
-              v-model.trim="form.speakerId"
-              collapse-tags
-              clearable
-              placeholder="请输入主讲人"
-              remote
-              filterable
-              :remote-method="remoteMethodEduc"
-              :loading="remoteLoading"
-              @change="changeTeacher"
-            >
-              <el-option
-                v-for="item in educationList"
-                :key="item.id"
-                :label="item.realName"
-                :value="item.id"
-              >
+          <el-form-item v-else label="主讲人" class="nomb" prop="speakerId" :rules="[{ required: true, message: '请输入主讲人' }]">
+            <el-select v-model.trim="form.speakerId" collapse-tags clearable placeholder="请输入主讲人" remote filterable
+              :remote-method="remoteMethodEduc" :loading="remoteLoading" @change="changeTeacher">
+              <el-option v-for="item in educationList" :key="item.id" :label="item.realName" :value="item.id">
                 <span style="float: left">{{ item.realName }}</span>
                 <span style="float: right; color: #8492a6; font-size: 13px">{{
                   item.phone
@@ -200,27 +101,13 @@
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            label="直播课内容"
-            prop="liveRemark"
-            :rules="[{ required: true, message: '请输入直播课内容' }]"
-          >
-            <el-input
-              :rows="3"
-              placeholder="请输入直播课内容"
-              v-model.trim="form.liveRemark"
-              type="textarea"
-              maxlength="200"
-              show-word-limit
-            ></el-input>
+          <el-form-item label="直播间内容" prop="liveRemark" :rules="[{ required: true, message: '请输入直播间内容' }]">
+            <el-input :rows="3" placeholder="请输入直播间内容" v-model.trim="form.liveRemark" type="textarea" maxlength="200"
+              show-word-limit></el-input>
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            label="预热模板(模板使用于分享宣传图片)"
-            prop="preTemplate"
-            :rules="[{ required: true, message: '请选择预热模板' }]"
-          >
+          <el-form-item label="预热模板(模板使用于分享宣传图片)" prop="preTemplate" :rules="[{ required: true, message: '请选择预热模板' }]">
             <el-checkbox-group v-model="checkList" @change="bindCheckBox">
               <div class="chioseWrap">
                 <div class="chioseItem" @click="setPreTemplate(1)">
@@ -228,12 +115,7 @@
                   <!--        v-model="form.preTemplate" -->
                   <div class="remberBox">
                     <div class="wrap"></div>
-                    <el-checkbox
-                      class="chioseBox"
-                      :label="1"
-                      :checked="form.preTemplate == 1"
-                      ><br
-                    /></el-checkbox>
+                    <el-checkbox class="chioseBox" :label="1" :checked="form.preTemplate == 1"><br /></el-checkbox>
                     <!-- <div
                     class="dotWrap"
                     :class="[form.preTemplate == 1 ? 'checked' : '']"
@@ -245,13 +127,8 @@
                   <div class="remberBox">
                     <!--  v-model="form.preTemplate" -->
                     <div class="wrap"></div>
-                    <el-checkbox
-                      name="2"
-                      class="chioseBox"
-                      :label="2"
-                      :checked="form.preTemplate == 2"
-                      ><br
-                    /></el-checkbox>
+                    <el-checkbox name="2" class="chioseBox" :label="2"
+                      :checked="form.preTemplate == 2"><br /></el-checkbox>
                     <!-- <div
                     class="dotWrap"
                     :class="[form.preTemplate == 2 ? 'checked' : '']"
@@ -262,12 +139,7 @@
                   <img src="./images/img3.png" alt="" />
                   <div class="remberBox">
                     <div class="wrap"></div>
-                    <el-checkbox
-                      class="chioseBox"
-                      :label="3"
-                      :checked="form.preTemplate == 3"
-                      ><br
-                    /></el-checkbox>
+                    <el-checkbox class="chioseBox" :label="3" :checked="form.preTemplate == 3"><br /></el-checkbox>
                     <!-- <div
                     class="dotWrap"
                     :class="[form.preTemplate == 3 ? 'checked' : '']"
@@ -279,34 +151,19 @@
           </el-form-item>
         </el-row>
 
-        <el-alert
-          title="观看权限配置"
-          type="info"
-          :closable="false"
-          style="margin-bottom: 20px"
-        ></el-alert>
+        <el-alert title="观看权限配置" type="info" :closable="false" style="margin-bottom: 20px"></el-alert>
         <el-row class="row">
-          <el-form-item
-            class="mline"
-            label="观看权限信息"
-            prop="popularizeType"
-            label-width="130px"
-            :rules="[{ required: true, message: '请选择推广类型' }]"
-          >
+          <el-form-item class="mline" label="观看权限信息" prop="popularizeType" label-width="130px"
+            :rules="[{ required: true, message: '请选择推广类型' }]">
             <el-radio-group v-model="form.popularizeType" @change="changeType">
-              <el-radio label="ALL">公开</el-radio>
-              <el-radio label="PRIVATE">私密</el-radio>
+              <el-radio label="ALL">公开模式</el-radio>
+              <el-radio label="PRIVATE">私密模式</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            class="mline"
-            label="观看模式"
-            prop="viewMode"
-            label-width="130px"
-            :rules="[{ required: true, message: '请选择推广类型' }]"
-          >
+          <el-form-item class="mline" label="观看模式" prop="viewMode" label-width="130px"
+            :rules="[{ required: true, message: '请选择推广类型' }]">
             <el-radio-group v-model="form.viewMode">
               <el-radio label="LOGIN">登录</el-radio>
               <el-radio label="VISITOR">游客</el-radio>
@@ -314,85 +171,35 @@
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            v-if="
-              form.popularizeType == 'SCHOOL' ||
-              form.popularizeType == 'ORGAN' ||
-              form.popularizeType == 'TEAM'
-            "
-            label="分部"
-            prop="organIds"
-            :rules="[{ required: true, message: '请选择分部' }]"
-          >
-            <select-all
-              v-model.trim="form.organIds"
-              filterable
-              clearable
-              placeholder="请选择分部"
-              @change="changeSection"
-            >
-              <el-option
-                v-for="(item, index) in selects.branchs"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-              ></el-option>
+          <el-form-item v-if="form.popularizeType == 'SCHOOL' ||
+            form.popularizeType == 'ORGAN' ||
+            form.popularizeType == 'TEAM'
+            " label="分部" prop="organIds" :rules="[{ required: true, message: '请选择分部' }]">
+            <select-all v-model.trim="form.organIds" filterable clearable placeholder="请选择分部" @change="changeSection">
+              <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+                :value="item.id"></el-option>
             </select-all>
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            v-if="form.popularizeType == 'SCHOOL'"
-            label="合作单位"
-            prop="schoolIds"
-            :rules="[{ required: true, message: '请选择合作单位' }]"
-          >
-            <select-all
-              v-model.trim="form.schoolIds"
-              :disabled="form.organIds.length <= 0"
-              filterable
-              clearable
-              multiple
-            >
+          <el-form-item v-if="form.popularizeType == 'SCHOOL'" label="合作单位" prop="schoolIds"
+            :rules="[{ required: true, message: '请选择合作单位' }]">
+            <select-all v-model.trim="form.schoolIds" :disabled="form.organIds.length <= 0" filterable clearable multiple>
               <!--   @change="changeSchool" -->
-              <el-option
-                v-for="(item, index) in cooperationList"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-              ></el-option>
+              <el-option v-for="(item, index) in cooperationList" :key="index" :label="item.name"
+                :value="item.id"></el-option>
             </select-all>
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            v-if="form.popularizeType == 'TEAM'"
-            label="乐团"
-            prop="teamIds"
-            :rules="[{ required: true, message: '请选择乐团' }]"
-          >
-            <select-all
-              v-model.trim="form.teamIds"
-              :disabled="form.organIds.length <= 0"
-              filterable
-              clearable
-              multiple
-            >
-              <el-option
-                v-for="(item, index) in teamList"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-              ></el-option>
+          <el-form-item v-if="form.popularizeType == 'TEAM'" label="乐团" prop="teamIds"
+            :rules="[{ required: true, message: '请选择乐团' }]">
+            <select-all v-model.trim="form.teamIds" :disabled="form.organIds.length <= 0" filterable clearable multiple>
+              <el-option v-for="(item, index) in teamList" :key="index" :label="item.name" :value="item.id"></el-option>
             </select-all>
           </el-form-item>
         </el-row>
-        <el-alert
-          title="直播间信息"
-          type="info"
-          :closable="false"
-          style="margin-bottom: 20px"
-        ></el-alert>
+        <el-alert title="直播间信息" type="info" :closable="false" style="margin-bottom: 20px"></el-alert>
         <!-- <el-row class="row">
           <el-form-item
             prop="roomConfig.whether_like"
@@ -436,13 +243,8 @@
           </el-form-item>
         </el-row> -->
         <el-row class="row">
-          <el-form-item
-            prop="roomConfig.whether_video"
-            label-width="130px"
-            class="mline"
-            label="保存直播回放"
-            :rules="[{ required: true, message: '是否保存直播回放' }]"
-          >
+          <el-form-item prop="roomConfig.whether_video" label-width="130px" class="mline" label="保存直播回放"
+            :rules="[{ required: true, message: '是否保存直播回放' }]">
             <el-radio-group v-model="form.roomConfig.whether_video">
               <el-radio :label="0">是</el-radio>
               <el-radio :label="1">否</el-radio>
@@ -450,13 +252,8 @@
           </el-form-item>
         </el-row>
         <el-row class="row">
-          <el-form-item
-            prop="roomConfig.whether_view_shop_cart"
-            label-width="130px"
-            class="mline"
-            label="是否展示购物车"
-            :rules="[{ required: true, message: '是否展示购物车' }]"
-          >
+          <el-form-item prop="roomConfig.whether_view_shop_cart" label-width="130px" class="mline" label="是否展示购物车"
+            :rules="[{ required: true, message: '是否展示购物车' }]">
             <el-radio-group v-model="form.roomConfig.whether_view_shop_cart">
               <el-radio :label="0">是</el-radio>
               <el-radio :label="1">否</el-radio>
@@ -470,13 +267,7 @@
       </el-row>
     </div>
 
-    <el-dialog
-      title="预览"
-      width="415px"
-      :close-on-click-modal="false"
-      append-to-body
-      :visible.sync="preLookVisible"
-    >
+    <el-dialog title="预览" width="415px" :close-on-click-modal="false" append-to-body :visible.sync="preLookVisible">
       <preview :form="form" />
     </el-dialog>
   </div>
@@ -489,7 +280,7 @@ import {
   createLiveBroadcast,
   resetLiveBroadcastRoomList,
   getRoomInfo,
-  sysTenantConfigAll,
+  sysTenantConfigAll
 } from "./api";
 import { queryByOrganId } from "@/api/systemManage";
 import { getTeamList } from "@/api/teamServer";
@@ -497,7 +288,7 @@ export default {
   components: { preview },
   data() {
     return {
-      name: "新建直播",
+      name: "新建直播",
       preLookVisible: false,
       form: {
         organIds: [],
@@ -517,10 +308,10 @@ export default {
           whether_chat: 0,
           whether_video: 0,
           whether_mic: 0,
-          whether_view_shop_cart: 0,
+          whether_view_shop_cart: 0
         },
         checkList: [],
-        viewMode: "LOGIN",
+        viewMode: "LOGIN"
       },
       serviceProvider: "tencentCloud",
       remoteLoading: false,
@@ -533,9 +324,9 @@ export default {
         firstDayOfWeek: 1,
         disabledDate(time) {
           return time.getTime() + 86400000 <= new Date().getTime();
-        },
+        }
       },
-      educationList: [],
+      educationList: []
     };
   },
   async mounted() {
@@ -543,14 +334,15 @@ export default {
 
     try {
       const findName = await sysTenantConfigAll({
-        group: "LIVE_CLIENT",
+        group: "LIVE_CLIENT"
       });
       if (findName.data && findName.data.length > 0) {
-        findName.data.forEach((item) => {
+        findName.data.forEach(item => {
           if (item.paramName == "live_client") {
             this.serviceProvider = item.paranValue;
 
-            this.form.os = this.serviceProvider == "tencentCloud" ? "client" : "pc";
+            this.form.os =
+              this.serviceProvider == "tencentCloud" ? "client" : "pc";
           }
         });
       }
@@ -620,19 +412,23 @@ export default {
           schoolIds: [],
           teamIds: [],
           catIds: [],
-          studentIds: [],
+          studentIds: []
         };
         this.form.roomConfig = JSON.parse(res.data.roomConfig);
         if (res.data.popularizeOrgIds) {
-          this.form.organIds = res.data.popularizeOrgIds.split(",").map((item) => {
-            return item * 1;
-          });
+          this.form.organIds = res.data.popularizeOrgIds
+            .split(",")
+            .map(item => {
+              return item * 1;
+            });
         }
 
         if (res.data.popularizeSchoolIds) {
-          this.form.schoolIds = res.data.popularizeSchoolIds.split(",").map((item) => {
-            return item * 1;
-          });
+          this.form.schoolIds = res.data.popularizeSchoolIds
+            .split(",")
+            .map(item => {
+              return item * 1;
+            });
         }
 
         if (res.data.popularizeTeamIds) {
@@ -659,14 +455,14 @@ export default {
       this.$router.push("/liveClassManager");
     },
     changeTeacher(val) {
-      this.teacherList.forEach((item) => {
+      this.teacherList.forEach(item => {
         if (val == item.id) {
           this.form.speakerName = item.realName;
         }
       });
     },
     preLook() {
-      this.$refs.form.validate((flag) => {
+      this.$refs.form.validate(flag => {
         if (flag) {
           this.preLookVisible = true;
           console.log("预览", this.form);
@@ -693,25 +489,25 @@ export default {
           method: "get",
           headers: {
             Authorization: getToken(),
-            tenantId: getTenantId(),
+            tenantId: getTenantId()
           },
           params: {
             rows: 9999,
             search: query,
             lockFlag: 0,
-            demissionFlag: false,
+            demissionFlag: false
           },
-          url,
+          url
         };
         this.remoteLoading = true;
         // this.studentList = []
-        axios(options).then((res) => {
+        axios(options).then(res => {
           this.remoteLoading = false;
           let result = res.data;
           if (result.code == 200) {
             // Array.prototype.splice.apply(this.studentList, result.data.rows);
             if (result.data && result.data.rows.length > 0) {
-              result.data.rows.forEach((item) => {
+              result.data.rows.forEach(item => {
                 this.teacherList.unshift(item);
               });
               this.teacherList = this.deweight(this.teacherList, "phone");
@@ -738,25 +534,25 @@ export default {
           method: "get",
           headers: {
             Authorization: getToken(),
-            tenantId: getTenantId(),
+            tenantId: getTenantId()
           },
           params: {
             rows: 9999,
             search: query,
             lockFlag: 0,
-            demissionFlag: false,
+            demissionFlag: false
           },
-          url,
+          url
         };
         this.remoteLoading = true;
 
-        axios(options).then((res) => {
+        axios(options).then(res => {
           this.remoteLoading = false;
           let result = res.data;
           if (result.code == 200) {
             // Array.prototype.splice.apply(this.studentList, result.data.rows);
             if (result.data && result.data.rows.length > 0) {
-              result.data.rows.forEach((item) => {
+              result.data.rows.forEach(item => {
                 this.educationList.unshift(item);
               });
               this.educationList = this.deweight(this.educationList, "phone");
@@ -768,9 +564,9 @@ export default {
     },
     deweight(arr, key) {
       let res = [];
-      arr.forEach((item) => {
+      arr.forEach(item => {
         let list = [];
-        res.forEach((resitem) => {
+        res.forEach(resitem => {
           list.push(resitem[key]);
         });
         if (list.indexOf(item[key]) === -1) {
@@ -789,7 +585,7 @@ export default {
       this.form.popularizeOrgIds = this.form.organIds.join(",");
       this.form.popularizeSchoolIds = this.form.schoolIds.join(",");
       this.form.popularizeTeamIds = this.form.teamIds.join(",");
-      this.$refs.form.validate(async (flag) => {
+      this.$refs.form.validate(async flag => {
         if (!flag) return;
         if (this.$route.query.id) {
           // 修改
@@ -828,7 +624,7 @@ export default {
       if (this.form.popularizeType == "SCHOOL" && val && val.length > 0) {
         let organId = val.join(",");
         try {
-          await queryByOrganId({ organId }).then((res) => {
+          await queryByOrganId({ organId }).then(res => {
             if (res.code == 200) {
               this.cooperationList = res.data;
             }
@@ -840,7 +636,7 @@ export default {
       if (this.form.popularizeType == "TEAM" && val && val.length > 0) {
         let organId = val.join(",");
         try {
-          await getTeamList({ organId, page: 1, rows: 9999 }).then((res) => {
+          await getTeamList({ organId, page: 1, rows: 9999 }).then(res => {
             if (res.code == 200) {
               this.teamList = res.data.rows;
             }
@@ -849,49 +645,59 @@ export default {
           console.log(e);
         }
       }
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>
 .nomb {
   margin-bottom: 0px !important;
 }
+
 ::v-deep .mline {
   .el-form-item__content {
     display: inline-block !important;
   }
 }
+
 ::v-deep .el-form--inline {
   .el-form-item__content {
     display: block;
   }
 }
+
 ::v-deep .el-select {
   width: 300px !important;
 }
+
 ::v-deep .el-date-editor {
   width: 300px !important;
 }
+
 ::v-deep .el-checkbox {
   margin-left: 15px !important;
 }
+
 ::v-deep .el-input {
   position: relative;
   font-size: 14px;
   display: inline-block;
   width: 300px;
 }
+
 .row {
   padding-left: 24px;
 }
+
 ::v-deep .el-textarea__inner {
   width: 600px;
 }
+
 .chioseWrap {
   display: flex;
   flex-direction: row;
   justify-content: flex-start;
+
   .chioseItem {
     border-radius: 4px;
     overflow: hidden;
@@ -900,6 +706,7 @@ export default {
     width: 188px;
     height: 188px;
     cursor: pointer;
+
     .remberBox {
       .wrap {
         width: 100px;
@@ -908,6 +715,7 @@ export default {
         position: absolute;
         // background-color: red;
       }
+
       display: flex;
       flex-direction: row;
       justify-content: flex-start;
@@ -920,11 +728,13 @@ export default {
       position: absolute;
       top: 1px;
       right: 1px;
+
       .chioseBox {
         ::v-deep .el-checkbox__inner {
           width: 20px;
           height: 20px;
           border-radius: 50%;
+
           &::after {
             height: 8px;
             left: 6px;
@@ -934,6 +744,7 @@ export default {
           }
         }
       }
+
       .dotWrap {
         width: 21px;
         height: 21px;
@@ -942,6 +753,7 @@ export default {
         margin-right: 8px;
         position: relative;
         overflow: hidden;
+
         &.checked {
           background: url("../../assets/images/icon_checkbox.png") no-repeat center;
           background-size: contain;

+ 278 - 0
src/views/studentManager/components/studentLive.vue

@@ -0,0 +1,278 @@
+
+<template>
+  <div class="studentvip">
+    <!-- 搜索类型 -->
+    <save-form :inline="true" class="searchForm" :model="searchForm" @submit="onSearch" ref="searchForm"
+      save-key="studentDetail-studentVip">
+      <el-form-item>
+        <el-input placeholder="课程名称" clearable @keyup.enter.native="(e) => {
+          e.target.blur();
+          $refs.searchForm.save();
+          onSearch();
+        }
+          " v-model.trim="searchForm.vipGroupName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="danger">搜索</el-button>
+      </el-form-item>
+    </save-form>
+
+    <div class="tableWrap">
+      <el-table :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList">
+        <el-table-column label="课程组编号" align="center" prop="vipGroupId">
+          <template slot-scope="scope">
+            <!-- <div @click="gotoVip(scope.row.vipGroupId)" class="groupId">
+              <copy-text>{{ scope.row.vipGroupId }}</copy-text>
+            </div> -->
+            <copy-text>{{ scope.row.vipGroupId }}</copy-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="课程组名称" align="center" prop="vipGroupName">
+          <template slot-scope="scope">
+            <!-- class="vipGroupName" -->
+            <div>
+              <!-- <el-button type="text" @click="gotoVip(scope.row.vipGroupName)">
+              </el-button> -->
+              <copy-text width='110px'>{{ scope.row.vipGroupName }}</copy-text>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="课程组状态" align="center">
+          <template slot-scope="scope">{{
+            scope.row.vipGroupStatus | vipCourseStatus
+          }}</template>
+        </el-table-column>
+        <el-table-column label="指导老师" align="center" prop="teacherName"></el-table-column>
+        <el-table-column label="乐团主管" align="center" prop="eduTeacherName"></el-table-column>
+        <el-table-column label="开课时间" width="150" align="center" prop="courseStartDate">
+          <template slot-scope="scope">{{
+            scope.row.courseStartDate | dateForMinFormat
+          }}</template>
+        </el-table-column>
+        <el-table-column label="当前课次" align="center" prop="currentClassTimes">
+          <template slot-scope="scope">{{ scope.row.currentClassTimes }}/{{
+            scope.row.totalClassTimes
+          }}</template>
+        </el-table-column>
+      </el-table>
+      <pagination save-key="studentDetail-studentVip" sync :total.sync="pageInfo.total" :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit" :page-sizes="pageInfo.page_size" @pagination="getCourseList" />
+
+      <el-dialog :title="dialogTitle" :visible.sync="dialogTableVisible">
+        <el-table :data="gridData" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+          <el-table-column prop="courseDate" label="时间" align="center">
+            <template slot-scope="scope">{{
+              scope.row.courseDate | dateForMinFormat
+            }}</template>
+          </el-table-column>
+          <el-table-column prop="classGroupName" label="课程名称" align="center"></el-table-column>
+          <el-table-column label="课程类型" align="center">
+            <template slot-scope="scope">{{
+              scope.row.teachMode == "ONLINE" ? "线上" : "线下"
+            }}</template>
+          </el-table-column>
+          <el-table-column prop="courseStatus" align="center" label="课程状态">
+            <template slot-scope="scope">{{
+              scope.row.courseStatus | coursesStatus
+            }}</template>
+          </el-table-column>
+        </el-table>
+        <pagination :total="studentInfo.total" :page.sync="studentInfo.page" :limit.sync="studentInfo.limit"
+          :page-sizes="studentInfo.page_size" @pagination="onCourse" />
+      </el-dialog>
+    </div>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import {
+  findStudentVipGroups,
+  findStudentVipGroupClass,
+  findStudentCourses,
+} from "@/api/studentManager";
+export default {
+  name: "studentvip",
+  components: { pagination },
+  data() {
+    return {
+      searchForm: {
+        studentId: null,
+        vipGroupName: null,
+      },
+      checkIndex: null, // 选中的课程
+      dialogTableVisible: false,
+      searchLsit: [],
+      tableList: [],
+      courseList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      studentInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      dialogTitle: "",
+      gridData: [],
+      userId: "",
+      activeRow: null,
+    };
+  },
+  created() {
+    this.userId = this.$route.query.userId || null;
+  },
+  mounted() {
+    this.userId = this.$route.query.userId || null;
+    this.searchForm.studentId = this.$route.query.userId;
+    this.getCourseList();
+  },
+  activated() {
+    this.userId = this.$route.query.userId || null;
+    this.searchForm.studentId = this.$route.query.userId;
+    this.getCourseList();
+  },
+  methods: {
+    // onCheckCourse(item) {
+    //   this.checkIndex = item.id
+    //   this.getList()
+    // },
+    getCourseList() {
+      let params = this.searchForm;
+      params.rows = this.pageInfo.limit;
+      params.page = this.pageInfo.page;
+      params.groupType = 'LIVE'
+      findStudentVipGroupClass(params).then((res) => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+        }
+      });
+    },
+    onCourse(row) {
+      if (row.vipGroupId) {
+        this.activeRow = row;
+      }
+      findStudentVipGroups({
+        vipGroupId: this.activeRow.vipGroupId,
+        studentId: this.userId,
+        page: this.studentInfo.page,
+        rows: this.studentInfo.limit,
+      }).then((res) => {
+        this.dialogTitle = this.activeRow.vipGroupName;
+        if (res.code == 200) {
+          this.studentInfo.total = res.data.total;
+          this.gridData = res.data.rows;
+          this.dialogTableVisible = true;
+        }
+      });
+    },
+    onSearch() {
+      this.pageInfo.page = 1;
+      this.getCourseList();
+    },
+    gotoVip(str) {
+      this.$router.push({
+        path: "/vipManager/vipList",
+        query: { search: str },
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.groupId {
+  color: var(--color-primary);
+}
+
+.vipGroupName {
+  width: 140px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.studentvip {
+  .topCard {
+    display: flex;
+    flex-direction: row;
+    justify-content: flex-start;
+    margin-bottom: 30px;
+
+    .cardItem {
+      margin-right: 15px;
+      width: 300px;
+      height: 130px;
+      padding: 20px 24px;
+      box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.1);
+      box-sizing: border-box;
+      border-radius: 6px;
+
+      .top {
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        margin-bottom: 23px;
+
+        .name {
+          font-size: 14px;
+          color: #323c47;
+          font-weight: 500;
+        }
+
+        .type {
+          font-size: 14px;
+          color: #aaa;
+        }
+      }
+
+      .bottom {
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        text-align: center;
+
+        p {
+          font-size: 14px;
+          color: #444;
+        }
+
+        .title {
+          color: #aaa;
+          margin-bottom: 8px;
+        }
+      }
+    }
+
+    .cardItem.active {
+      background-color: var(--color-primary);
+
+      .name {
+        font-size: 14px;
+        color: #fff;
+        font-weight: 500;
+      }
+
+      .type {
+        font-size: 14px;
+        color: #fff;
+      }
+
+      .bottom {
+        p {
+          color: #fff;
+        }
+
+        .title {
+          color: #fff;
+        }
+      }
+    }
+  }
+}
+</style>

+ 20 - 74
src/views/studentManager/index.vue

@@ -5,98 +5,42 @@
     </h2>
     <div class="m-core">
       <!-- navMenu -->
-      <tab-router
-        v-model.trim="activeIndex"
-        type="card"
-        @tab-click="handleClick"
-      >
-        <el-tab-pane
-          label="基本信息"
-          lazy
-          v-if="permissionList.studentInfo"
-          name="1"
-        >
+      <tab-router v-model.trim="activeIndex" type="card" @tab-click="handleClick">
+        <el-tab-pane label="基本信息" lazy v-if="permissionList.studentInfo" name="1">
           <studentInfo v-if="activeIndex == 1" />
         </el-tab-pane>
-        <el-tab-pane
-          label="乐团&课程"
-          lazy
-          v-if="permissionList.teamAndcourse"
-          name="2"
-        >
+        <el-tab-pane label="乐团&课程" lazy v-if="permissionList.teamAndcourse" name="2">
           <teamAndcourse v-if="activeIndex == 2" />
         </el-tab-pane>
-        <el-tab-pane
-          label="VIP课"
-          lazy
-          v-if="permissionList.studentVip"
-          name="3"
-        >
+        <el-tab-pane label="VIP课" lazy v-if="permissionList.studentVip" name="3">
           <studentVip v-if="activeIndex == 3" />
         </el-tab-pane>
-        <el-tab-pane
-          label="对外课"
-          lazy
-          v-if="permissionList.studentOutList"
-          name="4"
-        >
+        <el-tab-pane label="直播课" lazy v-if="permissionList.studentLive" name="12">
+          <studentLive v-if="activeIndex == 12" />
+        </el-tab-pane>
+        <el-tab-pane label="对外课" lazy v-if="permissionList.studentOutList" name="4">
           <studentOutList v-if="activeIndex == 4" />
         </el-tab-pane>
-        <el-tab-pane
-          label="网管课"
-          lazy
-          v-if="permissionList.studentNetwork"
-          name="9"
-        >
+        <el-tab-pane label="网管课" lazy v-if="permissionList.studentNetwork" name="9">
           <studentNetwork v-if="activeIndex == 9" />
         </el-tab-pane>
-        <el-tab-pane
-          label="课表详情"
-          lazy
-          v-if="permissionList.studentRecord"
-          name="5"
-        >
+        <el-tab-pane label="课表详情" lazy v-if="permissionList.studentRecord" name="5">
           <studentRecord v-if="activeIndex == 5" />
         </el-tab-pane>
-        <el-tab-pane
-          label="扣费记录"
-          lazy
-          v-if="permissionList.studentPayList"
-          name="6"
-        >
+        <el-tab-pane label="扣费记录" lazy v-if="permissionList.studentPayList" name="6">
           <studentPayList v-if="activeIndex == 6" />
         </el-tab-pane>
-        <el-tab-pane
-          label="学员订单"
-          lazy
-          v-if="permissionList.studentOrder"
-          name="7"
-        >
+        <el-tab-pane label="学员订单" lazy v-if="permissionList.studentOrder" name="7">
           <studentOrder v-if="activeIndex == 7" />
         </el-tab-pane>
-        <el-tab-pane
-          label="学员提现"
-          lazy
-          v-if="permissionList.studentCashout"
-          name="8"
-        >
+        <el-tab-pane label="学员提现" lazy v-if="permissionList.studentCashout" name="8">
           <studentCashout v-if="activeIndex == 8" />
         </el-tab-pane>
-        <el-tab-pane
-          label="乐器列表"
-          lazy
-          v-if="permissionList.studentLebao"
-          name="10"
-        >
+        <el-tab-pane label="乐器列表" lazy v-if="permissionList.studentLebao" name="10">
           <studentLebao v-if="activeIndex == 10" />
         </el-tab-pane>
 
-        <el-tab-pane
-          label="回访记录"
-          lazy
-          v-if="permissionList.studentVisit"
-          name="11"
-        >
+        <el-tab-pane label="回访记录" lazy v-if="permissionList.studentVisit" name="11">
           <studentVisit v-if="activeIndex == 11" />
         </el-tab-pane>
         <!-- studentVisit -->
@@ -110,6 +54,7 @@ import teamAndcourse from "./components/teamAndcourse.vue";
 import studentRecord from "./components/studentRecord.vue";
 import studentPayList from "./components/studentPayList.vue";
 import studentVip from "./components/studentVip.vue";
+import studentLive from "./components/studentLive.vue";
 import studentOutList from "./components/studentOutList.vue";
 import studentOrder from "./components/studentOrder.vue";
 import studentCashout from "./components/studentCashout.vue";
@@ -124,6 +69,7 @@ export default {
     studentPayList,
     studentInfo,
     studentVip,
+    studentLive,
     studentOrder,
     studentCashout,
     studentOutList,
@@ -140,6 +86,7 @@ export default {
         studentInfo: permission("/studentDetail/studentInfo"),
         teamAndcourse: permission("/studentDetail/teamAndcourse"),
         studentVip: permission("/studentDetail/studentVip"),
+        studentLive: permission("/studentDetail/studentLive"),
         studentRecord: permission("/studentDetail/studentRecord"),
         studentPayList: permission("/studentDetail/studentPayList"),
         studentOrder: permission("/studentDetail/studentOrder"),
@@ -147,7 +94,7 @@ export default {
         studentOutList: permission("/studentDetail/studentOutList"), //
         studentNetwork: permission("/studentDetail/studentNetwork"),
         studentLebao: permission("/studentDetail/studentLebao"),
-        studentVisit:permission("visit/queryPage/student"),
+        studentVisit: permission("visit/queryPage/student"),
       },
       studentName: "",
     };
@@ -184,5 +131,4 @@ export default {
   },
 };
 </script>
-<style lang="scss">
-</style>
+<style lang="scss"></style>

+ 33 - 22
src/views/teacherManager/teacherDetail/components/courseInfo1.vue

@@ -1,22 +1,32 @@
 <template>
   <div class="courseInfo">
-    <save-form :inline="true" @submit="search" :model="searchList" ref="searchForm" save-key='teacherDetail-courseInfo1'>
+    <save-form
+      :inline="true"
+      @submit="search"
+      :model="searchList"
+      ref="searchForm"
+      save-key="teacherDetail-courseInfo1"
+    >
       <el-form-item>
         <el-input
           placeholder="vip编号/名称"
           clearable
-            @keyup.enter.native="
-              (e) => {
-                e.target.blur();
-                $refs.searchForm.save();
-                search();
-              }
-            "
+          @keyup.enter.native="
+            e => {
+              e.target.blur();
+              $refs.searchForm.save();
+              search();
+            }
+          "
           v-model.trim="searchList.search"
         ></el-input>
       </el-form-item>
-      <el-form-item >
-        <el-select v-model.trim="searchList.status" clearable placeholder="请选择课程状态">
+      <el-form-item>
+        <el-select
+          v-model.trim="searchList.status"
+          clearable
+          placeholder="请选择课程状态"
+        >
           <el-option
             v-for="(item, index) in vipGroupStatus"
             :key="index"
@@ -42,7 +52,7 @@
           </template>
         </el-table-column>
         <el-table-column label="VIP课名称" prop="name">
-              <template slot-scope="scope">
+          <template slot-scope="scope">
             <copy-text>
               {{ scope.row.name }}
             </copy-text>
@@ -93,8 +103,8 @@
         </el-table-column>
       </el-table>
       <pagination
-      save-key='teacherDetail-courseInfo1'
-      sync
+        save-key="teacherDetail-courseInfo1"
+        sync
         :total.sync="pageInfo.total"
         :page.sync="pageInfo.page"
         :limit.sync="pageInfo.limit"
@@ -113,13 +123,13 @@ import store from "@/store";
 export default {
   name: "courseInfo1",
   components: {
-    pagination,
+    pagination
   },
   data() {
     return {
       searchList: {
         status: "",
-        search: "",
+        search: ""
       },
       teamList: [],
       organId: null,
@@ -130,8 +140,8 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 1, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
     };
   },
   activated() {
@@ -152,7 +162,8 @@ export default {
         teacherId: this.teacherId,
         status: this.searchList.status || null,
         search: this.searchList.search || null,
-      }).then((res) => {
+        groupType: "VIP"
+      }).then(res => {
         if (res.code == 200) {
           this.teamList = res.data.rows;
           this.pageInfo.total = res.data.total;
@@ -162,7 +173,7 @@ export default {
     search() {
       this.pageInfo.page = 1;
       this.getList();
-    },
+    }
   },
   filters: {
     formatterTime(val) {
@@ -182,11 +193,11 @@ export default {
         "取消",
         "已结束",
         "报名结束",
-        "暂停",
+        "暂停"
       ];
       return arr[val];
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scope>

+ 173 - 0
src/views/teacherManager/teacherDetail/components/live-course.vue

@@ -0,0 +1,173 @@
+<template>
+  <div class="courseInfo">
+    <save-form :inline="true" @submit="search" :model="searchList" ref="searchForm" save-key="teacherDetail-courseInfo1">
+      <el-form-item>
+        <el-input placeholder="直播课编号/名称" clearable @keyup.enter.native="e => {
+          e.target.blur();
+          $refs.searchForm.save();
+          search();
+        }
+          " v-model.trim="searchList.search"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-select v-model.trim="searchList.status" clearable placeholder="请选择课程状态">
+          <el-option v-for="(item, index) in vipGroupStatus" :key="index" :value="item.value"
+            :label="item.text"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="danger" native-type="search">搜索</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="tableWrap">
+      <el-table :data="teamList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+        <el-table-column label="课程组编号" prop="id">
+          <template slot-scope="scope">
+            <copy-text>
+              {{ scope.row.id }}
+            </copy-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="课程组名称" prop="name">
+          <template slot-scope="scope">
+            <copy-text>
+              {{ scope.row.name }}
+            </copy-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="课程组状态">
+          <template slot-scope="scope">
+            {{ scope.row.status | formatterStatus }}
+          </template>
+        </el-table-column>
+        <el-table-column label="班级人数" prop="studentNum"> </el-table-column>
+        <el-table-column label="课程单价">
+          <template slot-scope="scope">
+            {{ scope.row.onlineClassesUnitPrice }}
+          </template>
+        </el-table-column>
+        <el-table-column label="当前课次">
+          <template slot-scope="scope">
+            <p>
+              {{
+                scope.row.currentClassTimes + "/" + scope.row.totalClassTimes
+              }}
+            </p>
+          </template>
+        </el-table-column>
+        <el-table-column label="开课时间">
+          <template slot-scope="scope">
+            {{ scope.row.courseStartDate | formatterTime }}
+          </template>
+        </el-table-column>
+        <el-table-column label="截止时间">
+          <template slot-scope="scope">
+            {{ scope.row.coursesExpireDate | formatTimer }}
+          </template>
+        </el-table-column>
+        <el-table-column label="创建时间">
+          <template slot-scope="scope">
+            {{ scope.row.createTime | formatterTime }}
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination save-key="teacherDetail-courseInfo1" sync :total.sync="pageInfo.total" :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit" :page-sizes="pageInfo.page_size" @pagination="getList" />
+    </div>
+  </div>
+</template>
+<script>
+// import { getTeacherVipClass } from '@/api/teacherManager'
+import { getVipList } from "@/api/vipSeting";
+import pagination from "@/components/Pagination/index";
+import { vipGroupStatus } from "@/utils/searchArray";
+export default {
+  name: "courseInfo1",
+  components: {
+    pagination
+  },
+  data() {
+    return {
+      searchList: {
+        status: "",
+        search: ""
+      },
+      teamList: [],
+      organId: null,
+      vipGroupStatus: null,
+      teacherId: this.$route.query.teacherId,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 1, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    };
+  },
+  activated() {
+    this.teacherId = this.$route.query.teacherId;
+    this.vipGroupStatus = vipGroupStatus;
+    this.getList();
+  },
+  mounted() {
+    this.teacherId = this.$route.query.teacherId;
+    this.vipGroupStatus = vipGroupStatus;
+    this.getList();
+  },
+  methods: {
+    getList() {
+      getVipList({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page,
+        teacherId: this.teacherId,
+        status: this.searchList.status || null,
+        search: this.searchList.search || null,
+        groupType: "LIVE"
+      }).then(res => {
+        if (res.code == 200) {
+          this.teamList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+        }
+      });
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    }
+  },
+  filters: {
+    formatterTime(val) {
+      let result;
+      if (val) {
+        result = val.split(" ")[0];
+      } else {
+        result = "";
+      }
+      return result;
+    },
+    formatterStatus(val) {
+      let arr = [
+        "未开始",
+        "报名中",
+        "进行中",
+        "取消",
+        "已结束",
+        "报名结束",
+        "暂停"
+      ];
+      return arr[val];
+    }
+  }
+};
+</script>
+<style lang="scss" scope>
+// .courseInfo {
+//   h4 {
+//     margin-bottom: 20px;
+//   }
+//   .tableMargin {
+//     margin-top: 20px;
+//   }
+// }
+</style>

+ 24 - 91
src/views/teacherManager/teacherDetail/index.vue

@@ -12,120 +12,50 @@
             >{{ teacherInfos.operatingIndex }}%</span
           ></el-button
         > -->
-        <el-button
-          v-if="teacherInfos && permission('/serverIndexList')"
-          type="text"
-          @click="gotoAfterSchool"
-          >服务指标(每周):<span style="color:red"
-            >{{ teacherInfos.serviceIndex }}%</span
-          ></el-button
-        >
+        <el-button v-if="teacherInfos && permission('/serverIndexList')" type="text"
+          @click="gotoAfterSchool">服务指标(每周):<span style="color:red">{{ teacherInfos.serviceIndex }}%</span></el-button>
       </div>
     </h2>
     <div class="m-core">
       <!-- navMenu -->
-      <tab-router
-        v-model.trim="activeName"
-        type="card"
-        @tab-click="handleClick"
-      >
-        <el-tab-pane
-          label="基本信息"
-          lazy
-          v-if="permissionList.teacherInfo"
-          name="0"
-        >
-          <teacherInfo
-            v-if="activeName == 0 && teacherInfos"
-            :teacherInfo="teacherInfos"
-          />
+      <tab-router v-model.trim="activeName" type="card" @tab-click="handleClick">
+        <el-tab-pane label="基本信息" lazy v-if="permissionList.teacherInfo" name="0">
+          <teacherInfo v-if="activeName == 0 && teacherInfos" :teacherInfo="teacherInfos" />
         </el-tab-pane>
-        <el-tab-pane
-          label="乐团课"
-          lazy
-          v-if="permissionList.musicGroup"
-          name="1"
-        >
+        <el-tab-pane label="乐团课" lazy v-if="permissionList.musicGroup" name="1">
           <courseInfo v-if="activeName == 1" />
         </el-tab-pane>
-        <el-tab-pane
-          label="VIP课"
-          lazy
-          v-if="permissionList.VipCourse"
-          name="2"
-        >
+        <el-tab-pane label="VIP课" lazy v-if="permissionList.VipCourse" name="2">
           <courseInfo1 v-if="activeName == 2" />
         </el-tab-pane>
-        <el-tab-pane
-          label="网管课"
-          lazy
-          v-if="permissionList.teacherNetwork"
-          name="8"
-        >
+        <el-tab-pane label="直播课" lazy v-if="permissionList.LiveCourse" name="12">
+          <liveCourse v-if="activeName == 12" />
+        </el-tab-pane>
+        <el-tab-pane label="网管课" lazy v-if="permissionList.teacherNetwork" name="8">
           <teacherNetwork v-if="activeName == 8" />
         </el-tab-pane>
-        <el-tab-pane
-          label="对外课"
-          lazy
-          v-if="permissionList.outCourseList"
-          name="3"
-        >
+        <el-tab-pane label="对外课" lazy v-if="permissionList.outCourseList" name="3">
           <outCourseList v-if="activeName == 3" />
         </el-tab-pane>
-        <el-tab-pane
-          label="课表详情"
-          lazy
-          v-if="permissionList.teacherRecord"
-          name="4"
-        >
+        <el-tab-pane label="课表详情" lazy v-if="permissionList.teacherRecord" name="4">
           <teacherRecord v-if="activeName == 4" />
         </el-tab-pane>
-        <el-tab-pane
-          label="请假记录"
-          lazy
-          v-if="permissionList.leaveRecord"
-          name="5"
-        >
+        <el-tab-pane label="请假记录" lazy v-if="permissionList.leaveRecord" name="5">
           <leaveRecord v-if="activeName == 5" />
         </el-tab-pane>
-        <el-tab-pane
-          label="上课结算列表"
-          lazy
-          v-if="permissionList.settlement"
-          name="6"
-        >
+        <el-tab-pane label="上课结算列表" lazy v-if="permissionList.settlement" name="6">
           <settlement v-if="activeName == 6" />
         </el-tab-pane>
-        <el-tab-pane
-          label="时间记录"
-          lazy
-          v-if="permissionList.timerList"
-          name="7"
-        >
+        <el-tab-pane label="时间记录" lazy v-if="permissionList.timerList" name="7">
           <timerList v-if="activeName == 7" />
         </el-tab-pane>
-        <el-tab-pane
-          label="学员"
-          lazy
-          v-if="permissionList.serveStudentList"
-          name="9"
-        >
+        <el-tab-pane label="学员" lazy v-if="permissionList.serveStudentList" name="9">
           <serveStudentList v-if="activeName == 9" />
         </el-tab-pane>
-        <el-tab-pane
-          label="月历课表"
-          lazy
-          v-if="permissionList.calendarList"
-          name="10"
-        >
+        <el-tab-pane label="月历课表" lazy v-if="permissionList.calendarList" name="10">
           <calendarList v-if="activeName == 10" />
         </el-tab-pane>
-        <el-tab-pane
-          label="周历课表"
-          lazy
-          v-if="permissionList.weeklyCalendar"
-          name="11"
-        >
+        <el-tab-pane label="周历课表" lazy v-if="permissionList.weeklyCalendar" name="11">
           <weeklyCalendar v-if="activeName == 11" />
         </el-tab-pane>
       </tab-router>
@@ -139,6 +69,7 @@ import teacherInfo from "@/views/teacherManager/teacherDetail/components/teacher
 import courseInfo from "@/views/teacherManager/teacherDetail/components/courseInfo";
 import courseInfo1 from "@/views/teacherManager/teacherDetail/components/courseInfo1";
 import courseInfo2 from "@/views/teacherManager/teacherDetail/components/courseInfo2";
+import liveCourse from "@/views/teacherManager/teacherDetail/components/live-course";
 import settlement from "@/views/teacherManager/teacherDetail/components/settlement";
 import timerList from "@/views/teacherManager/teacherDetail/components/timerList";
 import outCourseList from "@/views/teacherManager/teacherDetail/components/outCourseList";
@@ -162,7 +93,8 @@ export default {
     teacherNetwork,
     serveStudentList,
     calendarList,
-    weeklyCalendar
+    weeklyCalendar,
+    liveCourse
   },
   name: "teacherDetail",
   data() {
@@ -174,6 +106,7 @@ export default {
         teacherInfo: permission("/teacherDetail/teacherInfo"),
         musicGroup: permission("/teacherDetail/musicGroupCourse"),
         VipCourse: permission("/teacherDetail/VIPCourse"),
+        LiveCourse: permission("/teacherDetail/LiveCourse"),
         domeCourse: permission("/teacherDetail/domeCourse"),
         teacherRecord: permission("/teacherDetail/teacherRecord"),
         leaveRecord: permission("/teacherDetail/leaveRecord"),
@@ -188,7 +121,7 @@ export default {
       teacherInfos: null
     };
   },
-  activated() {},
+  activated() { },
 
   mounted() {
     this.teacherName = this.$route.query.teacherName;

+ 202 - 191
src/views/teacherManager/teacherOperation/components/salarySet.vue

@@ -3,10 +3,7 @@
     <!-- <h4>单次课次参考时长:30min</h4> -->
     <div class="tableList">
       <div class="left">
-        <el-table
-          :data="teamTable"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        >
+        <el-table :data="teamTable" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
           <el-table-column label="乐团课课酬课时结算">
             <template slot-scope="scope">{{
               scope.row.courseScheduleType | coursesType
@@ -44,62 +41,30 @@
           </el-table-column> -->
           <el-table-column label="标准课酬-主教">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.mainTeacher90MinSalary"
-                placeholder="请输入课酬"
-              >
-                <template
-                  slot="append"
-                  v-if="scope.row.courseScheduleType == 'HIGH'"
-                  >元/人</template
-                >
-                <template
-                  slot="append"
-                  v-else-if="scope.row.courseScheduleType == 'CLASSROOM'"
-                  >元/节</template
-                >
-                <template slot="append" v-else
-                  >元/90分钟</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.mainTeacher90MinSalary"
+                placeholder="请输入课酬">
+                <template slot="append" v-if="scope.row.courseScheduleType == 'HIGH'">元/人</template>
+                <template slot="append" v-else-if="scope.row.courseScheduleType == 'CLASSROOM'">元/节</template>
+                <template slot="append" v-else>元/90分钟</template>
                 <!-- <template slot="append">元/{{ (scope.row.courseScheduleType == 'HIGH' || scope.row.courseScheduleType == 'CLASSROOM') ? 45 : 90 }}分钟</template> -->
               </el-input>
             </template>
           </el-table-column>
           <el-table-column label="标准课酬-助教">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.assistantTeacher90MinSalary"
-                placeholder="请输入课酬"
-              >
-                <template
-                  slot="append"
-                  v-if="scope.row.courseScheduleType == 'HIGH'"
-                  >元/人</template
-                >
-                <template
-                  slot="append"
-                  v-else-if="scope.row.courseScheduleType == 'CLASSROOM'"
-                  >元/节</template
-                >
-                <template slot="append" v-else
-                  >元/90分钟</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.assistantTeacher90MinSalary"
+                placeholder="请输入课酬">
+                <template slot="append" v-if="scope.row.courseScheduleType == 'HIGH'">元/人</template>
+                <template slot="append" v-else-if="scope.row.courseScheduleType == 'CLASSROOM'">元/节</template>
+                <template slot="append" v-else>元/90分钟</template>
                 <!-- <template slot="append">元/{{ (scope.row.courseScheduleType == 'HIGH' || scope.row.courseScheduleType == 'CLASSROOM') ? 45 : 90 }}分钟</template> -->
               </el-input>
             </template>
           </el-table-column>
         </el-table>
 
-        <el-table
-          :data="teamSmallTable"
-          style="margin-top: 15px"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-          v-if="tenantId == 1"
-        >
+        <el-table :data="teamSmallTable" style="margin-top: 15px"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }" v-if="tenantId == 1">
           <el-table-column label="">
             <template slot-scope="scope">{{
               scope.row.courseScheduleType | coursesType
@@ -107,85 +72,44 @@
           </el-table-column>
           <el-table-column label="1V1">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.v1"
-                placeholder="请输入课酬"
-              >
-                <template slot="append"
-                  >元/节</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.v1" placeholder="请输入课酬">
+                <template slot="append">元/节</template>
               </el-input>
             </template>
           </el-table-column>
           <el-table-column label="1V2">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.v2"
-                placeholder="请输入课酬"
-              >
-                <template slot="append"
-                  >元/节</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.v2" placeholder="请输入课酬">
+                <template slot="append">元/节</template>
               </el-input>
             </template>
           </el-table-column>
           <el-table-column label="1V3">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.v3"
-                placeholder="请输入课酬"
-              >
-                <template slot="append"
-                  >元/节</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.v3" placeholder="请输入课酬">
+                <template slot="append">元/节</template>
               </el-input>
             </template>
           </el-table-column>
           <el-table-column label="1V4">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.v4"
-                placeholder="请输入课酬"
-              >
-                <template slot="append"
-                  >元/节</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.v4" placeholder="请输入课酬">
+                <template slot="append">元/节</template>
               </el-input>
             </template>
           </el-table-column>
           <el-table-column label="1V5">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.v5"
-                placeholder="请输入课酬"
-              >
-                <template slot="append"
-                  >元/节</template
-                >
+              <el-input type="number" @mousewheel.native.prevent v-model.trim="scope.row.v5" placeholder="请输入课酬">
+                <template slot="append">元/节</template>
               </el-input>
             </template>
           </el-table-column>
         </el-table>
 
-        <el-table
-          :data="vipTable"
-          style="width: 70%; margin-top: 15px"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        >
-          <el-table-column
-            label="VIP课课酬参考值"
-            prop="vipGroupCategoryName"
-          ></el-table-column>
+        <el-table :data="vipTable" style="width: 70%; margin-top: 15px"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+          <el-table-column label="VIP课课酬参考值" prop="vipGroupCategoryName"></el-table-column>
           <!-- <el-table-column label="线上课">
             <template slot-scope="scope">
               <el-input
@@ -201,78 +125,71 @@
           <el-table-column label="">
             <template slot-scope="scope">
               <div>
-                <el-input
-                  v-if="scope.row.musicTheory"
-                  type="number"
-                  @mousewheel.native.prevent
-                  v-model.trim="scope.row.offlineClassesSalary"
-                  placeholder="请输入内容"
-                >
+                <el-input v-if="scope.row.musicTheory" type="number" @mousewheel.native.prevent
+                  v-model.trim="scope.row.offlineClassesSalary" placeholder="请输入内容">
                   <template slot="append">
-                    人/节</template
-                  >
+                    人/节</template>
                   <!-- <template slot="append" v-else>节/人</template>  v-if="scope.row.musicTheory" -->
                 </el-input>
 
-                <el-input
-                  v-else
-                  type="number"
-                  @mousewheel.native.prevent
-                  v-model.trim="scope.row.offlineClassesSalary"
-                  placeholder="请输入内容"
-                >
+                <el-input v-else type="number" @mousewheel.native.prevent v-model.trim="scope.row.offlineClassesSalary"
+                  placeholder="请输入金额">
                   <template slot="append">
-                    元/节</template
-                  >
+                    元/节</template>
                   <!-- <template slot="append" v-else>节/人</template>  v-if="scope.row.musicTheory" -->
                 </el-input>
               </div>
             </template>
           </el-table-column>
         </el-table>
-        <el-table
-          :data="accompanyTable"
-          style="width: 35%; margin-top: 15px"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        >
+
+        <el-table :data="liveTable" style="width: 70%; margin-top: 15px"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+          <el-table-column label="直播课课课酬参考值" prop="vipGroupCategoryName">
+            <template slot-scope="scope">
+              {{ scope.row.vipGroupCategoryName }}分钟
+            </template>
+          </el-table-column>
+          <el-table-column label="">
+            <template slot-scope="scope">
+              <div>
+                <el-input v-if="scope.row.musicTheory" type="number" @mousewheel.native.prevent
+                  v-model.trim="scope.row.offlineClassesSalary" placeholder="请输入内容">
+                  <template slot="append">
+                    人/节</template>
+                </el-input>
+
+                <el-input v-else type="number" @mousewheel.native.prevent v-model.trim="scope.row.offlineClassesSalary"
+                  placeholder="请输入金额">
+                  <template slot="append">
+                    元/节</template>
+                </el-input>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <el-table :data="accompanyTable" style="width: 35%; margin-top: 15px"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
           <el-table-column label="网管课">
             <template slot-scope="scope">
-              <el-input
-                type="number"
-                style="width: 195px"
-                @mousewheel.native.prevent
-                v-model.trim="scope.row.mainTeacherSalary"
-              >
-                <template slot="append"
-                  >元/{{ scope.row.minutes }}分钟</template
-                >
+              <el-input type="number" style="width: 195px" @mousewheel.native.prevent
+                v-model.trim="scope.row.mainTeacherSalary">
+                <template slot="append">元/{{ scope.row.minutes }}分钟</template>
               </el-input>
             </template>
           </el-table-column>
         </el-table>
 
-        <el-form
-          style="margin-top: 20px"
-          ref="salaryForm"
-          :model="updateForm"
-          :rules="rules"
-        >
-          <el-form-item
-            label="是否结算课酬"
-            label-width="120px"
-            prop="isSettlementSalary"
-            :rules="[
-              {
-                required: true,
-                message: '请选择是否结算课酬',
-                trigger: 'change'
-              }
-            ]"
-          >
-            <el-select
-              v-model.trim="updateForm.isSettlementSalary"
-              style="width: 220px !important"
-            >
+        <el-form style="margin-top: 20px" ref="salaryForm" :model="updateForm" :rules="rules">
+          <el-form-item label="是否结算课酬" label-width="120px" prop="isSettlementSalary" :rules="[
+            {
+              required: true,
+              message: '请选择是否结算课酬',
+              trigger: 'change'
+            }
+          ]">
+            <el-select v-model.trim="updateForm.isSettlementSalary" style="width: 220px !important">
               <el-option label="是" :value="1"></el-option>
               <el-option label="否" :value="0"></el-option>
             </el-select>
@@ -303,14 +220,10 @@
 
         <!--  v-permission="pageType == 'create' ? {child: 'teacherDefaultMusicGroupSalary/batchUpset', parent: 'teacherAdd/batchUpset'} : {child: 'teacherDefaultMusicGroupSalary/batchUpset', parent: 'teacherUpdate/batchUpset'}" -->
         <div style="padding-top: 10px">
-          <auth
-            :auths="
-              pageType == 'create'
-                ? ['/teacherOperationAdd', 'teacherDefaultCreateSave']
-                : ['/teacherOperationUpdate', 'teacherDefaultUpdateSave']
-            "
-            mulit
-          >
+          <auth :auths="pageType == 'create'
+            ? ['/teacherOperationAdd', 'teacherDefaultCreateSave']
+            : ['/teacherOperationUpdate', 'teacherDefaultUpdateSave']
+            " mulit>
             <el-button @click="onSave()" type="primary">保存</el-button>
           </auth>
         </div>
@@ -437,6 +350,7 @@ export default {
         }
       ],
       vipTable: [],
+      liveTable: [],
       musicGroupTable: [],
       ruleList: [],
       vipList: [],
@@ -463,7 +377,6 @@ export default {
       studentRuleNum: ""
     };
   },
-  created() {},
   async mounted() {
     // this.pageType = this.$route.query.type;
     try {
@@ -476,10 +389,6 @@ export default {
     this.tenantId = this.$helpers.tenantId;
     this.__init();
   },
-  // activated () {
-  //   this.pageType = this.$route.query.type;
-  //   this.__init();
-  // },
   methods: {
     __init() {
       if (this.$route.query.search) {
@@ -524,6 +433,36 @@ export default {
           });
         }
       });
+
+      // 获取课程形态 设置vip课酬
+      findTeacherDefaultSalary({ userId: this.teacherId, groupType: 'LIVE' }).then(res => {
+        if (res.code == 200 && res.data.length > 0) {
+          let liveData = [];
+          res.data.forEach(item => {
+            liveData.push({
+              offlineClassesSalary: null,
+              onlineClassesSalary: null,
+              vipGroupCategoryId: item.id,
+              vipGroupCategoryName: item.name,
+              userId: this.teacherId,
+              musicTheory: item.musicTheory
+            });
+          });
+
+          // 直播课课列表
+          vipGroupSalaryList({
+            rows: 9999,
+            page: 1,
+            search: this.teacherId,
+            groupType: 'LIVE'
+          }).then(res => {
+            if (res.code == 200) {
+              const rows = res.data.rows;
+              this.liveListCompare(liveData, rows);
+            }
+          });
+        }
+      });
       // 乐团
       teacherSalaryList({
         rows: 9999,
@@ -564,6 +503,7 @@ export default {
               onlineClassesSalary: c.onlineClassesSalary,
               vipGroupCategoryName: c.vipGroupCategoryName,
               userId: c.userId,
+              groupType: c.groupType,
               musicTheory: c.musicTheory
             });
           }
@@ -581,6 +521,43 @@ export default {
       this.vipTable = result;
     },
 
+    liveListCompare(liveData, rows) {
+      // 直播课 做对比
+      if (!rows) {
+        // 判断是否有数据
+        this.liveTable = liveData;
+        return;
+      }
+      let result = [];
+      liveData.forEach(item => {
+        rows.forEach(c => {
+          if (item.vipGroupCategoryId == c.vipGroupCategoryId) {
+            item.checked = true;
+            result.push({
+              vipGroupCategoryId: c.vipGroupCategoryId,
+              offlineClassesSalary: c.offlineClassesSalary,
+              onlineClassesSalary: c.onlineClassesSalary,
+              vipGroupCategoryName: c.vipGroupCategoryName,
+              userId: c.userId,
+              groupType: c.groupType,
+              musicTheory: c.musicTheory
+            });
+          }
+        });
+      });
+      if (result.length > 0) {
+        liveData.forEach(item => {
+          if (!item.checked) {
+            result.push(item);
+          }
+        });
+      } else {
+        result = liveData;
+      }
+      console.log(result, 'result')
+      this.liveTable = result;
+    },
+
     teacherSalaryMoney(rows) {
       // 判断是否有数据
       if (!rows || rows.length <= 0) return;
@@ -703,6 +680,15 @@ export default {
           return;
         }
       });
+
+      this.liveTable.forEach(item => {
+        // console.log(item)
+        if (item.offlineClassesSalary < 0 || item.onlineClassesSalary < 0) {
+          this.$message.error("输入课酬不能为负数");
+          checkStatus = false;
+          return;
+        }
+      });
       this.accompanyTable.forEach(item => {
         if (item.mainTeacherSalary < 0) {
           this.$message.error("输入课酬不能为负数");
@@ -739,33 +725,53 @@ export default {
               teacherSalaryBatchUpset({
                 teacherDefaultMusicGroupSalaries: params
                 // startDate: updateForm.startDate
-              }).then(res => {
+              }).then(async (res) => {
                 if (res.code == 200) {
                   // 判断输入的值是否正确
-                  vipGroupSalarySet({
-                    teacherDefaultVipGroupSalaries: this.vipTable
-                    // startDate: updateForm.startDate
-                  }).then(res => {
-                    if (res.code == 200) {
-                      PracticeGroupSalaryUpdate({
-                        // startDate: updateForm.startDate,
-                        teacherDefaultPracticeGroupSalaries: this.accompanyTable
-                      }).then(res => {
-                        if (res.code == 200) {
-                          this.$message.success("保存成功");
-                          this.$store.dispatch("delVisitedViews", this.$route);
-                          this.$router.push({
-                            path: "/teacherManager/teacherList",
-                            query: { rules: this.Frules, search: this.Fsearch }
-                          });
-                        }
-                      });
-                    }
-                  });
+                  // vipGroupSalarySet({
+                  //   teacherDefaultVipGroupSalaries: this.vipTable
+                  //   // startDate: updateForm.startDate
+                  // }).then(res => {
+                  //   if (res.code == 200) {
+                  //     PracticeGroupSalaryUpdate({
+                  //       // startDate: updateForm.startDate,
+                  //       teacherDefaultPracticeGroupSalaries: this.accompanyTable
+                  //     }).then(res => {
+                  //       if (res.code == 200) {
+                  //         this.$message.success("保存成功");
+                  //         this.$store.dispatch("delVisitedViews", this.$route);
+                  //         this.$router.push({
+                  //           path: "/teacherManager/teacherList",
+                  //           query: { rules: this.Frules, search: this.Fsearch }
+                  //         });
+                  //       }
+                  //     });
+                  //   }
+                  // });
+                  try {
+                    await vipGroupSalarySet({
+                      teacherDefaultVipGroupSalaries: this.vipTable
+                    })
+                    await vipGroupSalarySet({
+                      teacherDefaultVipGroupSalaries: this.liveTable
+                    })
+                    await PracticeGroupSalaryUpdate({
+                      // startDate: updateForm.startDate,
+                      teacherDefaultPracticeGroupSalaries: this.accompanyTable
+                    })
+                    this.$message.success("保存成功");
+                    this.$store.dispatch("delVisitedViews", this.$route);
+                    this.$router.push({
+                      path: "/teacherManager/teacherList",
+                      query: { rules: this.Frules, search: this.Fsearch }
+                    });
+                  } catch {
+                    //
+                  }
                 }
               });
             })
-            .catch(() => {});
+            .catch(() => { });
         }
       });
       // 判断输入的值是否正确
@@ -786,14 +792,18 @@ export default {
     color: #444;
     font-weight: normal;
   }
+
   .tableList {
+
     .left,
     .right {
       float: left;
     }
+
     .left {
       width: 100%;
     }
+
     .right {
       width: 56%;
       margin-left: 2%;
@@ -808,6 +818,7 @@ export default {
     }
   }
 }
+
 ::v-deep .el-input-group__append {
   min-width: 103px;
   background-color: #f5f7fa;

+ 18 - 31
src/views/teamDetail/componentCourse/gpsLocation.vue

@@ -4,30 +4,16 @@
                         value="searchValue"
                         :search-option="searchOption"
                         :on-search-result="onSearchResult"></el-amap-search-box> -->
-    <el-amap :zoom="zoom"
-             ref='map'
-             vid="amapDemo"
-             :amap-manager="amapManager"
-             :center="center"
-             :events="markerEvents"
-             class="amap-demo">
+    <el-amap :zoom="zoom" ref='map' vid="amapDemo" :amap-manager="amapManager" :center="center" :events="markerEvents"
+      class="amap-demo">
       <!--  :plugin="plugin"  -->
-      <el-amap-marker v-for="(marker, index) in markers"
-                      :key="index"
-                      :position="marker.location"
-                      :title="marker.title"></el-amap-marker>
-      <el-amap-text v-for="(marker,index) in markers"
-                    :key="index+'xxx'"
-                    :text="marker.title"
-                    :position="marker.location"
-                    :offset="[40,-10]"></el-amap-text>
-      <el-amap-polyline :path="path"
-                        strokeColor='#4196fc'></el-amap-polyline>
-      <el-amap-text v-for="(text,index) in texts"
-                    :key="index+'ooo'"
-                    :text="text.text"
-                    :position="text.position"
-                    :offset="[-50,0]"></el-amap-text>
+      <el-amap-marker v-for="(marker, index) in markers" :key="index" :position="marker.location"
+        :title="marker.title"></el-amap-marker>
+      <el-amap-text v-for="(marker, index) in markers" :key="index + 'xxx'" :text="marker.title"
+        :position="marker.location" :offset="[40, -10]"></el-amap-text>
+      <el-amap-polyline :path="path" strokeColor='#4196fc'></el-amap-polyline>
+      <el-amap-text v-for="(text, index) in texts" :key="index + 'ooo'" :text="text.text" :position="text.position"
+        :offset="[-50, 0]"></el-amap-text>
     </el-amap>
   </div>
 </template>
@@ -57,14 +43,14 @@ import VueAMap from 'vue-amap'
 }());
 // Vue.use(VueAMap)
 VueAMap.initAMapApiLoader({
-  key: 'b1e6ac2eb28902ce91a490edf194e000',
+  key: 'ac943ac1522de0d63eb8a99b71fe2601',
   plugin: ['Autocomplete', 'PlaceSearch', 'Scale', 'OverView', 'ToolBar', 'MapType', 'PolyEditor', 'AMap.CircleEditor'],
   v: '1.4.4',
 })
 let amapManager = new VueAMap.AMapManager();
 export default {
   props: ['activeRow'],
-  data () {
+  data() {
     return {
       zoom: 20,
       amapManager,
@@ -84,25 +70,25 @@ export default {
     }
   },
   watch: {
-    activeRow (val) {
+    activeRow(val) {
       if (val) {
         console.log(val)
         this.init()
       }
     }
   },
-  mounted () {
+  mounted() {
     this.init()
   },
 
-  activated () {
+  activated() {
     // this.init()
   },
   methods: {
     // 地点搜索
     // searchOption () { },
     // 重置
-    init () {
+    init() {
       if (this.activeRow.schoolLongitudeLatitude) {
         let add = {
           title: '教学点',
@@ -138,8 +124,8 @@ export default {
       this.getDistance(this.signInLongitudeLatitude, this.schoolLongitudeLatitude)
       this.getDistance(this.signOutLongitudeLatitude, this.schoolLongitudeLatitude)
     },
-    onSearchResult () { },
-    getDistance (sigin, school) {
+    onSearchResult() { },
+    getDistance(sigin, school) {
 
       if (sigin && sigin.length > 0 && school && school.length > 0) {
         let o = amapManager.getMap();
@@ -171,6 +157,7 @@ export default {
 .title {
   margin-bottom: 20px;
 }
+
 .amap-demo {
   height: 500px;
 }

+ 36 - 101
src/views/teamDetail/componentCourse/resetClass.vue

@@ -1,136 +1,60 @@
 <template>
   <div>
-    <el-form
-      :model="maskForm"
-      class="maskForm"
-      ref="maskForm"
-      :rules="maskRules"
-      label-position="right"
-      label-width="120px"
-      :inline="true"
-    >
+    <el-form :model="maskForm" class="maskForm" ref="maskForm" :rules="maskRules" label-position="right"
+      label-width="120px" :inline="true">
       <!--    -->
       <el-form-item label="主教老师" v-if="maskForm.type == 'VIP'" prop="teacher">
-        <remote-search
-          :commit="'setTeachers'"
-          v-model="maskForm.teacher"
-          @change="changeTeacher"
-          :width="220"
-        />
+        <remote-search :commit="'setTeachers'" v-model="maskForm.teacher" @change="changeTeacher" :width="220" />
       </el-form-item>
       <el-form-item label="主教老师" v-else prop="teacher">
         <remote-search :commit="'setTeachers'" v-model="maskForm.teacher" :width="220" />
       </el-form-item>
-      <el-form-item
-        label="助教老师"
-        v-if="
-          maskForm.type != 'MUSIC_NETWORK' &&
-          maskForm.type != 'HIGH_ONLINE' &&
-          maskForm.groupType == 'MUSIC'
-        "
-        prop="assistant"
-      >
-        <remote-search
-          :commit="'setTeachers'"
-          v-model="maskForm.assistant"
-          :width="220"
-          :multiple="true"
-        />
+      <el-form-item label="助教老师" v-if="maskForm.type != 'MUSIC_NETWORK' &&
+        maskForm.type != 'HIGH_ONLINE' &&
+        maskForm.groupType == 'MUSIC'
+        " prop="assistant">
+        <remote-search :commit="'setTeachers'" v-model="maskForm.assistant" :width="220" :multiple="true" />
       </el-form-item>
       <el-form-item label="上课日期" prop="date">
-        <el-date-picker
-          v-model.trim="maskForm.date"
-          type="date"
-          :picker-options="bigin"
-          value-format="yyyy-MM-dd"
-          placeholder="选择日期"
-          clearable
-        ></el-date-picker>
+        <el-date-picker v-model.trim="maskForm.date" type="date" :picker-options="bigin" value-format="yyyy-MM-dd"
+          placeholder="选择日期" clearable></el-date-picker>
       </el-form-item>
       <el-form-item label="课程时长" prop="timer">
-        <el-select
-          v-model="maskForm.timer"
-          @change="changeTime"
-          style="width: 220px !important"
-          clearable
-        >
-          <el-option
-            v-for="(item, index) in typeTimeList"
-            :key="index"
-            :disabled="item > baseTimer ? true : false"
-            :value="parseInt(item)"
-            :label="item"
-          ></el-option>
+        <el-select v-model="maskForm.timer" @change="changeTime" style="width: 220px !important" clearable>
+          <el-option v-for="(item, index) in typeTimeList" :key="index" :disabled="item > baseTimer ? true : false"
+            :value="parseInt(item)" :label="item"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="开始时间" prop="startTime">
-        <el-time-picker
-          placeholder="起始时间"
-          v-model.trim="maskForm.startTime"
-          @change="changeStartTime"
-          format="HH:mm"
-          value-format="HH:mm"
-          :picker-options="{
+        <el-time-picker placeholder="起始时间" v-model.trim="maskForm.startTime" @change="changeStartTime" format="HH:mm"
+          value-format="HH:mm" :picker-options="{
             selectableRange: `06:00:00 - 23:30:00`,
-          }"
-          clearable
-        ></el-time-picker>
+          }" clearable></el-time-picker>
       </el-form-item>
       <el-form-item label="结束时间" prop="endTime">
-        <el-time-picker
-          placeholder="结束时间"
-          v-model.trim="maskForm.endTime"
-          disabled
-          format="HH:mm"
-          value-format="HH:mm"
+        <el-time-picker placeholder="结束时间" v-model.trim="maskForm.endTime" disabled format="HH:mm" value-format="HH:mm"
           :picker-options="{
             start: '04:30',
             step: '00:05',
             end: '23:30',
             minTime: maskForm.startTime,
-          }"
-          clearable
-        ></el-time-picker>
+          }" clearable></el-time-picker>
       </el-form-item>
       <el-form-item label="课程类型" v-if="maskForm.type == 'VIP'" prop="courseType">
-        <el-select
-          clearable
-          @change="typeChange"
-          style="width: 220px !important"
-          v-model.trim="maskForm.teachMode"
-        >
+        <el-select clearable @change="typeChange" style="width: 220px !important" v-model.trim="maskForm.teachMode">
           <el-option label="线上课" value="ONLINE"></el-option>
           <el-option label="线下课" value="OFFLINE"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item
-        label="课程类型"
-        v-if="maskForm.type == 'HIGH' || maskForm.type == 'HIGH_ONLINE'"
-        prop="courseType"
-      >
-        <el-select
-          clearable
-          @change="typeChangeHight"
-          style="width: 220px !important"
-          v-model.trim="maskForm.teachMode"
-        >
+      <el-form-item label="课程类型" v-if="maskForm.type == 'HIGH' || maskForm.type == 'HIGH_ONLINE'" prop="courseType">
+        <el-select clearable @change="typeChangeHight" style="width: 220px !important" v-model.trim="maskForm.teachMode">
           <el-option label="线上课" value="ONLINE"></el-option>
           <el-option label="线下课" value="OFFLINE"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="教学地点" v-if="maskForm.teachMode == 'OFFLINE'">
-        <el-select
-          v-model.trim="maskForm.address"
-          style="width: 220px !important"
-          filterable
-          clearable
-        >
-          <el-option
-            v-for="(item, index) in schoolList"
-            :key="index"
-            :value="item.id"
-            :label="item.name"
-          ></el-option>
+        <el-select v-model.trim="maskForm.address" style="width: 220px !important" filterable clearable>
+          <el-option v-for="(item, index) in schoolList" :key="index" :value="item.id" :label="item.name"></el-option>
         </el-select>
       </el-form-item>
     </el-form>
@@ -148,6 +72,7 @@ import {
   getCourseScheduleDetail,
   getOrganCourseDurationSettings,
 } from "@/api/buildTeam";
+import { vipGroupCategory } from '@/api/vipSeting'
 import { getTeachSchool } from "@/api/teacherManager";
 import { getSchool } from "@/api/systemManage";
 import cleanDeep from "clean-deep";
@@ -257,7 +182,7 @@ export default {
             }
           });
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     typeChange() {
       this.$set(this.maskForm, "address", null);
@@ -346,7 +271,17 @@ export default {
                   this.typeTimeList = this.courseTimeList[key].split(",");
                 }
               }
-            } catch (e) {}
+            } catch (e) { }
+          } else if (res.data.groupType == 'LIVE') {
+            try {
+              const { data } = await vipGroupCategory({
+                groupType: 'LIVE',
+              });
+              console.log(data, 'data')
+              data.forEach(liveItem => {
+                this.typeTimeList.push(liveItem.singleClassMinutes)
+              })
+            } catch (e) { }
           }
           this.baseTimer = time;
           this.maskForm.timer = time;

+ 5 - 19
src/views/teamDetail/components/modals/school-location.vue

@@ -1,29 +1,15 @@
 <template>
-  <el-amap
-    :zoom="14"
-    ref="map"
-    vid="amapDemo1"
-    style="height: 300px;"
-    :amap-manager="amapManager"
-    :center="center"
-    class="amap-demo"
-  >
-    <el-amap-marker
-      :position="center"
-      title="教学点"
-    ></el-amap-marker>
-    <el-amap-text
-      :text="address"
-      :position="center"
-      :offset="[0, 20]"
-    ></el-amap-text>
+  <el-amap :zoom="14" ref="map" vid="amapDemo1" style="height: 300px;" :amap-manager="amapManager" :center="center"
+    class="amap-demo">
+    <el-amap-marker :position="center" title="教学点"></el-amap-marker>
+    <el-amap-text :text="address" :position="center" :offset="[0, 20]"></el-amap-text>
   </el-amap>
 </template>
 <script>
 import VueAMap from "vue-amap";
 let amapManager = new VueAMap.AMapManager();
 VueAMap.initAMapApiLoader({
-  key: "b1e6ac2eb28902ce91a490edf194e000",
+  key: "ac943ac1522de0d63eb8a99b71fe2601",
   plugin: [
     "Autocomplete",
     "PlaceSearch",

+ 75 - 214
src/views/teamDetail/teamClassList.vue

@@ -4,118 +4,56 @@
     <h2>
       <div class="squrt"></div>
       班级管理
-      <filter-search
-        v-if="permission('/teamCLassList/abnormal')"
-        :keys="['lessThenThreeHighOnline']"
-        @reload="reloadSearch"
-        :moreKeys="['organId']"
-      />
+      <filter-search v-if="permission('/teamCLassList/abnormal')" :keys="['lessThenThreeHighOnline']"
+        @reload="reloadSearch" :moreKeys="['organId']" />
     </h2>
     <div class="m-core">
-      <save-form
-        ref="searchForm"
-        :inline="true"
-        :model="searchForm"
-        @submit="search"
-        @reset="onReSet"
-      >
+      <save-form ref="searchForm" :inline="true" :model="searchForm" @submit="search" @reset="onReSet">
         <el-form-item prop="search">
-          <el-input
-            v-model.trim="searchForm.search"
-            clearable
-               @keyup.enter.native="
-              (e) => {
-                e.target.blur();
-                $refs.searchForm.save();
-                search();
-              }
-            "
-            placeholder="乐团&班级编号名称"
-          ></el-input>
+          <el-input v-model.trim="searchForm.search" clearable @keyup.enter.native="(e) => {
+              e.target.blur();
+              $refs.searchForm.save();
+              search();
+            }
+            " placeholder="乐团&班级编号名称"></el-input>
         </el-form-item>
         <el-form-item prop="organIdList">
-          <select-all
-            class="multiple"
-            filterable
-            multiple
-            v-model.trim="searchForm.organIdList"
-            clearable
-            placeholder="请选择分部"
-          >
-            <el-option
-              v-for="(item, index) in selects.branchs"
-              :key="index"
-              :label="item.name"
-              :value="item.id"
-            ></el-option>
+          <select-all class="multiple" filterable multiple v-model.trim="searchForm.organIdList" clearable
+            placeholder="请选择分部">
+            <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+              :value="item.id"></el-option>
           </select-all>
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.groupType"
-            @change="
-              () => {
-                searchForm.type = '';
-              }
-            "
-            filterable
-            placeholder="课程组类型"
-          >
-            <el-option
-              v-for="(item, index) in courseListType"
-              :key="index"
-              :value="item.value"
-              :label="item.label"
-            ></el-option>
+          <el-select v-model.trim="searchForm.groupType" @change="() => {
+              searchForm.type = '';
+            }
+            " filterable placeholder="课程组类型">
+            <el-option v-for="(item, index) in courseListType" :key="index" :value="item.value"
+              :label="item.label"></el-option>
           </el-select>
         </el-form-item>
         <!-- musicClassTypeList -->
         <el-form-item prop="type">
-          <el-select
-            v-model.trim="searchForm.type"
-            filterable
-            clearable
-            :disabled="searchForm.groupType != 'MUSIC'"
-            placeholder="班级类型"
-          >
-            <el-option
-              v-for="(item, index) in musicClassTypeList"
-              :key="index"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select v-model.trim="searchForm.type" filterable clearable :disabled="searchForm.groupType != 'MUSIC'"
+            placeholder="班级类型">
+            <el-option v-for="(item, index) in musicClassTypeList" :key="index" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="mainTeacherUserId">
-          <remote-search
-            :commit="'setTeachers'"
-            v-model="searchForm.mainTeacherUserId"
-            :demissionFlag="true"
-            :isForzenWithQueryCondition="true"
-          />
+          <remote-search :commit="'setTeachers'" v-model="searchForm.mainTeacherUserId" :demissionFlag="true"
+            :isForzenWithQueryCondition="true" />
         </el-form-item>
         <el-form-item>
           <el-button native-type="submit" type="primary">搜索</el-button>
           <el-button native-type="reset" type="danger">重置</el-button>
-          <el-button
-            type="primary"
-            v-permission="'export/classGroup'"
-            @click="exportClassGroup"
-            >导出</el-button
-          >
+          <el-button type="primary" v-permission="'export/classGroup'" @click="exportClassGroup">导出</el-button>
         </el-form-item>
       </save-form>
       <div class="tableWrap">
-        <el-table
-          style="width: 100%"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-          :data="tableList"
-        >
-          <el-table-column
-            align="center"
-            prop="musicGroupId"
-            label="课程组编号"
-          >
+        <el-table style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }" :data="tableList">
+          <el-table-column align="center" prop="musicGroupId" label="课程组编号">
             <template slot-scope="scope">
               <copy-text>{{ scope.row.musicGroupId }}</copy-text>
             </template>
@@ -125,31 +63,19 @@
               <copy-text>{{ scope.row.id }}</copy-text>
             </template>
           </el-table-column> -->
-          <el-table-column
-            align="center"
-            prop="musicGroupName"
-            label="课程组名称"
-          ></el-table-column>
+          <el-table-column align="center" prop="musicGroupName" label="课程组名称"></el-table-column>
           <el-table-column align="center" prop="organName" label="分部名称">
             <template slot-scope="scope">
               <copy-text>{{ scope.row.organName }}</copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="name"
-            label="班级名称"
-          ></el-table-column>
+          <el-table-column align="center" prop="name" label="班级名称"></el-table-column>
           <el-table-column align="center" prop="type" label="班级类型">
             <template slot-scope="scope">
               <div>{{ scope.row.type | classType }}</div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="studentNum"
-            label="当前班级人数"
-          >
+          <el-table-column align="center" prop="studentNum" label="当前班级人数">
             <template slot-scope="scope">
               <div>{{ scope.row.studentNum }}人</div>
             </template>
@@ -157,11 +83,8 @@
           <el-table-column align="center" prop label="主教老师">
             <template slot-scope="scope">
               <div v-if="scope.row.classGroupTeacherMapperList">
-                <p
-                  v-for="(item, index) in scope.row.classGroupTeacherMapperList"
-                  v-if="item.teacherRole == 'BISHOP'"
-                  :key="index"
-                >
+                <p v-for="(item, index) in scope.row.classGroupTeacherMapperList" v-if="item.teacherRole == 'BISHOP'"
+                  :key="index">
                   {{ item.userName }}
                 </p>
               </div>
@@ -170,11 +93,8 @@
           <el-table-column align="center" label="助教老师">
             <template slot-scope="scope">
               <div v-if="scope.row.classGroupTeacherMapperList">
-                <p
-                  v-for="(item, index) in scope.row.classGroupTeacherMapperList"
-                  v-if="item.teacherRole == 'TEACHING'"
-                  :key="index"
-                >
+                <p v-for="(item, index) in scope.row.classGroupTeacherMapperList" v-if="item.teacherRole == 'TEACHING'"
+                  :key="index">
                   {{ item.userName }}
                 </p>
               </div>
@@ -190,97 +110,39 @@
               <div>{{ scope.row.totalClassTimes }}</div>
             </template>
           </el-table-column>
-          <el-table-column
-            fixed="right"
-            width="160px"
-            align="center"
-            label="操作"
-          >
+          <el-table-column fixed="right" width="160px" align="center" label="操作">
             <template slot-scope="scope">
-              <el-button
-                type="text"
-                v-if="
-                 permission('classGroup/update')
-                "
-                @click="resetClassName(scope.row,true)"
-                >班级名称调整</el-button
-              >
-              <el-button
-                type="text"
-                v-if="
-                 permission('classGroup/update')
-                "
-                @click="resetClassName(scope.row,false)"
-                >备注</el-button
-              >
-              <el-button
-                type="text"
-                @click="addCompound(scope.row)"
-                v-if="
-                  scope.row.type != 'MUSIC_NETWORK' &&
-                  scope.row.groupType == 'MUSIC' &&
-                  !isAddCom(scope.row) &&
-                  permission('classGroup/spanGroupMergeClassSplitClassAffirm')
-                "
-                >添加合班</el-button
-              >
-              <el-button
-                type="text"
-                v-if="
-                  isAddCom(scope.row) &&
-                  permission('classGroup/spanGroupMergeClassSplitClassAffirm')
-                "
-                @click="cancleCompound(scope.row)"
-                >取消合班</el-button
-              >
-              <el-button
-                type="text"
-                v-if="
-                  permission('classGroup/delSingle?page=teamCLassList') &&
-                  scope.row.groupType === 'MUSIC' &&
-                  (scope.row.studentNum == '0' ||
-                    scope.row.totalClassTimes == '0')
-                "
-                @click="removeClass(scope)"
-                >删除</el-button
-              >
+              <el-button type="text" v-if="permission('classGroup/update')
+                " @click="resetClassName(scope.row, true)">班级名称调整</el-button>
+              <el-button type="text" v-if="permission('classGroup/update')
+                " @click="resetClassName(scope.row, false)">备注</el-button>
+              <el-button type="text" @click="addCompound(scope.row)" v-if="scope.row.type != 'MUSIC_NETWORK' &&
+                scope.row.groupType == 'MUSIC' &&
+                !isAddCom(scope.row) &&
+                permission('classGroup/spanGroupMergeClassSplitClassAffirm')
+                ">添加合班</el-button>
+              <el-button type="text" v-if="isAddCom(scope.row) &&
+                permission('classGroup/spanGroupMergeClassSplitClassAffirm')
+                " @click="cancleCompound(scope.row)">取消合班</el-button>
+              <el-button type="text" v-if="permission('classGroup/delSingle?page=teamCLassList') &&
+                scope.row.groupType === 'MUSIC' &&
+                (scope.row.studentNum == '0' ||
+                  scope.row.totalClassTimes == '0')
+                " @click="removeClass(scope)">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          sync
-          :total.sync="rules.total"
-          :page.sync="rules.page"
-          :limit.sync="rules.limit"
-          :page-sizes="rules.page_size"
-          @pagination="getList"
-        />
+        <pagination sync :total.sync="rules.total" :page.sync="rules.page" :limit.sync="rules.limit"
+          :page-sizes="rules.page_size" @pagination="getList" />
       </div>
     </div>
-    <classCompound
-      :compoundList="compoundList"
-      v-if="
-        permission('classGroup/spanGroupMergeClassSplitClassAffirm') &&
-        compoundList.length > 0
-      "
-      @clearCom="clearCom"
-      @getList="getList"
-      @cancleCompound="cancleCompound"
-    />
-        <!-- 修改班级名称 -->
-    <el-dialog
-      :title="!resetName?'班级名称调整':'备注'"
-      width="500px"
-      :visible.sync="classNameVisible"
-      v-if="classNameVisible"
-    >
-      <changeClassName
-        :classGroupId="activeClass"
-        :detail="classDetail"
-        @submited="submitedResetClassName"
-        :resetName="resetName"
-        @close="classNameVisible = false"
-      />
+    <classCompound :compoundList="compoundList" v-if="permission('classGroup/spanGroupMergeClassSplitClassAffirm') &&
+      compoundList.length > 0
+      " @clearCom="clearCom" @getList="getList" @cancleCompound="cancleCompound" />
+    <!-- 修改班级名称 -->
+    <el-dialog :title="!resetName ? '班级名称调整' : '备注'" width="500px" :visible.sync="classNameVisible" v-if="classNameVisible">
+      <changeClassName :classGroupId="activeClass" :detail="classDetail" @submited="submitedResetClassName"
+        :resetName="resetName" @close="classNameVisible = false" />
     </el-dialog>
   </div>
 </template>
@@ -301,10 +163,10 @@ import { permission } from "@/utils/directivePage";
 import classCompound from "./componentClass/classCompound";
 import { Export } from "@/utils/downLoadFile";
 import changeClassName from "@/views/teamDetail/components/modals/class-resetclass-name.vue";
-import {resetClassName} from '@/views/teamDetail/api'
+import { resetClassName } from '@/views/teamDetail/api'
 import qs from "qs";
 export default {
-  components: { pagination, classCompound,changeClassName },
+  components: { pagination, classCompound, changeClassName },
   data() {
     return {
       searchForm: {
@@ -312,7 +174,7 @@ export default {
         organIdList: [],
         type: "",
         groupType: "MUSIC",
-        mainTeacherUserId:''
+        mainTeacherUserId: ''
       },
       courseListType: courseListType,
       musicClassTypeList,
@@ -327,14 +189,14 @@ export default {
         total: 0, // 总条数
         page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
-      classNameVisible:false,
-      classDetail:null,
-      activeClass:'',
-      resetName:false
+      classNameVisible: false,
+      classDetail: null,
+      activeClass: '',
+      resetName: false
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created() {},
+  created() { },
   //生命周期 - 挂载完成(可以访问DOM元素)
   mounted() {
     const { query, params } = this.$route;
@@ -358,7 +220,7 @@ export default {
         if (!res.data) {
           this.$bus.$emit("showguide", ["agreement"]);
         }
-      } catch (e) {}
+      } catch (e) { }
     },
     reloadSearch() {
       this.rules.page = 1;
@@ -402,7 +264,7 @@ export default {
         await removeSingleClass({ classGroupId: scope.row.id });
         this.$message.success("删除成功");
         this.getList();
-      } catch (error) {}
+      } catch (error) { }
     },
     addCompound(row) {
       //  scope.row.type != 'HIGH_ONLINE' &&scope.row.type != 'HIGH'&&
@@ -483,13 +345,13 @@ export default {
         "是否确认导出报表?"
       );
     },
-        resetClassName(row,flag) {
+    resetClassName(row, flag) {
       this.classDetail = row;
       this.resetName = !flag;
       this.classNameVisible = true;
     },
     async submitedResetClassName(data) {
-      const obj = {...data};
+      const obj = { ...data };
       resetClassName(obj).then((res) => {
         if (res.code == 200) {
           this.$message.success("修改成功");
@@ -501,5 +363,4 @@ export default {
   },
 };
 </script>
-<style lang='scss' scoped>
-</style>
+<style lang='scss' scoped></style>

+ 136 - 386
src/views/teamDetail/teamCourseList.vue

@@ -3,112 +3,56 @@
     <h2>
       <div class="squrt"></div>
       课表管理
-      <filter-search
-        ref="filterSearch"
-        @reload="reloadSearch"
-        @setTimeForSearch="setTimeForSearch"
-        :keys="['searchType']"
-        :moreKeys="['start', 'end', 'organId']"
-        v-if="permission('courseSchedule/abnormal')"
-      />
+      <filter-search ref="filterSearch" @reload="reloadSearch" @setTimeForSearch="setTimeForSearch" :keys="['searchType']"
+        :moreKeys="['start', 'end', 'organId']" v-if="permission('courseSchedule/abnormal')" />
     </h2>
     <div class="m-core">
       <!-- 搜索类型 -->
-      <save-form
-        :inline="true"
-        class="searchForm"
-        @submit="search"
-        @reset="reset"
-        ref="searchForm"
-        :model.sync="searchForm"
-      >
+      <save-form :inline="true" class="searchForm" @submit="search" @reset="reset" ref="searchForm"
+        :model.sync="searchForm">
         <el-form-item>
-          <el-input
-            type="number"
-            v-model.trim="searchForm.courseIdSearch"
-            clearable
-            placeholder="课程编号"
-          />
+          <el-input type="number" v-model.trim="searchForm.courseIdSearch" clearable placeholder="课程编号" />
         </el-form-item>
         <el-form-item>
-          <remote-search
-            :commit="'setTeachers'"
-            v-model="searchForm.teacherIdList"
-            :demissionFlag="true"
-            :isForzenWithQueryCondition="true"
-          />
+          <remote-search :commit="'setTeachers'" v-model="searchForm.teacherIdList" :demissionFlag="true"
+            :isForzenWithQueryCondition="true" />
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.courseType"
-            clearable
-            filterable
-            placeholder="课程类型"
-          >
-            <el-option
-              v-for="(item, index) in courseType"
-              :key="index"
-              :value="item.value"
-              :label="item.label"
-            ></el-option>
+          <el-select v-model.trim="searchForm.courseType" clearable filterable placeholder="课程类型">
+            <el-option v-for="(item, index) in courseType" :key="index" :value="item.value"
+              :label="item.label"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select
-            v-model.trim="searchForm.courseStatus"
-            clearable
-            filterable
-            placeholder="课程状态"
-          >
+          <el-select v-model.trim="searchForm.courseStatus" clearable filterable placeholder="课程状态">
             <el-option label="未开始" value="NOT_START"></el-option>
             <el-option label="进行中" value="UNDERWAY"></el-option>
             <el-option label="已结束" value="OVER"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-date-picker
-            v-model.trim="searchForm.timer"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="-"
-            start-placeholder="上课开始日期"
-            end-placeholder="上课结束日期"
-            :picker-options="{
+          <el-date-picker v-model.trim="searchForm.timer" type="daterange" value-format="yyyy-MM-dd" range-separator="-"
+            start-placeholder="上课开始日期" end-placeholder="上课结束日期" :picker-options="{
               firstDayOfWeek: 1,
-            }"
-          ></el-date-picker>
+            }"></el-date-picker>
         </el-form-item>
 
         <el-form-item>
-          <el-button
-            :type="isSearch ? 'primary' : 'info'"
-            icon="el-icon-circle-plus-outline"
-            @click="showMove = true"
-            >更多选项</el-button
-          >
+          <el-button :type="isSearch ? 'primary' : 'info'" icon="el-icon-circle-plus-outline"
+            @click="showMove = true">更多选项</el-button>
         </el-form-item>
         <el-form-item>
           <el-button native-type="submit" type="primary">搜索</el-button>
           <el-button native-type="reset" type="danger">重置</el-button>
 
-          <el-button
-            v-permission="'export/superFindCourseSchedules'"
-            @click="onCourseExport"
-            type="primary"
-            >导出课表</el-button
-          >
+          <el-button v-permission="'export/superFindCourseSchedules'" @click="onCourseExport"
+            type="primary">导出课表</el-button>
         </el-form-item>
       </save-form>
       <!-- 列表 -->
       <div class="tableWrap">
-        <el-table
-          :data="tableList"
-          ref="tableList"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-          @selection-change="handleSelectionChange"
-          @select="onTableSelect"
-          row-key="id"
-        >
+        <el-table :data="tableList" ref="tableList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          @selection-change="handleSelectionChange" @select="onTableSelect" row-key="id">
           >
           <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column type="expand">
@@ -118,43 +62,33 @@
                   <el-col :span="4">
                     <el-form-item label="考勤申诉:">
                       <span>{{ props.row.isComplaints == 1 ? "是" : "否" }}</span>
-                    </el-form-item></el-col
-                  >
+                    </el-form-item></el-col>
                   <el-col :span="4">
                     <el-form-item label="是否冻结:">
                       <span>{{ props.row.isLock ? "是" : "否" }}</span>
-                    </el-form-item></el-col
-                  >
+                    </el-form-item></el-col>
 
                   <el-col :span="4">
                     <el-form-item label="云教练课程:">
                       {{ props.row.memberFlag ? "是" : "否" }}
-                    </el-form-item></el-col
-                  >
+                    </el-form-item></el-col>
                   <el-col :span="4">
                     <el-form-item label="是否点名:">
                       {{ props.row.isCallNames ? "是" : "否" }}
-                    </el-form-item></el-col
-                  >
+                    </el-form-item></el-col>
                 </el-row>
                 <el-row style="margin-left: 64px" v-if="props.row.newCourseId">
                   <el-col :span="4">
                     <el-form-item label="合并类型:">
                       <span>
                         <div>
-                          <span
-                            v-if="
-                              props.row.newCourseId > 0 &&
-                              props.row.newCourseId == props.row.id
-                            "
-                            >合并课
+                          <span v-if="props.row.newCourseId > 0 &&
+                            props.row.newCourseId == props.row.id
+                            ">合并课
                           </span>
-                          <p
-                            v-if="
-                              props.row.newCourseId > 0 &&
-                              props.row.newCourseId != props.row.id
-                            "
-                          >
+                          <p v-if="props.row.newCourseId > 0 &&
+                            props.row.newCourseId != props.row.id
+                            ">
                             被合并课
                           </p>
                           <p v-if="props.row.newCourseId == 0">无</p>
@@ -167,35 +101,20 @@
                       <el-button type="text" @click="common(props.row)">
                         {{ props.row.newCourseId }}
                       </el-button>
-                    </el-form-item></el-col
-                  >
+                    </el-form-item></el-col>
                   <el-col :span="4">
                     <el-form-item label="被合并课编号:">
-                      <el-button
-                        type="text"
-                        @click="common1(item)"
-                        :key="index"
-                        v-for="(item, index) in props.row.mergedCourseIds.split(',')"
-                      >
+                      <el-button type="text" @click="common1(item)" :key="index"
+                        v-for="(item, index) in props.row.mergedCourseIds.split(',')">
                         {{ item }}
                       </el-button>
-                    </el-form-item></el-col
-                  >
+                    </el-form-item></el-col>
                 </el-row>
               </el-form>
             </template>
           </el-table-column>
-          <el-table-column
-            align="left"
-            prop="organName"
-            label="分部名称"
-          ></el-table-column>
-          <el-table-column
-            align="center"
-            width="170px"
-            prop="musicGroupId"
-            label="乐团/课程组编号"
-          >
+          <el-table-column align="left" prop="organName" label="分部名称"></el-table-column>
+          <el-table-column align="center" width="170px" prop="musicGroupId" label="乐团/课程组编号">
             <template slot-scope="scope">
               <div style="color: var(--color-primary)" @click="gotoCourse(scope.row)">
                 <copy-text>{{ scope.row.musicGroupId }}</copy-text>
@@ -219,20 +138,16 @@
                 <p>
                   {{
                     scope.row.startClassTime
-                      ? scope.row.startClassTime.substr(0, 16)
-                      : ""
+                    ? scope.row.startClassTime.substr(0, 16)
+                    : ""
                   }}-{{
-                    scope.row.endClassTime ? scope.row.endClassTime.substr(11, 5) : ""
-                  }}
+  scope.row.endClassTime ? scope.row.endClassTime.substr(11, 5) : ""
+}}
                 </p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="subjectName"
-            label="声部"
-          ></el-table-column>
+          <el-table-column align="center" prop="subjectName" label="声部"></el-table-column>
           <el-table-column prop="name" width="150px" label="主教老师/课程名称">
             <template slot-scope="scope">
               <div>
@@ -249,7 +164,7 @@
                   {{ scope.row.teachMode | teachMode }}
                 </p>
                 <p>
-                  {{ scope.row.schoolName ? scope.row.schoolName : "网络教室" }}
+                  {{ scope.row.schoolName ? scope.row.schoolName : scope.row.type === 'LIVE' ? '线上直播间' : "网络教室" }}
                 </p>
               </div>
             </template>
@@ -257,22 +172,11 @@
           <el-table-column align="center" label="详情" fixed="right" width="220px">
             <template slot-scope="scope">
               <div>
-                <el-button
-                  v-if="'/teamCourseListDetail'"
-                  type="text"
-                  @click="lookDetail(scope.row)"
-                  >详情</el-button
-                >
-                <el-button
-                  type="text"
-                  v-if="
-                    permission('courseSchedule/classStartDateAdjust?hight') &&
-                    !scope.row.isLock &&
-                    !(scope.row.newCourseId > 0 && scope.row.newCourseId != scope.row.id)
-                  "
-                  @click="resetClass(scope.row)"
-                  >调整</el-button
-                >
+                <el-button v-if="'/teamCourseListDetail'" type="text" @click="lookDetail(scope.row)">详情</el-button>
+                <el-button type="text" v-if="permission('courseSchedule/classStartDateAdjust?hight') &&
+                  !scope.row.isLock &&
+                  !(scope.row.newCourseId > 0 && scope.row.newCourseId != scope.row.id) && scope.row.status != 'UNDERWAY'
+                  " @click="resetClass(scope.row)">调整</el-button>
 
                 <!-- <el-button
                   type="text"
@@ -299,38 +203,20 @@
                   @click="cancleCompound(scope.row)"
                   >取消合课</el-button
                 > -->
-                <el-button
-                  type="text"
-                  v-if="
-                    scope.row.newCourseId == scope.row.id &&
-                    permission('courseSchedule/mergeCourseSplit') &&
-                    scope.row.status != 'OVER'
-                  "
-                  @click="resetCompound(scope.row)"
-                  >取消合并</el-button
-                >
-                <el-button
-                  type="text"
-                  v-if="
-                    scope.row.status == 'OVER' &&
-                    !scope.row.isSettlement &&
-                    permission('courseSchedule/cleanAttendance')
-                  "
-                  @click="clearAttend(scope.row)"
-                  >清除考勤</el-button
-                >
+                <el-button type="text" v-if="scope.row.newCourseId == scope.row.id &&
+                  permission('courseSchedule/mergeCourseSplit') &&
+                  scope.row.status != 'OVER'
+                  " @click="resetCompound(scope.row)">取消合并</el-button>
+                <el-button type="text" v-if="scope.row.status == 'OVER' &&
+                  !scope.row.isSettlement &&
+                  permission('courseSchedule/cleanAttendance')
+                  " @click="clearAttend(scope.row)">清除考勤</el-button>
               </div>
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          :total.sync="rules.total"
-          :page.sync="rules.page"
-          :limit.sync="rules.limit"
-          :page-sizes="rules.page_size"
-          @pagination="getList"
-          sync
-        />
+        <pagination :total.sync="rules.total" :page.sync="rules.page" :limit.sync="rules.limit"
+          :page-sizes="rules.page_size" @pagination="getList" sync />
       </div>
     </div>
     <el-dialog title="课表详情" :visible.sync="classVisible" width="1000px">
@@ -364,106 +250,63 @@
             <el-tooltip placement="top" popper-class="mTooltip">
               <div slot="content">学员和老师同时在教室里的时长。</div>
 
-              <i
-                class="el-icon-question micon el-tooltip"
-                style="font-size: 18px; color: #f56c6c"
-                v-permission="'export/teacherSalary'"
-              ></i>
+              <i class="el-icon-question micon el-tooltip" style="font-size: 18px; color: #f56c6c"
+                v-permission="'export/teacherSalary'"></i>
             </el-tooltip>
           </div>
         </el-form-item>
         <el-form-item label="学员考勤" v-if="maskForm.status != 'NOT_START'">
-          <div
-            class="inputStyle"
-            :class="maskForm.errorAttendanceNum != 0 ? 'red' : 'green'"
-          >
+          <div class="inputStyle" :class="maskForm.errorAttendanceNum != 0 ? 'red' : 'green'">
             {{ maskForm.errorAttendanceNum != 0 ? "异常" : "正常" }}
           </div>
         </el-form-item>
         <el-form-item label="老师考勤" v-if="maskForm.status != 'NOT_START'">
-          <div
-            class="inputStyle"
-            :class="
-              maskForm.signInStatusEnum == 1 && maskForm.signOutStatusEnum == 1
-                ? 'green'
-                : 'red'
-            "
-          >
+          <div class="inputStyle" :class="maskForm.signInStatusEnum == 1 && maskForm.signOutStatusEnum == 1
+            ? 'green'
+            : 'red'
+            ">
             {{
               maskForm.signInStatusEnum == 1 && maskForm.signOutStatusEnum == 1
-                ? "正常"
-                : "异常"
+              ? "正常"
+              : "异常"
             }}
           </div>
         </el-form-item>
         <el-form-item v-if="maskForm.school" label="教学点">
           {{ maskForm.school.name }}
           <el-tooltip content="查看教学点" :open-delay="0.5">
-            <i
-              @click="openLocation(maskForm.school)"
-              class="el-icon-map-location"
-              style="cursor: pointer"
-            ></i>
+            <i @click="openLocation(maskForm.school)" class="el-icon-map-location" style="cursor: pointer"></i>
           </el-tooltip>
         </el-form-item>
       </el-form>
 
       <el-tabs v-model.trim="activeName" type="card" @tab-click="handleClick">
-        <el-tab-pane
-          label="学员列表"
-          name="first"
-          v-if="permission('/teamCourseListDetailStudnetList')"
-        >
+        <el-tab-pane label="学员列表" name="first" v-if="permission('/teamCourseListDetailStudnetList')">
           <div v-if="activeName == 'first'">
-            <studentRollCall
-              :courseScheduleId="maskForm.id"
-              :isMainGo="isMainGo"
-            ></studentRollCall>
+            <studentRollCall :courseScheduleId="maskForm.id" :isMainGo="isMainGo"></studentRollCall>
           </div>
         </el-tab-pane>
 
-        <el-tab-pane
-          label="老师列表"
-          name="second"
-          v-if="permission('/teamCourseListDetailTeacherList')"
-        >
+        <el-tab-pane label="老师列表" name="second" v-if="permission('/teamCourseListDetailTeacherList')">
           <div v-if="activeName == 'second'">
-            <teacherList
-              :courseScheduleId="maskForm.id"
-              :teachMode="maskForm.teachMode"
-              :courseStatus="maskForm.status"
-              @syncTeacherAttend="syncTeacherAttend"
-            ></teacherList>
+            <teacherList :courseScheduleId="maskForm.id" :teachMode="maskForm.teachMode" :courseStatus="maskForm.status"
+              @syncTeacherAttend="syncTeacherAttend"></teacherList>
           </div>
         </el-tab-pane>
 
-        <el-tab-pane
-          label="训练"
-          name="third"
-          v-if="permission('/teamCourseListDetailWorkList') && maskForm.status == 'OVER'"
-        >
+        <el-tab-pane label="训练" name="third"
+          v-if="permission('/teamCourseListDetailWorkList') && maskForm.status == 'OVER'">
           <div v-if="activeName == 'third'">
-            <studentWork
-              :courseScheduleId="maskForm.id"
-              v-if="maskForm.versionTag == 'v1'"
-            ></studentWork>
+            <studentWork :courseScheduleId="maskForm.id" v-if="maskForm.versionTag == 'v1'"></studentWork>
             <studentWorks :courseScheduleId="maskForm.id" v-else></studentWorks>
           </div>
         </el-tab-pane>
-        <el-tab-pane
-          label="评论"
-          name="four"
-          v-if="permission('/teamCourseListDetailCommentList')"
-        >
+        <el-tab-pane label="评论" name="four" v-if="permission('/teamCourseListDetailCommentList')">
           <div v-if="activeName == 'four'">
             <courseEvaluate :courseScheduleId="maskForm.id"></courseEvaluate>
           </div>
         </el-tab-pane>
-        <el-tab-pane
-          label="调整记录"
-          v-if="permission('/teamCourseListDetailAdjust')"
-          name="five"
-        >
+        <el-tab-pane label="调整记录" v-if="permission('/teamCourseListDetailAdjust')" name="five">
           <div v-if="activeName == 'five'">
             <infoMsg :courseScheduleId="maskForm.id"></infoMsg>
           </div>
@@ -471,96 +314,42 @@
       </el-tabs>
     </el-dialog>
     <el-dialog :visible.sync="show" width="400px" title="课程调整">
-      <resetClass
-        :show="show"
-        v-if="show"
-        @closeReset="closeReset"
-        @getList="getList"
-        :id="id"
-      />
+      <resetClass :show="show" v-if="show" @closeReset="closeReset" @getList="getList" :id="id" />
     </el-dialog>
     <el-dialog title="查看教学点" :visible.sync="locationVisible">
-      <school-location
-        v-if="maskForm.school"
-        :longitudeLatitude="maskForm.school.longitudeLatitude"
-        :address="maskForm.school.address"
-      />
+      <school-location v-if="maskForm.school" :longitudeLatitude="maskForm.school.longitudeLatitude"
+        :address="maskForm.school.address" />
     </el-dialog>
     <el-dialog title="更多选项" :visible.sync="showMove" v-if="showMove" width="700px">
-      <el-form
-        :inline="true"
-        class="searchForm"
-        @submit="search"
-        @reset="reset"
-        ref="searchForm2"
-        :model.sync="searchForm"
-        label-width="120px"
-      >
+      <el-form :inline="true" class="searchForm" @submit="search" @reset="reset" ref="searchForm2"
+        :model.sync="searchForm" label-width="120px">
         <el-form-item label="课程组编号/名称" prop="search">
-          <el-input
-            style="width: 180px !important"
-            v-model.trim="searchForm.search"
-            clearable
-            placeholder="课程组编号/课程名称"
-          />
+          <el-input style="width: 180px !important" v-model.trim="searchForm.search" clearable placeholder="课程组编号/课程名称" />
         </el-form-item>
         <el-form-item label="教学点" prop="schoolId">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.schoolId"
-            clearable
-            filterable
-            placeholder="请选择教学点"
-          >
-            <el-option
-              v-for="(item, index) in selects.schools"
-              :key="index"
-              :value="item.id"
-              :label="item.name"
-            ></el-option>
+          <el-select style="width: 180px !important" v-model.trim="searchForm.schoolId" clearable filterable
+            placeholder="请选择教学点">
+            <el-option v-for="(item, index) in selects.schools" :key="index" :value="item.id"
+              :label="item.name"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="分部" prop="organIdList">
-          <el-select
-            style="width: 180px !important"
-            class="multiple"
-            v-model.trim="searchForm.organIdList"
-            filterable
-            clearable
-            placeholder="请选择分部"
-          >
-            <el-option
-              v-for="(item, index) in selects.branchs"
-              :key="index"
-              :label="item.name"
-              :value="item.id"
-            ></el-option>
+          <el-select style="width: 180px !important" class="multiple" v-model.trim="searchForm.organIdList" filterable
+            clearable placeholder="请选择分部">
+            <el-option v-for="(item, index) in selects.branchs" :key="index" :label="item.name"
+              :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="课程组类型" prop="groupType">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.groupType"
-            clearable
-            filterable
-            placeholder="课程组类型"
-          >
-            <el-option
-              v-for="item in courseListType"
-              :key="item.value"
-              :value="item.value"
-              :label="item.label"
-            ></el-option>
+          <el-select style="width: 180px !important" v-model.trim="searchForm.groupType" clearable filterable
+            placeholder="课程组类型">
+            <el-option v-for="item in courseListType" :key="item.value" :value="item.value"
+              :label="item.label"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="教学模式" prop="teachMode">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.teachMode"
-            clearable
-            filterable
-            placeholder="教学模式"
-          >
+          <el-select style="width: 180px !important" v-model.trim="searchForm.teachMode" clearable filterable
+            placeholder="教学模式">
             <el-option label="线上课" value="ONLINE"></el-option>
             <el-option label="线下课" value="OFFLINE"></el-option>
           </el-select>
@@ -579,90 +368,45 @@
           </el-select>
         </el-form-item> -->
         <el-form-item label="合并课类型" prop="mergeCourseType">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.mergeCourseType"
-            clearable
-            filterable
-            placeholder="合并课程类型"
-          >
-            <el-option
-              v-for="(item, index) in mergeCourseTypeOptions"
-              :key="index"
-              :value="item.value"
-              :label="item.label"
-            ></el-option>
+          <el-select style="width: 180px !important" v-model.trim="searchForm.mergeCourseType" clearable filterable
+            placeholder="合并课程类型">
+            <el-option v-for="(item, index) in mergeCourseTypeOptions" :key="index" :value="item.value"
+              :label="item.label"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="老师类型" prop="teachType">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.teachType"
-            clearable
-            filterable
-            placeholder="老师类型"
-          >
-            <el-option
-              v-for="item in workTypeOptions"
-              :key="item.label"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
+          <el-select style="width: 180px !important" v-model.trim="searchForm.teachType" clearable filterable
+            placeholder="老师类型">
+            <el-option v-for="item in workTypeOptions" :key="item.label" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="是否点名" prop="isCallNames">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.isCallNames"
-            clearable
-            filterable
-            placeholder="是否点名"
-          >
+          <el-select style="width: 180px !important" v-model.trim="searchForm.isCallNames" clearable filterable
+            placeholder="是否点名">
             <el-option label="是" value="1"></el-option>
             <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="云教练课程" prop="memberFlag">
-          <el-select
-            style="width: 180px !important"
-            v-model.trim="searchForm.memberFlag"
-            clearable
-            filterable
-            placeholder="云教练课程"
-          >
+          <el-select style="width: 180px !important" v-model.trim="searchForm.memberFlag" clearable filterable
+            placeholder="云教练课程">
             <el-option label="是" value="1"></el-option>
             <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="创建日期" prop="creatTimer">
-          <el-date-picker
-            v-model.trim="searchForm.creatTimer"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="-"
-            start-placeholder="创建开始日期"
-            end-placeholder="创建结束日期"
-            :picker-options="{
+          <el-date-picker v-model.trim="searchForm.creatTimer" type="daterange" value-format="yyyy-MM-dd"
+            range-separator="-" start-placeholder="创建开始日期" end-placeholder="创建结束日期" :picker-options="{
               firstDayOfWeek: 1,
-            }"
-          ></el-date-picker>
+            }"></el-date-picker>
         </el-form-item>
         <el-form-item label="课程时间" prop="courseTime">
-          <el-time-picker
-            is-range
-            :picker-options="{
-              selectableRange: '06:00:00 - 23:59:59',
-            }"
-            style="width: 350px !important"
-            v-model="searchForm.courseTime"
-            range-separator="-"
-            start-placeholder="上课开始时间"
-            end-placeholder="上课结束时间"
-            placeholder="选择时间范围"
-            value-format="HH:mm:ss"
-            format="HH:mm"
-            @change="changeCourseTime"
-          >
+          <el-time-picker is-range :picker-options="{
+            selectableRange: '06:00:00 - 23:59:59',
+          }" style="width: 350px !important" v-model="searchForm.courseTime" range-separator="-"
+            start-placeholder="上课开始时间" end-placeholder="上课结束时间" placeholder="选择时间范围" value-format="HH:mm:ss"
+            format="HH:mm" @change="changeCourseTime">
           </el-time-picker>
         </el-form-item>
       </el-form>
@@ -672,16 +416,9 @@
       </span>
     </el-dialog>
 
-    <addCompound
-      ref="addCompound"
-      :compoundList="deleteList"
-      v-if="permission('courseSchedule/courseMerge')"
-      v-show="deleteList.length > 0"
-      @clearCom="clearCom"
-      @getList="getList"
-      @removeCourse="removeCourse"
-      @cancleCompound="cancleCompound"
-    />
+    <addCompound ref="addCompound" :compoundList="deleteList" v-if="permission('courseSchedule/courseMerge')"
+      v-show="deleteList.length > 0" @clearCom="clearCom" @getList="getList" @removeCourse="removeCourse"
+      @cancleCompound="cancleCompound" />
   </div>
 </template>
 <script>
@@ -1025,7 +762,7 @@ export default {
               load.endLoading();
             });
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     getList() {
       if (!this.getSearchForm()) {
@@ -1113,7 +850,7 @@ export default {
             }
           });
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     cancleMore() {
       // this.$refs.searchForm2.resetFields()
@@ -1175,7 +912,7 @@ export default {
             }
           });
         })
-        .catch(() => {});
+        .catch(() => { });
     },
     handleSelectionChange(arr) {
       // this.deleteList = arr;
@@ -1271,23 +1008,29 @@ export default {
 .courseRed {
   color: #808080;
 }
+
 .courseYellow {
   color: #ff802c;
 }
+
 .coruseGreen {
   color: #01c1b5;
 }
+
 .visible {
   visibility: hidden;
 }
+
 .cl-container {
   .topFrom {
     margin: 20px 30px 0;
+
     .classlist {
       display: flex;
       flex-direction: row;
       justify-content: flex-start;
       align-items: center;
+
       ul {
         li {
           list-style: none;
@@ -1295,24 +1038,30 @@ export default {
       }
     }
   }
+
   .searchForm {
     margin: 0 30px;
   }
 }
+
 .btnWraps {
   display: flex;
   flex-direction: row;
   justify-content: flex-start;
+
   div {
     margin-right: 20px;
   }
 }
+
 .inputStyle {
   width: 180px;
 }
+
 .red {
   color: red;
 }
+
 .green {
   color: var(--color-primary);
 }
@@ -1320,6 +1069,7 @@ export default {
 .exportBtn {
   background: var(--color-primary);
 }
+
 .newBand {
   margin-top: 30px;
 }

+ 2 - 1
src/views/vipClass/vipDetail/components/fnanceInfo.vue

@@ -162,7 +162,8 @@ export default {
         page: this.rules.page,
         rows: this.rules.limit,
         startTime: this.searchForm.time[0] || null,
-        endTime: this.searchForm.time[1] || null
+        endTime: this.searchForm.time[1] || null,
+        groupType: 'VIP'
       }).then(res => {
         if (res.code == 200) {
           this.tableList = res.data.pageInfo.rows;

+ 47 - 41
src/views/vipClass/vipDetail/components/teacherRecord.vue

@@ -1,4 +1,4 @@
-<template >
+<template>
   <div>
     <!-- 头部展示 -->
     <statistic>
@@ -21,7 +21,7 @@
     </statistic>
     <!-- 搜索标题 -->
     <save-form
-      save-key='vipDetail-record'
+      save-key="vipDetail-record"
       :inline="true"
       label-position="right"
       label-width="120px"
@@ -60,7 +60,7 @@
           start-placeholder="课程开始日期"
           end-placeholder="课程结束日期"
           :picker-options="{
-            firstDayOfWeek: 1,
+            firstDayOfWeek: 1
           }"
         >
         </el-date-picker>
@@ -71,7 +71,10 @@
     </save-form>
     <!-- 列表 -->
     <div class="tableWrap">
-      <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
         <el-table-column align="center" label="课程编号" prop="id">
         </el-table-column>
         <el-table-column
@@ -150,8 +153,8 @@
               <el-button
                 v-if="
                   scope.row.status == 'OVER' &&
-                  !scope.row.isSalary &&
-                  permission('teacherAttendance/updateTeacherAttendance/3361')
+                    !scope.row.isSalary &&
+                    permission('teacherAttendance/updateTeacherAttendance/3361')
                 "
                 type="text"
                 @click="onMarkAttendance(scope.row)"
@@ -160,7 +163,7 @@
               <el-button
                 v-if="
                   scope.row.status == 'OVER' &&
-                  permission('studentAttendance/updateStudentAttendances')
+                    permission('studentAttendance/updateStudentAttendances')
                 "
                 type="text"
                 @click="onCallName(scope.row)"
@@ -174,7 +177,7 @@
       </el-table>
     </div>
     <pagination
-      save-key='vipDetail-record'
+      save-key="vipDetail-record"
       sync
       :total.sync="rules.total"
       :page.sync="rules.page"
@@ -296,7 +299,10 @@
     </el-dialog>
 
     <el-dialog title="点名表" width="800px" :visible.sync="rollCall.status">
-      <el-table :data="rollCall.gridData" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+      <el-table
+        :data="rollCall.gridData"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
         <el-table-column
           align="center"
           property="userName"
@@ -364,12 +370,12 @@ import { getSchool } from "@/api/systemManage";
 import {
   findVipGroupTeachingRecord,
   getStudyStudents,
-  resetVipClass,
+  resetVipClass
 } from "@/api/vipSeting";
 import {
   findAttendanceStudentByCourseWithPage,
   updateStudentAttendances,
-  updateTeacherAttendance,
+  updateTeacherAttendance
 } from "@/api/buildTeam";
 import { permission } from "@/utils/directivePage";
 export default {
@@ -380,7 +386,7 @@ export default {
       searchForm: {
         type: "",
         status: "",
-        time: [],
+        time: []
       },
       searchLsit: [],
       tableList: [],
@@ -399,26 +405,26 @@ export default {
         endTime: "",
         status: "",
         type: "",
-        cooperation: "",
+        cooperation: ""
       },
       markAttendance: {
         // 考勤状态
         status: false,
-        dataInfo: {},
+        dataInfo: {}
       },
       activeId: "",
       activeRow: null, //
       maskrules: {
         date: [{ required: true, message: "请选择修改日期", trigger: "blur" }],
         startTime: [{ required: true, message: "请选择开始", trigger: "blur" }],
-        endTime: [{ required: true, message: "请选择结束", trigger: "blur" }],
+        endTime: [{ required: true, message: "请选择结束", trigger: "blur" }]
       },
       rules: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       rollCall: {
         // 点名表
@@ -428,8 +434,8 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
     };
   },
   mounted() {
@@ -446,7 +452,7 @@ export default {
       // 获取vip教学记录
       this.getList();
       // 获取分部教学点
-      getSchool({ organId: null }).then((res) => {
+      getSchool({ organId: null }).then(res => {
         if (res.code == 200) {
           this.cooperationList = res.data;
         }
@@ -472,10 +478,11 @@ export default {
         rows: this.rules.limit,
         status: this.searchForm.status || null,
         teachMode: this.searchForm.type || null,
+        groupType: "VIP",
         startTime,
-        endTime,
+        endTime
       };
-      findVipGroupTeachingRecord(obj).then((res) => {
+      findVipGroupTeachingRecord(obj).then(res => {
         if (res.code == 200) {
           this.complaintsNum = res.data.baseInfo.complaintsNum;
           // 当前课数
@@ -494,9 +501,9 @@ export default {
       let params = {
         courseScheduleId: tempData.id,
         signInStatus: 1,
-        signOutStatus: 1,
+        signOutStatus: 1
       };
-      updateTeacherAttendance(params).then((res) => {
+      updateTeacherAttendance(params).then(res => {
         if (res.code == 200) {
           this.$message.success("补卡成功");
           this.markAttendance.status = false;
@@ -510,7 +517,7 @@ export default {
       // 补考勤
       this.markAttendance = {
         status: true,
-        dataInfo: item,
+        dataInfo: item
       };
     },
     onCallName(item) {
@@ -524,9 +531,9 @@ export default {
       let params = {
         page: rollCall.page,
         rows: rollCall.limit,
-        courseScheduleId: rollCall.selectItem.id,
+        courseScheduleId: rollCall.selectItem.id
       };
-      findAttendanceStudentByCourseWithPage(params).then((res) => {
+      findAttendanceStudentByCourseWithPage(params).then(res => {
         let result = res.data;
         rollCall.status = true;
         if (res.code == 200) {
@@ -542,11 +549,11 @@ export default {
         studentAttendances: [
           {
             userId: row.studentId,
-            status: type,
-          },
-        ],
+            status: type
+          }
+        ]
       };
-      updateStudentAttendances(params).then((res) => {
+      updateStudentAttendances(params).then(res => {
         if (res.code == 200) {
           this.$message.success("修改成功");
           row.status = type;
@@ -558,7 +565,7 @@ export default {
     },
     lookStudents(row) {
       let id = row.id;
-      getStudyStudents({ courseScheduleId: id }).then((res) => {
+      getStudyStudents({ courseScheduleId: id }).then(res => {
         if (res.code == 200) {
           this.studentList = res.data;
           this.studentVisible = true;
@@ -581,7 +588,7 @@ export default {
     },
     resetCourse() {
       // 点击弹窗效验
-      this.$refs["maskForm"].validate((valid) => {
+      this.$refs["maskForm"].validate(valid => {
         if (valid) {
           // 效验成功
           resetVipClass({
@@ -589,8 +596,8 @@ export default {
             classDate: this.maskForm.date,
             startClassTime: this.maskForm.date + " " + this.maskForm.startTime,
             endClassTime: this.maskForm.date + " " + this.maskForm.endTime,
-            schoolId: this.maskForm.cooperation,
-          }).then((res) => {
+            schoolId: this.maskForm.cooperation
+          }).then(res => {
             if (res.code == 200) {
               this.$message.success("调整成功");
               this.getList();
@@ -602,7 +609,7 @@ export default {
           });
         }
       });
-    },
+    }
   },
   filters: {
     fitterisSalary(val) {
@@ -632,19 +639,18 @@ export default {
         return val;
       }
     },
-    studentCallName: (value) => {
+    studentCallName: value => {
       let template = {
         NORMAL: "到课",
         TRUANT: "未到",
         LEAVE: "请假",
         DROP_OUT: "退学",
         LATE: "迟到",
-        "": "未到",
+        "": "未到"
       };
       return template[value];
-    },
-  },
+    }
+  }
 };
 </script>
-<style lang="scss" scope>
-</style>
+<style lang="scss" scope></style>

+ 43 - 43
src/views/vipClass/vipDetail/components/vipBaseInfo.vue

@@ -91,7 +91,7 @@ import {
   getVipGroupDetail,
   findVipGroupStudents,
   leaveSchool,
-  updateVipBaseInfo,
+  updateVipBaseInfo
 } from "@/api/vipSeting";
 export default {
   props: ["vipDetail"],
@@ -108,17 +108,17 @@ export default {
         onlineClass: "", //线上课数
         offlineClass: "", //线下课数
         startTime: "", // 报名开始时间
-        endTime: "",
+        endTime: ""
       },
       rightForm: {
         allClass: "",
         onlineClass: "",
         offlineClass: "",
         allPrice: "",
-        progress: "",
+        progress: ""
       },
       tableList: [],
-      isreset: false,
+      isreset: false
     };
   },
   mounted() {
@@ -132,13 +132,13 @@ export default {
 
       // 根据id 获取vip学员
       this.getStudents();
-      this.getVipGroupDetail()
+      this.getVipGroupDetail();
     },
     getVipGroupDetail() {
       let id = this.$route.query.id;
-        getVipGroupDetail({ vipGroupId: id }).then((res) => {
-          if (res.code == 200) {
-            /**
+      getVipGroupDetail({ vipGroupId: id }).then(res => {
+        if (res.code == 200) {
+          /**
            *  teacherCount: '',
           subject: '', // 科目名称
           active: '', // 活动名称
@@ -151,44 +151,44 @@ export default {
           startTime: '', // 报名开始时间
            *
            */
-            this.topForm.teacherCount = res.data.userName;
-            this.topForm.educationalTeacherName =
-              res.data.educationalTeacherName;
-            this.topForm.subject = res.data.subjectName; //科目名称
-            this.topForm.active = res.data.vipGroupActivityName;
-            this.topForm.status = res.data.categoryName;
-            this.topForm.classNum = res.data.studentNum;
-
-            // totalClassTimes; 总课时数
-            this.topForm.classTime = res.data.singleClassMinutes;
-            //  教学点
-            this.topForm.address = res.data.teacherSchoolName;
-            this.topForm.onlineClass = res.data.onlineClassesNum;
-            this.topForm.offlineClass = res.data.offlineClassesNum;
-            // endTime
-            this.topForm.startTime = res.data.registrationStartTime;
-            this.topForm.endTime = res.data.paymentExpireDate;
-            this.rightForm.allClass = res.data.totalClassTimes;
-            this.rightForm.onlineClass = res.data.onlineClassesUnitPrice;
-            this.rightForm.offlineClass = res.data.offlineClassesUnitPrice;
-            this.rightForm.allPrice = res.data.totalPrice;
-            this.rightForm.progress =
-              res.data.currentClassTimes + "/" + res.data.totalClassTimes;
+          this.topForm.teacherCount = res.data.userName;
+          this.topForm.educationalTeacherName = res.data.educationalTeacherName;
+          this.topForm.subject = res.data.subjectName; //科目名称
+          this.topForm.active = res.data.vipGroupActivityName;
+          this.topForm.status = res.data.categoryName;
+          this.topForm.classNum = res.data.studentNum;
 
-          }
-        });
+          // totalClassTimes; 总课时数
+          this.topForm.classTime = res.data.singleClassMinutes;
+          //  教学点
+          this.topForm.address = res.data.teacherSchoolName;
+          this.topForm.onlineClass = res.data.onlineClassesNum;
+          this.topForm.offlineClass = res.data.offlineClassesNum;
+          // endTime
+          this.topForm.startTime = res.data.registrationStartTime;
+          this.topForm.endTime = res.data.paymentExpireDate;
+          this.rightForm.allClass = res.data.totalClassTimes;
+          this.rightForm.onlineClass = res.data.onlineClassesUnitPrice;
+          this.rightForm.offlineClass = res.data.offlineClassesUnitPrice;
+          this.rightForm.allPrice = res.data.totalPrice;
+          this.rightForm.progress =
+            res.data.currentClassTimes + "/" + res.data.totalClassTimes;
+        }
+      });
     },
     getStudents() {
-      findVipGroupStudents({ vipGroupId: this.id }).then((res) => {
-        if (res.code == 200) {
-          this.tableList = res.data.rows;
+      findVipGroupStudents({ vipGroupId: this.id, groupType: "VIP" }).then(
+        res => {
+          if (res.code == 200) {
+            this.tableList = res.data.rows;
+          }
         }
-      });
+      );
     },
     leaveSchool(scope) {
       let studentId = scope.row.id;
       let vipGroupId = this.id;
-      leaveSchool({ studentId, vipGroupId }).then((res) => {
+      leaveSchool({ studentId, vipGroupId }).then(res => {
         if (res.code == 200) {
           this.$message.success("退学成功");
           scope._self.$refs[scope.$index].doClose();
@@ -210,18 +210,18 @@ export default {
       updateVipBaseInfo({
         id: this.id,
         onlineClassesUnitPrice,
-        offlineClassesUnitPrice,
-      }).then((res) => {
+        offlineClassesUnitPrice
+      }).then(res => {
         if (res.code == 200) {
           this.$message.success("修改成功");
           this.isreset = false;
-          this.$emit('getVipGroupDetail')
+          this.$emit("getVipGroupDetail");
           // this.getVipGroupDetail(this.id);
         }
       });
-    },
+    }
   },
-  watch:{
+  watch: {
     // vipDetail(val){
     //   if(val){
     //     this.getVipGroupDetail();

+ 82 - 82
src/views/vipClass/vipDetail/components/vipStudentList.vue

@@ -174,16 +174,14 @@
             </div>
           </template>
         </el-table-column>
-                <el-table-column
+        <el-table-column
           label="剩余排课数"
           align="center"
           prop="totalClassTimes"
         >
-        <template slot-scope="scope">
-          <div>
-            {{scope.row.totalClassTimes}}节
-          </div>
-        </template>
+          <template slot-scope="scope">
+            <div>{{ scope.row.totalClassTimes }}节</div>
+          </template>
         </el-table-column>
         <el-table-column prop="studentId" label="线上课单价">
           <!--    v-if="activeStudent == scope.row.id" 202109/10跟辜经理确认过所有乐理课也不能改钱-->
@@ -327,7 +325,7 @@
               :picker-options="{
                 start: '04:30',
                 step: '00:05',
-                end: '23:55',
+                end: '23:55'
               }"
             >
             </el-time-select>
@@ -390,7 +388,7 @@ import {
   recoverForStudent,
   findTeacherWithVipGroupOrganAndSubject,
   vipGroupManageUpdate,
-  getVipGroupDetail,
+  getVipGroupDetail
 } from "@/api/vipSeting";
 import { permission } from "@/utils/directivePage";
 export default {
@@ -399,12 +397,12 @@ export default {
     return {
       expireVisible: false,
       expireForm: {
-        coursesExpireDate: "",
+        coursesExpireDate: ""
       },
       expireRules: {
         coursesExpireDate: [
-          { required: true, message: "请选择课程结束时间", trigger: "blur" },
-        ],
+          { required: true, message: "请选择课程结束时间", trigger: "blur" }
+        ]
       },
       adjustmentVisible: false,
       tableList: [],
@@ -416,11 +414,11 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       activeStudent: "",
       maskForm: {
-        search: "",
+        search: ""
       },
       adjustmentForm: {
         count: "",
@@ -431,7 +429,7 @@ export default {
         fee: "",
         teacher: "",
 
-        expireDate: "",
+        expireDate: ""
       },
       adjustmentRules: {
         courseTime: [{ required: true, message: "请选择开始时间" }],
@@ -440,7 +438,7 @@ export default {
         fee: [{ required: true, message: "请输入费用" }],
         teacher: [{ required: true, message: "请选择老师" }],
 
-        expireDate: [{ required: true, message: "请输入有效期截止" }],
+        expireDate: [{ required: true, message: "请输入有效期截止" }]
       },
       weekDateList: [
         { value: "1", label: "星期一" },
@@ -449,26 +447,26 @@ export default {
         { value: "4", label: "星期四" },
         { value: "5", label: "星期五" },
         { value: "6", label: "星期六" },
-        { value: "7", label: "星期日" },
+        { value: "7", label: "星期日" }
       ],
       weekList: [
         {
           dayOfWeek: "",
           startTime: "",
           endTime: "",
-          moid: new Date().getTime(),
-        },
+          moid: new Date().getTime()
+        }
       ],
       pickerOptions: {
         firstDayOfWeek: 1,
         disabledDate(time) {
           return time.getTime() + 86400000 <= new Date().getTime();
-        },
+        }
       },
       teacherList: [],
       vipDetail: {},
       deleteList: [],
-      isDetele: false,
+      isDetele: false
     };
   },
   mounted() {
@@ -488,13 +486,13 @@ export default {
       this.rules.page = 1;
       this.getStudents();
       findTeacherWithVipGroupOrganAndSubject({ vipGroupId: this.id }).then(
-        (res) => {
+        res => {
           if (res.code == 200) {
             this.teacherList = res.data;
           }
         }
       );
-      getVipGroupDetail({ vipGroupId: id }).then((res) => {
+      getVipGroupDetail({ vipGroupId: id }).then(res => {
         if (res.code == 200) {
           this.vipDetail = res.data;
         }
@@ -511,15 +509,17 @@ export default {
       this.getList();
     },
     getStudents() {
-      findVipGroupStudents({ vipGroupId: this.id }).then((res) => {
-        if (res.code == 200) {
-          this.tableList = res.data.rows;
-          for (let i in this.tableList) {
-            this.tableList[i].fee = 0;
-            this.tableList[i].visible = false;
+      findVipGroupStudents({ vipGroupId: this.id, groupType: "VIP" }).then(
+        res => {
+          if (res.code == 200) {
+            this.tableList = res.data.rows;
+            for (let i in this.tableList) {
+              this.tableList[i].fee = 0;
+              this.tableList[i].visible = false;
+            }
           }
         }
-      });
+      );
     },
     // 删除循环周
     removeWeek(item) {
@@ -533,7 +533,7 @@ export default {
       let studentId = scope.row.id;
       let vipGroupId = this.id;
       let amount = scope.row.fee;
-      leaveSchool({ studentId, vipGroupId, amount }).then((res) => {
+      leaveSchool({ studentId, vipGroupId, amount }).then(res => {
         if (res.code == 200) {
           this.$message.success("退学成功");
           this.getStudents();
@@ -541,14 +541,14 @@ export default {
         if (res.code == 206) {
           this.$confirm(res.msg, "提示", {
             confirmButtonText: "确定",
-            cancelButtonText: "取消",
+            cancelButtonText: "取消"
           }).then(() => {
             leaveSchool({
               studentId,
               vipGroupId,
               amount,
-              confirmReturnActivityGive: true,
-            }).then((res) => {
+              confirmReturnActivityGive: true
+            }).then(res => {
               if (res.code == 200) {
                 this.$message.success("退学成功");
                 this.getStudents();
@@ -562,7 +562,7 @@ export default {
       this.$confirm(`确定是否退学?`, "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           let id = scope.row.id;
@@ -571,8 +571,8 @@ export default {
           } else {
             getStudentSurplusCourseFee({
               studentId: id,
-              vipGroupId: this.id,
-            }).then((res) => {
+              vipGroupId: this.id
+            }).then(res => {
               if (res.code == 200) {
                 // this.$prompt("请输入退课金额", "提示", {
                 //   confirmButtonText: "确定",
@@ -595,22 +595,22 @@ export default {
                       class: "el-input__inner",
                       attrs: { value: res.data.suplusCourseFee },
                       on: {
-                        input: function (event) {
+                        input: function(event) {
                           scope.row.fee = event.target.value;
                           this.$emit("input", event.target.value);
-                        }.bind(this),
-                      },
+                        }.bind(this)
+                      }
                     }),
                     h(
                       "p",
                       { style: "color: red;marginTop:20px" },
                       "退费金额暂不进入账户余额"
-                    ),
+                    )
                   ]),
                   showCancelButton: true,
                   confirmButtonText: "确定",
-                  cancelButtonText: "取消",
-                }).then((action) => {
+                  cancelButtonText: "取消"
+                }).then(action => {
                   this.leaveSchool(scope);
                 });
               }
@@ -628,7 +628,7 @@ export default {
           {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
-            type: "warning",
+            type: "warning"
           }
         )
           .then(() => {
@@ -646,17 +646,17 @@ export default {
         organId: null,
         page: this.rules.page,
         rows: this.rules.limit,
-        search,
-      }).then((res) => {
+        search
+      }).then(res => {
         if (res.code == 200) {
           this.rules.total = res.data.total;
           this.maskStudentList = res.data.rows;
-          let idList = this.deleteList.map((course) => {
+          let idList = this.deleteList.map(course => {
             return course.id;
           });
           this.isDetele = true;
           this.$nextTick(() => {
-            this.maskStudentList.forEach((course) => {
+            this.maskStudentList.forEach(course => {
               if (idList.indexOf(course.id) != -1) {
                 this.$refs.maskStudentList.toggleRowSelection(course, true);
               }
@@ -664,15 +664,13 @@ export default {
             this.isDetele = false;
           });
 
-          this.maskStudentList.forEach((stu) => {
+          this.maskStudentList.forEach(stu => {
             stu.offlineClassesUnitPrice
               ? stu.offlineClassesUnitPrice
-              : (stu.offlineClassesUnitPrice =
-                  this.vipDetail?.offlineClassesUnitPrice);
+              : (stu.offlineClassesUnitPrice = this.vipDetail?.offlineClassesUnitPrice);
             stu.onlineClassesUnitPrice
               ? stu.onlineClassesUnitPrice
-              : (stu.onlineClassesUnitPrice =
-                  this.vipDetail?.onlineClassesUnitPrice);
+              : (stu.onlineClassesUnitPrice = this.vipDetail?.onlineClassesUnitPrice);
           });
           this.maskVisible = true;
         }
@@ -690,12 +688,12 @@ export default {
         if (this.isDetele) return;
         // 有2种 1是新页
         // 2是点击反选
-        let idList = this.deleteList.map((course) => {
+        let idList = this.deleteList.map(course => {
           return course.id;
         });
         this.$nextTick(() => {
           let tableIdList = [];
-          this.maskStudentList.forEach((course) => {
+          this.maskStudentList.forEach(course => {
             tableIdList.push(course.id);
             if (idList.indexOf(course.id) != -1) {
               this.$refs.maskStudentList.toggleRowSelection(course, false);
@@ -704,7 +702,7 @@ export default {
           });
           this.deleteList = this.$helpers.lodash.remove(
             this.deleteList,
-            function (item) {
+            function(item) {
               return tableIdList.indexOf(item.id) == -1;
             }
           );
@@ -715,7 +713,7 @@ export default {
       }
     },
     onTableSelect(rows, row) {
-      let idList = this.deleteList.map((course) => {
+      let idList = this.deleteList.map(course => {
         return course.id;
       });
       if (idList.indexOf(row.id) != -1) {
@@ -743,13 +741,13 @@ export default {
         return;
       }
       let str = "";
-      let arr = this.deleteList.map((stu) => {
+      let arr = this.deleteList.map(stu => {
         str += stu.userName + ",";
         return {
           vipGroupId: this.id,
           studentId: stu.id,
           offlineClassesUnitPrice: stu.offlineClassesUnitPrice,
-          onlineClassesUnitPrice: stu.onlineClassesUnitPrice,
+          onlineClassesUnitPrice: stu.onlineClassesUnitPrice
         };
       });
       str = str.slice(0, str.length - 1);
@@ -777,10 +775,10 @@ export default {
       this.$confirm(`是否将${str}加入课程组?`, "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
-        .then(async (res) => {
-          addVipGroupStudents(arr).then((res) => {
+        .then(async res => {
+          addVipGroupStudents(arr).then(res => {
             if (res.code == 200) {
               this.$message.success("添加成功");
               this.getStudents();
@@ -788,7 +786,7 @@ export default {
             }
           });
         })
-        .catch((e) => {
+        .catch(e => {
           console.log(e);
         });
     },
@@ -796,14 +794,14 @@ export default {
       this.$confirm("是否休学?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           // 发请求 申请休学
           vipPauseForStudent({
             vipGroupId: this.id,
-            studentId: scope.row.id,
-          }).then((res) => {
+            studentId: scope.row.id
+          }).then(res => {
             if (res.code == 200) {
               this.$message.success("休学成功");
               this.getStudents();
@@ -815,8 +813,8 @@ export default {
     recoveryCourse(scope) {
       getStudentPauseInfo({
         studentId: scope.row.id,
-        vipGroupId: this.id,
-      }).then((res) => {
+        vipGroupId: this.id
+      }).then(res => {
         if (res.code == 200) {
           if (res.data.isPause == 0) {
             // vip状态没暂停 不需要排课
@@ -825,20 +823,20 @@ export default {
             this.$msgbox({
               title: "提示",
               message: h("p", null, [
-                h("p", null, "将按照当前剩余课时安排上课"),
+                h("p", null, "将按照当前剩余课时安排上课")
                 // h("span", null, `排课截至时间:`),
                 // h("span", { style: "color: red" }, `${res.data.expireDate}`), 辜经理同意注释
               ]),
               confirmButtonText: "确定",
               cancelButtonText: "取消",
-              showCancelButton: true,
+              showCancelButton: true
             })
               .then(() => {
                 // 发请求 恢复上课
                 recoverForStudent({
                   vipGroupId: this.id,
-                  userId: scope.row.id,
-                }).then((res) => {
+                  userId: scope.row.id
+                }).then(res => {
                   if (res.code == 200) {
                     this.adjustmentVisible = false;
                     this.getStudents();
@@ -850,7 +848,9 @@ export default {
             this.activeStudent = res.data.studentId;
             this.adjustmentVisible = true;
             this.adjustmentForm.teacher = res.data.teacherId;
-            this.adjustmentForm.count = `${res.data.totalCourseTimes}+${res.data.giveCourseTimes}`;
+            this.adjustmentForm.count = `${res.data.totalCourseTimes}+${
+              res.data.giveCourseTimes
+            }`;
             this.adjustmentForm.expireDate = res.data.expireDate;
           }
         }
@@ -877,7 +877,7 @@ export default {
         dayOfWeek: "",
         startClassTime: "",
         endClassTime: "",
-        id: new Date(),
+        id: new Date()
       });
     },
     submieRecover() {
@@ -885,7 +885,7 @@ export default {
         this.$message.error("排课循环次数不能为空");
         return;
       }
-      this.$refs["adjustmentForm"].validate((res) => {
+      this.$refs["adjustmentForm"].validate(res => {
         if (res) {
           // 发请求
           let obj = {};
@@ -897,7 +897,7 @@ export default {
           obj.courseTimes = this.weekList;
           obj.vipGroupId = this.id;
           obj.expireDate = this.adjustmentForm.expireDate;
-          recoverForStudent(obj).then((res) => {
+          recoverForStudent(obj).then(res => {
             if (res.code == 200) {
               this.adjustmentVisible = false;
               this.getStudents();
@@ -910,12 +910,12 @@ export default {
       this.activeStudent;
     },
     submitExpireDate() {
-      this.$refs.expireForm.validate((some) => {
+      this.$refs.expireForm.validate(some => {
         if (some) {
           vipGroupManageUpdate({
             id: this.id,
-            coursesExpireDate: this.expireForm.coursesExpireDate,
-          }).then((res) => {
+            coursesExpireDate: this.expireForm.coursesExpireDate
+          }).then(res => {
             if (res.code == 200) {
               this.$message.success("有效期修改成功");
               this.expireVisible = false;
@@ -928,7 +928,7 @@ export default {
           return;
         }
       });
-    },
+    }
   },
   watch: {
     maskVisible(val) {
@@ -939,11 +939,11 @@ export default {
           limit: 10, // 限制显示条数
           page: 1, // 当前页
           total: 0, // 总条数
-          page_size: [10, 20, 40, 50], // 选择限制显示条数
+          page_size: [10, 20, 40, 50] // 选择限制显示条数
         };
       }
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 68 - 71
src/views/vipClass/vipList.vue

@@ -111,7 +111,8 @@
       </save-form>
       <!-- 查询列表 -->
       <el-button
-        v-permission="'/buildVip'" @click="gotoBuildVip"
+        v-permission="'/buildVip'"
+        @click="gotoBuildVip"
         type="primary"
         style="margin-bottom:20px"
       >
@@ -126,7 +127,8 @@
         导出
       </el-button>
       <el-button
-        v-permission="'export/vipGroup'" @click="onStudentExport"
+        v-permission="'export/vipGroup'"
+        @click="onStudentExport"
         type="primary"
         style="margin-bottom:20px"
       >
@@ -220,8 +222,8 @@
                 <p>
                   {{
                     scope.row.currentClassTimes +
-                    "/" +
-                    scope.row.totalClassTimes
+                      "/" +
+                      scope.row.totalClassTimes
                   }}
                 </p>
               </div>
@@ -306,8 +308,8 @@
                   width="160"
                   v-if="
                     scope.row.status < 3 &&
-                    scope.row.enableDelete != 1 &&
-                    permission('vipGroupManage/stopVipGroup')
+                      scope.row.enableDelete != 1 &&
+                      permission('vipGroupManage/stopVipGroup')
                   "
                   :ref="scope.$index"
                 >
@@ -317,16 +319,10 @@
                     placeholder="请输入关闭原因"
                   ></el-input>
                   <div style="text-align: right; margin-top: 20px">
-                    <el-button
-
-                      type="text"
-                      @click="onCancelVip(scope)"
+                    <el-button type="text" @click="onCancelVip(scope)"
                       >取消</el-button
                     >
-                    <el-button
-                      type="primary"
-
-                      @click="closeVip(scope)"
+                    <el-button type="primary" @click="closeVip(scope)"
                       >确定</el-button
                     >
                   </div>
@@ -337,7 +333,7 @@
                   @click="onVipDelete(scope.row)"
                   v-if="
                     scope.row.enableDelete == 1 &&
-                    permission('vipGroupManage/deleteVipGroup')
+                      permission('vipGroupManage/deleteVipGroup')
                   "
                   >删除</el-button
                 >
@@ -355,8 +351,8 @@
                   type="text"
                   v-if="
                     scope.row.vipGroupCategoryName == '乐理课' &&
-                    permission('vipGroupManage/update') &&
-                    scope.row.status == 1
+                      permission('vipGroupManage/update') &&
+                      scope.row.status == 1
                   "
                   @click="isStartCourse(scope.row)"
                   >确认成课</el-button
@@ -385,7 +381,7 @@ import {
   vipGroupActivity,
   closeVip,
   vipGroupManageUpdate,
-  deleteVipGroup,
+  deleteVipGroup
 } from "@/api/vipSeting";
 import { getTeacher, getEmployeeOrgan } from "@/api/buildTeam";
 import store from "@/store";
@@ -405,7 +401,7 @@ export default {
         search: null,
         orgin: null,
         status: null,
-        hasEducationalTeacherId: null,
+        hasEducationalTeacherId: null
       },
       teacherList: [],
       activeList: [],
@@ -416,7 +412,7 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       statusList: [
         { lable: "未开始", value: "0" },
@@ -425,9 +421,9 @@ export default {
         { lable: "进行中", value: "2" },
         { lable: "已结束", value: "4" },
         { lable: "取消", value: "3" },
-        { lable: "暂停", value: "6" },
+        { lable: "暂停", value: "6" }
       ],
-      stopReason: null, // 停止原因
+      stopReason: null // 停止原因
     };
   },
   created() {},
@@ -443,7 +439,7 @@ export default {
   },
   methods: {
     init() {
-      getEmployeeOrgan().then((res) => {
+      getEmployeeOrgan().then(res => {
         if (res.code == 200) {
           this.organList = res.data;
         }
@@ -456,7 +452,7 @@ export default {
       //   }
       // });
       // 获取活动方案
-      vipGroupActivity({ organId: this.organId, rows: 9999 }).then((res) => {
+      vipGroupActivity({ organId: this.organId, rows: 9999 }).then(res => {
         if (res.code == 200) {
           this.activeList = res.data.rows;
         }
@@ -473,7 +469,7 @@ export default {
         activityId: null,
         search: null,
         orgin: null,
-        status: null,
+        status: null
       };
       this.getList();
     },
@@ -485,7 +481,8 @@ export default {
         this.searchForm.hasEducationalTeacherId || null;
       params.organId = this.searchForm.orgin || null;
       params.status = this.searchForm.status || null;
-      getVipList(params).then((res) => {
+      params.groupType = "VIP";
+      getVipList(params).then(res => {
         if (res.code == 200) {
           // this.tableData = [];
           setTimeout(() => {
@@ -508,18 +505,20 @@ export default {
       let startTimeStr = row.courseStartDate;
       this.$router.push({
         path: "/business/vipDetail",
-        query: {  id,
+        query: {
+          id,
           educationalTeacherId,
           organId,
           userId,
           name,
           endTimeStr,
-          startTimeStr,},
+          startTimeStr
+        }
       });
     },
     closeVip(scope) {
       let id = scope.row.id;
-      closeVip({ vipGroupId: id, stopReason: this.stopReason }).then((res) => {
+      closeVip({ vipGroupId: id, stopReason: this.stopReason }).then(res => {
         if (res.code == 200) {
           this.$message.success("停止课程成功");
           scope._self.$refs[scope.$index].doClose();
@@ -533,7 +532,7 @@ export default {
     },
     gotoBuildVip() {
       this.$router.push({
-        path: "/business/buildVip",
+        path: "/business/buildVip"
       });
     },
     onVIPCourseExport() {
@@ -544,7 +543,7 @@ export default {
         activityId: searchForm.activityId || null,
         organId: searchForm.orgin || null,
         status: searchForm.status || null,
-        search: searchForm.search || null,
+        search: searchForm.search || null
       };
       let url = "/api-web/export/vipGroupList";
       const options = {
@@ -555,36 +554,36 @@ export default {
         },
         params: data,
         url,
-        responseType: "blob",
+        responseType: "blob"
       };
       this.$confirm("您确定导出VIP课吗?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then((res) => {
+            .then(res => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8",
+                type: "application/vnd.ms-excel;charset=utf-8"
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
 
               let text = new Response(blob).text();
-              text.then((res) => {
+              text.then(res => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
-                  if(json.code == 403) {
-                    this.$message.error(`登录过期,请重新登录!`)
+                  if (json.code == 403) {
+                    this.$message.error(`登录过期,请重新登录!`);
                     setTimeout(() => {
-                      this.$store.dispatch('user/resetToken').then(() => {
-                        location.reload()
-                      })
+                      this.$store.dispatch("user/resetToken").then(() => {
+                        location.reload();
+                      });
                     }, 1000);
-                    return
+                    return;
                   }
                   this.$message.error(json.msg);
                 } else {
@@ -599,7 +598,7 @@ export default {
               });
               load.endLoading();
             })
-            .catch((error) => {
+            .catch(error => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
@@ -619,36 +618,36 @@ export default {
         },
         params: data,
         url,
-        responseType: "blob",
+        responseType: "blob"
       };
       this.$confirm("VIP课程续费提醒导出?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then((res) => {
+            .then(res => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8",
+                type: "application/vnd.ms-excel;charset=utf-8"
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
 
               let text = new Response(blob).text();
-              text.then((res) => {
+              text.then(res => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
-                  if(json.code == 403) {
-                    this.$message.error(`登录过期,请重新登录!`)
+                  if (json.code == 403) {
+                    this.$message.error(`登录过期,请重新登录!`);
                     setTimeout(() => {
-                      this.$store.dispatch('user/resetToken').then(() => {
-                        location.reload()
-                      })
+                      this.$store.dispatch("user/resetToken").then(() => {
+                        location.reload();
+                      });
                     }, 1000);
-                    return
+                    return;
                   }
                   this.$message.error(json.msg);
                 } else {
@@ -663,7 +662,7 @@ export default {
               });
               load.endLoading();
             })
-            .catch((error) => {
+            .catch(error => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
@@ -690,8 +689,8 @@ export default {
           userId,
           name,
           endTimeStr,
-          startTimeStr,
-        },
+          startTimeStr
+        }
       });
     },
     // 删除VIP
@@ -699,10 +698,10 @@ export default {
       this.$confirm("您确定删除该VIP课吗?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
-          deleteVipGroup({ vipGroupId: row.id }).then((res) => {
+          deleteVipGroup({ vipGroupId: row.id }).then(res => {
             if (res.code == 200) {
               this.$message.success("删除成功");
               this.getList();
@@ -719,20 +718,18 @@ export default {
       this.$confirm("确定开启乐理课", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
-          vipGroupManageUpdate({ id: row.id, status: "PROGRESS" }).then(
-            (res) => {
-              if (res.code == 200) {
-                this.$message.success("提交成功");
-                this.getList();
-              }
+          vipGroupManageUpdate({ id: row.id, status: "PROGRESS" }).then(res => {
+            if (res.code == 200) {
+              this.$message.success("提交成功");
+              this.getList();
             }
-          );
+          });
         })
         .catch(() => {});
-    },
+    }
   },
   filters: {
     formatterTime(val) {
@@ -752,11 +749,11 @@ export default {
         "取消",
         "已结束",
         "报名结束",
-        "暂停",
+        "暂停"
       ];
       return arr[val];
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 233 - 384
src/views/vipClass/vipReset.vue


+ 151 - 153
src/views/workBenchManager/journal/model/leave.vue

@@ -1,96 +1,93 @@
 <template>
-    <div>
-        <el-form ref="leaveForm"
-                 :model="leaveForm"
-                 class="leaveForm"
-                 label-width="100px">
-            <el-alert title="已拒绝" show-icon center v-if="leaveForm.status == 'REJECT'" :closable="false" class="alert" type="error"></el-alert>
-            <el-alert title="已同意" show-icon center v-if="leaveForm.status == 'PASS'" :closable="false" class="alert" type="success"></el-alert>
-            <el-form-item label="开始时间">
-                <el-input disabled v-model.trim="leaveForm.startTime"></el-input>
-            </el-form-item>
-            <el-form-item label="结束时间">
-                <el-input disabled v-model.trim="leaveForm.endTime"></el-input>
-            </el-form-item>
-            <el-form-item label="备注">
-                <el-input type="textarea" disabled v-model.trim="leaveForm.remark"></el-input>
-            </el-form-item>
-        </el-form>
-        <!-- vip -->
-        <el-table :data="vipCourse"
-                    style="width: 100%"
-                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-            <el-table-column label="编号" width="100px" prop="before.id"></el-table-column>
-            <el-table-column label="类型"
-                            width="100px">
-                <template slot-scope="scope">
-                    {{ scope.row.before.type == "VIP" ? 'VIP课' : '乐团课' }}
-                </template>
-            </el-table-column>
-            <el-table-column label="班名"
-                            width="140px">
-                <template slot-scope="scope">
-                    <tooltip :content="scope.row.before.name" />
-                </template>
-            </el-table-column>
-            <el-table-column label="调整前日期">
-                <template slot-scope="scope">
-                    {{ scope.row.before.classDate | formatTimer }}
-                    {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
-                </template>
-            </el-table-column>
-            <!-- <el-table-column label="调整前时间">
+  <div>
+    <el-form ref="leaveForm" :model="leaveForm" class="leaveForm" label-width="100px">
+      <el-alert title="已拒绝" show-icon center v-if="leaveForm.status == 'REJECT'" :closable="false" class="alert"
+        type="error"></el-alert>
+      <el-alert title="已同意" show-icon center v-if="leaveForm.status == 'PASS'" :closable="false" class="alert"
+        type="success"></el-alert>
+      <el-form-item label="开始时间">
+        <el-input disabled v-model.trim="leaveForm.startTime"></el-input>
+      </el-form-item>
+      <el-form-item label="结束时间">
+        <el-input disabled v-model.trim="leaveForm.endTime"></el-input>
+      </el-form-item>
+      <el-form-item label="备注">
+        <el-input type="textarea" disabled v-model.trim="leaveForm.remark"></el-input>
+      </el-form-item>
+    </el-form>
+    <!-- vip -->
+    <el-table :data="vipCourse" style="width: 100%" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+      <el-table-column label="编号" width="100px" prop="before.id"></el-table-column>
+      <el-table-column label="类型" width="100px">
+        <template slot-scope="scope">
+          {{ scope.row.before.type == "VIP" ? 'VIP课' : '乐团课' }}
+        </template>
+      </el-table-column>
+      <el-table-column label="班名" width="140px">
+        <template slot-scope="scope">
+          <tooltip :content="scope.row.before.name" />
+        </template>
+      </el-table-column>
+      <el-table-column label="调整前日期">
+        <template slot-scope="scope">
+          {{ scope.row.before.classDate | formatTimer }}
+          {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="调整前时间">
                 <template slot-scope="scope">
                     {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
                 </template>
             </el-table-column> -->
-            <el-table-column label="调整后日期">
-            <template slot-scope="scope"
-                        v-if="scope.row.before.type == 'VIP'">
-                {{ scope.row.after.classDate | formatTimer }}
-                {{ scope.row.after.startClassTime | getFormatTime(scope.row.after.endClassTime) }}
-            </template>
-            </el-table-column>
-            <!-- <el-table-column label="调整后时间">
+      <el-table-column label="调整后日期">
+        <template slot-scope="scope" v-if="scope.row.before.type == 'VIP'">
+          {{ scope.row.after.classDate | formatTimer }}
+          {{ scope.row.after.startClassTime | getFormatTime(scope.row.after.endClassTime) }}
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="调整后时间">
                 <template slot-scope="scope"
                             v-if="scope.row.before.type == 'VIP'">
                     {{ scope.row.after.startClassTime | getFormatTime(scope.row.after.endClassTime) }}
                 </template>
             </el-table-column> -->
-        </el-table>
+    </el-table>
 
-        <el-table :data="musicGroupCourse"
-                    style="width: 100%; padding-top: 10px;"
-                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-            <el-table-column label="乐团编号"
-                            prop="before.musicGroupId">
-            </el-table-column>
-            <el-table-column label="类型">
-            <template slot-scope="scope">
-                {{ scope.row.before.type == "VIP" ? 'VIP课' : '乐团课' }}
-            </template>
-            </el-table-column>
-            <el-table-column label="班名">
-                <template slot-scope="scope">
-                    <tooltip :content="scope.row.before.name" />
-                </template>
-            </el-table-column>
-            <el-table-column label="调整前日期">
-                <template slot-scope="scope">
-                    {{ scope.row.before.classDate | formatTimer }}
-                </template>
-            </el-table-column>
-            <el-table-column label="上课时间">
-                <template slot-scope="scope">
-                    {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
-                </template>
-            </el-table-column>
-        </el-table>
-        <div slot="footer" class="dialog-footer" v-if="leaveForm.status == 'ING'">
-            <el-button type="primary" v-permission="'teacherLeaveRecord/approve/confirm'" @click="onSubmit('leaveForm', 'PASS')">确 定</el-button>
-            <el-button type="danger" v-permission="'teacherLeaveRecord/approve'" @click="onSubmit('leaveForm', 'REJECT')">拒 绝</el-button>
-        </div>
+    <el-table :data="musicGroupCourse" style="width: 100%; padding-top: 10px;"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+      <el-table-column label="乐团编号" prop="before.musicGroupId">
+        <template slot-scope="scope">
+          {{ scope.row.before.type == 'LIVE' ? '' : scope.row.before.musicGroupId }}
+        </template>
+      </el-table-column>
+      <el-table-column label="类型">
+        <template slot-scope="scope">
+          {{ scope.row.before.type == "VIP" ? 'VIP课' : scope.row.before.type == 'LIVE' ? '直播课' : '乐团课' }}
+        </template>
+      </el-table-column>
+      <el-table-column label="班名">
+        <template slot-scope="scope">
+          <tooltip :content="scope.row.before.name" />
+        </template>
+      </el-table-column>
+      <el-table-column label="调整前日期">
+        <template slot-scope="scope">
+          {{ scope.row.before.classDate | formatTimer }}
+        </template>
+      </el-table-column>
+      <el-table-column label="上课时间">
+        <template slot-scope="scope">
+          {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <div slot="footer" class="dialog-footer" v-if="leaveForm.status == 'ING'">
+      <el-button type="primary" v-permission="'teacherLeaveRecord/approve/confirm'"
+        @click="onSubmit('leaveForm', 'PASS')">确 定</el-button>
+      <el-button type="danger" v-permission="'teacherLeaveRecord/approve'" @click="onSubmit('leaveForm', 'REJECT')">拒
+        绝</el-button>
     </div>
+  </div>
 </template>
 
 <script>
@@ -98,87 +95,88 @@ import { leaveQueryDetail, approve } from '@/api/journal'
 import Tooltip from '@/components/Tooltip'
 import dayjs from 'dayjs'
 export default {
-    props: ['dialogDetail'],
-    components: { Tooltip },
-    data() {
-        return {
-            leaveForm: {},
-            musicGroupCourse: [],
-            vipCourse: [],
-        }
-    },
-    mounted() {
-        this.__init()
-    },
-    methods: {
-        async __init() {
-            let { memo } = this.dialogDetail
-            memo = memo ? JSON.parse(memo) : null
-            if(!memo) { // 判断是否有参数
-                this.$message.error('参数有误')
-                return
-            }
-            await leaveQueryDetail({ id: memo.leaveRecordId }).then(res => {
-                let result = res.data
-                if (res.code == 200) {
-                    this.leaveForm = result
-                    let tempJson = result.coursesScheduleJson ? JSON.parse(result.coursesScheduleJson) : []
-                    let musicGroupCourse = []
-                    let vipCourse = []
-                    tempJson.forEach(item => {
-                        if (item.before.type == 'VIP') {
-                            vipCourse.push(item)
-                        } else {
-                            musicGroupCourse.push(item)
-                        }
-                    })
-                    this.musicGroupCourse = musicGroupCourse
-                    this.vipCourse = vipCourse
-                }
-            })
-        },
-        async onSubmit(formName, type) {
-            const params = {
-                id: this.leaveForm.id,
-                status: type,
-                userId: this.leaveForm.userId
+  props: ['dialogDetail'],
+  components: { Tooltip },
+  data() {
+    return {
+      leaveForm: {},
+      musicGroupCourse: [],
+      vipCourse: [],
+    }
+  },
+  mounted() {
+    this.__init()
+  },
+  methods: {
+    async __init() {
+      let { memo } = this.dialogDetail
+      memo = memo ? JSON.parse(memo) : null
+      if (!memo) { // 判断是否有参数
+        this.$message.error('参数有误')
+        return
+      }
+      await leaveQueryDetail({ id: memo.leaveRecordId }).then(res => {
+        let result = res.data
+        if (res.code == 200) {
+          this.leaveForm = result
+          let tempJson = result.coursesScheduleJson ? JSON.parse(result.coursesScheduleJson) : []
+          let musicGroupCourse = []
+          let vipCourse = []
+          tempJson.forEach(item => {
+            if (item.before.type == 'VIP') {
+              vipCourse.push(item)
+            } else {
+              musicGroupCourse.push(item)
             }
-            const str = type == 'PASS' ? '同意' : '拒绝'
-            this.$confirm(`您确定${str}该请假申请吗?`, '提示', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning'
-            }).then(async () => {
-                await approve(params).then(res => {
-                    if (res.code == 200) {
-                        this.$message.success('处理成功')
-                        this.$listeners.close()
-                    }
-                    else {
-                        this.$message.error(res.msg)
-                    }
-
-                })
-            }).catch(() => {
-                //
-            })
+          })
+          this.musicGroupCourse = musicGroupCourse
+          this.vipCourse = vipCourse
         }
+      })
     },
-    filters: {
-        getFormatTime (tempA, tempB) {
-            return dayjs(tempA).format('HH') + ':' + dayjs(tempA).format('mm') + '-' + dayjs(tempB).format('HH') + ':' + dayjs(tempB).format('mm')
-        }
+    async onSubmit(formName, type) {
+      const params = {
+        id: this.leaveForm.id,
+        status: type,
+        userId: this.leaveForm.userId
+      }
+      const str = type == 'PASS' ? '同意' : '拒绝'
+      this.$confirm(`您确定${str}该请假申请吗?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(async () => {
+        await approve(params).then(res => {
+          if (res.code == 200) {
+            this.$message.success('处理成功')
+            this.$listeners.close()
+          }
+          else {
+            this.$message.error(res.msg)
+          }
+
+        })
+      }).catch(() => {
+        //
+      })
+    }
+  },
+  filters: {
+    getFormatTime(tempA, tempB) {
+      return dayjs(tempA).format('HH') + ':' + dayjs(tempA).format('mm') + '-' + dayjs(tempB).format('HH') + ':' + dayjs(tempB).format('mm')
     }
+  }
 }
 </script>
 
 <style lang="less" scoped>
-.dialog-footer{
-    margin-top: 20px;
-    display: block;
-    text-align: right;
+.dialog-footer {
+  margin-top: 20px;
+  display: block;
+  text-align: right;
 }
+
 .alert {
-   margin-bottom: 10px;
+  margin-bottom: 10px;
 }
 </style>

+ 1 - 4
vue.config.js

@@ -16,13 +16,10 @@ const name = defaultSettings.title || "管乐迷后台管理系统"; // page tit
 // http://47.99.212.176:8000
 //  https://online.dayaedu.com
 // let target = "https://online.dayaedu.com"; //线上
-// let target = 'http://192.168.3.251:8000' // 何国威
 // let target = 'http://192.168.3.20:8000' //邹璇
 // let target = 'http://192.168.3.161:8000' //勇哥
-// let target = 'http://192.168.3.146:8000' //王昭
-// let target = 'http://dev.dayaedu.com' // 开发环境
+// let target = "http://192.168.3.143:8000"; //
 let target = "https://test.dayaedu.com"; //测试环境
-// let target = "https://online.dayaedu.com"; //测试环境
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 module.exports = {
   /**

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