Browse Source

分班完成,排课

lrf402788946 5 years ago
parent
commit
460ba2a753

+ 6 - 0
src/store/classes.js

@@ -4,6 +4,7 @@ import _ from 'lodash';
 Vue.use(Vuex);
 const api = {
   interface: `/api/train/class`,
+  divide: `/api/train/class/divide`,
 };
 const state = () => ({});
 const mutations = {};
@@ -29,6 +30,11 @@ const actions = {
     const res = await this.$axios.$delete(`${api.interface}/${payload}`);
     return res;
   },
+  //分班
+  async divide({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.divide}`, payload);
+    return res;
+  },
 };
 export default {
   namespaced: true,

+ 4 - 0
src/store/index.js

@@ -13,6 +13,8 @@ import questionnaire from './questionnaire';
 import teacher from './teacher';
 import trainplan from './trainplan';
 import duty from './duty';
+import school from './school';
+import schPlan from '@school/src/store/sch-plan';
 
 Vue.use(Vuex);
 
@@ -31,6 +33,8 @@ export default new Vuex.Store({
     teacher,
     trainplan,
     duty,
+    schPlan,
+    school,
   },
   state: {},
   mutations: {},

+ 38 - 0
src/store/school.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  interface: `/api/train/school`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.interface}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.interface}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.interface}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.interface}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.interface}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 5 - 0
src/store/student.js

@@ -4,6 +4,7 @@ import _ from 'lodash';
 Vue.use(Vuex);
 const api = {
   interface: `/api/train/student`,
+  noClass: '/api/train/student/seek',
 };
 const state = () => ({});
 const mutations = {};
@@ -29,6 +30,10 @@ const actions = {
     const res = await this.$axios.$delete(`${api.interface}/${payload}`);
     return res;
   },
+  async noClass({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.noClass}`, payload);
+    return res;
+  },
 };
 export default {
   namespaced: true,

+ 133 - 54
src/views/plan/classes.vue

@@ -1,9 +1,15 @@
 <template>
   <div id="plan">
     <!-- 根据计划,获取所有期数及期数下批次,然后提供选择期数;查询出该期数下学校上报的学生,选择学生手动分班 -->
-    <list-frame :title="mainTitle" @query="search" :total="total" :filter="filterFields" :needAdd="false">
+    <list-frame :title="mainTitle" @query="stuSearch" :total="total" :filter="filterFields" :needAdd="false">
+      <template #options="{item}">
+        <template v-if="item.model === 'termid'">
+          <el-option v-for="(i, index) in termList" :key="index" :label="`第${i.term}期`" :value="i._id"></el-option>
+        </template>
+      </template>
       <el-card>
         <el-row type="flex" justify="space-around" :gutter="10" align="middle" style="padding:10px 0;">
+          <el-col :span="7">班级需求:{{ selectInfo.personReq }}人</el-col>
           <el-col :span="7">已选择学生:{{ selected.length }}人</el-col>
           <el-col :span="7">男性:{{ selectInfo.male }}人</el-col>
           <el-col :span="7">女性:{{ selectInfo.female }}人</el-col>
@@ -12,22 +18,22 @@
         <el-row>
           <el-form :inline="true" size="mini">
             <el-form-item label="批次">
-              <el-select v-model="selectInfo.batch" placeholder="请先选择期数">
-                <el-option v-for="i in 3" :key="i" :label="`第${i}批`" :value="i"></el-option>
+              <el-select v-model="selectInfo.batchid" placeholder="请先选择期数" @change="getClasses">
+                <el-option v-for="(i, index) in batchList" :key="index" :label="i.name" :value="i._id"></el-option>
               </el-select>
             </el-form-item>
             <el-form-item label="班级">
-              <el-select v-model="selectInfo.class" placeholder="请先选择批次">
-                <el-option v-for="i in 3" :key="i" :label="`${i}班`" :value="i"></el-option>
+              <el-select v-model="selectInfo.classname" placeholder="请先选择批次">
+                <el-option v-for="(i, index) in classList" :key="index" :label="i.name" :value="i.name"></el-option>
               </el-select>
             </el-form-item>
-            <el-form-item label="班主任">
+            <!-- <el-form-item label="班主任">
               <el-select v-model="selectInfo.director" placeholder="请选择班主任" filterable>
-                <el-option-group v-for="group in options" :key="group.label" :label="group.label">
-                  <el-option v-for="item in group.options" :key="item.id" :label="item.label" :value="item.id"> </el-option>
+                <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" :value="item._id"> </el-option>
                 </el-option-group>
               </el-select>
-            </el-form-item>
+            </el-form-item> -->
             <el-form-item>
               <el-button type="primary" @click="toSetClass">确认分班</el-button>
             </el-form-item>
@@ -52,6 +58,14 @@
 <script>
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
+import _ from 'lodash';
+import { mapStatem, createNamespacedHelpers } from 'vuex';
+const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
+const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
+const { mapActions: student } = createNamespacedHelpers('student');
+const { mapActions: classes } = createNamespacedHelpers('classes');
+const { mapActions: director } = createNamespacedHelpers('director');
+const { mapActions: dept } = createNamespacedHelpers('dept');
 export default {
   metaInfo: { title: '安排班级' },
   name: 'plan',
@@ -59,60 +73,87 @@ export default {
   components: { listFrame, dataTable },
   data: () => ({
     opera: [],
-    options: [
-      {
-        label: '信息部',
-        options: [
-          {
-            id: '1',
-            label: '测试班主任1',
-          },
-          {
-            id: '2',
-            label: '测试班主任2',
-          },
-        ],
-      },
-      {
-        label: '其他部门',
-        options: [
-          {
-            id: '3',
-            label: '测试班主任3',
-          },
-          {
-            id: '4',
-            label: '测试班主任4',
-          },
-        ],
-      },
-    ],
     fields: [
       { label: '学生姓名', prop: 'name' },
-      { label: '学校', prop: 'school' },
+      { label: '学校', prop: 'school_name' },
       { label: '性别', prop: 'gender' },
     ],
-    filterFields: [{ label: '期数', model: 'term' }],
-    list: [{ id: 1, name: '学生1', school: '测试学校1', gender: '男' }],
+    filterFields: [{ label: '期数', model: 'termid', type: 'select' }],
+    list: [],
     selected: [],
     selectedTest: [],
     total: 0,
     selectInfo: {
       male: 0,
       female: 0,
+      personReq: 0,
     },
+    termList: [],
+    batchList: [],
+    classList: [],
+    directorList: [],
+    deptList: [],
   }),
   created() {
     this.search();
+    // this.getOhterList();
   },
   methods: {
+    ...trainPlan(['fetch']),
+    ...schPlan({ schQuery: 'query' }),
+    ...student({ getStudentList: 'noClass' }), //noClass
+    ...classes({ getClassesList: 'query', createClass: 'divide' }),
+    ...director({ getDirectorList: 'query' }),
+    ...dept({ getDeptList: 'query' }),
     async search({ skip = 0, limit = 10, ...info } = {}) {
-      // this.$refs.table.init;
-      // const res = await this.query({ skip, limit, ...info });
-      // if (this.$checkRes(res)) {
-      //   this.$set(this, `list`, res.data);
-      //   this.$set(this, `total`, res.total);
-      // }
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        let { termnum } = res.data;
+        this.$set(this, `termList`, termnum);
+      }
+    },
+    //查询选择期上报的学生,提供批次选择
+    async stuSearch({ skip = 0, limit = 10, ...info } = {}) {
+      let { termid } = info;
+      this.selectInfo.termid = termid;
+      const res = await this.getStudentList({ termid: termid, skip, limit });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+      if (skip !== 0) return;
+      this.getBatch(termid);
+    },
+    getBatch(termid) {
+      let batchs = this.termList.filter(f => f._id === termid);
+      if (batchs.length > 0) {
+        let { batchnum } = batchs[0];
+        this.$set(this, `batchList`, batchnum);
+      }
+    },
+    //根据批次id,查询下面的班级
+    async getClasses(data) {
+      //查询班级
+      if (!data) return;
+      const res = await this.getClassesList({ batchid: data });
+      // gc1 因为已经限制了分班人数,所以不允许出现班级人数不够的情况,查出来的班级就不应该生成,可以使用name过滤掉选项
+      let classList = [];
+      if (this.$checkRes(res)) {
+        if (res.data.length > 0) classList = res.data;
+      }
+      //整理班级数据,根据批次中的class数量,人数,创建班级
+      let batch = this.batchList.find(f => f._id === data);
+      let { name, class: classnum = 1, type, number } = batch;
+      this.selectInfo.type = type;
+      this.$set(this.selectInfo, `personReq`, number);
+      let arr = [];
+      for (let i = 1; i <= classnum; i++) {
+        let object = { name: `${name}${type === '0' ? `${i}班` : ''}` };
+        arr.push(object);
+      }
+      // gc1 过滤掉
+      arr = arr.filter(f => !classList.find(c => c.name == f.name));
+      this.$set(this, `classList`, arr);
     },
     toEdit({ data }) {
       this.$router.push({ path: '/dept/detail', query: { id: data.id } });
@@ -133,16 +174,51 @@ export default {
       this.$set(this.selectInfo, `male`, male);
       this.$set(this.selectInfo, `female`, female);
     },
-    toSetClass() {
+    async toSetClass() {
       //TODO 整理数据生成班级;将学生列表重新查询=>为了将已经有班级的学生剔除,以便继续分班(重新查询)
-
+      let info = JSON.parse(JSON.stringify(_.omit(this.selectInfo, ['male', 'female', 'personReq'])));
+      console.log(info);
+      let stuList = JSON.parse(JSON.stringify(this.selected));
+      console.log(stuList);
+      // if (this.isOutRange(stuList)) return;
+      info.students = stuList;
+      let res = await this.createClass(info);
+      this.$checkRes(res, '分班成功', '分班失败');
       //重置信息
-      this.selectInfo = {
-        male: 0,
-        female: 0,
-      };
-      this.selected = [];
-      this.$refs.table.selectReset();
+      // this.selectInfo = {
+      //   male: 0,
+      //   female: 0,
+      // };
+      // this.selected = [];
+      // this.$refs.table.selectReset();
+    },
+    async getOhterList() {
+      let res;
+      res = await this.getDeptList();
+      if (this.$checkRes(res)) this.$set(this, `deptList`, res.data);
+      res = await this.getDirectorList();
+      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);
+      }
+    },
+    isOutRange(selected) {
+      let res = true;
+      if (selected.length > this.selectInfo.personReq) this.$message.error('超出班级规定人数');
+      else if (selected.length < this.selectInfo.personReq) this.$message.error('人数不足');
+      else if (selected.length == this.selectInfo.personReq) res = false;
+      return res;
     },
   },
   computed: {
@@ -157,6 +233,9 @@ export default {
       let main = meta.title || '';
       return main;
     },
+    id() {
+      return this.$route.query.id;
+    },
   },
 };
 </script>

+ 1 - 1
src/views/plan/index.vue

@@ -72,7 +72,7 @@ export default {
         label: '状态',
         prop: 'status',
         format: i => {
-          return i === '0' ? '筹备中' : '其他状态';
+          return i === '0' ? '筹备中' : i === '1' ? '发布中' : '已结束';
         },
       },
     ],

+ 35 - 19
src/views/plan/lesson-plan.vue

@@ -3,10 +3,10 @@
     <el-collapse v-model="activeName" accordion>
       <el-collapse-item v-for="(item, index) in classList" :key="`coli${index}`" :name="`${index}`">
         <template slot="title">
-          <span style="font-size:24px">{{ item.term }}期{{ item.batch }}批{{ index + 1 }}班</span>
+          <span style="font-size:24px">{{ item.name }}</span>
         </template>
-        <data-table style="padding:10px" ref="table" :fields="fields" :data="item.setting" :opera="opera" @edit="toEdit"></data-table>
-        <el-form :inline="true" size="mini" style="padding:0 10px" label-width="150px">
+        <data-table style="padding:10px" ref="table" :fields="fields" :data="item.lessons" :opera="opera" @edit="toEdit"></data-table>
+        <el-form :inline="true" size="small" style="padding:0 10px" label-width="150px">
           <el-form-item label="礼仪课教师">
             <el-select v-model="item.lyteacher" placeholder="请选择礼仪课教师">
               <el-option v-for="(tea, index) in lyTeacherList" :key="`lytea${index}`" :label="tea.name" :value="tea.id"></el-option>
@@ -14,17 +14,17 @@
           </el-form-item>
           <el-form-item label="开班地点">
             <el-select v-model="item.kb" placeholder="请选择开班地点">
-              <el-option v-for="(place, index) in placeList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
+              <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.room" placeholder="请选择教室地点">
-              <el-option v-for="(place, index) in placeList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
+              <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.pra" placeholder="请选择拓展训练地点">
-              <el-option v-for="(place, index) in placeList" :key="`lytea${index}`" :label="place.name" :value="place.id"></el-option>
+              <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>
@@ -34,15 +34,24 @@
       <el-tabs>
         <el-tab-pane style="padding:10px">
           <template #label>
-            <span style="zoom:1.3">{{ form.term }}期{{ form.batch }}批{{ form.name }}</span>
+            <span style="zoom:1.3">{{ form.name }}</span>
           </template>
           <data-form :data="form" :fields="formFields" :rules="rules" @save="handleSave" :isNew="false">
-            <template #options="{item}">
-              <template v-if="item.model === 'lesson'">
-                <el-option v-for="(item, index) in lessonList" :key="`lesson${index}`" :label="item.name" :value="item.id"></el-option>
+            <template #custom="{item, form}">
+              <template v-if="item.model === 'subid'">
+                <el-select v-model="form[item.model]" @change="getTeacherList">
+                  <el-option v-for="(item, index) in subjectList" :key="`subject${index}`" :label="item.name" :value="item.id"></el-option>
+                </el-select>
               </template>
-              <template v-if="item.model === 'teacher'">
-                <el-option v-for="(item, index) in teacherList" :key="`teacher${index}`" :label="item.name" :value="item.id"></el-option>
+              <template v-if="item.model === 'teacherid'">
+                <el-select v-model="form[item.model]" placeholder="请先选择科目">
+                  <el-option v-for="(item, index) in teacherList" :key="`teacher${index}`" :label="item.name" :value="item.id"></el-option>
+                </el-select>
+              </template>
+            </template>
+            <template #radios="{item, form}">
+              <template v-if="item.model === 'day'">
+                <el-radio v-for="(i, index) in dayList" :key="index" :label="i.label"></el-radio>
               </template>
             </template>
           </data-form>
@@ -62,6 +71,10 @@ export default {
     start: { type: String, required: true },
     end: { type: String, required: true },
     classes: { type: Array, default: () => [] },
+    locationList: { type: Array, default: () => [] },
+    subjectList: { type: Array, default: () => [] },
+    lyTeacherList: { type: Array, default: () => [] },
+    teacherList: { type: Array, default: () => [] },
   },
   components: { dataTable, dataForm },
   data: () => ({
@@ -85,15 +98,13 @@ export default {
     formFields: [
       { label: '时间', model: 'date', type: 'text' },
       { label: '星期', model: 'week', type: 'text' },
-      { label: '课程', model: 'lesson', type: 'select' },
-      { label: '教师', model: 'teacher', type: 'select' },
+      { label: '课程', model: 'subid', custom: true },
+      { label: '教师', model: 'teacherid', custom: true },
+      { label: '时长', model: 'day', type: 'radio' },
     ],
+    dayList: [{ label: '一天' }, { label: '半天' }],
     rules: {},
     form: {},
-    lessonList: [],
-    teacherList: [],
-    lyTeacherList: [],
-    placeList: [],
   }),
   created() {
     this.setDateList();
@@ -121,7 +132,7 @@ export default {
       let classes = JSON.parse(JSON.stringify(this.classes));
       classes.map(i => {
         // i.dateList = JSON.parse(JSON.stringify(this.dateList));
-        i.setting = JSON.parse(JSON.stringify(this.dateList));
+        i.lessons = JSON.parse(JSON.stringify(this.dateList));
         return i;
       });
       this.$set(this, `classList`, classes);
@@ -139,6 +150,11 @@ export default {
     },
     handleSave({ data, isNew }) {
       console.log(data);
+      //根据data.id(班级id)找出是那条数据,然后根据data.date找到那条数据,将课程,教师,时长显示出来
+    },
+    getTeacherList(subjectId) {
+      console.log(subjectId);
+      this.$emit('getTeacher', subjectId);
     },
   },
   computed: {

+ 46 - 33
src/views/plan/lesson.vue

@@ -9,8 +9,17 @@
         </template>
         <data-table ref="table" :fields="fields" :data="list" :opera="opera" @date="toDate"></data-table>
       </list-frame>
-      <detail-frame v-else :title="detailTitle" :returns="returnList">
-        <lesson-plan :start="batch.startdate" :end="batch.enddate" :classes="classes"></lesson-plan>
+      <detail-frame v-else title="返回批次列表" :returns="returnList">
+        <lesson-plan
+          :start="batch.startdate"
+          :end="batch.enddate"
+          :classes="classes"
+          :locationList="locationList"
+          :subjectList="subjectList"
+          :teacherList="teacherList"
+          :lyTeacherList="lyTeacherList"
+          @getTeacher="toGetTeacherList"
+        ></lesson-plan>
       </detail-frame>
     </transition>
   </div>
@@ -25,6 +34,11 @@ import _ from 'lodash';
 import { createNamespacedHelpers } from 'vuex';
 const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
 const { mapActions: mapClasses } = createNamespacedHelpers('classes');
+const { mapActions: location } = createNamespacedHelpers('location'); //地点
+const { mapActions: subject } = createNamespacedHelpers('subject'); //科目
+const { mapActions: teacher } = createNamespacedHelpers('teacher'); //教师
+
+//教师表,地点表,课程表
 export default {
   metaInfo: { title: '安排课程' },
   name: 'lesson',
@@ -32,7 +46,6 @@ export default {
   components: { listFrame, dataTable, detailFrame, lessonPlan },
   data: () => ({
     view: 'list',
-    detailTitle: '',
     termList: [],
     opera: [
       {
@@ -45,41 +58,26 @@ export default {
       { label: '', prop: 'name' },
       { label: '批数', prop: 'batch' },
     ],
-    filterFields: [{ label: '期数', model: 'term', type: 'select' }], //期数应该改成下拉,从计划里拿出来的
+    filterFields: [{ label: '期数', model: 'term', type: 'select' }],
     list: [],
     batch: {},
     total: 0,
-    classes: [
-      {
-        id: 1,
-        term: 336,
-        batch: 1,
-        name: '1班',
-      },
-      {
-        id: 2,
-        term: 336,
-        batch: 1,
-        name: '2班',
-      },
-      {
-        id: 3,
-        term: 336,
-        batch: 1,
-        name: '3班',
-      },
-    ],
+    classes: [],
+    locationList: [],
+    subjectList: [],
+    lyTeacherList: [],
+    teacherList: [],
   }),
   created() {
     this.search();
+    this.getOtherList();
   },
   methods: {
-    ...trainPlan({
-      getTrainPlan: 'fetch',
-    }),
-    ...mapClasses({
-      getClass: 'fetch',
-    }),
+    ...trainPlan({ getTrainPlan: 'fetch' }),
+    ...mapClasses({ getClass: 'query' }),
+    ...location({ getLocationList: 'query' }),
+    ...subject({ getSubjectList: 'query' }),
+    ...teacher({ getTeacherList: 'query' }),
     async search({ skip = 0, limit = 10, ...info } = {}) {
       let res = await this.getTrainPlan(this.id);
       if (this.$checkRes(res)) {
@@ -95,13 +93,28 @@ export default {
       // TODO 根据批id查班级
       let res = await this.getClass({ batchid: data._id });
       // this.view = 'lesson';
-      console.log(data);
-      let { type, classes } = data;
-      // this.$set(this, `detailTitle`, `第${data.term}期 第${data.batch}批次`);
+      let { startdate, enddate } = data;
+      this.$set(this.batch, `startdate`, startdate);
+      this.$set(this.batch, `enddate`, enddate);
+      if (this.$checkRes(res)) this.$set(this, `classes`, res.data);
+      this.view = 'lesson';
     },
     returnList() {
       this.view = 'list';
     },
+    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);
+      res = await this.getTeacherList({ is_etiquette_teacher: '1' });
+      if (this.$checkRes(res)) this.$set(this, `lyTeacherList`, res.data);
+    },
+    async toGetTeacherList(subjectId) {
+      let res = await this.getTeacherList({ subid: subjectId });
+      if (this.$checkRes(res)) this.$set(this, `teacherList`, res.data);
+    },
   },
   computed: {
     mainTitle() {

+ 81 - 37
src/views/teacher/detail.vue

@@ -6,6 +6,12 @@
           {{ status }}
         </template>
         <template #options="{item}">
+          <template v-if="item.model === 'subid'">
+            <el-option v-for="(i, index) in subjectList" :key="index" :label="i.name" :value="i._id"></el-option>
+          </template>
+          <template v-if="item.model === 'school_code'">
+            <el-option v-for="(i, index) in schoolList" :key="index" :label="i.name" :value="i.code"></el-option>
+          </template>
           <template v-if="item.model === 'tltype'">
             <el-option label="ppt" value="0"></el-option>
             <el-option label="视频" value="1"></el-option>
@@ -32,10 +38,12 @@ import detailFrame from '@frame/layout/admin/detail-frame';
 import dataForm from '@frame/components/form';
 import upload from '@frame/components/upload';
 import { createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('teacher');
+const { mapActions: teacher } = createNamespacedHelpers('teacher');
+const { mapActions: subject } = createNamespacedHelpers('subject');
+const { mapActions: school } = createNamespacedHelpers('school');
 
 export default {
-  metaInfo: { title: '题库详情页' },
+  metaInfo: { title: '教师详情' },
   name: 'detail',
   props: {},
   components: {
@@ -43,21 +51,43 @@ export default {
     dataForm,
   },
   data: () => ({
-    info: { status: '1' },
+    // info: { status: '1', is_etiquette_teacher: '0' },
+    info: {
+      status: '1',
+      is_etiquette_teacher: '0',
+      name: '测试教师',
+      gender: '男',
+      phone: '18946597931',
+      id_number: '222222222222222222',
+      profession_number: '1111111111111212',
+      school_code: '10183',
+      email: '2938260457@qq.com',
+      age: '29',
+      birthday: '1991-02-04',
+      entry_time: '2015-02-04',
+      job: '教师',
+      major: '化学',
+      subid: '5e4369a4275c2f5514ec2593',
+      school_name: '吉林大学',
+    },
     fields: [
       { label: '教师姓名', required: true, model: 'name' },
-      { label: '状态', required: true, model: 'status', custom: true },
+      // { label: '状态', required: true, model: 'status', custom: true },
       { label: '性别', model: 'gender', type: `radio` },
-      { label: '手机号', required: true, model: 'phone' },
-      { label: '身份证号', required: true, model: 'id_number' },
+      { label: '手机号', required: true, model: 'phone', options: { maxLength: 11, minLength: 11 } },
+      { label: '身份证号', required: true, model: 'id_number', options: { maxLength: 18, minLength: 18 } },
       { label: '教师资格证号', required: true, model: 'profession_number' },
-      { label: '学校名称', required: true, model: 'school_name' },
+      // { label: '教师资格证', required: true, model: 'profession_number_file' },
+      { label: '学校', required: true, model: 'school_code', type: 'select' },
       { label: '邮箱', required: true, model: 'email' },
       { label: '年龄', required: true, model: 'age' },
-      { label: '出生日期', required: true, model: 'birthday' },
+      { label: '出生日期', required: true, model: 'birthday', type: 'date' },
+      { label: '入职时间', required: true, model: 'entry_time', type: 'date' },
       { label: '职务', required: true, model: 'job' },
       { label: '专业', required: true, model: 'major' },
+      { label: '科目', required: true, model: 'subid', type: 'select' },
       { label: '是/否是礼仪老师', model: 'is_etiquette_teacher', type: `radio` },
+
       // { label: '资料评分', required: true, model: 'zlgrade' },
       // { label: '面试评分', required: true, model: 'msgrade' },
       // { label: '学生评分', required: true, model: 'student' },
@@ -68,36 +98,43 @@ export default {
     ],
     rules: {
       name: [{ required: true, message: '请输入教师姓名' }],
-      // state: [{ required: true, message: '请选择状态' }],
-      sex: [{ required: true, message: '请选择性别' }],
-      birthday: [{ required: true, message: '请输入出生日期' }],
-      zhiwu: [{ required: true, message: '请输入职务' }],
-      zhuanye: [{ required: true, message: '请输入专业' }],
-      // zlgrade: [{ required: true, message: '请输入资料评分' }],
-      // msgrade: [{ required: true, message: '请输入面试评分' }],
-      // student: [{ required: true, message: '请输入学生评分' }],
-      // url: [{ required: true, message: '请输入视频地址' }],
-      // zlname: [{ required: true, message: '请输入资料名称' }],
-      openid: [{ required: true, message: '请输入openid' }],
-      password: [{ required: true, message: '请输入职业资格证文件' }],
+      gender: [{ required: true, message: '请选择性别' }],
+      phone: [
+        { required: true, message: '请输入手机号' },
+        { min: 11, max: 11, message: '请输入11位手机号 ', trigger: 'blur' },
+      ],
       id_number: [
         { required: true, message: '请输入身份证号' },
         { min: 18, max: 18, message: '请输入18位身份证号 ', trigger: 'blur' },
       ],
-      school_name: [{ required: true, message: '请输入学校名称' }],
-      email: [{ required: true, message: '请输入教师邮箱' }],
+      profession_number: [{ required: true, message: '请输入教师资格证号' }],
+      school_code: [{ required: true, message: '请选择学校' }],
+      email: [{ required: true, message: '请输入邮箱' }],
       age: [{ required: true, message: '请输入年龄' }],
-      phone: [
-        { required: true, message: '请输入电话' },
-        { min: 11, max: 11, message: '请输入11位电话号码', trigger: 'blur' },
-      ],
-      profession_number_file: [
-        { required: true, message: '请输入教师资格证号' },
-        { min: 17, max: 17, message: '请输入17位教师资格证号', trigger: 'blur' },
-      ],
+      birthday: [{ required: true, message: '请选择出生日期' }],
+      entry_time: [{ required: true, message: '请选择入职时间' }],
+      job: [{ required: true, message: '请输入职务' }],
+      major: [{ required: true, message: '请输入专业' }],
+      subid: [{ required: true, message: '请选择科目' }],
+      // zlgrade: [{ required: true, message: '请输入资料评分' }],
+      // msgrade: [{ required: true, message: '请输入面试评分' }],
+      // student: [{ required: true, message: '请输入学生评分' }],
+      // url: [{ required: true, message: '请输入视频地址' }],
+      // zlname: [{ required: true, message: '请输入资料名称' }],
+      // openid: [{ required: true, message: '请输入openid' }],
+      // password: [{ required: true, message: '请输入职业资格证文件' }],
+      // school_name: [{ required: true, message: '请输入学校名称' }],
+      // profession_number_file: [
+      //   { required: true, message: '请输入教师资格证号' },
+      //   { min: 17, max: 17, message: '请输入17位教师资格证号', trigger: 'blur' },
+      // ],
     },
+    subjectList: [],
+    schoolList: [],
   }),
-  created() {},
+  created() {
+    this.getOtherList();
+  },
   computed: {
     status() {
       return this.info.status == '0' ? '面试' : this.info.status == '1' ? '注册' : '其他';
@@ -131,7 +168,9 @@ export default {
     },
   },
   methods: {
-    ...mapActions(['fetch', 'create', 'update']),
+    ...teacher(['fetch', 'create', 'update']),
+    ...subject({ getSubjectList: 'query' }),
+    ...school({ getSchoolList: 'query' }),
     async search() {
       const res = await this.fetch(this.id);
       if (this.$checkRes(res)) this.$set(this, `info`, res.data);
@@ -140,20 +179,25 @@ export default {
     async handleSave({ isNew, data }) {
       let res;
       let msg;
+      data.school_name = this.schoolList.find(f => f.code === data.school_code).name;
       if (isNew) {
         res = this.create(data);
+        data.password = '123456';
         msg = `${this.keyWord}添加成功`;
       } else {
         res = this.update(data);
         msg = `${this.keyWord}修改成功`;
       }
-      if (this.$checkRes(res, msg)) this.$router.push({ path: '/teacher/index' });
+      // if (this.$checkRes(res, msg)) this.$router.push({ path: '/teacher/index' });
     },
 
-    // async handleSave({ isNew, data }) {
-    //   console.log(isNew);
-    //   console.log(data);
-    // },
+    async getOtherList() {
+      let res;
+      res = await this.getSubjectList();
+      if (this.$checkRes(res)) this.$set(this, `subjectList`, res.data);
+      res = await this.getSchoolList();
+      if (this.$checkRes(res)) this.$set(this, `schoolList`, res.data);
+    },
   },
 };
 </script>

+ 2 - 0
vue.config.js

@@ -1,5 +1,6 @@
 const path = require('path');
 const frame = path.resolve(__dirname, '../frame');
+const school = path.resolve(__dirname, '../train-school');
 module.exports = {
   publicPath: process.env.NODE_ENV === 'development' ? '/' : process.env.VUE_APP_ROOT_URL + 'center',
   configureWebpack: {
@@ -14,6 +15,7 @@ module.exports = {
         '@c': path.resolve(__dirname, './src/components'),
         '@a': path.resolve(__dirname, './src/assets'),
         '@frame': frame,
+        '@school': school,
       },
     },
   },