소스 검색

Merge branch '01/21VipReset' into online

mo 4 년 전
부모
커밋
26cc94b843

+ 11 - 0
src/views/operateManager/modals/infoList.js

@@ -0,0 +1,11 @@
+export const infoList =[
+{ row1:'学员有声部课、VIP课、合奏课、网管课',row2:'本周有声部课',row3:'声部课老师课后布置作业',row4:'声部课老师统计服务指标'},
+{ row1:'学员有声部课、VIP课、合奏课、网管课',row2:'本周无声部课',row3:'声部课老师在课外训练布置作业',row4:'声部课老师统计服务指标'},
+{ row1:'学员有VIP课、合奏课、网管课',row2:'本周有VIP课',row3:'VIP课老师课后布置作业',row4:'VIP课老师统计服务指标'},
+{ row1:'学员有VIP课、合奏课、网管课',row2:'本周无VIP课',row3:'VIP课老师布置课外训练',row4:'VIP课老师统计服务指标'},
+{ row1:'学员有合奏课、网管课',row2:'无论本周是否有合奏课',row3:'该乐团声部班老师布置课外训练',row4:'声部班老师统计服务指标'},
+{ row1:'学员有合奏课、网管课',row2:'无论本周是否有合奏课',row3:'该乐团没有声部班则指导老师布置课外训练',row4:'指导老师统计服务指标'},
+{ row1:'学员有网管课',row2:'本周有网管课',row3:'网管课老师课后布置作业',row4:'网管课老师统计服务指标'},
+{ row1:'学员有网管课',row2:'本周无网管课',row3:'网管课老师布置课外训练',row4:'网管课老师统计服务指标'},
+{ row1:'学员没有任何课程但在进行中乐团在读',row2:'无课程',row3:'该乐团声部班老师布置课外训练',row4:'声部班老师统计服务指标'},
+{ row1:'学员没有任何课程但在进行中乐团在读',row2:'无课程',row3:'该乐团没有声部班则指导老师布置课外训练',row4:'指导老师统计服务指标'}]

+ 123 - 11
src/views/operateManager/serverIndexList.vue

@@ -144,6 +144,7 @@
           >
         </el-form-item>
       </save-form>
+      <div class="newBand" @click="lookServerDetail">服务指标说明</div>
       <div class="tableWrap">
         <el-table
           style="width: 100%"
@@ -171,13 +172,12 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="groupNames"
-            label="乐团名称"
-          >
+          <el-table-column align="center" prop="groupNames" label="乐团名称">
             <template slot-scope="scope">
-              <overflow-text width="100%" :text="scope.row.groupNames"></overflow-text>
+              <overflow-text
+                width="100%"
+                :text="scope.row.groupNames"
+              ></overflow-text>
             </template>
           </el-table-column>
           <el-table-column align="center" prop="teacherName" label="指导老师">
@@ -287,6 +287,82 @@
         />
       </div>
     </div>
+    <el-dialog title="服务指标规则说明" :visible.sync="lookServer">
+      <div class="serverInfo">
+        <p>作业布置&服务指标优先级:<span>声部课>VIP课>合奏课>网管课</span></p>
+        <p>
+          每
+          <span>周一凌晨</span> 系统根据学员的排课情况生成布置作业路径及服务指标
+        </p>
+        <p>
+          <span>多次课程</span>
+          只布置一次作业、统计一次服务指标(多乐团、多组VIP网管课除外)
+        </p>
+        <el-table
+         border
+         style="margin-top:30px"
+          :data="infoList"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :span-method="arraySpanMethod"
+        >
+          <el-table-column
+            align="center"
+            prop="row1"
+            label="总体课程情况"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="row2"
+            label="本周课程情况"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="row3"
+            label="作业布置路径"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="row4"
+            label="服务指标统计"
+          ></el-table-column>
+        </el-table>
+        <div class="infoWrap">
+           <h4>其他情况:</h4>
+        <p>1.学员在 <span>多个乐团时</span> ,剩余课程中 <span>本周有声部课</span> 的乐团布置作业, <span>都有</span> 则都布置, <span>都没有</span>  则根据表格中的逻辑布置</p>
+        <p>2.学员存在 <span>多组VIP课</span> 时,若课程组 <span>老师相同</span> ,则仅布置一次作业(网管课同理)</p>
+        <p>3.学员存在 <span>多组VIP课</span> 时,若课程组 <span>老师不同,本周有课</span> 的VIP课程组布置作业,多个课程组本周都有课则布置多次(网管课同理)</p>
+        <p>4.学员存在 <span>多组VIP课</span> 时,若课程组 <span>老师不同,本周都没有课</span> ,则所有VIP老师  <span>都布置</span> 课外训练, <span>都统计</span> 服务指标</p>
+        </div>
+           <div class="infoWrap">
+           <h4>课程调整:</h4>
+        <p>本周 <span>课程调整时</span> ,重新根据该学员的 <span>本周课程情况更新</span> 作业布置路径及服务指标 则根据表格中的逻辑布置</p>
+        </div>
+                   <div class="infoWrap">
+           <h4>服务指标:</h4>
+           <p>服务指标按 <span>周为单位</span> 统计</p>
+            <p><span>周六周日</span> 的服务指标 <span>延迟到下周二更新</span> 实际安排数据(即周日的作业课程,在周二23:59:59时前布置作业都算一次实际安排)</p>
+        </div>
+          <div class="infoWrap">
+           <h4>服务指标开启/关闭:</h4>
+           <p>学员新增课程时,自动开启服务指标,</p>
+           <p>手动关闭服务指标的学员新增课程时,不会自动开启服务指标</p>
+           <p>学员退团、乐团关闭、VIP课程组结束、网管课课程组结束时,若学员不在任何【进行中】乐团【在读】,且无任何未开始课程(乐团课、VIP课、网管课),则关闭服务指标</p>
+        </div>
+           <div class="infoWrap">
+           <h4>服务指标解释:</h4>
+          <p><span>若本周学员有多次服务指标则生成多条数据</span> </p>
+          <p>预期安排:本周内服务指标次数(即本周应该给该学员布置的作业次数)</p>
+          <p>实际安排:本周通过服务指标作业布置路径给该学员布置作业的次数</p>
+          <p>提交次数:本周学员按照作业布置路径提交作业的次数</p>
+          <p>评价次数:本周老师评价通过作业布置路径提交的作业的次数</p>
+          <p>及时评价次数:学员提交作业后24小时内进行评价的次数</p>
+          <p>VIP课:本周VIP课程课时数</p>
+          <p>付费网管课:本周付费网管课课时数</p>
+          <p>作业提交时间:学员提交作业的时间</p>
+          <p>服务周期:本服务周期时间段</p>
+        </div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -295,9 +371,11 @@ import axios from "axios";
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/Pagination/index";
 import load from "@/utils/loading";
-import dayjs from 'dayjs'
+import dayjs from "dayjs";
 import { getEmployeeOrgan, getTeacher } from "@/api/buildTeam";
+import { infoList } from "./modals/infoList";
 import { findStudentExtracurricularExercisesSituations } from "@/api/afterSchool";
+
 // findStudentExtracurricularExercisesSituations
 let nowTime = new Date();
 nowTime =
@@ -333,6 +411,8 @@ export default {
         total: 0, // 总条数
         page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
+      lookServer: false,
+      infoList: infoList,
       // imageIcon: require("@/assets/images/base/warning.png"),
     };
   },
@@ -365,7 +445,7 @@ export default {
   },
   methods: {
     dayjs,
-    init () {
+    init() {
       if (this.$route.query.teacherId) {
         this.searchForm.teacherId = this.$route.query.teacherId * 1;
       }
@@ -435,9 +515,9 @@ export default {
         teacherId: null,
         existVipCourse: null,
       };
-          this.searchForm.timer = [];
-    this.searchForm.timer.push(this.getNowDateAndMonday(nowTime));
-    this.searchForm.timer.push(this.getNowDateAndSunday(nowTime));
+      this.searchForm.timer = [];
+      this.searchForm.timer.push(this.getNowDateAndMonday(nowTime));
+      this.searchForm.timer.push(this.getNowDateAndSunday(nowTime));
       this.search();
     },
 
@@ -586,6 +666,24 @@ export default {
         },
       });
     },
+    lookServerDetail() {
+      this.lookServer = true;
+    },
+    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 0) {
+        if (rowIndex % 2 === 0) {
+          return {
+            rowspan: 2,
+            colspan: 1,
+          };
+        } else {
+          return {
+            rowspan: 0,
+            colspan: 0,
+          };
+        }
+      }
+    },
   },
 };
 </script>
@@ -595,4 +693,18 @@ export default {
   top: 3px;
   right: 2px;
 }
+.serverInfo {
+  line-height: 30px;
+  span {
+    color: #333;
+    font-weight: bold;
+  }
+}
+.infoWrap {
+  margin-top: 30px;
+  span {
+    color:red;
+     font-weight: normal;
+  }
+}
 </style>

+ 55 - 31
src/views/teacherManager/teacherList.vue

@@ -5,13 +5,17 @@
       老师列表
     </h2>
     <div class="m-core">
-      <div
-        class="newBand"
-        v-permission="'/teacherOperationAdd'"
-        @click="onTeacher('create')"
-      >
-        老师新增
+      <div class="hanlderWrap">
+        <div
+          class="newBand"
+          v-permission="'/teacherOperationAdd'"
+          @click="onTeacher('create')"
+        >
+          老师新增
+        </div>
+
       </div>
+
       <!-- 搜索标题 -->
       <save-form
         :inline="true"
@@ -43,15 +47,19 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select style="width: 100% !important;"
-                     filterable
-                     clearable
-                     v-model.trim="searchForm.subjectId"
-                     placeholder="专业技能">
-            <el-option v-for="(item, i) in selects.subjects"
-                         :key="i"
-                         :label="item.name"
-                         :value="item.id"></el-option>
+          <el-select
+            style="width: 100% !important"
+            filterable
+            clearable
+            v-model.trim="searchForm.subjectId"
+            placeholder="专业技能"
+          >
+            <el-option
+              v-for="(item, i) in selects.subjects"
+              :key="i"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
           </el-select>
           <!-- <el-select
             v-model.trim="searchForm.subjectId"
@@ -84,7 +92,9 @@
               v-for="item in selects.branchs"
               :key="item.id"
               :label="item.name"
-              :value="item.id"> </el-option>
+              :value="item.id"
+            >
+            </el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -219,17 +229,17 @@
               }}</el-button>
             </template>
           </el-table-column>
-             <el-table-column align="center" label="转正日期">
+          <el-table-column align="center" label="转正日期">
             <template slot-scope="scope">
               <div>
-                {{scope.row.formalStaffDate | dayjsFormat}}
+                {{ scope.row.formalStaffDate | dayjsFormat }}
               </div>
             </template>
           </el-table-column>
-             <el-table-column align="center" label="离职日期">
+          <el-table-column align="center" label="离职日期">
             <template slot-scope="scope">
               <div>
-                {{scope.row.demissionDate | dayjsFormat}}
+                {{ scope.row.demissionDate | dayjsFormat }}
               </div>
             </template>
           </el-table-column>
@@ -282,6 +292,7 @@
         />
       </div>
     </div>
+
     <el-dialog
       title="修改密码"
       :visible.sync="passwrodVisiable"
@@ -302,7 +313,7 @@
             },
           ]"
         >
-          <copy-text>{{passwrodForm.phone}}</copy-text>
+          <copy-text>{{ passwrodForm.phone }}</copy-text>
         </el-form-item>
         <el-form-item
           label="输入密码"
@@ -386,6 +397,8 @@ export default {
         password2: "",
       },
       activatedRow: null,
+      lookServer: false,
+      infoList: [],
     };
   },
   // activated() {
@@ -403,9 +416,9 @@ export default {
     },
     async __init() {
       // 获取分部
-      await this.$store.dispatch('setBranchs')
+      await this.$store.dispatch("setBranchs");
 
-      await this.$store.dispatch('setSubjects')
+      await this.$store.dispatch("setSubjects");
     },
     onTeacher(type, row) {
       let params = {
@@ -413,21 +426,24 @@ export default {
       };
       if (row) {
         params.teacherId = row.id;
-        params.teacherName = row.realName
+        params.teacherName = row.realName;
       }
       let path = "/business/teacherOperation";
       if (type == "update") {
         path = "/business/teacherOperationUpdate";
       }
       //  teacherId=${scope.row.id}&teacherName=${scope.row.realName}
-      this.$router.push({
-        path: path,
-        query: params,
-      }, router => {
-        if(type != 'update') {
-          router.meta.title = '老师新增'
+      this.$router.push(
+        {
+          path: path,
+          query: params,
+        },
+        (router) => {
+          if (type != "update") {
+            router.meta.title = "老师新增";
+          }
         }
-      });
+      );
     },
     getList() {
       let params = this.searchForm;
@@ -550,6 +566,7 @@ export default {
         query: { teacherId: row.id, operatingTag: "1" },
       });
     },
+
   },
 };
 </script>
@@ -557,4 +574,11 @@ export default {
 .el-button + .el-button {
   margin-left: 0;
 }
+.hanlderWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+}
+
 </style>

+ 13 - 0
src/views/teamBuild/signupList.vue

@@ -72,6 +72,16 @@
           >
             合并学员
           </div>
+                 <el-popover placement="right" width="500" trigger="click">
+          <div class="popoverWrap">
+            <p>乐团退团退费规则:</p>
+            <p>退还课程费用:缴费总额-已结束课时单价之和</p>
+            <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
+            <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
+          </div>
+          <div class="newBand" slot="reference">退团说明</div>
+
+        </el-popover>
         </div>
       </div>
       <el-dialog title="选择合并乐团" :visible.sync="mergeVisible" width="950px">
@@ -1597,4 +1607,7 @@ export default {
     width: 360px !important;
   }
 }
+.popoverWrap {
+  p{line-height: 25px;}
+}
 </style>

+ 1 - 1
src/views/teamBuild/teamSeting/components/setClassV2.vue

@@ -38,7 +38,7 @@
               乐团可创建的线上基础技能班数量为各声部人数/6向上取整之和(上低音号与长号合并计算)
             </p>
             <p>
-              例:乐团有长笛13人、上低音号8人、长号7人,则该乐团可创建线基础技能班数量为
+              例:乐团有长笛13人、上低音号8人、长号7人,则该乐团可创建线基础技能班数量为
             </p>
             <p>13/6向上取整+(8+7)/6向上取整=3+3=6个线上基础技能班</p>
             <p>班级人数:</p>

+ 1 - 1
src/views/teamDetail/components/resetClass.vue

@@ -32,7 +32,7 @@
               乐团可创建的线上基础技能班数量为各声部人数/6向上取整之和(上低音号与长号合并计算)
             </p>
             <p>
-              例:乐团有长笛13人、上低音号8人、长号7人,则该乐团可创建线基础技能班数量为
+              例:乐团有长笛13人、上低音号8人、长号7人,则该乐团可创建线基础技能班数量为
             </p>
             <p>13/6向上取整+(8+7)/6向上取整=3+3=6个线上基础技能班</p>
             <p>班级人数:</p>

+ 21 - 2
src/views/teamDetail/components/studentList.vue

@@ -42,14 +42,23 @@
           </div>
         </div>
       </statistic-item> -->
-    <div style="margin-bottom: 15px;">
+    <div style="margin-bottom: 15px;" class="studentListWrap">
       <el-button type="primary" v-permission="'studentRegistration/insertStudent'"
               @click="addStudentVisible = true">新增学员</el-button>
       <!-- 可以直接去学生考勤查看 -->
       <!-- <el-button type="primary" v-permission="'/studentSignin'"
               @click="gotoSignin">点名总览</el-button> -->
       <el-button type="primary" v-permission="'studentManage/queryStudentSubTotalCourseTimes'"
-              @click="viewTimer">剩余时长明细</el-button>
+              @click="viewTimer" style="margin-right: 15px;">剩余时长明细</el-button>
+          <el-popover placement="right" width="500" trigger="click">
+          <div class="popoverWrap">
+            <p>乐团退团退费规则:</p>
+            <p>退还课程费用:缴费总额-已结束课时单价之和</p>
+            <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
+            <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
+          </div>
+          <el-button type="primary" slot="reference">退团说明</el-button>
+        </el-popover>
     </div>
     <!-- 搜索类型 -->
     <save-form
@@ -1610,4 +1619,14 @@ export default {
     width: 100%;
     margin: auto!important;
 }
+.popoverWrap {
+  p{line-height: 25px;}
+}
+.studentListWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+  height: 36px;
+  align-items: center;
+}
 </style>

+ 3 - 2
src/views/teamDetail/teamClassList.vue

@@ -42,7 +42,7 @@
         <el-form-item>
           <el-select
             v-model.trim="searchForm.groupType"
-            clearable
+            @change="()=>{searchForm.type=''}"
             filterable
             placeholder="课程组类型"
           >
@@ -56,7 +56,7 @@
         </el-form-item>
         <!-- musicClassTypeList -->
         <el-form-item prop="type">
-          <el-select v-model.trim="searchForm.type" clearable filterable>
+          <el-select v-model.trim="searchForm.type" filterable  clearable :disabled='searchForm.groupType!="MUSIC"'>
             <el-option
               v-for="(item, index) in musicClassTypeList"
               :key="index"
@@ -153,6 +153,7 @@
                 @click="addCompound(scope.row)"
                 v-if="
                   scope.row.type != 'MUSIC_NETWORK' &&
+                  scope.row.groupType== 'MUSIC'&&
                   !isAddCom(scope.row) &&
                   permission('classGroup/spanGroupMergeClassSplitClassAffirm')
                 "

+ 45 - 21
src/views/teamDetail/teamCourseList.vue

@@ -200,13 +200,22 @@
           </el-col>
         </el-row>
       </save-form>
-      <div class="btnWraps"></div>
+      <div class="btnWraps">
+        <div class="newBand"  v-permission="
+                    'courseSchedule/batchDelete?page=teamCourseList'
+                  " @click="removeCourse" >批量删除</div>
+      </div>
       <!-- 列表 -->
       <div class="tableWrap" style="margin-top: 20px">
         <el-table
           :data="tableList"
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          @selection-change="handleSelectionChange">
         >
+         <el-table-column
+          v-permission="'courseSchedule/batchDelete?page=teamCourseList'"
+      type="selection"
+      width="55"></el-table-column>
           <el-table-column
             align="center"
             prop="organName"
@@ -337,14 +346,14 @@
           >
             <template slot-scope="scope">
               <div>
-                <el-button
+                <!-- <el-button
                   type="text"
                   @click="removeCourse(scope.row)"
                   v-permission="
                     'courseSchedule/batchDelete?page=teamCourseList'
                   "
                   >删除</el-button
-                >
+                > -->
                 <el-button
                   type="text"
                   v-if="permission('teamCourseList/details')"
@@ -587,7 +596,7 @@ import {
   superFindCourseSchedules,
   getEmployeeOrgan,
   cleanAttendance,
-  cancelCourseMerge
+  cancelCourseMerge,
 } from "@/api/buildTeam";
 import { bathDelete } from "@/api/vipSeting";
 import { workType, mergeCourseType } from "@/constant";
@@ -659,6 +668,7 @@ export default {
       id: null,
       show: false,
       compoundList: [],
+      deleteList:[]
     };
   },
   components: {
@@ -697,13 +707,21 @@ export default {
     permission(str, parent) {
       return permission(str, parent);
     },
-    async removeCourse(row) {
-      console.log({ ...row });
+    async removeCourse() {
+      if(this.deleteList.length < 1){
+        this.$message.error('请自少选择一个班级')
+        return
+      }
+
+      let arr = this.deleteList.map(course=>{
+        return course.id
+      })
+      let courseScheduleIds = arr.join(',')
       try {
         await this.$confirm("是否确认删除此数据?", "提示", {
           type: "warning",
         });
-        bathDelete({ courseScheduleIds: row.id }).then((res) => {
+        bathDelete({ courseScheduleIds: courseScheduleIds }).then((res) => {
           if (res.code == 200) {
             this.$message.success("删除成功");
             this.getList();
@@ -897,21 +915,24 @@ export default {
     clearCom() {
       this.compoundList = [];
     },
-    resetCompound(row){
-            this.$confirm('您确定取消合并该课程?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-         cancelCourseMerge({mainCourseId:row.id}).then(res=>{
-        if(res.code == 200){
-          this.$message.success('提交成功')
-          this.getList()
-        }
+    resetCompound(row) {
+      this.$confirm("您确定取消合并该课程?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
       })
-      }).catch(() => { })
-
-
+        .then(() => {
+          cancelCourseMerge({ mainCourseId: row.id }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("提交成功");
+              this.getList();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    handleSelectionChange(arr){
+      this.deleteList = arr;
     }
   },
   filters: {
@@ -973,4 +994,7 @@ export default {
 .exportBtn {
   background: #13817a;
 }
+.newBand {
+  margin-top: 30px;
+}
 </style>

+ 10 - 0
src/views/vipClass/vipDetail/components/vipStudentList.vue

@@ -9,12 +9,22 @@
         新增学员
       </el-button>
       <el-button
+      style="margin-right:15px"
         v-permission="'vipGroupManage/update'"
         @click="expireVisible = true"
         type="primary"
       >
         有效期调整
       </el-button>
+                <el-popover placement="right" width="500" trigger="click">
+          <div class="popoverWrap">
+            <p>VIP退费规则:</p>
+            <p>预计课程单价*课时数-课程标准单价*已完成课时数)*0.8</p>
+          </div>
+            <el-button  type="primary" slot="reference">退学说明</el-button>
+
+        </el-popover>
+
     </div>
 
     <div class="tableWrap">