|
@@ -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: {
|