|
@@ -1,56 +1,54 @@
|
|
<template>
|
|
<template>
|
|
<div id="school-arrange">
|
|
<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-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>
|
|
</el-row>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</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-drawer :visible.sync="drawer" direction="rtl" title="名额分配" @close="toClose">
|
|
<el-row type="flex" align="middle" justify="center" style="padding:20px" :gutter="20">
|
|
<el-row type="flex" align="middle" justify="center" style="padding:20px" :gutter="20">
|
|
@@ -144,8 +142,9 @@
|
|
<script>
|
|
<script>
|
|
import _ from 'lodash';
|
|
import _ from 'lodash';
|
|
var moment = require('moment');
|
|
var moment = require('moment');
|
|
|
|
+import detailFrame from '@frame/layout/admin/detail-frame';
|
|
import { mapState, createNamespacedHelpers } from 'vuex';
|
|
import { mapState, createNamespacedHelpers } from 'vuex';
|
|
-const { mapActions } = createNamespacedHelpers('trainplan');
|
|
|
|
|
|
+const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
|
|
const { mapActions: trainTemplate } = createNamespacedHelpers('trainTemplate');
|
|
const { mapActions: trainTemplate } = createNamespacedHelpers('trainTemplate');
|
|
const { mapActions: school } = createNamespacedHelpers('school');
|
|
const { mapActions: school } = createNamespacedHelpers('school');
|
|
const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
|
|
const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
|
|
@@ -156,10 +155,11 @@ export default {
|
|
year: { type: String, default: `${new Date().getFullYear()}` },
|
|
year: { type: String, default: `${new Date().getFullYear()}` },
|
|
template: { type: Object, default: () => {} },
|
|
template: { type: Object, default: () => {} },
|
|
},
|
|
},
|
|
- components: {},
|
|
|
|
|
|
+ components: { detailFrame },
|
|
data: () => {
|
|
data: () => {
|
|
return {
|
|
return {
|
|
list: [],
|
|
list: [],
|
|
|
|
+ plan: {},
|
|
termList: [],
|
|
termList: [],
|
|
totalList: [],
|
|
totalList: [],
|
|
carList: [],
|
|
carList: [],
|
|
@@ -171,9 +171,11 @@ export default {
|
|
};
|
|
};
|
|
},
|
|
},
|
|
async created() {
|
|
async created() {
|
|
|
|
+ await this.toGetTrainPlan();
|
|
await this.getSchool();
|
|
await this.getSchool();
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
|
|
+ ...trainPlan({ getTrainPlan: 'fetch' }),
|
|
...school(['query']),
|
|
...school(['query']),
|
|
...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update' }),
|
|
...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update' }),
|
|
//请求,处理学校列表
|
|
//请求,处理学校列表
|
|
@@ -298,39 +300,77 @@ export default {
|
|
},
|
|
},
|
|
//将学校上报的月份数组[String]=>[{start,end}]方法
|
|
//将学校上报的月份数组[String]=>[{start,end}]方法
|
|
changeRange(data) {
|
|
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));
|
|
let duplicate = JSON.parse(JSON.stringify(data));
|
|
if (_.isArray(duplicate)) {
|
|
if (_.isArray(duplicate)) {
|
|
duplicate = duplicate.map(i => {
|
|
duplicate = duplicate.map(i => {
|
|
let daterange = _.get(i, `daterange`, []); //['4','5','6']形式
|
|
let daterange = _.get(i, `daterange`, []); //['4','5','6']形式
|
|
- i.daterange = c(daterange);
|
|
|
|
|
|
+ i.daterange = this.groupTime(daterange);
|
|
return i;
|
|
return i;
|
|
});
|
|
});
|
|
} else if (_.isObject(duplicate)) {
|
|
} else if (_.isObject(duplicate)) {
|
|
- duplicate.daterange = c(duplicate.daterange);
|
|
|
|
|
|
+ duplicate.daterange = this.groupTime(duplicate.daterange);
|
|
}
|
|
}
|
|
|
|
|
|
return duplicate;
|
|
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() {
|
|
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)) {
|
|
if (this.$checkRes(res)) {
|
|
let nl = this.list.map(i => {
|
|
let nl = this.list.map(i => {
|
|
let r = res.data.find(f => f.schid == i.code);
|
|
let r = res.data.find(f => f.schid == i.code);
|
|
@@ -368,7 +408,8 @@ export default {
|
|
},
|
|
},
|
|
//整理期(事件)列表
|
|
//整理期(事件)列表
|
|
getTermList() {
|
|
getTermList() {
|
|
- let arr = _.toPairs(_.groupBy(this.events, 'termid'));
|
|
|
|
|
|
+ let events = this.resetEvents();
|
|
|
|
+ let arr = _.toPairs(_.groupBy(events, 'termid'));
|
|
let res = arr.map(i => {
|
|
let res = arr.map(i => {
|
|
i = _.flatten(_.remove(i, r => _.isArray(r)));
|
|
i = _.flatten(_.remove(i, r => _.isArray(r)));
|
|
let tpt = i.reduce((prev, next) => {
|
|
let tpt = i.reduce((prev, next) => {
|
|
@@ -381,6 +422,20 @@ export default {
|
|
});
|
|
});
|
|
this.$set(this, `termList`, res);
|
|
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() {
|
|
getTotal() {
|
|
let res = this.termList.map((i, index) => {
|
|
let res = this.termList.map((i, index) => {
|
|
@@ -519,8 +574,10 @@ export default {
|
|
//学校上报时间转换
|
|
//学校上报时间转换
|
|
row = this.changeRange(row);
|
|
row = this.changeRange(row);
|
|
let { result } = this.$tqInRange(term.start, term.end, row.daterange);
|
|
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 }) {
|
|
cellClass({ row, column, rowIndex, columnIndex }) {
|
|
let disabled = ' disabled_point';
|
|
let disabled = ' disabled_point';
|
|
@@ -538,6 +595,16 @@ export default {
|
|
this.toSave();
|
|
this.toSave();
|
|
this.$emit(`toDirector`);
|
|
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: {
|
|
filters: {
|
|
getProp(data, prop) {
|
|
getProp(data, prop) {
|
|
@@ -548,23 +615,12 @@ export default {
|
|
},
|
|
},
|
|
},
|
|
},
|
|
computed: {
|
|
computed: {
|
|
- ...mapState(['user']),
|
|
|
|
|
|
+ ...mapState(['user', 'defaultOption']),
|
|
pageTitle() {
|
|
pageTitle() {
|
|
return `${this.$route.meta.title}`;
|
|
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() {
|
|
metaInfo() {
|
|
return { title: this.$route.meta.title };
|
|
return { title: this.$route.meta.title };
|
|
},
|
|
},
|