123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- <template>
- <div id="lesson-plan">
- <el-collapse v-model="activeName" accordion v-if="views === 'setting'">
- <template v-if="classList.length > 0">
- <el-collapse-item v-for="(item, index) in classList" :key="`coli${index}`" :name="`${index}`">
- <template slot="title">
- <span style="font-size:24px">{{ item.name }}</span>
- </template>
- <data-table style="padding:10px" ref="table" :fields="fields" :data="item.lessons" :opera="opera" @edit="toEdit"></data-table>
- <el-form :inline="true" size="mini" label-width="120px" @submit.native.prevent>
- <el-form-item label="班主任">
- <el-select v-model="item.headteacherid" placeholder="请选择班主任">
- <el-option-group v-for="group in directorList" :key="group.label" :label="group.label">
- <el-option v-for="item in group.options" :key="item._id" :label="`${item.name}${item.status === '0' ? '(已上报)' : ''}`" :value="item._id">
- </el-option>
- </el-option-group>
- </el-select>
- </el-form-item>
- <el-form-item label="礼仪课教师">
- <el-select v-model="item.lyteacherid" placeholder="请选择礼仪课教师">
- <el-option v-for="(tea, index) in lyTeacherList" :key="`lytea${index}`" :label="tea.name" :value="tea.id"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="教室地点">
- <el-select v-model="item.jslocationid" placeholder="请选择教室地点">
- <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="开班地点">
- <el-select v-model="item.kbyslocationid" placeholder="请选择开班地点">
- <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="拓展训练地点">
- <el-select v-model="item.kzjhlocationid" placeholder="请选择拓展训练地点">
- <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="用餐地点">
- <el-select v-model="item.yclocationid" placeholder="请选择用餐地点">
- <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
- </el-select>
- </el-form-item>
- <el-row type="flex" justify="center" align="middle">
- <el-col :span="5">
- <el-button type="primary" @click="saveLessson(item.classid)" size="mini">保存班级课程</el-button>
- </el-col>
- <el-col :span="5">
- <el-button type="primary" @click="toPreview(item.classid)" plain size="mini">课表预览</el-button>
- </el-col>
- </el-row>
- </el-form>
- </el-collapse-item>
- </template>
- <template v-else>
- <el-collapse-item title="该批次未分班,无法继续排课!" name="none"></el-collapse-item>
- </template>
- </el-collapse>
- <cards title="课表预览" :returns="toReturns" v-else>
- <time-table :data="previews"></time-table>
- </cards>
- <el-drawer :with-header="false" :visible.sync="drawer" direction="rtl" @close="drawerClose">
- <el-tabs>
- <el-tab-pane style="padding:10px">
- <template #label>
- <span style="zoom:1.3">{{ form.name }}</span>
- </template>
- <el-form ref="form" :model="form" label-width="120px" size="mini" :rules="rules" @submit.native.prevent>
- <el-form-item label="时间" prop="date">
- {{ form.date }}
- </el-form-item>
- <el-form-item label="星期" prop="week">
- {{ form.week }}
- </el-form-item>
- <el-form-item label="所授科目" prop="subid">
- <el-select v-model="form.subid">
- <el-option v-for="(item, index) in subjectList" :key="`subject${index}`" :label="item.name" :value="item.id"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="任课教师" prop="teaid">
- <el-input v-model="form.teaname" :readonly="true" placeholder="点击选择教师" @click.native="toChooseTeacher"></el-input>
- </el-form-item>
- <el-form-item label="时长" prop="day" required>
- <el-radio-group v-model="form.day" @change="$forceUpdate()">
- <el-radio v-for="(i, index) in dayList" :key="`day${index}`" :label="i.label"></el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="toSaveDrawer">保存</el-button>
- <el-button @click="resetDrawer">重置</el-button>
- </el-form-item>
- </el-form>
- </el-tab-pane>
- </el-tabs>
- </el-drawer>
- <el-dialog :visible.sync="dialog" title="选择教师" center @close="toClose">
- <el-tabs v-model="teaTab">
- <el-tab-pane style="padding:10px" label="申请授课教师" name="apply">
- <el-form :model="applyTeacherListPag" :inline="true">
- <el-form-item label="姓名">
- <el-input v-model="applyTeacherListPag.name" size="mini" placeholder="请输入要查询的教师姓名"></el-input>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" size="mini" @click="changePage(null, 'apply')">查询</el-button>
- </el-form-item>
- </el-form>
- <data-table style="padding:10px" :fields="teaFields" :data="applyTeacherList" :opera="teaOpera" @seletTea="setTea" :height="300"></data-table>
- </el-tab-pane>
- <el-tab-pane style="padding:10px" label="可授课教师" name="list">
- <el-form :model="teacherListPag" :inline="true">
- <el-form-item label="姓名">
- <el-input v-model="teacherListPag.name" size="mini" placeholder="请输入要查询的教师姓名"></el-input>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" size="mini" @click="changePage(null, 'teacher')">查询</el-button>
- </el-form-item>
- </el-form>
- <data-table style="padding:10px" :fields="teaFields" :data="teacherList" :opera="teaOpera" @seletTea="setTea" :height="300"></data-table>
- <el-row type="flex" align="middle" justify="end">
- <el-col :span="24" style="text-align:right;">
- <el-pagination
- background
- layout="total, prev, pager, next"
- :total="teacherListPag.total"
- :page-size="5"
- :current-page.sync="teacherListPag.currentPage"
- @current-change="cur => changePage(cur, 'teacher')"
- >
- </el-pagination>
- </el-col>
- </el-row>
- </el-tab-pane>
- </el-tabs>
- </el-dialog>
- </div>
- </template>
- <script>
- import _ from 'lodash';
- import timeTable from '@frame/parts/time-table';
- import cards from '@frame/parts/cards';
- import dataTable from '@frame/components/data-table';
- import { createNamespacedHelpers } from 'vuex';
- const { mapActions: location } = createNamespacedHelpers('location'); //地点
- const { mapActions: subject } = createNamespacedHelpers('subject'); //科目
- const { mapActions: teacher } = createNamespacedHelpers('teacher'); //教师
- const { mapActions: teaPlan } = createNamespacedHelpers('teaPlan'); //教师申请
- const { mapActions: dept } = createNamespacedHelpers('dept'); //配合教师表使用的部门表
- const { mapActions: dirPlan } = createNamespacedHelpers('dirPlan'); //班主任不能上课的列表
- export default {
- name: 'lesson-plan',
- props: {
- startDate: { type: String, required: true },
- endDate: { type: String, required: true },
- classes: { type: Array, default: () => [] },
- trainplanid: { type: String },
- batchid: { type: String },
- },
- components: { dataTable, timeTable, cards },
- data: () => ({
- start: '',
- end: '',
- views: 'setting',
- activeName: '0',
- drawer: false,
- dialog: false,
- teaTab: 'apply',
- dateList: [],
- classList: [],
- fields: [
- { label: '日期', prop: 'date' },
- { label: '星期', prop: 'week' },
- { label: '课程', prop: 'subname' },
- { label: '任课教师', prop: 'teaname' },
- ],
- opera: [
- {
- label: '安排课程及教师',
- icon: 'el-icon-edit',
- method: 'edit',
- },
- ],
- teaOpera: [
- {
- label: '选择教师',
- icon: 'el-icon-check',
- method: 'seletTea',
- },
- ],
- teaFields: [
- { label: '姓名', prop: 'name' },
- { label: '学校', prop: 'schname' },
- { label: '资料评分', prop: 'zlscore' },
- { label: '面试评分', prop: 'msscore' },
- ],
- dayList: [{ label: '一天' }, { label: '半天' }],
- rules: {
- day: [{ required: true, message: '请选择时长' }],
- },
- form: {},
- locationList: [],
- subjectList: [],
- lyTeacherList: [],
- teacherList: [],
- applyTeacherList: [],
- directorList: [],
- deptList: [],
- teacherListPag: {
- total: 0,
- cur: 1,
- },
- applyTeacherListPag: {},
- previews: {},
- }),
- created() {
- this.setDateList();
- this.setClasses();
- this.getOtherList();
- },
- methods: {
- ...dirPlan({ dirQuery: 'getDirTeacher' }),
- ...location({ getLocationList: 'query' }),
- ...subject({ getSubjectList: 'query' }),
- ...teacher({ getTeacherList: 'query' }),
- ...teaPlan({ getApplyTeacherList: 'applyQuery' }),
- ...dept({ getDeptList: 'query' }),
- setDateList() {
- let start = new Date(this.startDate);
- let end = new Date(this.endDate);
- this.$set(this, `start`, this.$fullDateString(new Date(start)));
- let day = (end.getTime() - start.getTime()) / (1 * 24 * 60 * 60 * 1000);
- let endDate = this.$fullDateString(new Date(new Date(start).setDate(new Date(start).getDate() + day - 1)));
- this.$set(this, `end`, endDate);
- let arr = [];
- for (let index = 0; index < day; index++) {
- let s = new Date(JSON.parse(JSON.stringify(start)));
- let i = s.setDate(s.getDate() + index);
- i = this.$fullDateString(new Date(i));
- let object = {
- date: i,
- week: new Date(i).getDay() === 0 ? 7 : new Date(i).getDay(),
- };
- arr.push(object);
- }
- this.$set(this, `dateList`, arr);
- },
- setClasses() {
- let classes = JSON.parse(JSON.stringify(this.classes));
- classes.map(i => {
- i.lessons
- ? i.lessons.map(i => {
- i.week = new Date(i.date).getDay() === 0 ? 7 : new Date(i.date).getDay();
- })
- : (i.lessons = JSON.parse(JSON.stringify(this.dateList)));
- return i;
- });
- this.$set(this, `classList`, classes);
- },
- toEdit({ data }) {
- //班级信息
- let sClass = JSON.parse(JSON.stringify(this.classes[this.activeName]));
- //点击的日期,星期
- let arrange = data;
- //让用户选择课程=>根据选择的课程查询可以教课的老师,根据老师的评分排序(不一定谁做)
- // 1先查询课程列表
- // 2先查询arr中,是否有选择的课程,有则查询教师列表
- this.$set(this, `form`, { ...sClass, ...arrange });
- this.form.day ? '' : (this.form.day = '一天');
- this.drawer = true;
- },
- resetDrawer() {
- this.$set(this.form, `subid`);
- this.$set(this.form, `subname`);
- this.$set(this.form, `teaid`);
- this.$set(this.form, `teaname`);
- delete this.form.teaid, this.form.teaname, this.form.subid, this.form.subname;
- },
- toChooseTeacher() {
- if (this.form.subid) {
- this.dialog = true;
- this.toGetTeacherList({});
- } else this.$message.warning('请选择所授科目');
- },
- setTea({ data }) {
- let { id, name } = data;
- this.$set(this.form, `teaid`, id);
- this.$set(this.form, `teaname`, name);
- this.toClose();
- },
- toClose() {
- this.dialog = false;
- },
- drawerClose() {
- this.drawer = false;
- this.form = {};
- this.$refs.form.resetFields();
- },
- toSaveDrawer() {
- this.$refs['form'].validate(valid => {
- if (valid) {
- if (this.subjectList.find(f => f._id === this.form.subid)) {
- this.form.subname = this.subjectList.find(f => f._id === this.form.subid).name;
- }
- let form = JSON.parse(JSON.stringify(this.form));
- let lesson = _.pick(form, ['day', 'subname', 'teaname', 'subid', 'teaid', 'date', 'week']);
- // 整理列表所需要的数据
- let res = this.classList.find(f => f.classid === form.classid);
- let classIndex = this.classList.findIndex(f => f.classid === form.classid);
- let index = res.lessons.findIndex(f => f.date === form.date);
- this.$set(this.classList[classIndex].lessons, index, lesson);
- this.drawerClose();
- } else {
- console.warn('form validate error!!!');
- return false;
- }
- });
- },
- //选项列表请求
- async getOtherList() {
- let res;
- res = await this.getLocationList();
- if (this.$checkRes(res)) this.$set(this, `locationList`, res.data);
- res = await this.getSubjectList();
- if (this.$checkRes(res)) this.$set(this, `subjectList`, res.data);
- //TODO 班主任表中的人员也可以成为礼仪老师,现在应该没有
- // TODO派生:涉及之后回显问题,是要将这个人在教师/班主任表中都查然后获得到
- res = await this.getTeacherList({ islyteacher: '1' });
- if (this.$checkRes(res)) this.$set(this, `lyTeacherList`, res.data);
- res = await this.getDeptList();
- if (this.$checkRes(res)) this.$set(this, `deptList`, res.data);
- res = await this.dirQuery({ batchid: this.batchid });
- if (this.$checkRes(res)) {
- let arr = res.data;
- arr = arr.map(i => {
- let dept = this.deptList.find(f => f._id === i.department);
- if (res) i.dept_name = dept.name;
- else i.dept_name = '无所属部门';
- return i;
- });
- let last = this.deptList.map(i => {
- let options = arr.filter(f => f.department === i._id);
- let label = i.name;
- return { options, label };
- });
- this.$set(this, `directorList`, last);
- }
- },
- //教师列表请求
- async toGetTeacherList({ query = {}, type } = {}) {
- query.subid = this.form.subid;
- query.termid = this.form.termid;
- query.status = '4';
- let setTeacher = async query => {
- let res = await this.getTeacherList(query);
- if (this.$checkRes(res)) {
- this.$set(this, `teacherList`, res.data);
- this.$set(this.teacherListPag, `total`, res.total);
- }
- };
- let setApply = async query => {
- let res = await this.getApplyTeacherList(query);
- if (this.$checkRes(res)) {
- this.$set(this, `applyTeacherList`, res.data ? res.data : []);
- }
- };
- if (!type) {
- //都查
- setTeacher(query);
- setApply(query);
- } else if (type === 'teacher') {
- //查教师
- setTeacher(query);
- } else if (type === 'apply') {
- //查申请授课
- setApply(query);
- }
- },
- changePage(page = 1, type) {
- let query = { skip: (page - 1) * 5 < 0 ? 0 : (page - 1) * 5, limit: 5 };
- if (type === 'teacher') {
- this.teacherListPag.name && this.teacherListPag.name !== '' ? (query.name = this.teacherListPag.name) : '';
- } else {
- this.applyTeacherListPag.name && this.applyTeacherListPag.name !== '' ? (query.name = this.applyTeacherListPag.name) : '';
- }
- this.toGetTeacherList({ query, type });
- },
- saveLessson(id) {
- let tcc = this.classList.find(f => f.classid === id);
- // // 礼仪课,开班地点,教师地点,拓展训练地点修改班级表
- this.$emit(`save`, tcc);
- },
- toPreview(id) {
- console.log(id);
- let tcc = this.classList.find(f => f.classid === id);
- console.log(this.classList);
- let numArr = tcc.name.match(/\d+/g);
- let term = numArr[0];
- let classes = numArr[2];
- let headteacher = {};
- this.directorList.map(f => (headteacher = f.options.find(ff => ff.id === tcc.headteacherid)));
- let lyTeacher = this.lyTeacherList.find(f => f.id === tcc.lyteacherid);
- let js = this.locationList.find(f => f.id === tcc.jslocationid);
- let kbys = this.locationList.find(f => f.id === tcc.kbyslocationid);
- let tzxl = this.locationList.find(f => f.id === tcc.kzjhlocationid);
- let yc = this.locationList.find(f => f.id === tcc.yclocationid);
- let object = { term, class: classes, start: this.start, end: this.end, lessons: tcc.lessons, headteacher, lyTeacher, js, kbys, tzxl, yc };
- this.$set(this, `previews`, object);
- this.views = 'table';
- },
- toReturns() {
- this.views = 'setting';
- },
- },
- computed: {
- mainTitle() {
- let meta = this.$route.meta;
- let main = meta.title || '';
- let sub = meta.sub || '';
- return `${main}${sub}`;
- },
- keyWord() {
- let meta = this.$route.meta;
- let main = meta.title || '';
- return main;
- },
- },
- };
- </script>
- <style lang="less" scoped></style>
|