|
@@ -6,53 +6,36 @@
|
|
|
<el-button type="primary" size="mini" plain @click="toArrange">按模板排课</el-button>
|
|
|
</el-col>
|
|
|
<el-col :span="2">
|
|
|
- <el-button type="primary" size="mini" @click="allSave">保存期课表</el-button>
|
|
|
+ <!-- <el-button type="primary" size="mini" @click="allSave">保存期课表</el-button> -->
|
|
|
</el-col>
|
|
|
<el-col :span="2">
|
|
|
<el-button type="primary" size="mini" plain @click="toStatus">确定课表</el-button>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
- <el-row type="flex" v-loading="loading" style="min-height:500px">
|
|
|
- <el-col :span="9" v-for="(i, index) in list" :key="index">
|
|
|
- <lesson-table
|
|
|
- type="usual"
|
|
|
- :data="i"
|
|
|
- :batch="`${index + 1}`"
|
|
|
- :noticeList="noticeList"
|
|
|
- :teacherList="inteaList"
|
|
|
- @lesson="toLesson"
|
|
|
- @other="toOther"
|
|
|
- @toOneClass="toOneClass"
|
|
|
- ></lesson-table>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row type="flex" v-loading="loading" style="min-height:500px" v-for="(i, index) in unusualList" :key="index">
|
|
|
- <el-col :span="8">
|
|
|
- <lesson-table
|
|
|
- type="unusual"
|
|
|
- :data="i"
|
|
|
- :batch="`${index + 1}`"
|
|
|
- :noticeList="noticeList"
|
|
|
- :teacherList="inteaList"
|
|
|
- @lesson="toLesson"
|
|
|
- @other="toOther"
|
|
|
- @toOneClass="toOneClass"
|
|
|
- ></lesson-table>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <div style="min-height:800px" v-loading="loading" element-loading-text="期课表加载中,请稍后..." element-loading-background="rgba(0, 0, 0, 0.8)">
|
|
|
+ <excel-term-lesson
|
|
|
+ :classType="ctList"
|
|
|
+ :data="list"
|
|
|
+ :teacherList="teacherList"
|
|
|
+ :noticeList="noticeList"
|
|
|
+ :subjectList="subjectList"
|
|
|
+ :headTeacherList="headTeacherList"
|
|
|
+ @lessonChange="toLessonChange"
|
|
|
+ @classChange="toClassChange"
|
|
|
+ ></excel-term-lesson>
|
|
|
+ </div>
|
|
|
</detail-frame>
|
|
|
<el-drawer title="课程安排" :visible.sync="lDrawer" :destroy-on-close="true" @close="toClose">
|
|
|
- <lesson-form v-if="lDrawer" v-loading="dloading" :data="form" :subjectList="subjectList" :schoolList="schoolList" @save="lessonSave"></lesson-form>
|
|
|
+ <lesson-form v-if="lDrawer" :data="form" :subjectList="subjectList" :schoolList="schoolList" @save="lessonSave"></lesson-form>
|
|
|
</el-drawer>
|
|
|
- <el-drawer title="其他安排" :visible.sync="oDrawer" :destroy-on-close="true" @close="toClose">
|
|
|
+ <el-drawer title="班级安排" :visible.sync="cDrawer" :destroy-on-close="true" @close="toClose">
|
|
|
<class-form
|
|
|
- v-if="oDrawer"
|
|
|
+ v-if="cDrawer"
|
|
|
:data="form"
|
|
|
:locationList="locationList"
|
|
|
:headTeacherList="headTeacherList"
|
|
|
- :lyTeacherList="lyTeacherList"
|
|
|
- v-loading="dloading"
|
|
|
- @save="lessonSave"
|
|
|
+ :teacherList="teacherList"
|
|
|
+ @save="classSave"
|
|
|
></class-form>
|
|
|
</el-drawer>
|
|
|
</div>
|
|
@@ -63,7 +46,7 @@ import _ from 'lodash';
|
|
|
import axios from 'axios';
|
|
|
// const moment = require('moment');
|
|
|
// moment.locale('zh-cn');
|
|
|
-import lessonTable from './parts/term-lesson-table';
|
|
|
+import excelTermLesson from './parts/excel-term-lesson.vue';
|
|
|
import lessonForm from './parts/term-lesson-form';
|
|
|
import classForm from './parts/term-class-from';
|
|
|
import detailFrame from '@frame/layout/admin/detail-frame';
|
|
@@ -81,29 +64,30 @@ const { mapActions: director } = createNamespacedHelpers('director');
|
|
|
const { mapActions: school } = createNamespacedHelpers('school'); //给选老师组件使用.这个页面请求完就不销毁了
|
|
|
const { mapActions: subject } = createNamespacedHelpers('subject');
|
|
|
const { mapActions: notice } = createNamespacedHelpers('notice');
|
|
|
+const { mapActions: ct } = createNamespacedHelpers('classtype');
|
|
|
export default {
|
|
|
name: 'term-lesson',
|
|
|
props: {},
|
|
|
- components: { detailFrame, lessonTable, lessonForm, classForm },
|
|
|
+ components: { detailFrame, excelTermLesson, lessonForm, classForm },
|
|
|
data: function() {
|
|
|
return {
|
|
|
loading: true,
|
|
|
- dloading: false,
|
|
|
lDrawer: false,
|
|
|
- oDrawer: false,
|
|
|
+ cDrawer: false,
|
|
|
form: {},
|
|
|
formType: 'usual',
|
|
|
options: {},
|
|
|
list: [],
|
|
|
- unusualList: [],
|
|
|
classList: [],
|
|
|
lessonList: [],
|
|
|
locationList: [],
|
|
|
- lyTeacherList: [],
|
|
|
+ teacherList: [],
|
|
|
deptList: [],
|
|
|
headTeacherList: [],
|
|
|
schoolList: [],
|
|
|
subjectList: [],
|
|
|
+ // 班级类型列表
|
|
|
+ ctList: [],
|
|
|
//该期通知列表
|
|
|
noticeList: [],
|
|
|
//已经选择的教师列表
|
|
@@ -133,12 +117,18 @@ export default {
|
|
|
},
|
|
|
methods: {
|
|
|
...notice({ getNoticeList: 'query' }),
|
|
|
-
|
|
|
- ...lesson({ getLesson: 'query', plupdate: 'pluralUpdate', autoArrange: 'arrange', confirmLesson: 'confirmLesson', newArrange: 'newArrange' }),
|
|
|
- ...classes({ getClass: 'query', pcupdate: 'pluralUpdate' }),
|
|
|
-
|
|
|
+ ...lesson({
|
|
|
+ getLesson: 'query',
|
|
|
+ lessonUpdate: 'update',
|
|
|
+ plupdate: 'pluralUpdate',
|
|
|
+ autoArrange: 'arrange',
|
|
|
+ confirmLesson: 'confirmLesson',
|
|
|
+ newArrange: 'newArrange',
|
|
|
+ }),
|
|
|
+ ...classes({ getClass: 'query', pcupdate: 'pluralUpdate', classUpdate: 'update' }),
|
|
|
+ ...ct({ getCt: 'query' }),
|
|
|
...subject({ getSubject: 'query' }),
|
|
|
- ...director({ getDirector: 'fetch' }),
|
|
|
+ ...director({ getDirector: 'fetch', getDirectorList: 'query' }),
|
|
|
...school({ getSchool: 'query' }),
|
|
|
...location({ getLocationList: 'query' }),
|
|
|
...teacher({ getTeacherList: 'query', getTeacher: 'fetch', getTeachers: 'lessonteafetch' }),
|
|
@@ -147,22 +137,43 @@ export default {
|
|
|
...teaplan(['findTeacher']),
|
|
|
async search() {
|
|
|
this.loading = true;
|
|
|
+ // 将 请求班级和 请求课表拆开,以便之后局部修改,保存减少请求次数
|
|
|
+ const res = await this.toGetClass();
|
|
|
+ if (res === 'noClass') {
|
|
|
+ this.loading = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ await this.toGetLesson();
|
|
|
+ this.toSetData();
|
|
|
+ this.toGetNoticeList();
|
|
|
+ this.loading = false;
|
|
|
+ },
|
|
|
+ // 获取班级
|
|
|
+ async toGetClass() {
|
|
|
let termid = _.get(this.defaultOption, `termid`);
|
|
|
if (!termid) return;
|
|
|
- let lessonList = [];
|
|
|
- let classList = [];
|
|
|
let classes = await this.getClass({ termid });
|
|
|
+ let classList = [];
|
|
|
if (this.$checkRes(classes)) {
|
|
|
classList = classes.data;
|
|
|
- for (let cla of classList) {
|
|
|
- cla = await this.searchClassPerson(cla);
|
|
|
- }
|
|
|
if (classList.length <= 0) {
|
|
|
this.$message.error('班级未生成,无法查询课表,请先进行学生分班');
|
|
|
- return;
|
|
|
+ return 'noClass';
|
|
|
}
|
|
|
+ classList = classList.map(i => {
|
|
|
+ if (parseInt(i.name)) i.order = parseInt(i.name);
|
|
|
+ else i.order = i.name;
|
|
|
+ return i;
|
|
|
+ });
|
|
|
+ classList = _.orderBy(classList, ['order'], ['asc']);
|
|
|
this.$set(this, `classList`, classList);
|
|
|
}
|
|
|
+ },
|
|
|
+ // 获取课程
|
|
|
+ async toGetLesson() {
|
|
|
+ let termid = _.get(this.defaultOption, `termid`);
|
|
|
+ if (!termid) return;
|
|
|
+ let lessonList = [];
|
|
|
let lessons = await this.getLesson({ termid });
|
|
|
if (this.$checkRes(lessons)) {
|
|
|
lessonList = lessons.data;
|
|
@@ -172,182 +183,26 @@ export default {
|
|
|
}
|
|
|
this.$set(this, `lessonList`, lessonList);
|
|
|
}
|
|
|
-
|
|
|
- let unusualList = classList.filter(f => f.type != '0');
|
|
|
- let usualList = classList.filter(f => f.type == '0');
|
|
|
- let usualRes = this.dealList(usualList, lessonList);
|
|
|
- let unusualRes = this.dealList(unusualList, lessonList);
|
|
|
- this.$set(this, `list`, usualRes);
|
|
|
- this.$set(this, `unusualList`, unusualRes);
|
|
|
- this.toGetNoticeList();
|
|
|
- this.toGetTeachers();
|
|
|
- this.loading = false;
|
|
|
- },
|
|
|
- dealList(classList, lessonList) {
|
|
|
- let arr = classList.map(i => {
|
|
|
- let r = lessonList.find(f => f.classid == i._id);
|
|
|
- if (r) {
|
|
|
- let { lessons = [] } = r;
|
|
|
- i.lessons = lessons;
|
|
|
- }
|
|
|
- return i;
|
|
|
- });
|
|
|
- arr = _.flatten(
|
|
|
- _.toPairs(
|
|
|
- _.groupBy(
|
|
|
- arr.sort((a, b) => a - b),
|
|
|
- `batch`
|
|
|
- )
|
|
|
- )
|
|
|
- ).filter(f => _.isArray(f));
|
|
|
- arr = arr.map((i, index) => {
|
|
|
- // 先转换lessons,此表的情况是:小批次下的班级都是一样的课程,只有教师,教室不一样
|
|
|
- let a = this.changeLesson(i);
|
|
|
- let last = this.setAllday(_.last(a));
|
|
|
- let ht = this.setProp(a, 'headteacher');
|
|
|
- let lyt = this.setProp(a, 'lyteacher');
|
|
|
- let js = this.setProp(a, 'jslocation');
|
|
|
- for (let ind = 0; ind < index; ind++) {
|
|
|
- a.unshift({});
|
|
|
- }
|
|
|
- //找到该班额班主任和礼仪课教师
|
|
|
- a.push(ht);
|
|
|
- a.push(lyt);
|
|
|
- a.push(js);
|
|
|
- for (let ind = 2; ind > index; ind--) {
|
|
|
- a.push({});
|
|
|
- }
|
|
|
- a.push(last);
|
|
|
- return a;
|
|
|
- });
|
|
|
- return arr;
|
|
|
},
|
|
|
- //课程数据=>页面数据形式
|
|
|
- changeLesson(array) {
|
|
|
- //{batch,subname(同一批每天课程一样),subid, classid_1,classid_2, teaid_1, teaid_2, lessonid_1,lessonid_2 }
|
|
|
- //i(map循环)中获取的参数: batch;classid_*;
|
|
|
- //lesson中获取的参数: subname;subid_*;teaid_*;lessonid_*
|
|
|
- let duplicate = _.cloneDeep(array);
|
|
|
- duplicate = duplicate.map(i => {
|
|
|
- if (parseInt(i.name)) i.orderObj = parseInt(i.name);
|
|
|
+ // 整理班级和课程
|
|
|
+ async toSetData() {
|
|
|
+ let classList = _.cloneDeep(this.classList);
|
|
|
+ classList = classList.map(i => {
|
|
|
+ const lesson = this.lessonList.find(f => f.classid === i._id);
|
|
|
+ if (lesson) i.lesson = lesson;
|
|
|
+ else i.lesson = {};
|
|
|
return i;
|
|
|
});
|
|
|
- duplicate = _.orderBy(duplicate, 'orderObj');
|
|
|
- //按日期排序
|
|
|
- let res = duplicate.map((i, index) => {
|
|
|
- let les = _.flatten(
|
|
|
- _.toPairs(
|
|
|
- _.groupBy(
|
|
|
- // i.lessons.sort((a, b) => moment(a.date).format('X') - moment(b.date).format('X')),
|
|
|
- _.orderBy(i.lessons, 'date', 'asc'),
|
|
|
- 'date'
|
|
|
- )
|
|
|
- )
|
|
|
- ).filter(f => _.isArray(f));
|
|
|
- // console.log(i);
|
|
|
- // console.log(les);
|
|
|
- //每天按时间排序
|
|
|
- les = les.map(lesi => _.orderBy(lesi, 'time', 'asc'));
|
|
|
- let t = les.map(li => {
|
|
|
- let r = li.find(f => f.subid);
|
|
|
- // console.log(r);
|
|
|
- let obj;
|
|
|
- //有课程,则显示课程;没有,显示安排的活动,反正都是用subname字段
|
|
|
- if (r) {
|
|
|
- let { subname, subid, teaid, teaname, _id: lessonid, date, reason } = r;
|
|
|
- obj = { subname, subid };
|
|
|
- obj[`id_${index + 1}`] = teaid;
|
|
|
- obj[`name_${index + 1}`] = teaname;
|
|
|
- obj[`lessonid_${index + 1}`] = lessonid;
|
|
|
- obj[`date`] = date;
|
|
|
- if (reason) obj[`reason_${index + 1}`] = reason;
|
|
|
- } else {
|
|
|
- let { subname, _id: lessonid, date } = _.head(li);
|
|
|
- obj = { subname };
|
|
|
- obj[`lessonid_${index + 1}`] = lessonid;
|
|
|
- obj[`date`] = date;
|
|
|
- }
|
|
|
- obj.batch = i.batch;
|
|
|
- obj[`classid_${index + 1}`] = i._id;
|
|
|
- obj[`class_${index + 1}`] = i.name;
|
|
|
- obj['type'] = 'lesson';
|
|
|
- return obj;
|
|
|
- });
|
|
|
- return t;
|
|
|
- });
|
|
|
- let l = _.get(_.head(res), 'length');
|
|
|
- let arr = [];
|
|
|
- for (let i = 0; i < l; i++) {
|
|
|
- let obj = {};
|
|
|
- for (const item of res) {
|
|
|
- obj = { ...obj, ...item[i] };
|
|
|
- }
|
|
|
- arr.push(obj);
|
|
|
- }
|
|
|
- return arr;
|
|
|
- },
|
|
|
- //班主任/礼仪课老师=>页面数据形式
|
|
|
- setProp(data, type) {
|
|
|
- if (!(data && data.length > 0)) return {};
|
|
|
- let head = _.head(data);
|
|
|
- let res = { type };
|
|
|
- res.date = type == 'headteacher' ? '班主任' : type == 'lyteacher' ? '礼仪课教师' : '教室';
|
|
|
- let keys = Object.keys(head).filter(f => f.includes('classid'));
|
|
|
- for (const key of keys) {
|
|
|
- let cla_id = head[key];
|
|
|
- let i = key.match(/\d+(.\d+)?/g)[0];
|
|
|
- let r = this.classList.find(f => f._id == cla_id);
|
|
|
- if (r) {
|
|
|
- res[`id_${i}`] = _.get(r, `${type}id`);
|
|
|
- res[`name_${i}`] = _.get(r, `${type}name`);
|
|
|
- res[key] = cla_id;
|
|
|
- }
|
|
|
- }
|
|
|
- return res;
|
|
|
- },
|
|
|
- setAllday(data = {}) {
|
|
|
- let ckeys = Object.keys(data).filter(f => f.includes('classid'));
|
|
|
- let lkeys = Object.keys(data).filter(f => f.includes('lessonid'));
|
|
|
- let arr = [];
|
|
|
- for (let i = 0; i < ckeys.length; i++) {
|
|
|
- if (data[`${ckeys[i]}`] && data[`${lkeys[i]}`]) {
|
|
|
- let cla = this.classList.find(f => f._id == data[ckeys[i]]);
|
|
|
- if (cla) {
|
|
|
- let { lessons } = cla;
|
|
|
- let r = lessons.find(f => f._id == data[lkeys[i]]);
|
|
|
- if (r) {
|
|
|
- let o = {};
|
|
|
- o[ckeys[i]] = data[ckeys[i]];
|
|
|
- o[`day`] = _.get(r, 'day');
|
|
|
- arr.push(o);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- let obj = { type: 'allday' };
|
|
|
- let r = arr.every(f => f.day == '0');
|
|
|
- if (r) obj.date = '全天';
|
|
|
- else {
|
|
|
- r = arr.every(f => f.day == '1');
|
|
|
- if (r) obj.date = '半天';
|
|
|
- else {
|
|
|
- let str = '';
|
|
|
- arr.map((i, index) => {
|
|
|
- str += i.day == '0' ? '全天' : '半天';
|
|
|
- if (index != arr.length - 1) str += '/';
|
|
|
- });
|
|
|
- obj.date = str;
|
|
|
- }
|
|
|
- }
|
|
|
- return obj;
|
|
|
+ this.$set(this, `list`, classList);
|
|
|
},
|
|
|
+ // 获取地点,学校,部门,科目,教师,班级类型,班主任
|
|
|
async getSettingLists() {
|
|
|
let res;
|
|
|
let arr = [];
|
|
|
if (this.locationList.length <= 0) {
|
|
|
arr.push(this.getLocationList());
|
|
|
}
|
|
|
- if (this.lyTeacherList.length <= 0) {
|
|
|
+ if (this.teacherList.length <= 0) {
|
|
|
arr.push(this.getTeacherList());
|
|
|
}
|
|
|
if (this.schoolList.length <= 0) {
|
|
@@ -359,313 +214,177 @@ export default {
|
|
|
if (this.subjectList.length <= 0) {
|
|
|
arr.push(this.getSubject());
|
|
|
}
|
|
|
+ if (this.ctList.length <= 0) {
|
|
|
+ arr.push(this.getCt());
|
|
|
+ }
|
|
|
+ if (this.headTeacherList.length <= 0) {
|
|
|
+ arr.push(this.getDirectorList());
|
|
|
+ }
|
|
|
axios.all(arr).then(
|
|
|
- axios.spread((r1, r2, r3, r4, r5) => {
|
|
|
+ axios.spread((r1, r2, r3, r4, r5, r6, r7) => {
|
|
|
if (r1) this.$set(this, `locationList`, r1.data);
|
|
|
- if (r2) this.$set(this, `lyTeacherList`, r2.data);
|
|
|
+ if (r2) this.$set(this, `teacherList`, r2.data);
|
|
|
if (r3) this.$set(this, `schoolList`, r3.data);
|
|
|
if (r4) this.$set(this, `deptList`, r4.data);
|
|
|
if (r5) this.$set(this, `subjectList`, r5.data);
|
|
|
+ if (r6) {
|
|
|
+ let d = _.cloneDeep(r6.data);
|
|
|
+ d = d.map(i => {
|
|
|
+ i.order = parseInt(i.code);
|
|
|
+ return i;
|
|
|
+ });
|
|
|
+ d = _.orderBy(d, ['order'], ['asc']);
|
|
|
+ this.$set(this, `ctList`, d);
|
|
|
+ }
|
|
|
+ if (r7) this.$set(this, `headTeacherList`, r7.data);
|
|
|
})
|
|
|
);
|
|
|
},
|
|
|
- //初始化,将每个班级的班主任,礼仪课老师,教室id=>名称
|
|
|
- async searchClassPerson(obj) {
|
|
|
- let arr = [];
|
|
|
- if (_.get(obj, 'jslocationid')) {
|
|
|
- let r = this.locationList.find(f => f._id == _.get(obj, 'jslocationid'));
|
|
|
- if (r) obj.jslocationname = _.get(r, `name`);
|
|
|
+
|
|
|
+ // 操作部分
|
|
|
+ // 修改教师
|
|
|
+ async lessonSave(data) {
|
|
|
+ console.log(data);
|
|
|
+ // lessonObjectId:lessonList的某项id; _id:lessons中指定的课
|
|
|
+ const { lessonObjectId, _id, is_last, ...info } = data;
|
|
|
+ let lobj = this.lessonList.find(f => f._id === lessonObjectId);
|
|
|
+ if (!lobj) {
|
|
|
+ this.$message.error('未找到该班课表');
|
|
|
+ return;
|
|
|
}
|
|
|
- if (_.get(obj, 'headteacherid')) {
|
|
|
- let r = await this.getDirector(_.get(obj, 'headteacherid'));
|
|
|
- if (this.$checkRes(r)) obj.headteachername = _.get(r.data, `name`);
|
|
|
+ let { lessons } = lobj;
|
|
|
+ if (!lessons) {
|
|
|
+ this.$message.error('未找到该班的课程');
|
|
|
+ return;
|
|
|
}
|
|
|
- if (_.get(obj, 'lyteacherid')) {
|
|
|
- let r = await this.getDirector(_.get(obj, 'lyteacherid'));
|
|
|
- if (this.$checkRes(r) && r.data) {
|
|
|
- obj.lyteachername = _.get(r.data, `name`);
|
|
|
- } else {
|
|
|
- r = await this.getTeacher(_.get(obj, 'lyteacherid'));
|
|
|
- if (this.$checkRes(r) && r.data) obj.lyteachername = _.get(r.data, `name`);
|
|
|
- }
|
|
|
+ let r = lessons.find(f => f._id === _id);
|
|
|
+ if (!r) {
|
|
|
+ this.$message.error('未找到该课程');
|
|
|
+ return;
|
|
|
}
|
|
|
- // if (_.get(obj, 'jslocationid')) {
|
|
|
- // arr.push(this.modelFetch({ model: 'director', id: _.get(obj, 'jslocationid') }));
|
|
|
- // }
|
|
|
- },
|
|
|
- toLesson(data, type) {
|
|
|
- let { is_last, batch } = data;
|
|
|
- if (is_last) {
|
|
|
- let last = _.last(this.list[batch - 1]);
|
|
|
- let { date } = last;
|
|
|
- data.allday = date;
|
|
|
+ const ri = lessons.findIndex(f => f._id === _id);
|
|
|
+ r = { ...r, ...info };
|
|
|
+ lessons[ri] = r;
|
|
|
+ let sameDay = lessons.find(f => f.date === r.date && f.subid && f._id !== r._id);
|
|
|
+ if (sameDay) {
|
|
|
+ const { teaid, teaname, reason } = data;
|
|
|
+ sameDay.teaid = teaid;
|
|
|
+ sameDay.teaname = teaname;
|
|
|
+ sameDay.reason = reason;
|
|
|
+ let sameDayIndex = lessons.findIndex(f => f.date === r.date && f.subid && f._id !== r._id);
|
|
|
+ lessons[sameDayIndex] = sameDay;
|
|
|
}
|
|
|
- this.formType = type;
|
|
|
- this.$set(this, `form`, data);
|
|
|
- this.lDrawer = true;
|
|
|
- },
|
|
|
- async toOther(data, type) {
|
|
|
- this.oDrawer = true;
|
|
|
- this.dloading = true;
|
|
|
- let { type: ct } = data;
|
|
|
- if (ct != 'jslocation') await this.getHeadTeacher(data);
|
|
|
- this.formType = type;
|
|
|
- this.$set(this, `form`, data);
|
|
|
- this.dloading = false;
|
|
|
- },
|
|
|
- lessonSave(data) {
|
|
|
- let { index, batch, is_last, allday, listtype, ...info } = data;
|
|
|
- console.log(data);
|
|
|
- if (is_last) {
|
|
|
- //TODO 改变半天/全天
|
|
|
- if (this.formType == 'usual') this.$set(this.list[batch - 1], this.list[batch - 1].length - 1, { date: allday, type: 'allday' });
|
|
|
- else this.$set(this.unusualList[batch - 1], this.unusualList[batch - 1].length - 1, { date: allday, type: 'allday' });
|
|
|
+ lobj.lessons = lessons;
|
|
|
+ let msg = this.$message({ duration: 0, message: '正在修改课程信息,请稍后...' });
|
|
|
+ const res = await this.lessonUpdate(lobj);
|
|
|
+ msg.close();
|
|
|
+ if (this.$checkRes(res, null, res.errmsg || '修改失败')) {
|
|
|
+ msg = this.$message({ duration: 0, message: '重新读取课程信息,请稍后...' });
|
|
|
+ await this.toClearSameDay(data);
|
|
|
+ if (is_last) {
|
|
|
+ await this.toChangeDay(data);
|
|
|
+ }
|
|
|
+ await this.toGetLesson();
|
|
|
+ this.toSetData();
|
|
|
+ this.toClose();
|
|
|
+ msg.close();
|
|
|
+ this.$message.success('已完成重新读取课程信息');
|
|
|
}
|
|
|
- if (this.formType == 'usual') this.$set(this.list[batch - 1], index, { batch, ...info });
|
|
|
- else this.$set(this.unusualList[batch - 1], index, { batch, ...info });
|
|
|
- this.toClose();
|
|
|
- this.toGetTeachers();
|
|
|
},
|
|
|
- toClose() {
|
|
|
- this.lDrawer = false;
|
|
|
- this.oDrawer = false;
|
|
|
- this.formType = 'usual';
|
|
|
- this.form = {};
|
|
|
- },
|
|
|
- async getHeadTeacher(data) {
|
|
|
- let batchid;
|
|
|
- let { type } = data;
|
|
|
- let { planid, termid } = this.defaultOption;
|
|
|
- let keys = Object.keys(data).filter(f => f.includes('classid'));
|
|
|
- if (keys.length <= 0) return;
|
|
|
- let cla = this.classList.find(f => f._id == data[keys[0]]);
|
|
|
- if (!cla) return;
|
|
|
- batchid = cla.batchid;
|
|
|
- let res = await this.findTeacher({ planid, termid, batchid });
|
|
|
- if (this.$checkRes(res)) {
|
|
|
- let duplicate = _.cloneDeep(res.data);
|
|
|
- if (type == 'headteacher') {
|
|
|
- let group = _.groupBy(res.data, 'department');
|
|
|
- let keys = Object.keys(group);
|
|
|
- let arr = keys.map(key => {
|
|
|
- let r = this.deptList.find(f => f.id == key);
|
|
|
- let obj = {};
|
|
|
- if (r) {
|
|
|
- obj.name = r.name;
|
|
|
- obj.list = group[key];
|
|
|
- }
|
|
|
- return obj;
|
|
|
- });
|
|
|
- this.$set(this, `headTeacherList`, arr);
|
|
|
- } else if (type == 'lyteacher') {
|
|
|
- duplicate = duplicate.filter(f => f.islyteacher == '1');
|
|
|
- this.$set(this, `lyTeacherList`, _.uniqBy([...this.lyTeacherList, ...duplicate], '_id'));
|
|
|
+ // 将该教师其他同一天的安排干掉
|
|
|
+ async toClearSameDay(data) {
|
|
|
+ const { lessonObjectId, date, teaid } = data;
|
|
|
+ let lobjs = this.lessonList.filter(f => f._id !== lessonObjectId);
|
|
|
+ let needUpdate = [];
|
|
|
+ for (let lobj of lobjs) {
|
|
|
+ let { lessons } = lobj;
|
|
|
+ if (!lessons || !_.isArray(lessons)) continue;
|
|
|
+ let ncList = lessons.filter(f => f.date === date && f.teaid === teaid);
|
|
|
+ // 该班课表,该天,没有该教师了,继续下一个
|
|
|
+ if (ncList.length <= 0) continue;
|
|
|
+ // 要是有,就改了,然后放到needUpdate中
|
|
|
+ for (let nc of ncList) {
|
|
|
+ const ri = lessons.findIndex(f => _.isEqual(f, nc));
|
|
|
+ if (ri < 0) continue;
|
|
|
+ nc.teaid = undefined;
|
|
|
+ nc.teaname = undefined;
|
|
|
+ lessons[ri] = nc;
|
|
|
}
|
|
|
+ lobj.lessons = lessons;
|
|
|
+ delete lobj.meta;
|
|
|
+ needUpdate.push(lobj);
|
|
|
+ }
|
|
|
+ if (needUpdate.length > 0) {
|
|
|
+ const r = await this.plupdate(needUpdate);
|
|
|
}
|
|
|
},
|
|
|
- //全部保存
|
|
|
- allSave() {
|
|
|
- //match(/\d+(.\d+)?/g)[0];
|
|
|
- let duplicate = _.cloneDeep(this.list);
|
|
|
- let dun = _.cloneDeep(this.unusualList);
|
|
|
- duplicate = [...duplicate, ...dun];
|
|
|
- let dClass = _.cloneDeep(this.classList);
|
|
|
- let dLesson = _.cloneDeep(this.lessonList);
|
|
|
- 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;
|
|
|
- });
|
|
|
- // console.log(claArr);
|
|
|
- //接下来改课表,之前整理过,所以课表除了改过的那些数据外,还有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;
|
|
|
- // TODO 添加不需要老师授课的科目不进行同步
|
|
|
- const subject = this.subjectList.find(f => f._id === subid);
|
|
|
- let tosync = false;
|
|
|
- if (subject) {
|
|
|
- const { need_teacher } = subject;
|
|
|
- if (need_teacher !== '1') tosync = true;
|
|
|
- }
|
|
|
- if (tosync && 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;
|
|
|
- });
|
|
|
- });
|
|
|
- let ndClass = dClass.map(i => _.omit(i, ['lessons']));
|
|
|
- let ndLesson = dLesson.map(i => _.omit(i, ['meta']));
|
|
|
- // console.log(ndClass, ndLesson);
|
|
|
- let res = this.checkClassConfig(dClass);
|
|
|
- if (!res.length > 0) {
|
|
|
- this.toSubmit(ndLesson, ndClass);
|
|
|
- return;
|
|
|
+ // 修改班级设置
|
|
|
+ async classSave(data) {
|
|
|
+ let msg = this.$message({ duration: 0, message: '正在修改,请稍后...' });
|
|
|
+ const res = await this.classUpdate(data);
|
|
|
+ msg.close();
|
|
|
+ if (this.$checkRes(res, null, res.errmsg || '修改班级设置失败')) {
|
|
|
+ msg = this.$message({ duration: 0, message: '重新读取班级信息,请稍后...' });
|
|
|
+ await this.toGetClass();
|
|
|
+ this.toSetData();
|
|
|
+ this.toClose();
|
|
|
+ msg.close();
|
|
|
+ this.$message.success('已完成重新读取班级信息');
|
|
|
}
|
|
|
- const h = this.$createElement;
|
|
|
- //[h('p', null, '您没有选择1班的礼仪课教师'), h('p', null, '您没有选择2班的礼仪课教师')]
|
|
|
- let arrs = [];
|
|
|
- for (const item of res) {
|
|
|
- let r;
|
|
|
- r = h(
|
|
|
- 'p',
|
|
|
- null,
|
|
|
- `${item.name}班:${item.headteacher ? '未选择班主任' : ''} ${item.lyteacher ? '未选择礼仪教师' : ''} ${item.jslocation ? '未选择教室' : ''}`
|
|
|
+ },
|
|
|
+ // 修改这一批次的所有课程的最后一天为全天/半天
|
|
|
+ async toChangeDay(data) {
|
|
|
+ const { lessonObjectId, _id, is_last, day, ...info } = data;
|
|
|
+ let lobj = this.lessonList.find(f => f._id === lessonObjectId);
|
|
|
+ if (!lobj) return;
|
|
|
+ const { batchid } = lobj;
|
|
|
+ let lobjs = this.lessonList.filter(f => f.batchid === batchid);
|
|
|
+ for (let o of lobjs) {
|
|
|
+ delete o.meta;
|
|
|
+ let { lessons } = o;
|
|
|
+ if (!(lessons && _.isArray(lessons))) continue;
|
|
|
+ const g = _.groupBy(lessons, 'date');
|
|
|
+ console.log(g);
|
|
|
+ let dkeys = Object.keys(g);
|
|
|
+ dkeys = _.orderBy(
|
|
|
+ dkeys.map(i => ({ date: i })),
|
|
|
+ ['date'],
|
|
|
+ ['asc']
|
|
|
);
|
|
|
- arrs.push(r);
|
|
|
+ const k = _.last(dkeys);
|
|
|
+ if (!k) continue;
|
|
|
+ // 将最后一天的所有day改成data的day
|
|
|
+ let needCList = g[k.date];
|
|
|
+ console.log(needCList);
|
|
|
+ for (let nco of needCList) {
|
|
|
+ const i = lessons.findIndex(f => f._id === nco._id);
|
|
|
+ if (i < 0) continue;
|
|
|
+ nco.day = day;
|
|
|
+ console.log(nco);
|
|
|
+ lessons[i] = nco;
|
|
|
+ }
|
|
|
+ o.lessons = lessons;
|
|
|
}
|
|
|
- this.$confirm(h('div', null, arrs), '提示', {
|
|
|
- confirmButtonText: '确定',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning',
|
|
|
- })
|
|
|
- .then(() => {
|
|
|
- this.toSubmit(ndLesson, ndClass);
|
|
|
- })
|
|
|
- .catch(() => {});
|
|
|
- // console.log(dLesson);
|
|
|
+ const r = await this.plupdate(lobjs);
|
|
|
},
|
|
|
- //提交接口请求
|
|
|
- async toSubmit(dLesson, dClass) {
|
|
|
- // 最后数据 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('保存成功');
|
|
|
- })
|
|
|
- );
|
|
|
+ // 页面及其他逻辑
|
|
|
+ // 打开修改课程框
|
|
|
+ toLessonChange(data) {
|
|
|
+ this.$set(this, 'form', data);
|
|
|
+ this.lDrawer = true;
|
|
|
},
|
|
|
- lessonDataReturn(data) {
|
|
|
- let { id: teaid, name: teaname, subid, subname, day = 0, reason } = data;
|
|
|
- return { teaid, teaname, subid, subname, day, reason };
|
|
|
+ // 打开修改班级设置框
|
|
|
+ toClassChange(data) {
|
|
|
+ this.$set(this, `form`, data);
|
|
|
+ this.cDrawer = true;
|
|
|
},
|
|
|
- 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;
|
|
|
+
|
|
|
+ // 关闭窗口
|
|
|
+ toClose() {
|
|
|
+ this.lDrawer = false;
|
|
|
+ this.cDrawer = false;
|
|
|
+ this.formType = 'usual';
|
|
|
+ this.form = {};
|
|
|
},
|
|
|
//检查班主任/教室/礼仪课教师
|
|
|
checkClassConfig(dClass) {
|
|
@@ -690,7 +409,7 @@ export default {
|
|
|
let planid = _.get(this.defaultOption, 'planid');
|
|
|
let termid = _.get(this.defaultOption, `termid`);
|
|
|
if (needAlert)
|
|
|
- this.$confirm('此操作将会将默认 年度计划 下所有的班级课表重置,若您已经修改过某班的信息,请谨慎使用', '提示', {
|
|
|
+ this.$confirm('此操作将会将后生成且没有课表的班级生成课表,已经生成的课表将不会改变!', '提示', {
|
|
|
confirmButtonText: '按模板排课',
|
|
|
cancelButtonText: '取消',
|
|
|
type: 'warning',
|
|
@@ -704,7 +423,6 @@ export default {
|
|
|
console.log('已取消');
|
|
|
});
|
|
|
else {
|
|
|
- // 先暂停使用此功能,需要修改后
|
|
|
let msg = this.$message({
|
|
|
message: '首次进入,计划未排课,正在按模板进行排课中...',
|
|
|
duration: 0,
|
|
@@ -718,33 +436,18 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
+ // 确定课表
|
|
|
async toStatus() {
|
|
|
let lessonIds = this.lessonList.map(i => i.id);
|
|
|
const res = await this.confirmLesson(lessonIds);
|
|
|
this.$checkRes(res, '课表确定成功', res.errmsg || '课表确定失败');
|
|
|
},
|
|
|
+ // 获取消息
|
|
|
async toGetNoticeList() {
|
|
|
const { planid, termid } = this.defaultOption;
|
|
|
const res = await this.getNoticeList({ planid, termid, type: '4' });
|
|
|
if (this.$checkRes(res)) this.$set(this, `noticeList`, res.data);
|
|
|
},
|
|
|
- async toGetTeachers() {
|
|
|
- let list = this.list
|
|
|
- .flat()
|
|
|
- .filter(f => f.type === 'lesson')
|
|
|
- .filter(f => {
|
|
|
- let keys = Object.keys(f);
|
|
|
- return keys.find(f => f.startsWith('id_'));
|
|
|
- });
|
|
|
- let arr = [];
|
|
|
- list.map(i => {
|
|
|
- let keys = Object.keys(i).filter(f => f.startsWith('id_'));
|
|
|
- keys.map(k => arr.push(i[k]));
|
|
|
- });
|
|
|
- arr = _.compact(_.uniq(arr));
|
|
|
- const res = await this.getTeachers(arr);
|
|
|
- if (this.$checkRes(arr)) this.$set(this, `inteaList`, res.data);
|
|
|
- },
|
|
|
},
|
|
|
computed: {
|
|
|
...mapState(['user', 'defaultOption']),
|