浏览代码

期课表完成

lrf402788946 5 年之前
父节点
当前提交
3e2d7edca9
共有 2 个文件被更改,包括 190 次插入6 次删除
  1. 0 2
      src/views/train-plan/parts/term-lesson-table.vue
  2. 190 4
      src/views/train-plan/term-lesson.vue

+ 0 - 2
src/views/train-plan/parts/term-lesson-table.vue

@@ -82,8 +82,6 @@ export default {
       } else {
         this.$message.warning('此项不允许更改');
       }
-      // console.log(row);
-      // console.log(column);
     },
   },
   filters: {

+ 190 - 4
src/views/train-plan/term-lesson.vue

@@ -1,6 +1,11 @@
 <template>
   <div id="term-lesson">
     <detail-frame :title="pageTitle" returns="/train/plan/lesson">
+      <el-row type="flex" align="middle" justify="end" class="btn_bar">
+        <el-col :span="2">
+          <el-button type="primary" size="mini" @click="allSave" v-if="!loading">保存期课表</el-button>
+        </el-col>
+      </el-row>
       <el-row type="flex" v-loading="loading" style="min-height:500px">
         <el-col :span="8" v-for="(i, index) in list" :key="index">
           <lesson-table :data="i" :batch="`${index + 1}`" @lesson="toLesson" @other="toOther"></lesson-table>
@@ -70,12 +75,29 @@ export default {
       subjectList: [],
     };
   },
-  created() {
-    this.getSettingLists();
+  async created() {
+    await this.getSettingLists();
+    // this.$watch(
+    //   'defaultOption',
+    //   val => {
+    //     if (!_.get(this, 'options')) {
+    //       this.$set(this, `options`, _.cloneDeep(val));
+    //       this.search();
+    //     } else {
+    //       let ntermid = _.get(val, 'termid');
+    //       let otermid = _.get(this.options, 'termid');
+    //       if (ntermid && !_.isEqual(ntermid, otermid)) {
+    //         this.$set(this, `options`, _.cloneDeep(val));
+    //         this.search();
+    //       }
+    //     }
+    //   },
+    //   { deep: true, immediate: true }
+    // );
   },
   methods: {
-    ...lesson({ getLesson: 'query' }),
-    ...classes({ getClass: 'query' }),
+    ...lesson({ getLesson: 'query', plupdate: 'pluralUpdate' }),
+    ...classes({ getClass: 'query', pcupdate: 'pluralUpdate' }),
 
     ...subject({ getSubject: 'query' }),
     ...director({ getDirector: 'fetch' }),
@@ -368,6 +390,170 @@ export default {
         }
       }
     },
+    //全部保存
+    allSave() {
+      //match(/\d+(.\d+)?/g)[0];
+      let duplicate = _.cloneDeep(this.list);
+      let dClass = _.cloneDeep(this.classList);
+      let dLesson = _.cloneDeep(this.lessonList);
+      let data = duplicate[0];
+      duplicate.map(data => {
+        // console.log(data);
+        let day = _.get(_.last(data), 'date', '全天');
+        day = day == '全天' ? '0' : '1';
+        //先以班级分组数据
+        let batch = [];
+        for (const obj of data) {
+          let keys = Object.keys(obj);
+          let r = _.uniq(_.flatten(_.compact(keys.map(key => key.match(/\d+(.\d+)?/g)))));
+          // console.log(`r`);
+          // console.log(r);
+          let notClassKey = keys.filter(f => {
+            for (const num of r) {
+              if (f.includes(num)) return false;
+            }
+            return true;
+          });
+          //获得这条数据公共属性
+          let common = {};
+          notClassKey.map(key => {
+            let o = {};
+            common[key] = obj[key];
+          });
+          // console.log(`common:`);
+          // console.log(common);
+          //获取各班设置
+          let self = [];
+          //获取需要分组的字段
+          let classKey = keys.filter(f => {
+            for (const num of r) {
+              if (f.includes(num)) return true;
+            }
+            return false;
+          });
+          // console.log(`classKey:和各个班级有关的key`);
+          // console.log(classKey);
+          //将分组字段的词根筛出来
+          let words = _.uniq(classKey.map(i => i.split('_')[0]));
+          // console.log(`words:classKey的词根`);
+          // console.log(words);
+          let wvs = [];
+          for (const num of r) {
+            let res = {};
+            words.map(word => {
+              res[word] = obj[`${word}_${num}`];
+            });
+            wvs.push(res);
+          }
+          // console.log(`wv:整理出以班为一个object的数组`);
+          wvs = wvs.map(i => {
+            return { ...i, ...common };
+          });
+          // console.log(wvs);
+          batch = [...batch, ...wvs];
+          // break;
+          // let indexs = _.uniq(keys.map(key => key.match(/\d+(.\d+)?/g)[0]));
+          // console.log(indexs);
+        }
+        // console.log(batch);
+        //按班分组,并将最后一天课按照全天/半天处理好
+        //先按classid分组 => [object] , object => array = [[string,array],...] => 数组维度-1 => [string,array] => 过滤出 数据类型是数组的数据 => [array]
+        let claArr = _.flatten(_.toPairs(_.groupBy(batch, 'classid'))).filter(f => _.isArray(f));
+        claArr = claArr.map(i => {
+          let shouldDeal = i.filter(f => f.type == 'lesson');
+          shouldDeal = _.orderBy(shouldDeal, 'date', 'asc');
+          let last = _.last(shouldDeal);
+          last = { ...last, day };
+          shouldDeal.splice(shouldDeal.length - 1, 1, last);
+          //处理班级的三个设置
+          let noDeal = i.filter(f => f.type !== 'lesson');
+          //此方法返回值为已经修改(班主任,礼仪教师,教室的id)后的班级列表(顺带也把meta除了),这个dClass可以作为修改班级的数据,剩下课表没出来
+          dClass = this.proClass(dClass, noDeal);
+          return shouldDeal;
+        });
+        //接下来改课表,之前整理过,所以课表除了改过的那些数据外,还有2份,一份在班级列表中(dClass中的lessons);还有一份原始数据在课程列表中(dLessons中的lessons)
+        //dClass和dLesson还有claArr可以通过classid建立联系确定唯一
+        //现在claArr中的结构是:[[{}],[{}],...] 内部第一层数组按班级分类,也就是说里面的{}都是一个班的数据
+        claArr.map(i => {
+          let cla_id = _.get(_.head(i), 'classid');
+          let les = dLesson.find(f => f.classid == cla_id);
+          let lesi = dLesson.findIndex(f => f.classid == cla_id);
+          if (!les) return;
+          //确定该班的原数据组(les) 和 现数据组(i)
+          //此处原数据的数据形式:{key(日期):array,...}
+          les = _.get(les, 'lessons', []);
+          les = _.groupBy(_.orderBy(les, ['date', 'time'], 'asc'), 'date');
+          //循环现数据,然后利用日期(date)缩小范围,然后过滤出 当前现数据所对应的原数据
+          i.map(nowi => {
+            let dateStr = _.get(nowi, 'date');
+            if (!dateStr) return;
+            //缩小范围,获取该天的原数据
+            let darr = les[dateStr];
+            //找到该条数据,进行替换
+            let r = darr.find(f => f._id == nowi.lessonid);
+            let ri = darr.findIndex(f => f._id == nowi.lessonid);
+            let o = {};
+            if (!r) return;
+            //数据还原与合并
+            let { _id, date, time } = r;
+            o = this.lessonDataReturn(nowi);
+            o = { ...o, _id, date, time };
+            //sub替换:此处靠数据关联=>自动排过课表后,有课的那天的array中一定会有2条数据,我们只改变第一条数据,第二条数据随着第一条数据改变
+            //所以此处会出现的问题就是:如果课表模板没有一天安排2条课的数据,那么此处会出现问题,不过这都是操作人干的.和程序无关
+            darr.splice(ri, 1, o);
+            let { subid, subname, teaid, teaname } = o;
+            if (subid) {
+              let srarr = darr.filter(f => f.subid && f._id != _id);
+              for (const sr of srarr) {
+                let sri = darr.findIndex(f => f._id == sr._id);
+                let sro = { ...sr, subid, subname, teaid, teaname };
+                darr.splice(sri, 1, sro);
+              }
+            }
+          });
+          let dres = _.cloneDeep(les);
+          dres = _.flatten(_.flatten(_.toPairs(dres)).filter(f => _.isArray(f)));
+          dLesson[lesi].lessons = dres;
+        });
+      });
+      dClass = dClass.map(i => _.omit(i, ['lessons']));
+      dLesson = dLesson.map(i => _.omit(i, ['meta']));
+      //最后数据 dClass,班级列表; dLesson 课程列表
+      let axiosArr = [];
+      axiosArr.push(this.plupdate(dLesson));
+      axiosArr.push(this.pcupdate(dClass));
+      axios.all(axiosArr).then(
+        axios.spread((rl, rc) => {
+          if (!rl && rl.errcode != '0') {
+            this.$message.error(rl.errmsg);
+            return;
+          }
+          if (!rc && rc.errcode != '0') {
+            this.$message.error(rc.errmsg);
+            return;
+          }
+          this.$message.success('保存成功');
+        })
+      );
+    },
+    lessonDataReturn(data) {
+      let { id: teaid, name: teaname, subid, subname, day = 0 } = data;
+      return { teaid, teaname, subid, subname, day };
+    },
+    proClass(classes, data) {
+      let obj = {};
+      data.map(i => {
+        obj.classid = i.classid;
+        obj[`${i.type}id`] = i.id;
+      });
+      classes.splice(
+        classes.findIndex(f => f._id == obj.classid),
+        1,
+        { ...classes.find(f => f._id == obj.classid), ...obj }
+      );
+      classes = classes.map(i => _.omit(i, ['meta']));
+      return classes;
+    },
   },
   watch: {
     defaultOption: {