lrf402788946 4 年之前
父節點
當前提交
a2886cb5da

+ 87 - 72
src/views/new-plan/arrange/school-arrange.vue

@@ -10,9 +10,6 @@
           <el-col :span="2">
             <el-button type="primary" size="mini" @click="toConfirm">一键分配</el-button>
           </el-col>
-          <!-- <el-col :span="2">
-            <el-button type="primary" size="mini" plain @click="dialog = true">查看汇总</el-button>
-          </el-col> -->
         </el-row>
         <a-table
           ref="planTabel"
@@ -22,6 +19,7 @@
           :getDesignate="getDesignate"
           :changeRange="changeRange"
           :proAffix="proAffix"
+          :classTypeList="classTypeList"
         ></a-table>
       </el-card>
     </detail-frame>
@@ -31,23 +29,24 @@
         <el-col :span="12">
           <el-card>
             <el-form size="mini">
-              <el-form-item label="学校">{{ form | getProp('sch.name') }}</el-form-item>
-              <el-form-item label="学校层次">{{ form | getProp('sch.level') }}</el-form-item>
-              <el-form-item label="需要派车">{{ form | getProp('sch.hascar') }}</el-form-item>
-              <el-form-item label="总名额">{{ form | getProp('sch.number') }}</el-form-item>
-              <el-form-item label="剩余名额">{{ form | getProp('sch.remaining') }}</el-form-item>
+              <el-form-item label="学校">{{ getProp(form, 'sch.name') }}</el-form-item>
+              <el-form-item label="学校层次">{{ getProp(form, 'sch.level') }}</el-form-item>
+              <el-form-item label="需要派车">{{ getProp(form, 'sch.hascar') }}</el-form-item>
+              <el-form-item label="总名额">{{ getProp(form, 'sch.number') }}</el-form-item>
+              <el-form-item label="剩余名额">{{ getProp(form, 'sch.remaining') }}</el-form-item>
             </el-form>
           </el-card>
         </el-col>
         <el-col :span="12">
           <el-card>
             <el-form size="mini">
-              <el-form-item label="期数">{{ form | getProp('info.term') }}</el-form-item>
-              <el-form-item label="批次">{{ form | getProp('info.batch') }}</el-form-item>
-              <el-form-item label="开始时间">{{ form | getProp('info.start') }}</el-form-item>
-              <el-form-item label="结束时间">{{ form | getProp('info.end') }}</el-form-item>
-              <el-form-item label="总名额">{{ form | getProp('info.bpt') }}</el-form-item>
-              <el-form-item label="剩余名额">{{ form | getProp('info.remaining') }}</el-form-item>
+              <el-form-item label="期数">{{ getProp(form, 'info.term') }}</el-form-item>
+              <el-form-item label="批次">{{ getProp(form, 'info.batch') }}</el-form-item>
+              <el-form-item label="班级类型">{{ getProp(form, 'info.classtype') }}</el-form-item>
+              <el-form-item label="开始时间">{{ getProp(form, 'info.start') }}</el-form-item>
+              <el-form-item label="结束时间">{{ getProp(form, 'info.end') }}</el-form-item>
+              <el-form-item label="总名额">{{ getProp(form, 'info.bpt') }}</el-form-item>
+              <el-form-item label="剩余名额">{{ getProp(form, 'info.remaining') }}</el-form-item>
             </el-form>
           </el-card>
         </el-col>
@@ -82,37 +81,6 @@
         </el-row>
       </el-card>
     </el-drawer>
-
-    <!-- 数据汇总 -->
-    <!-- <el-dialog :visible.sync="dialog" title="数据汇总">
-      <el-collapse v-model="activeName" accordion>
-        <el-collapse-item :title="`各期情况 (${isOk() ? '已完成' : '未完成'})`" name="1">
-          <el-table :data="totalList" border stripe size="mini">
-            <el-table-column prop="type"></el-table-column>
-            <el-table-column v-for="(i, index) in termList" align="center" :key="index" :label="`第${i.term}期`" :prop="`term${i.term}`"> </el-table-column>
-          </el-table>
-        </el-collapse-item>
-        <el-collapse-item :title="`车辆统计 共计(${getAllCarTotal()})`" name="2">
-          <el-table :data="carList" border stripe size="mini" height="500px">
-            <el-table-column type="expand">
-              <template v-slot="{ row }">
-                <el-row>
-                  <el-col :span="24" v-for="(i, index) in row.carTerm" :key="index">
-                    <span v-if="i.num > 0">第 {{ i.term }} 期需要 {{ i.num }} 辆车</span>
-                  </el-col>
-                </el-row>
-              </template>
-            </el-table-column>
-            <el-table-column label="学校" align="center" prop="name" width="180"></el-table-column>
-            <el-table-column label="车辆需求总数" align="center">
-              <template v-slot="{ row }">
-                {{ getTableCarTotal(row.carTerm) }}
-              </template>
-            </el-table-column>
-          </el-table>
-        </el-collapse-item>
-      </el-collapse>
-    </el-dialog> -->
   </div>
 </template>
 
@@ -126,8 +94,10 @@ const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
 const { mapActions: util } = createNamespacedHelpers('util');
 const { mapActions: school } = createNamespacedHelpers('school');
 const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
+const { mapActions: classtype } = createNamespacedHelpers('classtype');
 // 表中变量:
 // batch-${batchid}:${batch}
+// batch_type-${batchid}:${type} 这期是什么类型的班级
 // batch_total-${batchid}:${number}
 // car_total-${batchid}: ${carnum}
 // term-${termid}:${term}
@@ -152,9 +122,11 @@ export default {
       activeName: '1',
       already: false,
       options: undefined,
+      classTypeList: [],
     };
   },
   async created() {
+    await this.getOtherList();
     await this.toGetTrainPlan();
     await this.toGetTrainTemplate();
     await this.getSchool();
@@ -165,6 +137,7 @@ export default {
     ...trainPlan({ getTrainPlan: 'fetch' }),
     ...school(['query']),
     ...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update', setSchPlan: 'schArrange' }),
+    ...classtype({ getClassType: 'query' }),
     //请求,处理学校列表
     async getSchool() {
       const res = await this.query();
@@ -194,7 +167,6 @@ export default {
     },
     //自动安排
     async toArrange() {
-      let msg = this.$message({ message: '正在分配中,请稍后', duration: 0 });
       this.toReset();
       let school = this.list.filter(f => f.daterange);
       //整理之后的学校列表
@@ -203,28 +175,43 @@ export default {
       school = this.changeRange(school);
       let termList = JSON.parse(JSON.stringify(this.termList));
       //批次分配的人数 batch_total-${batchid} = 人数
-      for (const sch of school) {
-        for (const t of termList) {
-          for (const b of t.batchnum) {
+      for (let sch of school) {
+        for (let t of termList) {
+          for (let b of t.batchnum) {
+            // 用对应的 b 的 remaining 去判断 这期是否还有剩余
             if (b.remaining && b.remaining <= 0) continue;
+            // break;
+            // 根据 b 中的classtype 取出对应的 remaining
+            // 用对应的 remaining 去分配,处理完后把结果赋回对应的 remaining
+
+            // 判断时间是否在 学校范围内
             let { result } = this.$tqInRange(b.start, b.end, sch.daterange);
             if (result) {
-              //学校名额>本批次剩余名额:
-              if (sch.remaining > b.remaining) {
-                sch.remaining = sch.remaining - b.remaining; //学校剩余名额 = 学校剩余名额(原) - 本批次剩余名额
+              let { classtype } = b;
+              // 获取对应班级类型的 剩余人数
+              let schremaining = _.get(sch, this.proAffix(classtype, 'remaining'));
+              // 学校名额>本批次剩余名额:
+              if (schremaining > b.remaining) {
+                schremaining = schremaining - b.remaining; //学校剩余名额 = 学校剩余名额(原) - 本批次剩余名额
                 if (b.remaining > 0) {
                   this.setNumOthers(sch, b, b.remaining);
                 }
                 b.remaining = 0; //本批次剩余名额=0;
+                sch[this.proAffix(classtype, 'remaining')] = schremaining;
+                sch = this.computedSchRemaining(sch);
                 continue;
               } else {
                 //学校名额<=本批次剩余名额
-                b.remaining = b.remaining - sch.remaining; //本批次剩余名额 = 本批次剩余名额(原) - 学校剩余名额;
-                if (sch.remaining > 0) {
+                b.remaining = b.remaining - schremaining; //本批次剩余名额 = 本批次剩余名额(原) - 学校剩余名额;
+                if (schremaining > 0) {
                   this.setNumOthers(sch, b, sch.remaining);
                 }
-                sch.remaining = 0; //学校剩余名额 = 0
-                break;
+                schremaining = 0; //学校剩余名额 = 0
+                sch[this.proAffix(classtype, 'remaining')] = schremaining;
+                sch = this.computedSchRemaining(sch);
+                //这个地方需要检查下所有 类型的 remaining
+                console.log(sch, b);
+                continue;
               }
             }
           }
@@ -234,7 +221,6 @@ export default {
       }
       this.$set(this, `termList`, termList);
       this.getCarTotal();
-      msg.close();
       this.$message.success('分配完成');
     },
     //保存整体计划
@@ -274,13 +260,30 @@ export default {
     },
     cellClick(data) {
       this.drawer = true;
+      let { sch, info } = data;
+      let { classtype } = info;
+      // TODO车辆没改
+      let keys = Object.keys(sch).filter(f => !f.includes('number') || !f.includes('remaining'));
+      let nsch = _.pick(sch, keys);
+      nsch[`remaining`] = sch[this.proAffix(classtype, 'remaining')];
+      nsch[`number`] = sch[this.proAffix(classtype, 'number')];
+      data.sch = nsch;
+      data.osch = sch;
       this.$set(this, `form`, data);
     },
     toSend() {
       let num = _.get(this.form, 'num');
-      let sch = _.get(this.form, 'sch');
+      let sch = _.get(this.form, 'sch'); //修改部分
+      let osch = _.get(this.form, 'osch'); //原来所有的学校内容
       let info = _.get(this.form, 'info');
+      let { classtype } = info; //获取班级类型,用来减去对应的人数
       sch = this.setNumOthers(sch, info, num);
+      let { remaining } = sch;
+      sch.number = osch.number;
+      sch[this.proAffix(classtype, 'remaining')] = remaining;
+      let keys = Object.keys(sch).filter(f => f.includes('remaining-'));
+      let re = keys.reduce((p, n) => p + sch[n] * 1, 0);
+      sch.remaining = re;
       let si = _.findIndex(this.list, f => f.code == sch.code);
       let termIndex = this.termList.findIndex(f => f._id == info.termid);
       let batchIndex = this.termList.find(f => f._id == info.termid).batchnum.findIndex(f => f._id == info._id);
@@ -428,8 +431,10 @@ export default {
       //计算每批次人数上限
       let res = events.map(i => {
         i.batchnum = i.batchnum.map(b => {
-          b.bpt = b.number * 1 * (b.class * 1);
-          b.remaining = b.number * 1 * (b.class * 1);
+          //因为要分类型去分配,所以remaining要有多种类型,都带着自己的编号在后面
+          b.remaining = b.class.reduce((p, n) => p + (n.number || 0) * 1, 0);
+          b.bpt = _.clone(b.remaining);
+          b.classtype = _.get(_.head(b.class), 'type');
           return b;
         });
         return i; //bpt:该批次总人数 ,remaining:剩余人数
@@ -467,13 +472,6 @@ export default {
     //分配重置
     async toReset() {
       this.getBatchList();
-      let list = this.list.map(i => {
-        let arr = ['address', 'code', 'daterange', 'hascar', 'level', 'name', 'shortname', 'number', 'plan', 'cynum', 'jynum', 'mznum'];
-        let object = _.pick(i, arr);
-        object.remaining = object.number * 1;
-        return object;
-      });
-      this.$set(this, `list`, list);
     },
     //抽屉名额响应式计算
     dComputed(cv = 0, ov = 0) {
@@ -553,8 +551,13 @@ export default {
       let nl = data.map(i => {
         let r = planSchool.find(f => f.code == i.code);
         if (r) {
-          let { cynum = 0, jynum = 0, mznum = 0, num: number = 0 } = r;
-          i = { ...i, cynum: cynum * 1, jynum: jynum * 1, mznum: mznum * 1, number: number * 1 };
+          let obj = {};
+          r.classnum.map(i => {
+            obj[this.proAffix(i.code, 'number')] = i.number * 1;
+            obj[this.proAffix(i.code, 'remaining')] = i.number * 1;
+          });
+          obj.number = r.classnum.reduce((p, n) => p + (n.number || 0) * 1, 0);
+          i = { ...i, ...obj };
         }
         return i;
       });
@@ -621,15 +624,27 @@ export default {
         i.remaining = remaining - n;
         return i;
       });
-      console.log(dl);
       this.$set(this, `list`, dl);
     },
-  },
-  filters: {
+    //计算学校的剩余人数
+    computedSchRemaining(sch) {
+      let keys = Object.keys(sch).filter(f => f.includes(`remaining-`));
+      let num = keys.reduce((p, n) => p + sch[n] * 1, 0);
+      sch.remaining = num;
+      return sch;
+    },
+    async getOtherList() {
+      const res = await this.getClassType();
+      if (this.$checkRes(res)) this.$set(this, `classTypeList`, res.data);
+    },
     getProp(data, prop) {
       if (prop.includes('hascar')) {
         let res = _.get(data, prop);
         return res == '1' ? '需要' : '不需要';
+      } else if (prop.includes('classtype')) {
+        let value = _.get(data, prop);
+        let res = this.classTypeList.find(f => f.code == value);
+        if (res) return res.name;
       } else return _.get(data, prop);
     },
   },

+ 82 - 15
src/views/new-plan/arrange/school-num.vue

@@ -18,11 +18,11 @@
       <el-table :data="getList()" border stripe size="mini" :summary-method="getSummaries" show-summary>
         <el-table-column align="center" label="学校" prop="name"></el-table-column>
         <el-table-column align="center" label="学校代码" prop="code"></el-table-column>
-        <el-table-column align="center" v-for="(c, index) in classTypeList" :key="index" :label="c.name" :prop="`num${c.code}`">
+        <el-table-column align="center" v-for="(c, index) in classTypeList" :key="index" :label="c.name" :prop="proAffix(c.code, 'number')">
           <template v-slot="{ row, $index }">
             <el-input-number
-              v-model="row[`num${c.code}`]"
-              :max="toComputedMax(row, `num${c.code}`, $index)"
+              v-model="row[proAffix(c.code, 'number')]"
+              :max="toComputedMax(row, `number${c.code}`, $index)"
               :min="0"
               size="mini"
               :controls="false"
@@ -49,6 +49,10 @@ const { mapActions: plan } = createNamespacedHelpers('trainplan');
 const { mapActions: school } = createNamespacedHelpers('school');
 const { mapActions: util } = createNamespacedHelpers('util');
 const { mapActions: classtype } = createNamespacedHelpers('classtype');
+//key
+// type: 班级类型
+// _id-${type}:${c _id} ;_id:词缀,value:原来该条数据的_id
+// number-${type}:${number} ;number:词缀,value:该班级类型分配的人数
 export default {
   name: 'school-num',
   props: {},
@@ -68,6 +72,8 @@ export default {
         },
       ],
       classTypeList: [],
+      planAlready: false,
+      schoolAlready: false,
     };
   },
   async created() {
@@ -90,30 +96,75 @@ export default {
       }
     },
     async searchPlan() {
+      this.planAlready = false;
       let planid = _.get(this.defaultOption, 'planid');
       if (!planid) return;
       let res = await this.getPlan(planid);
       if (this.$checkRes(res)) {
         this.$set(this, 'plan', res.data);
       }
+      this.planAlready = true;
     },
     async search({ skip = 0, limit = 10, ...info } = {}) {
       let res = await this.query({ ...info });
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
+        this.schoolAlready = true;
       }
     },
+    //将已安排的学校整理进学校的列表中
+    toSetData() {
+      let dl = _.cloneDeep(this.list);
+      let schplan = _.get(this.plan, 'school', []);
+      schplan.map(sp => {
+        let sch = dl.find(f => f.code == sp.code);
+        if (sch) {
+          let schIndex = dl.findIndex(f => f.code == sp.code);
+          for (const c of sp.classnum) {
+            let { code, number, _id } = c;
+            let cnumkey = this.proAffix(code, 'number');
+            let c_idkey = this.proAffix(code, '_id');
+            sch[cnumkey] = number;
+            sch[c_idkey] = _id;
+          }
+          sch.planid = sp._id;
+          this.$set(this.list, schIndex, sch);
+        }
+      });
+    },
     async handleSave() {
-      for (const _list of this.list) {
-        let { num_id: _id, name, ...info } = _list;
-        if (_id) {
-          let i = this.plan.school.findIndex(f => f._id == _id);
-          this.$set(this.plan.school, i, { _id, ...info });
-        } else this.plan.school.push({ _id, ...info });
-      }
-      let duplicate = _.cloneDeep(this.plan);
-      let res = await this.updatePlan(duplicate);
-      this.$checkRes(res);
+      let dl = _.cloneDeep(this.list);
+      let dp = _.cloneDeep(this.plan);
+      let arr = dl.map(i => {
+        let { code, planid } = i;
+        let classnum = [];
+        let num = 0;
+        let keys = Object.keys(i).filter(f => f.includes('-'));
+        let keynums = _.uniq(keys.map(i => this.proAffix(i).value));
+        for (const kn of keynums) {
+          let tk = keys.filter(f => this.proAffix(f).value == kn);
+          let cobj = {};
+          for (const tkey of tk) {
+            let { affix, value } = this.proAffix(tkey);
+            cobj[affix] = i[tkey];
+            cobj['code'] = value;
+          }
+          let ct = this.classTypeList.find(f => f.code == cobj.code);
+          if (!(ct && cobj.number > 0)) continue;
+          cobj.name = ct.name;
+          num += cobj.number;
+          classnum.push(cobj);
+        }
+        if (num > 0) {
+          let sobj = { code, classnum, num };
+          if (planid) sobj._id = planid;
+          return sobj;
+        }
+      });
+      arr = _.compact(arr);
+      dp.school = arr;
+      let res = await this.updatePlan(dp);
+      this.$checkRes(res, '修改成功', res.errmsg || '修改失败');
     },
     getList() {
       let duplicate = this.list;
@@ -144,7 +195,7 @@ export default {
       if (this.$checkRes(res)) this.$set(this, `classTypeList`, res.data);
     },
     toComputedMax(row, prop, index) {
-      let keys = this.classTypeList.map(i => `num${i.code}`);
+      let keys = this.classTypeList.map(i => this.proAffix(i.code, 'number'));
       let { total } = this.template;
       let lt = this.list.reduce((p, n) => {
         let t = 0;
@@ -158,13 +209,20 @@ export default {
       return elsenum;
     },
     getRowTotal(row) {
-      let keys = this.classTypeList.map(i => `num${i.code}`);
+      let keys = this.classTypeList.map(i => this.proAffix(i.code, 'number'));
       let total = 0;
       for (const key of keys) {
         total = total + (row[key] || 0) * 1;
       }
       return total;
     },
+    proAffix(value, affix) {
+      if (affix) return `${affix}-${value}`;
+      else {
+        let arr = value.split('-');
+        return { affix: _.head(arr), value: _.last(arr) };
+      }
+    },
   },
   watch: {
     defaultOption: {
@@ -175,12 +233,21 @@ export default {
       deep: true,
       immediate: true,
     },
+    canReset: {
+      immediate: true,
+      handler(val) {
+        if (val) this.toSetData();
+      },
+    },
   },
   computed: {
     ...mapState(['user', 'defaultOption']),
     pageTitle() {
       return `${this.$route.meta.title}`;
     },
+    canReset() {
+      return this.planAlready && this.schoolAlready;
+    },
   },
   metaInfo() {
     return { title: this.$route.meta.title };

+ 29 - 25
src/views/new-plan/arrange/table/table.vue

@@ -23,35 +23,24 @@
         </template>
       </el-table-column>
 
-      <el-table-column label="期数" fixed align="center">
+      <el-table-column label="期数" align="center">
         <el-table-column label="班级数" align="center">
           <el-table-column label="时间" align="center">
             <el-table-column label="备注" align="center">
-              <el-table-column label="总人数" align="center" prop="number">
-                <template v-slot="{ row }">
-                  <el-tooltip effect="dark" placement="top">
-                    <template #content>
-                      <el-row style="width:120px">
-                        <el-col :span="24">就业班人数: {{ row.jynum }} 人</el-col>
-                        <el-col :span="24">创业班人数: {{ row.cynum }} 人</el-col>
-                        <el-col :span="24">少数民族班人数: {{ row.mznum }} 人</el-col>
-                      </el-row>
-                    </template>
-                    <el-link type="primary" :underline="false">{{ row.number }}</el-link>
-                  </el-tooltip>
-                </template>
+              <el-table-column align="center" v-for="(ct, index) in classTypeList" :key="index" :label="ct.name" :prop="`${proAffix(ct.code, 'remaining')}`">
               </el-table-column>
+              <el-table-column label="总人数" align="center" prop="number"> </el-table-column>
             </el-table-column>
           </el-table-column>
         </el-table-column>
       </el-table-column>
 
+      <!-- 用batch_batch.id batch_+对应_id拼成唯一数据存放在学校列表中,对应每个表格 -->
       <el-table-column align="center" v-for="(i, index) in tList" :key="index" :label="`${i.term}`">
         <template v-for="(batch, bindex) in i.batchnum">
-          <el-table-column :label="batch.batch ? batch.class : batch.name" :key="bindex" align="center">
-            <el-table-column :label="getBatchDate(batch)" :key="bindex" align="center">
+          <el-table-column :label="`${getClassnum(batch)}`" :key="bindex" align="center">
+            <el-table-column :label="`${getBatchDate(batch)}`" :key="bindex" align="center">
               <el-table-column :key="bindex" align="center" width="100" :prop="`batch_total-${batch._id}`">
-                <!-- 用batch_batch.id batch_+对应_id拼成唯一数据存放在学校列表中,对应每个表格 -->
                 <template #header>
                   <el-input v-model="remarks[batch._id]" size="mini" placeholder="备注" type="textarea"></el-input>
                 </template>
@@ -75,7 +64,6 @@
 <script>
 import _ from 'lodash';
 const moment = require('moment');
-// moment.locale('zh-cn');
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'table-frame',
@@ -85,6 +73,7 @@ export default {
     changeRange: { type: Function },
     proAffix: { type: Function },
     getDesignate: { type: Function },
+    classTypeList: { type: Array, default: () => [] },
   },
   components: {},
   data: function() {
@@ -99,8 +88,21 @@ export default {
   methods: {
     getBatchDate(batch) {
       let { end, start } = batch;
-      let date = `${moment(start).format('M.D')} - ${moment(end).format('M.D')}`;
-      return date;
+      if ((start, end)) {
+        let date = `${moment(start).format('M.D')} - ${moment(end).format('M.D')}`;
+        return date;
+      }
+    },
+    getClassnum(batch) {
+      let tip = '';
+      let ct = _.uniq(batch.class.map(i => i.type));
+      for (const type of ct) {
+        let r = this.classTypeList.find(f => f.code == type);
+        if (r && tip.length == 0) tip += r.name;
+        else if (r && tip.length > 0) tip += `/${r.name}`;
+      }
+      let num = _.get(batch.class, 'length', 0);
+      return `${num}(${tip})`;
     },
     findBatch(termid) {
       return this.bList.filter(f => f.termid == termid);
@@ -122,7 +124,7 @@ export default {
         } else {
           let prop = _.get(col, 'property');
           if (prop == 'number') {
-            let num = this.list.reduce((prev, next) => prev + next.number * 1, 0);
+            let num = this.list.reduce((prev, next) => prev + (next.number || 0) * 1, 0);
             arr.push(num);
           } else {
             let r = this.display ? this.columnComputed(prop, data) : this.carComputed(prop, data);
@@ -141,7 +143,7 @@ export default {
         .flat()
         .find(f => f._id == batchid);
       if (batch) {
-        let word = batch.remaining > 0 ? `(缺少${batch.remaining}人)` : '(ok)';
+        let word = batch.remaining > 0 ? `(缺少${batch.remaining}人)` : '(分配完成)';
         num = `${num}${word}`;
       }
       return num;
@@ -167,7 +169,7 @@ export default {
     },
     //单元格样式
     cellStyle({ row, column, rowIndex, columnIndex }) {
-      if (!column.property || column.property == 'name' || column.property == 'number') return '';
+      if (!column.property || column.property == 'name' || column.property.includes('number')) return '';
       else if (!_.get(row, 'daterange')) return '';
       else {
         let r = this.proAffix(column.property);
@@ -176,8 +178,10 @@ export default {
           .flat()
           .find(f => f._id == r.value);
         row = this.changeRange(row);
-        let { result } = this.$tqInRange(batch.start, batch.end, row.daterange);
-        if (result) return { background: '#67C23AA0' };
+        if (batch && batch.start && batch.end) {
+          let { result } = this.$tqInRange(batch.start, batch.end, row.daterange);
+          if (result) return { background: '#67C23AA0' };
+        }
       }
     },
   },

+ 4 - 2
src/views/new-plan/parts/event.vue

@@ -19,14 +19,15 @@
           <el-option v-for="(i, index) in classTypeList" :key="index" :label="i.name" :value="i.code"></el-option>
         </el-select>
       </el-form-item> -->
-      <el-form-item label="批次" prop="batch"> <el-input v-model="form.batch" :readonly="!isNew"></el-input> </el-form-item>
+      <el-form-item label="批次" prop="batch" required> <el-input v-model="form.batch" :readonly="!isNew"></el-input> </el-form-item>
       <el-form-item label="班级">
         <el-row>
           <el-col :span="24">
             <el-button type="primary" icon="el-icon-plus" @click="addClass()">添加班级</el-button>
           </el-col>
+          <el-alert :closable="false" title="班级名称在同一期不可重复;(不论特殊班级,还是正常班级)" type="warning" show-icon center></el-alert>
           <el-table size="mini" :data="form.class">
-            <el-table-column align="center" label="班级(不可重复)">
+            <el-table-column align="center" label="班级">
               <template v-slot="{ row }">
                 <el-input v-model="row.name"></el-input>
               </template>
@@ -95,6 +96,7 @@ export default {
         startdate: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
         enddate: [{ required: true, message: '请选择结束时间', trigger: 'change' }],
         term: [{ required: true, message: '请输入期数' }],
+        batch: [{ required: true, message: '请输入批次' }],
         number: [{ required: true, message: '请输入每班人数' }],
       },
       pickerOptions: {