Browse Source

添加排课逻辑

lex 1 năm trước cách đây
mục cha
commit
8c39271bcc

+ 272 - 110
src/views/teamDetail/components/modals/classroom-setting-item.vue

@@ -11,15 +11,33 @@
       </el-radio-group>
     </el-form-item> -->
 
-    <el-table v-if="form && form.cycle && form.cycle.length > 0" :data="form.cycle" :show-header="false">
+    <el-table
+      v-if="form && form.cycle && form.cycle.length > 0"
+      :data="form.cycle"
+      :show-header="false"
+    >
       <el-table-column>
         <template slot-scope="scope">
           <div>
-            <el-form-item :prop="'classs.' + type + '.cycle.' + scope.$index + '.coreTeacher'
-              " label-width="88px" :rules="[{ required: true, message: '请选择主教老师' }]">
-              <el-select v-model.trim="scope.row.coreTeacher" placeholder="请选择主教老师" clearable filterable>
-                <el-option v-for="(item, index) in teacherList" :key="index" :label="item.realName"
-                  :value="String(item.id)">
+            <el-form-item
+              :prop="
+                'classs.' + type + '.cycle.' + scope.$index + '.coreTeacher'
+              "
+              label-width="88px"
+              :rules="[{ required: true, message: '请选择主教老师' }]"
+            >
+              <el-select
+                v-model.trim="scope.row.coreTeacher"
+                placeholder="请选择主教老师"
+                clearable
+                filterable
+              >
+                <el-option
+                  v-for="(item, index) in teacherList"
+                  :key="index"
+                  :label="item.realName"
+                  :value="String(item.id)"
+                >
                   <span style="float: left">{{ item.realName }}</span>
                   <span style="float: right; color: #8492a6; font-size: 13px">{{
                     String(item.id)
@@ -27,17 +45,32 @@
                 </el-option>
               </el-select>
             </el-form-item>
-            <el-form-item prop="assistant" v-if="activeType != 'HIGH' &&
-              activeType != 'HIGH_ONLINE' &&
-              activeType != 'MUSIC_NETWORK' &&
-              type != 'HIGH' &&
-              type != 'HIGH_ONLINE' &&
-              type != 'MUSIC_NETWORK' &&
-              $helpers.permission('is/teacher/findTeachers')
-              ">
-              <el-select v-model.trim="scope.row.assistant" placeholder="请选择助教老师" filterable clearable multiple
-                collapse-tags>
-                <el-option v-for="(item, index) in cooperationList" :key="index" :label="item.realName" :value="item.id">
+            <el-form-item
+              prop="assistant"
+              v-if="
+                activeType != 'HIGH' &&
+                  activeType != 'HIGH_ONLINE' &&
+                  activeType != 'MUSIC_NETWORK' &&
+                  type != 'HIGH' &&
+                  type != 'HIGH_ONLINE' &&
+                  type != 'MUSIC_NETWORK' &&
+                  $helpers.permission('is/teacher/findTeachers')
+              "
+            >
+              <el-select
+                v-model.trim="scope.row.assistant"
+                placeholder="请选择助教老师"
+                filterable
+                clearable
+                multiple
+                collapse-tags
+              >
+                <el-option
+                  v-for="(item, index) in cooperationList"
+                  :key="index"
+                  :label="item.realName"
+                  :value="item.id"
+                >
                   <span style="float: left">{{ item.realName }}</span>
                   <span style="float: right; color: #8492a6; font-size: 13px">{{
                     String(item.id)
@@ -45,96 +78,221 @@
                 </el-option>
               </el-select>
             </el-form-item>
-            <el-form-item :prop="'classs.' + type + '.cycle.' + scope.$index + '.time'" :rules="[
-              { required: true, message: '请选择课程时长', trigger: 'blur' },
-            ]" inline-message>
-              <el-select v-model.trim="scope.row.time" style="width: 180px !important" placeholder="请选择课程时长" clearable
-                :disabled="!!selectPrice" @change="(val) => {
-                  startTimeChange(scope, val);
-                }
-                  " filterable>
-                <el-option v-for="(item, index) in pricesArray" :key="index" :disabled="surplustime + (parseFloat(scope.row.time) || 0) < item
-                  " :label="item" :value="item">
+            <el-form-item
+              :prop="'classs.' + type + '.cycle.' + scope.$index + '.time'"
+              :rules="[
+                { required: true, message: '请选择课程时长', trigger: 'blur' }
+              ]"
+              inline-message
+            >
+              <el-select
+                v-model.trim="scope.row.time"
+                style="width: 180px !important"
+                placeholder="请选择课程时长"
+                clearable
+                :disabled="!!selectPrice"
+                @change="
+                  val => {
+                    startTimeChange(scope, val);
+                  }
+                "
+                filterable
+              >
+                <el-option
+                  v-for="(item, index) in pricesArray"
+                  :key="index"
+                  :disabled="
+                    surplustime + (parseFloat(scope.row.time) || 0) < item
+                  "
+                  :label="item"
+                  :value="item"
+                >
                 </el-option>
               </el-select>
             </el-form-item>
-            <el-form-item :prop="'classs.' + type + '.cycle.' + scope.$index + '.expectCourseNum'
-              " :rules="[
-    { required: true, message: '请输入预计课时数' },
-    { pattern: /^\+?[1-9]\d*$/, message: '请输入大于0的正整数' },
-    { validator: validateNum },
-  ]" inline-message>
-              <el-input style="width: 180px !important" type="number" v-model.trim="scope.row.expectCourseNum"
-                placeholder="请输入预计课数" @input="(val) => {
-                  getUseTime(scope.row);
-                }
-                  ">
+
+            <el-form-item
+              :prop="
+                'classs.' + type + '.cycle.' + scope.$index + '.expectCourseNum'
+              "
+              :rules="[
+                { required: true, message: '请输入预计课时数' },
+                { pattern: /^\+?[1-9]\d*$/, message: '请输入大于0的正整数' },
+                { validator: validateNum }
+              ]"
+              inline-message
+            >
+              <el-input
+                style="width: 180px !important"
+                type="number"
+                v-model.trim="scope.row.expectCourseNum"
+                placeholder="请输入预计课数"
+                @input="
+                  val => {
+                    getUseTime(scope.row);
+                  }
+                "
+              >
+              </el-input>
+            </el-form-item>
+            <el-form-item
+              :prop="
+                'classs.' + type + '.cycle.' + scope.$index + '.intervalDays'
+              "
+              :rules="[
+                { required: true, message: '请输入间隔天数' },
+                { pattern: /^\+?[1-9]\d*$/, message: '请输入大于0的正整数' },
+                { validator: validateNum }
+              ]"
+              inline-message
+            >
+              <el-input
+                style="width: 180px !important"
+                type="number"
+                v-model.trim="scope.row.intervalDays"
+                placeholder="请输入间隔天数"
+              >
               </el-input>
             </el-form-item>
-            <el-form-item inline-message :rules="[{ required: true, message: '请选择循环周期' }]"
-              :prop="'classs.' + type + '.cycle.' + scope.$index + '.dayOfWeek'">
-              <el-select v-model.trim="scope.row.dayOfWeek" style="width: 180px !important" placeholder="请选择循环周期"
-                clearable filterable @change="(val) => {
-                  getUseTime(scope.row);
-                }
-                  ">
-                <el-option v-for="(item, index) in weekDateList" :key="index" :label="item.label" :value="item.value">
+            <!-- <el-form-item
+              inline-message
+              :rules="[{ required: true, message: '请选择循环周期' }]"
+              :prop="'classs.' + type + '.cycle.' + scope.$index + '.dayOfWeek'"
+            >
+              <el-select
+                v-model.trim="scope.row.dayOfWeek"
+                style="width: 180px !important"
+                placeholder="请选择循环周期"
+                clearable
+                filterable
+                @change="
+                  val => {
+                    getUseTime(scope.row);
+                  }
+                "
+              >
+                <el-option
+                  v-for="(item, index) in weekDateList"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                >
                 </el-option>
               </el-select>
-            </el-form-item>
-            <el-form-item :prop="'classs.' + type + '.cycle.' + scope.$index + '.startClassTime'
-              " :rules="[{ required: true, message: '请选择开始时间' }]" inline-message>
-              <el-time-picker style="width: 180px !important" v-model.trim="scope.row.startClassTime" format="HH:mm"
-                value-format="HH:mm" placeholder="请选择开始时间" @change="timeChange(scope.row)" :picker-options="{
-                  selectableRange: ['06:00:00 - 23:59:59'],
-                }">
+            </el-form-item> -->
+            <el-form-item
+              :prop="
+                'classs.' + type + '.cycle.' + scope.$index + '.startClassTime'
+              "
+              :rules="[{ required: true, message: '请选择开始时间' }]"
+              inline-message
+            >
+              <el-time-picker
+                style="width: 180px !important"
+                v-model.trim="scope.row.startClassTime"
+                format="HH:mm"
+                value-format="HH:mm"
+                placeholder="请选择开始时间"
+                @change="timeChange(scope.row)"
+                :picker-options="{
+                  selectableRange: ['06:00:00 - 23:59:59']
+                }"
+              >
               </el-time-picker>
             </el-form-item>
-            <el-form-item :prop="'classs.' + type + '.cycle.' + scope.$index + '.endClassTime'
-              " inline-message>
-              <el-time-picker style="width: 180px !important" v-model.trim="scope.row.endClassTime" format="HH:mm"
-                disabled value-format="HH:mm" placeholder="请选择结束时间" :picker-options="{
-                  selectableRange: [
-                    scope.row.startClassTime + ':00 - 23:59:59',
-                  ],
-                }">
+            <el-form-item
+              :prop="
+                'classs.' + type + '.cycle.' + scope.$index + '.endClassTime'
+              "
+              inline-message
+            >
+              <el-time-picker
+                style="width: 180px !important"
+                v-model.trim="scope.row.endClassTime"
+                format="HH:mm"
+                disabled
+                value-format="HH:mm"
+                placeholder="请选择结束时间"
+                :picker-options="{
+                  selectableRange: [scope.row.startClassTime + ':00 - 23:59:59']
+                }"
+              >
               </el-time-picker>
             </el-form-item>
-            <el-form-item :prop="'classs.' + type + '.cycle.' + scope.$index + '.holiday'"
-              :rules="[{ required: true, message: '请选择是否跳过节假日' }]" inline-message>
-              <el-select v-model.trim="scope.row.holiday" style="width: 180px !important" placeholder="是否跳过节假日" filterable
-                @change="holidayChange(scope.row)">
+            <el-form-item
+              :prop="'classs.' + type + '.cycle.' + scope.$index + '.holiday'"
+              :rules="[{ required: true, message: '请选择是否跳过节假日' }]"
+              inline-message
+            >
+              <el-select
+                v-model.trim="scope.row.holiday"
+                style="width: 180px !important"
+                placeholder="是否跳过节假日"
+                filterable
+                @change="holidayChange(scope.row)"
+              >
                 <el-option label="是" :value="true"></el-option>
                 <el-option label="否" :value="false"> </el-option>
               </el-select>
             </el-form-item>
-            <el-form-item inline-message :prop="'classs.' + type + '.cycle.' + scope.$index + '.startDate'"
-              :rules="[{ required: true, message: '请选择排课起始日期' }]">
-              <el-date-picker v-model.trim="scope.row.startDate" :picker-options="pickerOptions"
-                style="width: 180px !important" type="date" value-format="yyyy-MM-dd" placeholder="排课起始日期" @change="(val) => {
-                  changeStartDate(val, scope.row);
-                }
-                  ">
+            <el-form-item
+              inline-message
+              :prop="'classs.' + type + '.cycle.' + scope.$index + '.startDate'"
+              :rules="[{ required: true, message: '请选择排课起始日期' }]"
+            >
+              <el-date-picker
+                v-model.trim="scope.row.startDate"
+                :picker-options="pickerOptions"
+                style="width: 180px !important"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="排课起始日期"
+                @change="
+                  val => {
+                    changeStartDate(val, scope.row);
+                  }
+                "
+              >
               </el-date-picker>
             </el-form-item>
-            <el-form-item inline-message :prop="'classs.' + type + '.cycle.' + scope.$index + '.endDate'" :rules="[
-              { required: true, message: '请选择排课结束日期' },
-              { required: true, trigger: 'change', validator: validatePass },
-            ]">
-              <el-date-picker v-model.trim="scope.row.endDate" :disabled="true" :picker-options="pickerOptions"
-                style="width: 180px !important" type="date" value-format="yyyy-MM-dd" placeholder="排课结束日期">
+            <el-form-item
+              inline-message
+              :prop="'classs.' + type + '.cycle.' + scope.$index + '.endDate'"
+              :rules="[
+                { required: true, message: '请选择排课结束日期' },
+                { required: true, trigger: 'change', validator: validatePass }
+              ]"
+            >
+              <el-date-picker
+                v-model.trim="scope.row.endDate"
+                :disabled="true"
+                :picker-options="pickerOptions"
+                style="width: 180px !important"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="排课结束日期"
+              >
               </el-date-picker>
             </el-form-item>
 
-            <i @click="remove(scope.$index, scope)" v-if="form.cycle.length > 1"
-              class="close-icon el-icon-circle-close"></i>
+            <i
+              @click="remove(scope.$index, scope)"
+              v-if="form.cycle.length > 1"
+              class="close-icon el-icon-circle-close"
+            ></i>
           </div>
         </template>
       </el-table-column>
     </el-table>
-    <el-button icon="el-icon-circle-plus-outline" type="info" plain
-      :disabled="surplustime < (selectPrice || 0 || Math.min(...pricesArray))" @click="create"
-      style="margin-top: 10px; width: 100%">添加循环</el-button>
+    <el-button
+      icon="el-icon-circle-plus-outline"
+      type="info"
+      plain
+      :disabled="surplustime < (selectPrice || 0 || Math.min(...pricesArray))"
+      @click="create"
+      style="margin-top: 10px; width: 100%"
+      >添加循环</el-button
+    >
   </div>
 </template>
 <script>
@@ -190,7 +348,7 @@ export default {
       validatePass,
       validateNum,
       pickerOptions: this.getPickerOptions(),
-      useCourseNum: 0,
+      useCourseNum: 0
     };
   },
   mounted() {
@@ -205,12 +363,12 @@ export default {
         { value: "4", label: "星期四" },
         { value: "5", label: "星期五" },
         { value: "6", label: "星期六" },
-        { value: "7", label: "星期日" },
+        { value: "7", label: "星期日" }
       ];
     },
     pricesArray() {
-      return (this.prices[this.type] || "").split(",").filter((item) => !!item);
-    },
+      return (this.prices[this.type] || "").split(",").filter(item => !!item);
+    }
   },
   methods: {
     updateUseTime() {
@@ -268,7 +426,7 @@ export default {
         this.$set(item.row, "endClassTime", "");
       }
       if (val) {
-        console.log('isCourseNumType', this.isCourseNumType)
+        console.log("isCourseNumType", this.isCourseNumType);
         if (!this.isCourseNumType) {
           let activeTime = val * Math.max(item.row.expectCourseNum || 0, 0);
           if (this.endSchoolTerm) {
@@ -285,14 +443,12 @@ export default {
             );
           }
         } else {
-          console.log('课时排课')
-          let num = parseInt((this.surplusCourseNum - this.useCourseNum)) > 0 ? parseInt((this.surplusCourseNum - this.useCourseNum)) : 0
-          this.$set(
-            item.row,
-            "expectCourseNum",
-            parseInt(num)
-          );
-
+          console.log("课时排课");
+          let num =
+            parseInt(this.surplusCourseNum - this.useCourseNum) > 0
+              ? parseInt(this.surplusCourseNum - this.useCourseNum)
+              : 0;
+          this.$set(item.row, "expectCourseNum", parseInt(num));
         }
         // this.surplusTime
       } else {
@@ -319,7 +475,7 @@ export default {
     getUseTime(row) {
       this.updateEndTime(row);
       this.useTime = 0;
-      this.form.cycle.forEach((item) => {
+      this.form.cycle.forEach(item => {
         this.useTime +=
           (item.expectCourseNum ? parseInt(item.expectCourseNum) : 0) *
           parseInt(item.time);
@@ -338,10 +494,15 @@ export default {
       return num;
     },
     updateEndTime(row) {
-      if (row.dayOfWeek && row.startDate && typeof row.holiday === "boolean") {
+      if (
+        row.intervalDays &&
+        row.startDate &&
+        typeof row.holiday === "boolean"
+      ) {
         // const num = this.addData(row.startDate, row.dayOfWeek)
         // const week = dayjs(row.startDate).get('day') == 0 ? 7 : dayjs(row.startDate).get('day')
-        const selectWeek = row.dayOfWeek == 7 ? 0 : row.dayOfWeek;
+        // const selectWeek = row.dayOfWeek == 7 ? 0 : row.dayOfWeek;
+        const selectDays = row.intervalDays || 7;
         let exp = Math.max(row.expectCourseNum, 0);
         let end = dayjs(row.startDate);
         // console.log(selectWeek, end.get('day'))
@@ -349,24 +510,25 @@ export default {
           // exp >0 还有未排的课
           while (exp > 0) {
             if (
-              selectWeek == end.get("day") &&
+              // selectWeek == end.get("day") &&
               !this.holidays.includes(end.format("YYYY-MM-DD"))
             ) {
               exp--;
             }
-            end = end.add(1, "day");
+            end = end.add(selectDays, "day");
             if (exp === 0) {
-              end = end.subtract(1, "day");
+              end = end.subtract(selectDays, "day");
             }
           }
         } else {
           while (exp > 0) {
-            if (selectWeek == end.get("day")) {
-              exp--;
-            }
-            end = end.add(1, "day");
+            exp--;
+            // if (selectWeek == end.get("day")) {
+            //   exp--;
+            // }
+            end = end.add(selectDays, "day");
             if (exp === 0) {
-              end = end.subtract(1, "day");
+              end = end.subtract(selectDays, "day");
             }
           }
         }
@@ -431,10 +593,10 @@ export default {
           } else {
             return time.getTime() + 86400000 <= new Date().getTime();
           }
-        },
+        }
       };
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="less" scoped>

+ 2 - 1
src/views/teamDetail/components/modals/classroom-setting.vue

@@ -384,7 +384,8 @@ export default {
               {
                 time: this.selectPrices ? this.selectPrices[key] : undefined,
                 coreTeacher: this.coreid,
-                assistant: this.assistant
+                assistant: this.assistant,
+                intervalDays: 7
               }
             ]
           };

+ 1 - 1
vue.config.js

@@ -19,7 +19,7 @@ const name = defaultSettings.title || "管乐迷后台管理系统"; // page tit
 // let target = 'http://192.168.3.20:8000' //邹璇
 // let target = "http://192.168.0.127:8000"; //勇哥
 // let target = "http://192.168.3.14:8005"; // 原谅
-let target = "https://test.dayaedu.com"; //测试环境
+let target = "https://dev.dayaedu.com"; //测试环境
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 module.exports = {
   /**