lrf há 9 meses atrás
pai
commit
4044726fbc

+ 92 - 54
src/views/new-plan/arrange/school-arrange.vue

@@ -6,17 +6,35 @@
         <el-button type="primary" size="mini" @click="downloadExcel">导出xlsx</el-button>
       </div>
     </div>
-    <excel-view ref="excelView" v-if="!loading" :plan="plan" :classTypeList="classTypeList" :schStuList="schStuList"
-      :schoolList="schoolList" :placeList="placeList" :vacation="vacation" :year="plan.year"
-      @planUpdate="planUpdate" :schPlan="schPlan"></excel-view>
-    <div v-else v-loading="loading" style="height:85vh;width:100%" element-loading-text="加载中,请稍后..."
-      element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)"></div>
+    <excel-view
+      ref="excelView"
+      v-if="!loading"
+      :plan="plan"
+      :classTypeList="classTypeList"
+      :schStuList="schStuList"
+      :schoolList="schoolList"
+      :placeList="placeList"
+      :vacation="vacation"
+      :year="plan.year"
+      @planUpdate="planUpdate"
+      :schPlan="schPlan"
+      :template="template"
+      @saveArrange="saveArrange"
+    ></excel-view>
+    <div
+      v-else
+      v-loading="loading"
+      style="height:85vh;width:100%"
+      element-loading-text="加载中,请稍后..."
+      element-loading-spinner="el-icon-loading"
+      element-loading-background="rgba(0, 0, 0, 0.8)"
+    ></div>
   </div>
 </template>
 
 <script>
-import _ from 'lodash'
-import excelView from './school-arrange/excel-view.vue'
+import _ from 'lodash';
+import excelView from './school-arrange/excel-view.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
 const { mapActions: classtype } = createNamespacedHelpers('classtype');
@@ -29,7 +47,7 @@ export default {
   name: 'school-arrange',
   props: {},
   components: { excelView },
-  data: function () {
+  data: function() {
     return {
       loading: true,
       // 当前默认设置
@@ -49,7 +67,7 @@ export default {
       /**假期列表(计划中的festivals整理出来的) */
       vacation: [],
       /**培训计划安排 */
-      schPlan: []
+      schPlan: [],
     };
   },
   computed: {
@@ -74,52 +92,73 @@ export default {
     async planUpdate({ data }) {
       // 使用期数 查询是否有数据
       const { term, ...others } = data;
-      const plan = _.cloneDeep(this.plan)
-      const termData = plan.termnum.find(f => f.term === term)
+      const plan = _.cloneDeep(this.plan);
+      const termData = plan.termnum.find(f => f.term === term);
       if (termData) {
         // 有期数
-        const batchnum = _.get(termData, 'batchnum', [])
-        const classnum = _.get(termData, 'classnum', 0)
-        const batchData = batchnum.find(f => f.batch === others.batch)
+        const batchnum = _.get(termData, 'batchnum', []);
+        const classnum = _.get(termData, 'classnum', 0);
+        const batchData = batchnum.find(f => f.batch === others.batch);
         if (batchData) {
           // 有批次,修改
           for (const key in others) {
-            const val = others[key]
+            const val = others[key];
             batchData[key] = val;
           }
         } else {
           // 没有批次
-          batchnum.push(others)
+          batchnum.push(others);
         }
         // 计算班级数
-        termData.classnum = batchnum.reduce((p, n) => p + _.get(n, 'class', []).length, 0)
+        termData.classnum = batchnum.reduce((p, n) => p + _.get(n, 'class', []).length, 0);
       } else {
         // 没有该期数
         const object = {
           term,
           classnum: _.get(others, 'class', []).length,
-          batchnum: [others]
-        }
+          batchnum: [others],
+        };
         plan.termnum.push(object);
       }
-      const res = await this.tranPlanUpdate(plan)
+      const res = await this.tranPlanUpdate(plan);
       if (this.$checkRes(res, '计划修改成功', res.errmsg)) {
         this.loadData();
       }
     },
 
+    async saveArrange({ data, schid }) {
+      const schPlanData = this.schPlan.find(f => f.schid === schid);
+      if (!schPlanData) {
+        this.$message.error('未找到学校安排数据');
+        return;
+      }
+      if (_.get(data, '_id')) {
+        const index = schPlanData.arrange.findIndex(f => f._id === data._id);
+        if (index >= 0) schPlanData.arrange[index] = data;
+      } else {
+        const arrange = _.get(schPlanData, 'arrange', []);
+        arrange.push(data);
+      }
+      const schPlanDataIndex = this.schPlan.findIndex(f => f.schid === schid);
+      const cd = _.cloneDeep(this.schPlan);
+      cd[schPlanDataIndex] = schPlanData;
+      const res = await this.setSchPlan(cd);
+      if (this.$checkRes(res, '保存成功', res.errmsg)) {
+        this.loadData();
+      }
+    },
 
     /**查询需要根据默认值重新加载的数据 */
     async needResearchData() {
       let planyearid = _.get(this.defaultOption, 'planyearid');
       let planid = _.get(this.defaultOption, 'planid');
-      // #region查询上传学生名单的学校 
+      // #region查询上传学生名单的学校
       let res = await this.getSchoolStudent({ planid });
       if (this.$checkRes(res)) {
         const { data } = res;
-        console.group('schStuList')
-        console.log(data)
-        console.groupEnd()
+        console.group('schStuList');
+        console.log(data);
+        console.groupEnd();
         this.$set(this, `schStuList`, data);
       }
       // #endregion
@@ -128,13 +167,13 @@ export default {
       if (this.$checkRes(res)) {
         const data = _.get(res, 'data');
         if (data) {
-          let termnum = _.get(data, 'termnum', [])
+          let termnum = _.get(data, 'termnum', []);
           termnum = _.orderBy(termnum, ['term'], ['asc']);
           data.termnum = termnum;
-          console.group('plan')
-          console.log(data)
+          console.group('plan');
+          console.log(data);
           console.groupEnd();
-          this.$set(this, 'plan', data)
+          this.$set(this, 'plan', data);
           // 假期
           let fest = _.get(res.data, 'festivals', []);
           let vac = fest.map(i => {
@@ -151,28 +190,28 @@ export default {
           this.$set(this, `vacation`, vac);
           // TODO:原逻辑需要处理批次列表
           // 可以处理学校,分配人数的学校也在年度计划中存着,可以拿出来换学校名称
-          const needStudentSchool = _.get(data, 'school', [])
+          const needStudentSchool = _.get(data, 'school', []);
           let schoolList = [];
           if (needStudentSchool.length > 0) {
-            const schoolCodes = needStudentSchool.map(i => i.code)
-            const schoolListResult = await this.findByCodes({ code: schoolCodes })
+            const schoolCodes = needStudentSchool.map(i => i.code);
+            const schoolListResult = await this.findByCodes({ code: schoolCodes });
             if (this.$checkRes(schoolListResult)) {
               // 组成数据,将查询出来的学校 和 需要学校各类型班级的人数带上
-              schoolList = _.get(schoolListResult, 'data', [])
+              schoolList = _.get(schoolListResult, 'data', []);
               schoolList = schoolList.map(i => {
-                const r = needStudentSchool.find(f => f.code === i.code)
+                const r = needStudentSchool.find(f => f.code === i.code);
                 if (r) {
-                  i.classnum = _.get(r, 'classnum', [])
+                  i.classnum = _.get(r, 'classnum', []);
                 }
                 return i;
-              })
+              });
             }
             // TODO:查询出学校不能参培的时间,要禁止该时间段的操作
 
-            console.group('schoolList')
-            console.log(schoolList)
-            console.groupEnd()
-            this.$set(this, 'schoolList', schoolList)
+            console.group('schoolList');
+            console.log(schoolList);
+            console.groupEnd();
+            this.$set(this, 'schoolList', schoolList);
           }
         }
       }
@@ -180,31 +219,30 @@ export default {
       // #region 获取计划模板
       res = await this.modelFetch({ model: 'trainmodel', planyearid, planid });
       if (this.$checkRes(res)) {
-        console.group('template')
-        console.log(res.data)
-        console.groupEnd()
+        console.group('template');
+        console.log(res.data);
+        console.groupEnd();
         this.$set(this, `template`, _.get(res, 'data', {}));
       }
       // #endregion
       res = await this.schPlanQuery({ planid });
       if (this.$checkRes(res)) {
-        console.group('arrange')
-        console.log(res.data)
-        console.groupEnd()
-        this.$set(this, 'schPlan', res.data)
+        console.group('arrange');
+        console.log(res.data);
+        console.groupEnd();
+        this.$set(this, 'schPlan', res.data);
       }
-
     },
     /**查询不需要重载的字典数据 */
     async getOtherList() {
       let res = await this.getClassType();
       if (this.$checkRes(res)) {
-        console.group('classTypeList')
-        console.log(res.data)
-        console.groupEnd()
+        console.group('classTypeList');
+        console.log(res.data);
+        console.groupEnd();
         this.$set(this, `classTypeList`, res.data);
       }
-      res = await this.getLocation({ type: '4' })
+      res = await this.getLocation({ type: '4' });
       if (this.$checkRes(res)) {
         // 为每个地点随机生成颜色
         let list = res.data;
@@ -219,10 +257,10 @@ export default {
     },
     async loadData() {
       try {
-        this.loading = true
-        await this.needResearchData()
+        this.loading = true;
+        await this.needResearchData();
       } catch (error) {
-        console.error(error)
+        console.error(error);
       } finally {
         this.loading = false;
       }

+ 80 - 3
src/views/new-plan/arrange/school-arrange/arrange-edit.vue

@@ -12,18 +12,29 @@
         <el-col :span="12">
           <el-form-item label="期数">{{ planData.term }}</el-form-item>
           <el-form-item label="批次">{{ planData.batch }}</el-form-item>
-          <el-form-item label="班级类型">{{ planData.type }}</el-form-item>
+          <el-form-item label="班级类型">{{ planData.typeWord }}</el-form-item>
           <el-form-item label="开始时间">{{ planData.startdate }}</el-form-item>
           <el-form-item label="结束时间">{{ planData.enddate }}</el-form-item>
           <el-form-item label="总名额">{{ planData.total }}</el-form-item>
           <el-form-item label="剩余名额">{{ planData.elseNumber }}</el-form-item>
         </el-col>
       </el-row>
+      <el-row>
+        <el-col :span="24" class="acol">
+          <font style="padding-right:20px">安排人数</font>
+          <!-- 此处不限制人数,超过人数在保存时会进行提示 -->
+          <el-input-number :min="0" v-model="form.number" placeholder="请输入分配的人数" style="width:200px"></el-input-number>
+        </el-col>
+        <el-col :span="24" class="acol">
+          <el-button @click="toSave" type="primary" size="mini">保存</el-button>
+        </el-col>
+      </el-row>
     </el-form>
   </div>
 </template>
 
 <script>
+const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'arrange-edit',
@@ -31,11 +42,14 @@ export default {
     data: { type: Object },
     planData: { type: Object },
     schoolData: { type: Object },
+    template: { type: Object },
   },
   components: {},
   data: function() {
     return {
       form: {},
+      schoolMax: 0,
+      batchMax: 0,
     };
   },
   computed: {
@@ -43,12 +57,75 @@ export default {
   },
   created() {
     this.$set(this, 'form', this.data);
+    // 学校人数范围:0 -  学校剩余名额 + 安排人数
+    this.schoolMax = parseInt(_.get(this.schoolData, 'elseNumber', 0)) + parseInt(_.clone(_.get(this.data, 'number', 0)));
+    // 期批人数范围:0 - 期批剩余名额 + 安排人数
+    this.batchMax = _.get(this.planData, 'elseNumber', 0) + parseInt(_.clone(_.get(this.data, 'number', 0)));
+  },
+  methods: {
+    toSave() {
+      // 检查是否超过最大值
+      const anum = parseInt(_.get(this.form, 'number', 0));
+      let arr = [];
+      let str;
+      const data = this.resetData();
+      if (this.schoolMax < anum) arr.push('学校可分配');
+      if (this.batchMax < anum) arr.push('计划批次可分配');
+      if (arr.length > 0) str = `已超过 ${arr.join('、')} 的最多人数,确定继续保存次安排?`;
+      if (str) {
+        this.$confirm(str, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        }).then(() => {
+          // 保存
+          this.$emit('saveArrange', data);
+        });
+      } else {
+        // 保存
+        this.$emit('saveArrange', data);
+      }
+    },
+    /**整理要保存的数据:
+     * 如果有form有_id,说明是修改;
+     * 没有_id是新增;
+     * 有_id但是number为0是删除
+     */
+    resetData() {
+      let data = _.cloneDeep(this.form);
+      if (!_.get(data, '_id')) {
+        // 组织数据
+        const obj = {
+          term: _.get(this.planData, 'term'),
+          termid: _.get(this.planData, 'termid'),
+          batch: _.get(this.planData, 'batch'),
+          batchid: _.get(this.planData, 'batchid'),
+          type: _.get(this.planData, 'type'),
+        };
+        data = { ...data, ...obj };
+      }
+      // 计算派车
+      const hascar = _.get(this.schoolData, 'hascar', '0');
+      if (hascar === '1') {
+        let carpnum = _.get(this.template, 'carpnum', 0);
+        carpnum = parseInt(carpnum);
+        if (carpnum && _.isNumber(carpnum)) {
+          console.log(parseInt(_.get(data, 'number', 0)), carpnum);
+          data.carnum = _.ceil(_.divide(parseInt(_.get(data, 'number', 0)), carpnum));
+        } else data.carnum = 0;
+      }
+      return { data, schid: this.schoolData.code };
+    },
   },
-  methods: {},
   metaInfo() {
     return { title: this.$route.meta.title };
   },
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.acol {
+  text-align: center;
+  padding-bottom: 10px;
+}
+</style>

+ 16 - 6
src/views/new-plan/arrange/school-arrange/excel-view.vue

@@ -14,7 +14,7 @@
       <term-add :key="new Date().getTime()" :data="form" :classTypeList="classTypeList" :placeList="placeList" v-bind="$attrs" v-on="$listeners"></term-add>
     </el-dialog>
     <el-dialog :visible.sync="dialog2" title="培训安排" @close="toClose" :destroy-on-close="true">
-      <arrange-edit :key="new Date().getTime()" :data="form" :planData="planData" :schoolData="schoolData"></arrange-edit>
+      <arrange-edit :key="new Date().getTime()" :data="form" :planData="planData" :schoolData="schoolData" v-bind="$attrs" v-on="$listeners"></arrange-edit>
     </el-dialog>
   </div>
 </template>
@@ -231,10 +231,10 @@ export default {
           this.$message.error('培训计划安排整理数据发生错误');
           return;
         }
-        const { schoolData, planData } = res;
-        console.log(planData)
+        const { schoolData, planData, form } = res;
         _.delay(() => {
-          this.form = { number };
+          if (!form) this.form = { number };
+          else this.form = form;
           this.schoolData = schoolData;
           this.planData = planData;
           this.dialog2 = true;
@@ -247,6 +247,7 @@ export default {
      * 根据坐标确定培训安排取出数据
      * 收集学校信息:学校名(name);层次(level);需不需要派车(hascar);总名额;剩余名额
      * 期批信息;期数;批次;班级类型;开始时间;结束时间;批次总人数;批次剩余名额
+     * 当前安排的数据:由学校code和班级类型确定
      * 然后提供给修改组件取设置数值
      * @param {Number} ri 行位置
      * @param {Number} ci 列位置
@@ -305,7 +306,8 @@ export default {
         batchid: _.get(batchData, '_id'),
         startdate: _.get(batchData, 'startdate'),
         enddate: _.get(batchData, 'enddate'),
-        type: classType,
+        type: ct.code,
+        typeWord: classType,
       };
       /**
        * 丰富:
@@ -330,7 +332,15 @@ export default {
       const inNumber = arr.reduce((p, n) => p + n, 0);
       const elseNumber = total - inNumber;
       planData.elseNumber = elseNumber;
-      return { schoolData: school, planData };
+      // 确定要修改的数据
+      const sp = this.schPlan.find(f => f.schid === school.code);
+      const returnData = { schoolData: school, planData };
+      if (sp) {
+        const { arrange = [] } = sp;
+        const ta = arrange.find(f => f.type === ct.code && f.termid === planData.termid && f.batchid === planData.batchid);
+        if (ta) returnData.form = ta;
+      }
+      return returnData;
     },
 
     /**