lesson-plan.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <template>
  2. <div id="lesson-plan">
  3. <el-collapse v-model="activeName" accordion v-if="views === 'setting'">
  4. <template v-if="classList.length > 0">
  5. <el-collapse-item v-for="(item, index) in classList" :key="`coli${index}`" :name="`${index}`">
  6. <template slot="title">
  7. <span style="font-size:24px">{{ item.name }}</span>
  8. </template>
  9. <data-table style="padding:10px" ref="table" :fields="fields" :data="item.lessons" :opera="opera" @edit="toEdit"></data-table>
  10. <el-form :inline="true" size="mini" label-width="120px" @submit.native.prevent>
  11. <el-form-item label="班主任">
  12. <el-select v-model="item.headteacherid" placeholder="请选择班主任">
  13. <el-option-group v-for="group in directorList" :key="group.label" :label="group.label">
  14. <el-option v-for="item in group.options" :key="item._id" :label="`${item.name}${item.status === '0' ? '(已上报)' : ''}`" :value="item._id">
  15. </el-option>
  16. </el-option-group>
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item label="礼仪课教师">
  20. <el-select v-model="item.lyteacherid" placeholder="请选择礼仪课教师">
  21. <el-option v-for="(tea, index) in lyTeacherList" :key="`lytea${index}`" :label="tea.name" :value="tea.id"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label="教室地点">
  25. <el-select v-model="item.jslocationid" placeholder="请选择教室地点">
  26. <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="开班地点">
  30. <el-select v-model="item.kbyslocationid" placeholder="请选择开班地点">
  31. <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="拓展训练地点">
  35. <el-select v-model="item.kzjhlocationid" placeholder="请选择拓展训练地点">
  36. <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
  37. </el-select>
  38. </el-form-item>
  39. <el-form-item label="用餐地点">
  40. <el-select v-model="item.yclocationid" placeholder="请选择用餐地点">
  41. <el-option v-for="(place, index) in locationList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-row type="flex" justify="center" align="middle">
  45. <el-col :span="5">
  46. <el-button type="primary" @click="saveLessson(item.classid)" size="mini">保存班级课程</el-button>
  47. </el-col>
  48. <el-col :span="5">
  49. <el-button type="primary" @click="toPreview(item.classid)" plain size="mini">课表预览</el-button>
  50. </el-col>
  51. </el-row>
  52. </el-form>
  53. </el-collapse-item>
  54. </template>
  55. <template v-else>
  56. <el-collapse-item title="该批次未分班,无法继续排课!" name="none"></el-collapse-item>
  57. </template>
  58. </el-collapse>
  59. <cards title="课表预览" :returns="toReturns" v-else>
  60. <time-table :data="previews"></time-table>
  61. </cards>
  62. <el-drawer :with-header="false" :visible.sync="drawer" direction="rtl" @close="drawerClose">
  63. <el-tabs>
  64. <el-tab-pane style="padding:10px">
  65. <template #label>
  66. <span style="zoom:1.3">{{ form.name }}</span>
  67. </template>
  68. <el-form ref="form" :model="form" label-width="120px" size="mini" :rules="rules" @submit.native.prevent>
  69. <el-form-item label="时间" prop="date">
  70. {{ form.date }}
  71. </el-form-item>
  72. <el-form-item label="星期" prop="week">
  73. {{ form.week }}
  74. </el-form-item>
  75. <el-form-item label="所授科目" prop="subid">
  76. <el-select v-model="form.subid">
  77. <el-option v-for="(item, index) in subjectList" :key="`subject${index}`" :label="item.name" :value="item.id"></el-option>
  78. </el-select>
  79. </el-form-item>
  80. <el-form-item label="任课教师" prop="teaid">
  81. <el-input v-model="form.teaname" :readonly="true" placeholder="点击选择教师" @click.native="toChooseTeacher"></el-input>
  82. </el-form-item>
  83. <el-form-item label="时长" prop="day" required>
  84. <el-radio-group v-model="form.day" @change="$forceUpdate()">
  85. <el-radio v-for="(i, index) in dayList" :key="`day${index}`" :label="i.label"></el-radio>
  86. </el-radio-group>
  87. </el-form-item>
  88. <el-form-item>
  89. <el-button type="primary" @click="toSaveDrawer">保存</el-button>
  90. <el-button @click="resetDrawer">重置</el-button>
  91. </el-form-item>
  92. </el-form>
  93. </el-tab-pane>
  94. </el-tabs>
  95. </el-drawer>
  96. <el-dialog :visible.sync="dialog" title="选择教师" center @close="toClose">
  97. <el-tabs v-model="teaTab">
  98. <el-tab-pane style="padding:10px" label="申请授课教师" name="apply">
  99. <el-form :model="applyTeacherListPag" :inline="true">
  100. <el-form-item label="姓名">
  101. <el-input v-model="applyTeacherListPag.name" size="mini" placeholder="请输入要查询的教师姓名"></el-input>
  102. </el-form-item>
  103. <el-form-item>
  104. <el-button type="primary" size="mini" @click="changePage(null, 'apply')">查询</el-button>
  105. </el-form-item>
  106. </el-form>
  107. <data-table style="padding:10px" :fields="teaFields" :data="applyTeacherList" :opera="teaOpera" @seletTea="setTea" :height="300"></data-table>
  108. </el-tab-pane>
  109. <el-tab-pane style="padding:10px" label="可授课教师" name="list">
  110. <el-form :model="teacherListPag" :inline="true">
  111. <el-form-item label="姓名">
  112. <el-input v-model="teacherListPag.name" size="mini" placeholder="请输入要查询的教师姓名"></el-input>
  113. </el-form-item>
  114. <el-form-item>
  115. <el-button type="primary" size="mini" @click="changePage(null, 'teacher')">查询</el-button>
  116. </el-form-item>
  117. </el-form>
  118. <data-table style="padding:10px" :fields="teaFields" :data="teacherList" :opera="teaOpera" @seletTea="setTea" :height="300"></data-table>
  119. <el-row type="flex" align="middle" justify="end">
  120. <el-col :span="24" style="text-align:right;">
  121. <el-pagination
  122. background
  123. layout="total, prev, pager, next"
  124. :total="teacherListPag.total"
  125. :page-size="5"
  126. :current-page.sync="teacherListPag.currentPage"
  127. @current-change="cur => changePage(cur, 'teacher')"
  128. >
  129. </el-pagination>
  130. </el-col>
  131. </el-row>
  132. </el-tab-pane>
  133. </el-tabs>
  134. </el-dialog>
  135. </div>
  136. </template>
  137. <script>
  138. import _ from 'lodash';
  139. import timeTable from '@frame/parts/time-table';
  140. import cards from '@frame/parts/cards';
  141. import dataTable from '@frame/components/data-table';
  142. import { createNamespacedHelpers } from 'vuex';
  143. const { mapActions: location } = createNamespacedHelpers('location'); //地点
  144. const { mapActions: subject } = createNamespacedHelpers('subject'); //科目
  145. const { mapActions: teacher } = createNamespacedHelpers('teacher'); //教师
  146. const { mapActions: teaPlan } = createNamespacedHelpers('teaPlan'); //教师申请
  147. const { mapActions: dept } = createNamespacedHelpers('dept'); //配合教师表使用的部门表
  148. const { mapActions: dirPlan } = createNamespacedHelpers('dirPlan'); //班主任不能上课的列表
  149. export default {
  150. name: 'lesson-plan',
  151. props: {
  152. startDate: { type: String, required: true },
  153. endDate: { type: String, required: true },
  154. classes: { type: Array, default: () => [] },
  155. trainplanid: { type: String },
  156. batchid: { type: String },
  157. },
  158. components: { dataTable, timeTable, cards },
  159. data: () => ({
  160. start: '',
  161. end: '',
  162. views: 'setting',
  163. activeName: '0',
  164. drawer: false,
  165. dialog: false,
  166. teaTab: 'apply',
  167. dateList: [],
  168. classList: [],
  169. fields: [
  170. { label: '日期', prop: 'date' },
  171. { label: '星期', prop: 'week' },
  172. { label: '课程', prop: 'subname' },
  173. { label: '任课教师', prop: 'teaname' },
  174. ],
  175. opera: [
  176. {
  177. label: '安排课程及教师',
  178. icon: 'el-icon-edit',
  179. method: 'edit',
  180. },
  181. ],
  182. teaOpera: [
  183. {
  184. label: '选择教师',
  185. icon: 'el-icon-check',
  186. method: 'seletTea',
  187. },
  188. ],
  189. teaFields: [
  190. { label: '姓名', prop: 'name' },
  191. { label: '学校', prop: 'schname' },
  192. { label: '资料评分', prop: 'zlscore' },
  193. { label: '面试评分', prop: 'msscore' },
  194. ],
  195. dayList: [{ label: '一天' }, { label: '半天' }],
  196. rules: {
  197. day: [{ required: true, message: '请选择时长' }],
  198. },
  199. form: {},
  200. locationList: [],
  201. subjectList: [],
  202. lyTeacherList: [],
  203. teacherList: [],
  204. applyTeacherList: [],
  205. directorList: [],
  206. deptList: [],
  207. teacherListPag: {
  208. total: 0,
  209. cur: 1,
  210. },
  211. applyTeacherListPag: {},
  212. previews: {},
  213. }),
  214. created() {
  215. this.setDateList();
  216. this.setClasses();
  217. this.getOtherList();
  218. },
  219. methods: {
  220. ...dirPlan({ dirQuery: 'getDirTeacher' }),
  221. ...location({ getLocationList: 'query' }),
  222. ...subject({ getSubjectList: 'query' }),
  223. ...teacher({ getTeacherList: 'query' }),
  224. ...teaPlan({ getApplyTeacherList: 'applyQuery' }),
  225. ...dept({ getDeptList: 'query' }),
  226. setDateList() {
  227. let start = new Date(this.startDate);
  228. let end = new Date(this.endDate);
  229. this.$set(this, `start`, this.$fullDateString(new Date(start)));
  230. let day = (end.getTime() - start.getTime()) / (1 * 24 * 60 * 60 * 1000);
  231. let endDate = this.$fullDateString(new Date(new Date(start).setDate(new Date(start).getDate() + day - 1)));
  232. this.$set(this, `end`, endDate);
  233. let arr = [];
  234. for (let index = 0; index < day; index++) {
  235. let s = new Date(JSON.parse(JSON.stringify(start)));
  236. let i = s.setDate(s.getDate() + index);
  237. i = this.$fullDateString(new Date(i));
  238. let object = {
  239. date: i,
  240. week: new Date(i).getDay() === 0 ? 7 : new Date(i).getDay(),
  241. };
  242. arr.push(object);
  243. }
  244. this.$set(this, `dateList`, arr);
  245. },
  246. setClasses() {
  247. let classes = JSON.parse(JSON.stringify(this.classes));
  248. classes.map(i => {
  249. i.lessons
  250. ? i.lessons.map(i => {
  251. i.week = new Date(i.date).getDay() === 0 ? 7 : new Date(i.date).getDay();
  252. })
  253. : (i.lessons = JSON.parse(JSON.stringify(this.dateList)));
  254. return i;
  255. });
  256. this.$set(this, `classList`, classes);
  257. },
  258. toEdit({ data }) {
  259. //班级信息
  260. let sClass = JSON.parse(JSON.stringify(this.classes[this.activeName]));
  261. //点击的日期,星期
  262. let arrange = data;
  263. //让用户选择课程=>根据选择的课程查询可以教课的老师,根据老师的评分排序(不一定谁做)
  264. // 1先查询课程列表
  265. // 2先查询arr中,是否有选择的课程,有则查询教师列表
  266. this.$set(this, `form`, { ...sClass, ...arrange });
  267. this.form.day ? '' : (this.form.day = '一天');
  268. this.drawer = true;
  269. },
  270. resetDrawer() {
  271. this.$set(this.form, `subid`);
  272. this.$set(this.form, `subname`);
  273. this.$set(this.form, `teaid`);
  274. this.$set(this.form, `teaname`);
  275. delete this.form.teaid, this.form.teaname, this.form.subid, this.form.subname;
  276. },
  277. toChooseTeacher() {
  278. if (this.form.subid) {
  279. this.dialog = true;
  280. this.toGetTeacherList({});
  281. } else this.$message.warning('请选择所授科目');
  282. },
  283. setTea({ data }) {
  284. let { id, name } = data;
  285. this.$set(this.form, `teaid`, id);
  286. this.$set(this.form, `teaname`, name);
  287. this.toClose();
  288. },
  289. toClose() {
  290. this.dialog = false;
  291. },
  292. drawerClose() {
  293. this.drawer = false;
  294. this.form = {};
  295. this.$refs.form.resetFields();
  296. },
  297. toSaveDrawer() {
  298. this.$refs['form'].validate(valid => {
  299. if (valid) {
  300. if (this.subjectList.find(f => f._id === this.form.subid)) {
  301. this.form.subname = this.subjectList.find(f => f._id === this.form.subid).name;
  302. }
  303. let form = JSON.parse(JSON.stringify(this.form));
  304. let lesson = _.pick(form, ['day', 'subname', 'teaname', 'subid', 'teaid', 'date', 'week']);
  305. // 整理列表所需要的数据
  306. let res = this.classList.find(f => f.classid === form.classid);
  307. let classIndex = this.classList.findIndex(f => f.classid === form.classid);
  308. let index = res.lessons.findIndex(f => f.date === form.date);
  309. this.$set(this.classList[classIndex].lessons, index, lesson);
  310. this.drawerClose();
  311. } else {
  312. console.warn('form validate error!!!');
  313. return false;
  314. }
  315. });
  316. },
  317. //选项列表请求
  318. async getOtherList() {
  319. let res;
  320. res = await this.getLocationList();
  321. if (this.$checkRes(res)) this.$set(this, `locationList`, res.data);
  322. res = await this.getSubjectList();
  323. if (this.$checkRes(res)) this.$set(this, `subjectList`, res.data);
  324. //TODO 班主任表中的人员也可以成为礼仪老师,现在应该没有
  325. // TODO派生:涉及之后回显问题,是要将这个人在教师/班主任表中都查然后获得到
  326. res = await this.getTeacherList({ islyteacher: '1' });
  327. if (this.$checkRes(res)) this.$set(this, `lyTeacherList`, res.data);
  328. res = await this.getDeptList();
  329. if (this.$checkRes(res)) this.$set(this, `deptList`, res.data);
  330. res = await this.dirQuery({ batchid: this.batchid });
  331. if (this.$checkRes(res)) {
  332. let arr = res.data;
  333. arr = arr.map(i => {
  334. let dept = this.deptList.find(f => f._id === i.department);
  335. if (res) i.dept_name = dept.name;
  336. else i.dept_name = '无所属部门';
  337. return i;
  338. });
  339. let last = this.deptList.map(i => {
  340. let options = arr.filter(f => f.department === i._id);
  341. let label = i.name;
  342. return { options, label };
  343. });
  344. this.$set(this, `directorList`, last);
  345. }
  346. },
  347. //教师列表请求
  348. async toGetTeacherList({ query = {}, type } = {}) {
  349. query.subid = this.form.subid;
  350. query.termid = this.form.termid;
  351. query.status = '4';
  352. let setTeacher = async query => {
  353. let res = await this.getTeacherList(query);
  354. if (this.$checkRes(res)) {
  355. this.$set(this, `teacherList`, res.data);
  356. this.$set(this.teacherListPag, `total`, res.total);
  357. }
  358. };
  359. let setApply = async query => {
  360. let res = await this.getApplyTeacherList(query);
  361. if (this.$checkRes(res)) {
  362. this.$set(this, `applyTeacherList`, res.data ? res.data : []);
  363. }
  364. };
  365. if (!type) {
  366. //都查
  367. setTeacher(query);
  368. setApply(query);
  369. } else if (type === 'teacher') {
  370. //查教师
  371. setTeacher(query);
  372. } else if (type === 'apply') {
  373. //查申请授课
  374. setApply(query);
  375. }
  376. },
  377. changePage(page = 1, type) {
  378. let query = { skip: (page - 1) * 5 < 0 ? 0 : (page - 1) * 5, limit: 5 };
  379. if (type === 'teacher') {
  380. this.teacherListPag.name && this.teacherListPag.name !== '' ? (query.name = this.teacherListPag.name) : '';
  381. } else {
  382. this.applyTeacherListPag.name && this.applyTeacherListPag.name !== '' ? (query.name = this.applyTeacherListPag.name) : '';
  383. }
  384. this.toGetTeacherList({ query, type });
  385. },
  386. saveLessson(id) {
  387. let tcc = this.classList.find(f => f.classid === id);
  388. // // 礼仪课,开班地点,教师地点,拓展训练地点修改班级表
  389. this.$emit(`save`, tcc);
  390. },
  391. toPreview(id) {
  392. console.log(id);
  393. let tcc = this.classList.find(f => f.classid === id);
  394. console.log(this.classList);
  395. let numArr = tcc.name.match(/\d+/g);
  396. let term = numArr[0];
  397. let classes = numArr[2];
  398. let headteacher = {};
  399. this.directorList.map(f => (headteacher = f.options.find(ff => ff.id === tcc.headteacherid)));
  400. let lyTeacher = this.lyTeacherList.find(f => f.id === tcc.lyteacherid);
  401. let js = this.locationList.find(f => f.id === tcc.jslocationid);
  402. let kbys = this.locationList.find(f => f.id === tcc.kbyslocationid);
  403. let tzxl = this.locationList.find(f => f.id === tcc.kzjhlocationid);
  404. let yc = this.locationList.find(f => f.id === tcc.yclocationid);
  405. let object = { term, class: classes, start: this.start, end: this.end, lessons: tcc.lessons, headteacher, lyTeacher, js, kbys, tzxl, yc };
  406. this.$set(this, `previews`, object);
  407. this.views = 'table';
  408. },
  409. toReturns() {
  410. this.views = 'setting';
  411. },
  412. },
  413. computed: {
  414. mainTitle() {
  415. let meta = this.$route.meta;
  416. let main = meta.title || '';
  417. let sub = meta.sub || '';
  418. return `${main}${sub}`;
  419. },
  420. keyWord() {
  421. let meta = this.$route.meta;
  422. let main = meta.title || '';
  423. return main;
  424. },
  425. },
  426. };
  427. </script>
  428. <style lang="less" scoped></style>