|
@@ -1,7 +1,7 @@
|
|
<template>
|
|
<template>
|
|
<div id="school-arrange">
|
|
<div id="school-arrange">
|
|
<detail-frame :title="pageTitle">
|
|
<detail-frame :title="pageTitle">
|
|
- <el-row type="flex" align="middle" justify="end" style="padding-bottom:10px">
|
|
|
|
|
|
+ <el-row type="flex" align="middle" justify="end" style="padding-bottom:10px" v-if="already">
|
|
<el-col :span="2">
|
|
<el-col :span="2">
|
|
<el-button type="success" size="mini" @click="toSave">保存计划</el-button>
|
|
<el-button type="success" size="mini" @click="toSave">保存计划</el-button>
|
|
</el-col>
|
|
</el-col>
|
|
@@ -145,16 +145,12 @@ var moment = require('moment');
|
|
import detailFrame from '@frame/layout/admin/detail-frame';
|
|
import detailFrame from '@frame/layout/admin/detail-frame';
|
|
import { mapState, createNamespacedHelpers } from 'vuex';
|
|
import { mapState, createNamespacedHelpers } from 'vuex';
|
|
const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
|
|
const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
|
|
-const { mapActions: trainTemplate } = createNamespacedHelpers('trainTemplate');
|
|
|
|
|
|
+const { mapActions: util } = createNamespacedHelpers('util');
|
|
const { mapActions: school } = createNamespacedHelpers('school');
|
|
const { mapActions: school } = createNamespacedHelpers('school');
|
|
const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
|
|
const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
|
|
export default {
|
|
export default {
|
|
name: 'school-arrange',
|
|
name: 'school-arrange',
|
|
- props: {
|
|
|
|
- events: { type: Array, default: () => [] },
|
|
|
|
- year: { type: String, default: `${new Date().getFullYear()}` },
|
|
|
|
- template: { type: Object, default: () => {} },
|
|
|
|
- },
|
|
|
|
|
|
+ props: {},
|
|
components: { detailFrame },
|
|
components: { detailFrame },
|
|
data: () => {
|
|
data: () => {
|
|
return {
|
|
return {
|
|
@@ -163,27 +159,32 @@ export default {
|
|
termList: [],
|
|
termList: [],
|
|
totalList: [],
|
|
totalList: [],
|
|
carList: [],
|
|
carList: [],
|
|
|
|
+ template: {},
|
|
dialog: false,
|
|
dialog: false,
|
|
drawer: false,
|
|
drawer: false,
|
|
form: {},
|
|
form: {},
|
|
activeName: '1',
|
|
activeName: '1',
|
|
already: false,
|
|
already: false,
|
|
|
|
+ options: undefined,
|
|
};
|
|
};
|
|
},
|
|
},
|
|
async created() {
|
|
async created() {
|
|
await this.toGetTrainPlan();
|
|
await this.toGetTrainPlan();
|
|
|
|
+ await this.toGetTrainTemplate();
|
|
await this.getSchool();
|
|
await this.getSchool();
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
|
|
+ ...util({ modelFetch: 'fetch' }),
|
|
...trainPlan({ getTrainPlan: 'fetch' }),
|
|
...trainPlan({ getTrainPlan: 'fetch' }),
|
|
...school(['query']),
|
|
...school(['query']),
|
|
- ...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update' }),
|
|
|
|
|
|
+ ...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update', setSchPlan: 'schArrange' }),
|
|
//请求,处理学校列表
|
|
//请求,处理学校列表
|
|
async getSchool() {
|
|
async getSchool() {
|
|
const res = await this.query();
|
|
const res = await this.query();
|
|
if (this.$checkRes(res)) {
|
|
if (this.$checkRes(res)) {
|
|
- let school = res.data.map(i => {
|
|
|
|
- i = _.omit(i, ['meta', 'id', '_id', 'logourl']);
|
|
|
|
|
|
+ let nd = res.data.map(i => (i = _.omit(i, ['meta', 'id', '_id', 'logourl', 'number'])));
|
|
|
|
+ nd = this.setSchoolNumber(nd);
|
|
|
|
+ let school = nd.map(i => {
|
|
if (i.number) i.remaining = JSON.parse(JSON.stringify(i.number));
|
|
if (i.number) i.remaining = JSON.parse(JSON.stringify(i.number));
|
|
else i.remaining = 0;
|
|
else i.remaining = 0;
|
|
return i;
|
|
return i;
|
|
@@ -240,7 +241,7 @@ export default {
|
|
this.getCarTotal();
|
|
this.getCarTotal();
|
|
},
|
|
},
|
|
//保存整体计划
|
|
//保存整体计划
|
|
- toSave() {
|
|
|
|
|
|
+ async toSave() {
|
|
//修改学校上报计划,整理数据
|
|
//修改学校上报计划,整理数据
|
|
let schPlan = this.list.map(i => {
|
|
let schPlan = this.list.map(i => {
|
|
let plan = _.cloneDeep(i.plan);
|
|
let plan = _.cloneDeep(i.plan);
|
|
@@ -264,7 +265,8 @@ export default {
|
|
i.term = _.uniqBy(this.checkTerm(i.term), '_id');
|
|
i.term = _.uniqBy(this.checkTerm(i.term), '_id');
|
|
return i;
|
|
return i;
|
|
});
|
|
});
|
|
- this.$emit('toSave', schPlan);
|
|
|
|
|
|
+ const res = await this.setSchPlan(schPlan);
|
|
|
|
+ this.$checkRes(res, '保存成功', res.errmsg);
|
|
},
|
|
},
|
|
//手动更改
|
|
//手动更改
|
|
cellClick(row, column) {
|
|
cellClick(row, column) {
|
|
@@ -300,7 +302,6 @@ export default {
|
|
},
|
|
},
|
|
//将学校上报的月份数组[String]=>[{start,end}]方法
|
|
//将学校上报的月份数组[String]=>[{start,end}]方法
|
|
changeRange(data) {
|
|
changeRange(data) {
|
|
- //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 => {
|
|
@@ -315,29 +316,33 @@ export default {
|
|
return duplicate;
|
|
return duplicate;
|
|
},
|
|
},
|
|
groupTime(data) {
|
|
groupTime(data) {
|
|
|
|
+ let res;
|
|
let len = _.get(data, 'length');
|
|
let len = _.get(data, 'length');
|
|
if (len && len == 1) {
|
|
if (len && len == 1) {
|
|
let dr = data.map(mon => {
|
|
let dr = data.map(mon => {
|
|
let r = this.stringDateRange(mon, mon);
|
|
let r = this.stringDateRange(mon, mon);
|
|
return r;
|
|
return r;
|
|
});
|
|
});
|
|
- return dr;
|
|
|
|
|
|
+ res = dr;
|
|
} else if (len && len > 1) {
|
|
} else if (len && len > 1) {
|
|
//TODO 长度大于1也就是说明最少上报了2个月份
|
|
//TODO 长度大于1也就是说明最少上报了2个月份
|
|
//先排序,然后按照连续性分组
|
|
//先排序,然后按照连续性分组
|
|
let afterSort = data.sort((a, b) => a * 1 - b * 1);
|
|
let afterSort = data.sort((a, b) => a * 1 - b * 1);
|
|
let newRange = this.getConRange(afterSort);
|
|
let newRange = this.getConRange(afterSort);
|
|
- }
|
|
|
|
|
|
+ let r = newRange.map(arr => this.stringDateRange(_.head(arr), _.last(arr)));
|
|
|
|
+ res = r;
|
|
|
|
+ } else res = data;
|
|
|
|
+ return res;
|
|
},
|
|
},
|
|
stringDateRange(data, num) {
|
|
stringDateRange(data, num) {
|
|
if (_.isObject(data)) return data;
|
|
if (_.isObject(data)) return data;
|
|
let start = moment()
|
|
let start = moment()
|
|
- .year(this.year)
|
|
|
|
|
|
+ .year(this.plan.year)
|
|
.month(data * 1 - 1)
|
|
.month(data * 1 - 1)
|
|
.date('1')
|
|
.date('1')
|
|
.format('YYYY-MM-DD');
|
|
.format('YYYY-MM-DD');
|
|
let end = moment()
|
|
let end = moment()
|
|
- .year(this.year)
|
|
|
|
|
|
+ .year(this.plan.year)
|
|
.month(num * 1)
|
|
.month(num * 1)
|
|
.date('1')
|
|
.date('1')
|
|
.subtract(1, 'days')
|
|
.subtract(1, 'days')
|
|
@@ -345,9 +350,7 @@ export default {
|
|
return { start, end };
|
|
return { start, end };
|
|
},
|
|
},
|
|
getConRange(array) {
|
|
getConRange(array) {
|
|
- array = ['1', '2', '3', '5', '6', '10', '11'];
|
|
|
|
let res = [];
|
|
let res = [];
|
|
- console.log(array);
|
|
|
|
let limit = _.get(array, 'length') - 1;
|
|
let limit = _.get(array, 'length') - 1;
|
|
for (let i = 0; i <= limit; i++) {
|
|
for (let i = 0; i <= limit; i++) {
|
|
if (i == 0) res.push([array[i]]);
|
|
if (i == 0) res.push([array[i]]);
|
|
@@ -356,16 +359,14 @@ export default {
|
|
let l_num = _.last(_.last(res));
|
|
let l_num = _.last(_.last(res));
|
|
let r = _.subtract(t_num * 1, l_num * 1);
|
|
let r = _.subtract(t_num * 1, l_num * 1);
|
|
if (r == 1) {
|
|
if (r == 1) {
|
|
- //当前和下一期是连续的
|
|
|
|
|
|
+ //当前和上一期是连续的
|
|
let last = _.last(res);
|
|
let last = _.last(res);
|
|
last.push(t_num);
|
|
last.push(t_num);
|
|
res[res.length - 1] = last;
|
|
res[res.length - 1] = last;
|
|
- } else {
|
|
|
|
- res.push([array[i]]);
|
|
|
|
- }
|
|
|
|
|
|
+ } else res.push([array[i]]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- console.log(res);
|
|
|
|
|
|
+ return res;
|
|
},
|
|
},
|
|
//学校匹配学校计划
|
|
//学校匹配学校计划
|
|
async getSchoolPlan() {
|
|
async getSchoolPlan() {
|
|
@@ -465,6 +466,7 @@ export default {
|
|
sch.carTerm.push({ term, num });
|
|
sch.carTerm.push({ term, num });
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+ school = school.filter(f => _.get(f, 'carTerm.length', 0) > 0);
|
|
this.$set(this, `carList`, school);
|
|
this.$set(this, `carList`, school);
|
|
},
|
|
},
|
|
//计算车辆
|
|
//计算车辆
|
|
@@ -575,7 +577,6 @@ 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) {
|
|
if (!result) {
|
|
- console.log(term, row);
|
|
|
|
return disabled;
|
|
return disabled;
|
|
} else return '';
|
|
} else return '';
|
|
},
|
|
},
|
|
@@ -595,7 +596,6 @@ export default {
|
|
this.toSave();
|
|
this.toSave();
|
|
this.$emit(`toDirector`);
|
|
this.$emit(`toDirector`);
|
|
},
|
|
},
|
|
-
|
|
|
|
//获取计划
|
|
//获取计划
|
|
async toGetTrainPlan() {
|
|
async toGetTrainPlan() {
|
|
let planid = _.get(this.defaultOption, 'planid');
|
|
let planid = _.get(this.defaultOption, 'planid');
|
|
@@ -605,6 +605,34 @@ export default {
|
|
this.getTermList();
|
|
this.getTermList();
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
+ //获取计划模板
|
|
|
|
+ async toGetTrainTemplate() {
|
|
|
|
+ let planyearid = _.get(this.defaultOption, 'planyearid');
|
|
|
|
+ let planid = _.get(this.defaultOption, 'planid');
|
|
|
|
+ let res = await this.modelFetch({ model: 'trainmodel', planyearid, planid });
|
|
|
|
+ if (this.$checkRes(res)) {
|
|
|
|
+ this.$set(this, `template`, res.data ? res.data : {});
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ //本计划各个学校分配人数匹配
|
|
|
|
+ setSchoolNumber(data) {
|
|
|
|
+ let planSchool = _.get(this.plan, `school`, []);
|
|
|
|
+ if (planSchool.length <= 0) return data;
|
|
|
|
+ let nl = data.map(i => {
|
|
|
|
+ let r = planSchool.find(f => f.code == i.code);
|
|
|
|
+ if (r) i.number = r.num;
|
|
|
|
+ return i;
|
|
|
|
+ });
|
|
|
|
+ nl = nl.sort((a, b) => a.code * 1 - b.code * 1);
|
|
|
|
+ return nl;
|
|
|
|
+ },
|
|
|
|
+ //默认值改变查询
|
|
|
|
+ async reSearch() {
|
|
|
|
+ this.already = false;
|
|
|
|
+ await this.toGetTrainPlan();
|
|
|
|
+ await this.toGetTrainTemplate();
|
|
|
|
+ await this.getSchool();
|
|
|
|
+ },
|
|
},
|
|
},
|
|
filters: {
|
|
filters: {
|
|
getProp(data, prop) {
|
|
getProp(data, prop) {
|
|
@@ -620,7 +648,24 @@ export default {
|
|
return `${this.$route.meta.title}`;
|
|
return `${this.$route.meta.title}`;
|
|
},
|
|
},
|
|
},
|
|
},
|
|
- watch: {},
|
|
|
|
|
|
+ watch: {
|
|
|
|
+ defaultOption: {
|
|
|
|
+ immediate: true,
|
|
|
|
+ deep: true,
|
|
|
|
+ handler(val) {
|
|
|
|
+ if (!_.get(this, 'options')) {
|
|
|
|
+ this.$set(this, `options`, _.cloneDeep(val));
|
|
|
|
+ } else {
|
|
|
|
+ let nplanid = _.get(val, 'planid');
|
|
|
|
+ let oplanid = _.get(this.options, 'planid');
|
|
|
|
+ if (nplanid && !_.isEqual(nplanid, oplanid)) {
|
|
|
|
+ this.$set(this, `options`, _.cloneDeep(val));
|
|
|
|
+ this.reSearch();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
metaInfo() {
|
|
metaInfo() {
|
|
return { title: this.$route.meta.title };
|
|
return { title: this.$route.meta.title };
|
|
},
|
|
},
|