|
@@ -1,7 +1,7 @@
|
|
<template>
|
|
<template>
|
|
<div id="arrange">
|
|
<div id="arrange">
|
|
- <detail-frame :title="pageTitle" returns="./index">
|
|
|
|
- <el-row :gutter="10" type="flex">
|
|
|
|
|
|
+ <detail-frame :title="pageTitle" :returns="returns">
|
|
|
|
+ <el-row :gutter="10" type="flex" v-if="view == 'plan'">
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
<el-card header="全年计划信息">
|
|
<el-card header="全年计划信息">
|
|
<el-form :model="info" :rules="rules" :isNew="isNew" label-width="60px" size="small" @submit.native.prevent>
|
|
<el-form :model="info" :rules="rules" :isNew="isNew" label-width="60px" size="small" @submit.native.prevent>
|
|
@@ -33,14 +33,36 @@
|
|
</el-card>
|
|
</el-card>
|
|
</el-col>
|
|
</el-col>
|
|
</el-row>
|
|
</el-row>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <sch-arr :events="events" :year="info.year" :template="template"></sch-arr>
|
|
|
|
+ </template>
|
|
</detail-frame>
|
|
</detail-frame>
|
|
|
|
+ <el-drawer :visible.sync="drawer" direction="rtl" title="安排计划" @close="toClose">
|
|
|
|
+ <event
|
|
|
|
+ :data="form"
|
|
|
|
+ :year="info.year"
|
|
|
|
+ :vacation="vacation"
|
|
|
|
+ :isNew="formIsNew"
|
|
|
|
+ :predefineColors="template.color"
|
|
|
|
+ @save="setEvent"
|
|
|
|
+ @delete="toDelete"
|
|
|
|
+ ></event>
|
|
|
|
+ </el-drawer>
|
|
<el-dialog :visible.sync="dialog" title="模板计划" width="30%" :close-on-click-modal="false">
|
|
<el-dialog :visible.sync="dialog" title="模板计划" width="30%" :close-on-click-modal="false">
|
|
<el-form>
|
|
<el-form>
|
|
<el-form-item label="请输入您要生成的期数">
|
|
<el-form-item label="请输入您要生成的期数">
|
|
<el-input v-model="input.term"></el-input>
|
|
<el-input v-model="input.term"></el-input>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="请选择开始日期">
|
|
<el-form-item label="请选择开始日期">
|
|
- <el-date-picker v-model="input.start" type="date" placeholder="请选择开始日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"> </el-date-picker>
|
|
|
|
|
|
+ <el-date-picker
|
|
|
|
+ :picker-options="pickerOptions"
|
|
|
|
+ v-model="input.start"
|
|
|
|
+ type="date"
|
|
|
|
+ placeholder="请选择开始日期"
|
|
|
|
+ format="yyyy-MM-dd"
|
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
|
+ >
|
|
|
|
+ </el-date-picker>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
<template #footer>
|
|
<template #footer>
|
|
@@ -63,18 +85,22 @@ var moment = require('moment');
|
|
import detailFrame from '@frame/layout/admin/detail-frame';
|
|
import detailFrame from '@frame/layout/admin/detail-frame';
|
|
import calendar from '@frame/components/calendar';
|
|
import calendar from '@frame/components/calendar';
|
|
import dataTable from '@frame/components/data-table';
|
|
import dataTable from '@frame/components/data-table';
|
|
|
|
+import event from './parts/event';
|
|
|
|
+import schArr from './parts/school-arrange';
|
|
import { mapState, createNamespacedHelpers } from 'vuex';
|
|
import { mapState, createNamespacedHelpers } from 'vuex';
|
|
const { mapActions } = createNamespacedHelpers('trainplan');
|
|
const { mapActions } = createNamespacedHelpers('trainplan');
|
|
const { mapActions: trainTemplate } = createNamespacedHelpers('trainTemplate');
|
|
const { mapActions: trainTemplate } = createNamespacedHelpers('trainTemplate');
|
|
export default {
|
|
export default {
|
|
name: 'arrange',
|
|
name: 'arrange',
|
|
props: {},
|
|
props: {},
|
|
- components: { detailFrame, calendar, dataTable },
|
|
|
|
|
|
+ components: { detailFrame, calendar, dataTable, event, schArr },
|
|
data: function() {
|
|
data: function() {
|
|
var that = this;
|
|
var that = this;
|
|
return {
|
|
return {
|
|
|
|
+ view: 'plan',
|
|
template: {},
|
|
template: {},
|
|
info: {},
|
|
info: {},
|
|
|
|
+ form: {},
|
|
selectList: [],
|
|
selectList: [],
|
|
events: [],
|
|
events: [],
|
|
vacation: [],
|
|
vacation: [],
|
|
@@ -111,17 +137,26 @@ export default {
|
|
selfBtn: {
|
|
selfBtn: {
|
|
term: {
|
|
term: {
|
|
text: '生成模板计划',
|
|
text: '生成模板计划',
|
|
- //设置假期
|
|
|
|
click: () => (that.dialog = true),
|
|
click: () => (that.dialog = true),
|
|
position: 'left',
|
|
position: 'left',
|
|
},
|
|
},
|
|
|
|
+ school: {
|
|
|
|
+ text: '学校安排',
|
|
|
|
+ click: () => (that.view = 'school'),
|
|
|
|
+ position: 'left',
|
|
|
|
+ },
|
|
},
|
|
},
|
|
input: {
|
|
input: {
|
|
- term: 50,
|
|
|
|
- start: '2020-01-01',
|
|
|
|
|
|
+ term: 55,
|
|
|
|
+ start: '2020-03-01',
|
|
|
|
+ },
|
|
|
|
+ pickerOptions: {
|
|
|
|
+ disabledDate: time => that.checkDate(time),
|
|
},
|
|
},
|
|
heights: 250,
|
|
heights: 250,
|
|
collapse: '',
|
|
collapse: '',
|
|
|
|
+ drawer: false,
|
|
|
|
+ formIsNew: true,
|
|
};
|
|
};
|
|
},
|
|
},
|
|
created() {
|
|
created() {
|
|
@@ -150,70 +185,144 @@ export default {
|
|
this.$set(this, `info`, res.data);
|
|
this.$set(this, `info`, res.data);
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
+ //模板事件开始
|
|
|
|
+ //生成默认模板
|
|
setDefaultPlan() {
|
|
setDefaultPlan() {
|
|
|
|
+ this.$set(this, `events`, []);
|
|
|
|
+ this.$set(this, `selectList`, []);
|
|
this.dialog = false;
|
|
this.dialog = false;
|
|
let { term, start } = this.input;
|
|
let { term, start } = this.input;
|
|
let { day, batchnum, classnum } = this.template;
|
|
let { day, batchnum, classnum } = this.template;
|
|
let event = []; //处理成功事件的存储
|
|
let event = []; //处理成功事件的存储
|
|
- let qb = 0; //剩余没有满足之前的批数
|
|
|
|
- let qt = 0; //剩余没有满足之前的期数
|
|
|
|
//第一次正常安排
|
|
//第一次正常安排
|
|
- let arrange = (t, v) => {
|
|
|
|
- let arr = [];
|
|
|
|
- for (let it = 1; it <= t; it++) {
|
|
|
|
- for (let ib = 1; ib <= v; ib++) {
|
|
|
|
- let end = this.$plusDay(start, day - 1);
|
|
|
|
- let object = { startStr: start, endStr: end, vacation: this.vacation };
|
|
|
|
- let res = this.$checkDate(object);
|
|
|
|
- if (res == true) {
|
|
|
|
- let batch = {
|
|
|
|
- term: it - qt,
|
|
|
|
- batch: ib,
|
|
|
|
- class: classnum,
|
|
|
|
- start,
|
|
|
|
- end,
|
|
|
|
- type: '0',
|
|
|
|
- title: `第${it - qt}期第${ib}批次`,
|
|
|
|
- color: this.getColor(it, ib),
|
|
|
|
- };
|
|
|
|
- start = this.$plusDay(start);
|
|
|
|
- arr.push(batch);
|
|
|
|
- } else {
|
|
|
|
- if (ib == 1) qt += 1;
|
|
|
|
- else qb += batchnum - ib + 1;
|
|
|
|
- start = this.$plusDay(res.end);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return arr;
|
|
|
|
- };
|
|
|
|
- event = arrange(term, batchnum);
|
|
|
|
- while (qb > 0) {
|
|
|
|
- qt = qt + Math.ceil(qb / batchnum);
|
|
|
|
- let sb = qb % batchnum;
|
|
|
|
- let lessArr = arrange(qt, batchnum);
|
|
|
|
- let last = _.last(event);
|
|
|
|
- let lessNArr = _.chunk(lessArr, 3).map((i, index) => {
|
|
|
|
- i.map(ii => {
|
|
|
|
- ii.term = last.term + index + 1;
|
|
|
|
- ii.title = `第${ii.term}期第${ii.batch}批次`;
|
|
|
|
- return ii;
|
|
|
|
- });
|
|
|
|
- return i;
|
|
|
|
- });
|
|
|
|
- lessArr = _.flatten(lessNArr);
|
|
|
|
- //TODO需要判断是否还有剩余的批次,有的话还需要处理
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ //qb:剩余没有满足之前的批数 qt:剩余没有满足之前的期数
|
|
|
|
+ let { list, qb, start: rstart } = this.arrange(term, start);
|
|
|
|
+ event = list;
|
|
|
|
+ start = rstart;
|
|
|
|
+ event = this.otherArrange(qb, start, event);
|
|
//最后赋值回去
|
|
//最后赋值回去
|
|
|
|
+ event.map((i, index) => {
|
|
|
|
+ i.index = index;
|
|
|
|
+ return i;
|
|
|
|
+ });
|
|
this.$set(this, `events`, event);
|
|
this.$set(this, `events`, event);
|
|
this.$set(this, `selectList`, event);
|
|
this.$set(this, `selectList`, event);
|
|
},
|
|
},
|
|
- setHeight() {
|
|
|
|
- let heights = this.$refs.card.$el.clientHeight * 0.63;
|
|
|
|
- this.$set(this, `heights`, heights);
|
|
|
|
|
|
+ //默认安排事件
|
|
|
|
+ arrange(t, start, part) {
|
|
|
|
+ let qt = 0;
|
|
|
|
+ let qb = 0;
|
|
|
|
+ let { day, batchnum, classnum } = this.template;
|
|
|
|
+ if (!part) part = batchnum;
|
|
|
|
+ let list = [];
|
|
|
|
+ for (let it = 1; it <= t; it++) {
|
|
|
|
+ for (let ib = 1; ib <= part; ib++) {
|
|
|
|
+ let end = this.$plusDay(start, day - 1);
|
|
|
|
+ let res = this.$checkDate(start, end, this.vacation);
|
|
|
|
+ if (res == true) {
|
|
|
|
+ let batch = {
|
|
|
|
+ term: it - qt,
|
|
|
|
+ batch: ib,
|
|
|
|
+ class: classnum,
|
|
|
|
+ start,
|
|
|
|
+ end,
|
|
|
|
+ type: '0',
|
|
|
|
+ title: `第${it - qt}期第${ib}批次`,
|
|
|
|
+ color: this.getColor(it, ib),
|
|
|
|
+ };
|
|
|
|
+ start = this.$plusDay(start);
|
|
|
|
+ list.push(batch);
|
|
|
|
+ } else {
|
|
|
|
+ if (ib == 1) qt += 1;
|
|
|
|
+ qb += batchnum - ib + 1;
|
|
|
|
+ start = this.$plusDay(res.end);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return { list, qb, start };
|
|
|
|
+ },
|
|
|
|
+ //默认处理未安排的事件
|
|
|
|
+ otherArrange(qb, start, event) {
|
|
|
|
+ let { day, batchnum, classnum } = this.template;
|
|
|
|
+ //将剩余的批数转换成局部变量,然后赋0重置qb,为了在arrange中重新计算是否有接触假期
|
|
|
|
+ let tta = Math.ceil(qb / batchnum);
|
|
|
|
+ let part = qb % batchnum;
|
|
|
|
+ qb = 0;
|
|
|
|
+ let { list, qb: rqb, start: rstart } = this.arrange(tta, start, part);
|
|
|
|
+ start = rstart;
|
|
|
|
+ let last = _.last(event);
|
|
|
|
+ let arr = [];
|
|
|
|
+ if (last) arr = this.sortOtherData(last, list);
|
|
|
|
+ else arr = list;
|
|
|
|
+ event = event.concat(arr);
|
|
|
|
+ //判断是否还有剩余的批次,期;有的话还需要处理
|
|
|
|
+ if (rqb > 0) {
|
|
|
|
+ return this.otherArrange(rqb, start, event);
|
|
|
|
+ } else {
|
|
|
|
+ return event;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ //默认事件排序
|
|
|
|
+ sortOtherData(last, data) {
|
|
|
|
+ let arr = _.chunk(data, 3).map((i, index) => {
|
|
|
|
+ i.map(ii => {
|
|
|
|
+ ii.term = last.term + index + 1;
|
|
|
|
+ ii.title = `第${ii.term}期第${ii.batch}批次`;
|
|
|
|
+ return ii;
|
|
|
|
+ });
|
|
|
|
+ return i;
|
|
|
|
+ });
|
|
|
|
+ return _.flatten(arr);
|
|
},
|
|
},
|
|
|
|
+ //模板事件结束
|
|
|
|
+
|
|
|
|
+ //手动操作事件开始
|
|
|
|
+ setEvent({ data, isNew }) {
|
|
|
|
+ console.log(data);
|
|
|
|
+ data = JSON.parse(JSON.stringify(data));
|
|
|
|
+ if (data.type == 0) {
|
|
|
|
+ data.title = `第${data.term}期第${data.batch}批次`;
|
|
|
|
+ } else {
|
|
|
|
+ let { name } = data;
|
|
|
|
+ data = { ...data, title: name };
|
|
|
|
+ }
|
|
|
|
+ this.$set(this.events, data.index, data);
|
|
|
|
+ this.$set(this.selectList, data.index, data);
|
|
|
|
+ // 需要根据班级类型把数据分开
|
|
|
|
+ // let { start, end, term, type, number, color, id } = data;
|
|
|
|
+ // let object = {};
|
|
|
|
+ // if (data.type === '0') {
|
|
|
|
+ // // 正常班级
|
|
|
|
+ // let { batch, class: classes } = data;
|
|
|
|
+ // object = { start, end, term, type, number, color, batch, class: classes };
|
|
|
|
+ // object.title = `第${JSON.parse(JSON.stringify(term))}期第${JSON.parse(JSON.stringify(batch))}批次`;
|
|
|
|
+ // object.name = JSON.parse(JSON.stringify(object.title));
|
|
|
|
+ // } else {
|
|
|
|
+ // let { name } = data;
|
|
|
|
+ // object = { ...data, title: name };
|
|
|
|
+ // }
|
|
|
|
+ // if (isNew) {
|
|
|
|
+ // object.id = `eve${new Date().getTime()}`;
|
|
|
|
+ // this.events.push(object);
|
|
|
|
+ // this.selectList.push(object);
|
|
|
|
+ // } else {
|
|
|
|
+ // object.id = id;
|
|
|
|
+ // this.$set(
|
|
|
|
+ // this.events,
|
|
|
|
+ // _.findIndex(this.events, item => item.id == object.id),
|
|
|
|
+ // object
|
|
|
|
+ // );
|
|
|
|
+ // this.$set(
|
|
|
|
+ // this.selectList,
|
|
|
|
+ // _.findIndex(this.selectList, item => item.id == object.id),
|
|
|
|
+ // object
|
|
|
|
+ // );
|
|
|
|
+ // }
|
|
|
|
+ // if (_.findIndex(this.predefineColors, item => item == data.color) < 0) this.predefineColors.push(data.color);
|
|
|
|
+ this.toClose();
|
|
|
|
+ },
|
|
|
|
+
|
|
//列表编辑事件
|
|
//列表编辑事件
|
|
toEdit({ data, index }) {
|
|
toEdit({ data, index }) {
|
|
this.$set(this, `form`, JSON.parse(JSON.stringify(data)));
|
|
this.$set(this, `form`, JSON.parse(JSON.stringify(data)));
|
|
@@ -225,17 +334,35 @@ export default {
|
|
this.$set(
|
|
this.$set(
|
|
this,
|
|
this,
|
|
`events`,
|
|
`events`,
|
|
- this.events.filter(f => f.id !== data.id)
|
|
|
|
|
|
+ this.events.filter(f => f.index !== data.index)
|
|
);
|
|
);
|
|
- // this.events.splice(index, 1);
|
|
|
|
this.selectList.splice(index, 1);
|
|
this.selectList.splice(index, 1);
|
|
|
|
+ this.toClose();
|
|
},
|
|
},
|
|
//计划保存
|
|
//计划保存
|
|
savePlan() {},
|
|
savePlan() {},
|
|
|
|
+ //选择时间的事件
|
|
|
|
+ selectDate(object) {
|
|
|
|
+ let start = JSON.parse(JSON.stringify(object.startStr));
|
|
|
|
+ let end = JSON.parse(JSON.stringify(object.endStr));
|
|
|
|
+ this.$set(this.form, `start`, start);
|
|
|
|
+ this.$set(this.form, `end`, end);
|
|
|
|
+ this.$set(this.form, `index`, this.events.length);
|
|
|
|
+ this.drawer = true;
|
|
|
|
+ this.formIsNew = true;
|
|
|
|
+ },
|
|
//
|
|
//
|
|
- selectDate() {},
|
|
|
|
- //
|
|
|
|
- eventClick() {},
|
|
|
|
|
|
+ eventClick({ event }) {
|
|
|
|
+ let obj = _.get(event, `extendedProps`);
|
|
|
|
+ if (!obj) {
|
|
|
|
+ console.warn(`无对应事件`);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ let e = this.events.find(f => f.index == obj.index);
|
|
|
|
+ if (e) this.$set(this, `form`, e);
|
|
|
|
+ this.drawer = true;
|
|
|
|
+ this.formIsNew = false;
|
|
|
|
+ },
|
|
//
|
|
//
|
|
async searchTemplate() {
|
|
async searchTemplate() {
|
|
let res = await this.trainTemplate();
|
|
let res = await this.trainTemplate();
|
|
@@ -245,13 +372,36 @@ export default {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
+ //其他事件(无关紧要)
|
|
|
|
+ //关闭抽屉函数
|
|
|
|
+ toClose() {
|
|
|
|
+ this.drawer = false;
|
|
|
|
+ this.formIsNew = true;
|
|
|
|
+ this.setHeight();
|
|
|
|
+ },
|
|
|
|
+ setHeight() {
|
|
|
|
+ let heights = this.$refs.card.$el.clientHeight * 0.63;
|
|
|
|
+ this.$set(this, `heights`, heights);
|
|
|
|
+ },
|
|
|
|
+ //设置事件颜色
|
|
getColor(it, ib) {
|
|
getColor(it, ib) {
|
|
let { color, batchnum } = this.template;
|
|
let { color, batchnum } = this.template;
|
|
if (color.length > 0) {
|
|
if (color.length > 0) {
|
|
- let num = ((it - 1) * batchnum + ib) % color.length;
|
|
|
|
|
|
+ // let num = ((it - 1) * batchnum + ib) % color.length;
|
|
|
|
+ let num = (it - 1) % color.length;
|
|
return color[num];
|
|
return color[num];
|
|
} else return '#004499';
|
|
} else return '#004499';
|
|
},
|
|
},
|
|
|
|
+
|
|
|
|
+ checkDate(date) {
|
|
|
|
+ let year = JSON.parse(JSON.stringify(this.info.year));
|
|
|
|
+ let res = moment(date).isBetween(`${year}-01-01`, `${year}-12-31`, null, '[]');
|
|
|
|
+ return !res;
|
|
|
|
+ },
|
|
|
|
+ returns() {
|
|
|
|
+ if (this.view == 'plan') this.$router.push({ path: './index' });
|
|
|
|
+ else this.view = 'plan';
|
|
|
|
+ },
|
|
},
|
|
},
|
|
computed: {
|
|
computed: {
|
|
...mapState(['user']),
|
|
...mapState(['user']),
|