lrf402788946 5 years ago
parent
commit
0be4d023a7
1 changed files with 141 additions and 85 deletions
  1. 141 85
      src/views/new-plan/arrange/school-arrange.vue

+ 141 - 85
src/views/new-plan/arrange/school-arrange.vue

@@ -1,56 +1,54 @@
 <template>
   <div id="school-arrange">
-    <el-row type="flex" align="middle" justify="end" style="padding-bottom:10px">
-      <el-col :span="2">
-        <el-button type="success" size="mini" @click="toSave">保存计划</el-button>
-      </el-col>
-      <el-col :span="2">
-        <el-button type="primary" size="mini" @click="toArrange">一键分配</el-button>
-      </el-col>
-      <el-col :span="2">
-        <el-button type="primary" size="mini" plain @click="dialog = true">查看汇总</el-button>
-      </el-col>
-      <el-col :span="2">
-        <el-button size="mini" icon="el-icon-right" @click="toDirector">班主任计划</el-button>
-      </el-col>
-    </el-row>
-
-    <!-- 大表 -->
-    <el-card v-loading="!already" style="min-height:500px">
-      <el-table
-        :data="list"
-        border
-        stripe
-        size="mini"
-        height="650px"
-        @cell-click="cellClick"
-        :cell-style="cellStyle"
-        :cell-class-name="cellClass"
-        v-if="already"
-      >
-        <el-table-column label="学校" fixed align="center" prop="name" width="180">
-          <template v-slot="{ row }">
-            <el-row>
-              <el-col :span="24">
-                {{ row.name }}
-              </el-col>
-              <el-col :span="24" v-if="row.number"> 名额:{{ row.number }} </el-col>
-            </el-row>
-          </template>
-        </el-table-column>
-        <el-table-column align="center" v-for="(i, index) in termList" :key="index" :label="`第${i.term}期`">
-          <el-table-column align="center" width="95" :prop="`term${index + 1}`">
-            <template #header>
+    <detail-frame :title="pageTitle">
+      <el-row type="flex" align="middle" justify="end" style="padding-bottom:10px">
+        <el-col :span="2">
+          <el-button type="success" size="mini" @click="toSave">保存计划</el-button>
+        </el-col>
+        <el-col :span="2">
+          <el-button type="primary" size="mini" @click="toArrange">一键分配</el-button>
+        </el-col>
+        <el-col :span="2">
+          <el-button type="primary" size="mini" plain @click="dialog = true">查看汇总</el-button>
+        </el-col>
+      </el-row>
+      <!-- 大表 -->
+      <el-card v-loading="!already" style="min-height:500px">
+        <el-table
+          :data="list"
+          border
+          stripe
+          size="mini"
+          height="650px"
+          @cell-click="cellClick"
+          :cell-style="cellStyle"
+          :cell-class-name="cellClass"
+          v-if="already"
+        >
+          <el-table-column label="学校" fixed align="center" prop="name" width="180">
+            <template v-slot="{ row }">
               <el-row>
-                <el-col :span="24">{{ i.start }}</el-col>
-                <el-col :span="24">至</el-col>
-                <el-col :span="24">{{ i.end }}</el-col>
+                <el-col :span="24">
+                  {{ row.name }}
+                </el-col>
+                <el-col :span="24" v-if="row.number"> 名额:{{ row.number }} </el-col>
               </el-row>
             </template>
           </el-table-column>
-        </el-table-column>
-      </el-table>
-    </el-card>
+          <el-table-column align="center" v-for="(i, index) in termList" :key="index" :label="`第${i.term}期`">
+            <el-table-column align="center" width="95" :prop="`term${index + 1}`">
+              <template #header>
+                <el-row>
+                  <el-col :span="24">{{ i.start }}</el-col>
+                  <el-col :span="24">至</el-col>
+                  <el-col :span="24">{{ i.end }}</el-col>
+                </el-row>
+              </template>
+            </el-table-column>
+          </el-table-column>
+        </el-table>
+      </el-card>
+    </detail-frame>
 
     <el-drawer :visible.sync="drawer" direction="rtl" title="名额分配" @close="toClose">
       <el-row type="flex" align="middle" justify="center" style="padding:20px" :gutter="20">
@@ -144,8 +142,9 @@
 <script>
 import _ from 'lodash';
 var moment = require('moment');
+import detailFrame from '@frame/layout/admin/detail-frame';
 import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('trainplan');
+const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
 const { mapActions: trainTemplate } = createNamespacedHelpers('trainTemplate');
 const { mapActions: school } = createNamespacedHelpers('school');
 const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
@@ -156,10 +155,11 @@ export default {
     year: { type: String, default: `${new Date().getFullYear()}` },
     template: { type: Object, default: () => {} },
   },
-  components: {},
+  components: { detailFrame },
   data: () => {
     return {
       list: [],
+      plan: {},
       termList: [],
       totalList: [],
       carList: [],
@@ -171,9 +171,11 @@ export default {
     };
   },
   async created() {
+    await this.toGetTrainPlan();
     await this.getSchool();
   },
   methods: {
+    ...trainPlan({ getTrainPlan: 'fetch' }),
     ...school(['query']),
     ...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update' }),
     //请求,处理学校列表
@@ -298,39 +300,77 @@ export default {
     },
     //将学校上报的月份数组[String]=>[{start,end}]方法
     changeRange(data) {
-      let c = r => {
-        return r.map(mon => {
-          if (_.isObject(mon)) return mon;
-          let start = moment()
-            .year(this.year)
-            .month(mon * 1 - 1)
-            .date('1')
-            .format('YYYY-MM-DD');
-          let end = moment()
-            .year(this.year)
-            .month(mon * 1)
-            .date('1')
-            .subtract(1, 'days')
-            .format('YYYY-MM-DD');
-          return { start, end };
-        });
-      };
+      //TODO 时间不对,跨月份之后接不上了
       let duplicate = JSON.parse(JSON.stringify(data));
       if (_.isArray(duplicate)) {
         duplicate = duplicate.map(i => {
           let daterange = _.get(i, `daterange`, []); //['4','5','6']形式
-          i.daterange = c(daterange);
+          i.daterange = this.groupTime(daterange);
           return i;
         });
       } else if (_.isObject(duplicate)) {
-        duplicate.daterange = c(duplicate.daterange);
+        duplicate.daterange = this.groupTime(duplicate.daterange);
       }
 
       return duplicate;
     },
+    groupTime(data) {
+      let len = _.get(data, 'length');
+      if (len && len == 1) {
+        let dr = data.map(mon => {
+          let r = this.stringDateRange(mon, mon);
+          return r;
+        });
+        return dr;
+      } else if (len && len > 1) {
+        //TODO 长度大于1也就是说明最少上报了2个月份
+        //先排序,然后按照连续性分组
+        let afterSort = data.sort((a, b) => a * 1 - b * 1);
+        let newRange = this.getConRange(afterSort);
+      }
+    },
+    stringDateRange(data, num) {
+      if (_.isObject(data)) return data;
+      let start = moment()
+        .year(this.year)
+        .month(data * 1 - 1)
+        .date('1')
+        .format('YYYY-MM-DD');
+      let end = moment()
+        .year(this.year)
+        .month(num * 1)
+        .date('1')
+        .subtract(1, 'days')
+        .format('YYYY-MM-DD');
+      return { start, end };
+    },
+    getConRange(array) {
+      array = ['1', '2', '3', '5', '6', '10', '11'];
+      let res = [];
+      console.log(array);
+      let limit = _.get(array, 'length') - 1;
+      for (let i = 0; i <= limit; i++) {
+        if (i == 0) res.push([array[i]]);
+        else {
+          let t_num = array[i];
+          let l_num = _.last(_.last(res));
+          let r = _.subtract(t_num * 1, l_num * 1);
+          if (r == 1) {
+            //当前和下一期是连续的
+            let last = _.last(res);
+            last.push(t_num);
+            res[res.length - 1] = last;
+          } else {
+            res.push([array[i]]);
+          }
+        }
+      }
+      console.log(res);
+    },
     //学校匹配学校计划
     async getSchoolPlan() {
-      const res = await this.schPlanQuery({ planid: this.id });
+      let planid = _.get(this.defaultOption, 'planid');
+      const res = await this.schPlanQuery({ planid });
       if (this.$checkRes(res)) {
         let nl = this.list.map(i => {
           let r = res.data.find(f => f.schid == i.code);
@@ -368,7 +408,8 @@ export default {
     },
     //整理期(事件)列表
     getTermList() {
-      let arr = _.toPairs(_.groupBy(this.events, 'termid'));
+      let events = this.resetEvents();
+      let arr = _.toPairs(_.groupBy(events, 'termid'));
       let res = arr.map(i => {
         i = _.flatten(_.remove(i, r => _.isArray(r)));
         let tpt = i.reduce((prev, next) => {
@@ -381,6 +422,20 @@ export default {
       });
       this.$set(this, `termList`, res);
     },
+    //整理计划=>和日历的 events 一样
+    resetEvents() {
+      let events = _.get(this.plan, 'termnum', []);
+      events = events.map(i => {
+        let tobj = { term: i.term, termid: i._id };
+        return i.batchnum.map(bat => {
+          let { startdate: start, enddate: end, ...info } = bat;
+          let bobj = { ...info, ...tobj, start, end };
+          return bobj;
+        });
+      });
+      events = _.flatten(events);
+      return events;
+    },
     //名额统计
     getTotal() {
       let res = this.termList.map((i, index) => {
@@ -519,8 +574,10 @@ export default {
       //学校上报时间转换
       row = this.changeRange(row);
       let { result } = this.$tqInRange(term.start, term.end, row.daterange);
-      if (!result) return disabled;
-      else return '';
+      if (!result) {
+        console.log(term, row);
+        return disabled;
+      } else return '';
     },
     cellClass({ row, column, rowIndex, columnIndex }) {
       let disabled = ' disabled_point';
@@ -538,6 +595,16 @@ export default {
       this.toSave();
       this.$emit(`toDirector`);
     },
+
+    //获取计划
+    async toGetTrainPlan() {
+      let planid = _.get(this.defaultOption, 'planid');
+      let res = await this.getTrainPlan(planid);
+      if (this.$checkRes(res)) {
+        this.$set(this, `plan`, res.data);
+        this.getTermList();
+      }
+    },
   },
   filters: {
     getProp(data, prop) {
@@ -548,23 +615,12 @@ export default {
     },
   },
   computed: {
-    ...mapState(['user']),
+    ...mapState(['user', 'defaultOption']),
     pageTitle() {
       return `${this.$route.meta.title}`;
     },
-    id() {
-      return this.$route.query.id;
-    },
-  },
-  watch: {
-    events: {
-      handler(val) {
-        if (val.length > 0) this.getTermList();
-      },
-      deep: true,
-      immediate: true,
-    },
   },
+  watch: {},
   metaInfo() {
     return { title: this.$route.meta.title };
   },