|
@@ -10,9 +10,6 @@
|
|
|
<el-col :span="2">
|
|
|
<el-button type="primary" size="mini" @click="toConfirm">一键分配</el-button>
|
|
|
</el-col>
|
|
|
- <!-- <el-col :span="2">
|
|
|
- <el-button type="primary" size="mini" plain @click="dialog = true">查看汇总</el-button>
|
|
|
- </el-col> -->
|
|
|
</el-row>
|
|
|
<a-table
|
|
|
ref="planTabel"
|
|
@@ -22,6 +19,7 @@
|
|
|
:getDesignate="getDesignate"
|
|
|
:changeRange="changeRange"
|
|
|
:proAffix="proAffix"
|
|
|
+ :classTypeList="classTypeList"
|
|
|
></a-table>
|
|
|
</el-card>
|
|
|
</detail-frame>
|
|
@@ -31,23 +29,24 @@
|
|
|
<el-col :span="12">
|
|
|
<el-card>
|
|
|
<el-form size="mini">
|
|
|
- <el-form-item label="学校">{{ form | getProp('sch.name') }}</el-form-item>
|
|
|
- <el-form-item label="学校层次">{{ form | getProp('sch.level') }}</el-form-item>
|
|
|
- <el-form-item label="需要派车">{{ form | getProp('sch.hascar') }}</el-form-item>
|
|
|
- <el-form-item label="总名额">{{ form | getProp('sch.number') }}</el-form-item>
|
|
|
- <el-form-item label="剩余名额">{{ form | getProp('sch.remaining') }}</el-form-item>
|
|
|
+ <el-form-item label="学校">{{ getProp(form, 'sch.name') }}</el-form-item>
|
|
|
+ <el-form-item label="学校层次">{{ getProp(form, 'sch.level') }}</el-form-item>
|
|
|
+ <el-form-item label="需要派车">{{ getProp(form, 'sch.hascar') }}</el-form-item>
|
|
|
+ <el-form-item label="总名额">{{ getProp(form, 'sch.number') }}</el-form-item>
|
|
|
+ <el-form-item label="剩余名额">{{ getProp(form, 'sch.remaining') }}</el-form-item>
|
|
|
</el-form>
|
|
|
</el-card>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-card>
|
|
|
<el-form size="mini">
|
|
|
- <el-form-item label="期数">{{ form | getProp('info.term') }}</el-form-item>
|
|
|
- <el-form-item label="批次">{{ form | getProp('info.batch') }}</el-form-item>
|
|
|
- <el-form-item label="开始时间">{{ form | getProp('info.start') }}</el-form-item>
|
|
|
- <el-form-item label="结束时间">{{ form | getProp('info.end') }}</el-form-item>
|
|
|
- <el-form-item label="总名额">{{ form | getProp('info.bpt') }}</el-form-item>
|
|
|
- <el-form-item label="剩余名额">{{ form | getProp('info.remaining') }}</el-form-item>
|
|
|
+ <el-form-item label="期数">{{ getProp(form, 'info.term') }}</el-form-item>
|
|
|
+ <el-form-item label="批次">{{ getProp(form, 'info.batch') }}</el-form-item>
|
|
|
+ <el-form-item label="班级类型">{{ getProp(form, 'info.classtype') }}</el-form-item>
|
|
|
+ <el-form-item label="开始时间">{{ getProp(form, 'info.start') }}</el-form-item>
|
|
|
+ <el-form-item label="结束时间">{{ getProp(form, 'info.end') }}</el-form-item>
|
|
|
+ <el-form-item label="总名额">{{ getProp(form, 'info.bpt') }}</el-form-item>
|
|
|
+ <el-form-item label="剩余名额">{{ getProp(form, 'info.remaining') }}</el-form-item>
|
|
|
</el-form>
|
|
|
</el-card>
|
|
|
</el-col>
|
|
@@ -82,37 +81,6 @@
|
|
|
</el-row>
|
|
|
</el-card>
|
|
|
</el-drawer>
|
|
|
-
|
|
|
- <!-- 数据汇总 -->
|
|
|
- <!-- <el-dialog :visible.sync="dialog" title="数据汇总">
|
|
|
- <el-collapse v-model="activeName" accordion>
|
|
|
- <el-collapse-item :title="`各期情况 (${isOk() ? '已完成' : '未完成'})`" name="1">
|
|
|
- <el-table :data="totalList" border stripe size="mini">
|
|
|
- <el-table-column prop="type"></el-table-column>
|
|
|
- <el-table-column v-for="(i, index) in termList" align="center" :key="index" :label="`第${i.term}期`" :prop="`term${i.term}`"> </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-collapse-item>
|
|
|
- <el-collapse-item :title="`车辆统计 共计(${getAllCarTotal()})`" name="2">
|
|
|
- <el-table :data="carList" border stripe size="mini" height="500px">
|
|
|
- <el-table-column type="expand">
|
|
|
- <template v-slot="{ row }">
|
|
|
- <el-row>
|
|
|
- <el-col :span="24" v-for="(i, index) in row.carTerm" :key="index">
|
|
|
- <span v-if="i.num > 0">第 {{ i.term }} 期需要 {{ i.num }} 辆车</span>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="学校" align="center" prop="name" width="180"></el-table-column>
|
|
|
- <el-table-column label="车辆需求总数" align="center">
|
|
|
- <template v-slot="{ row }">
|
|
|
- {{ getTableCarTotal(row.carTerm) }}
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-collapse-item>
|
|
|
- </el-collapse>
|
|
|
- </el-dialog> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -126,8 +94,10 @@ const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
|
|
|
const { mapActions: util } = createNamespacedHelpers('util');
|
|
|
const { mapActions: school } = createNamespacedHelpers('school');
|
|
|
const { mapActions: schPlan } = createNamespacedHelpers('schPlan');
|
|
|
+const { mapActions: classtype } = createNamespacedHelpers('classtype');
|
|
|
// 表中变量:
|
|
|
// batch-${batchid}:${batch}
|
|
|
+// batch_type-${batchid}:${type} 这期是什么类型的班级
|
|
|
// batch_total-${batchid}:${number}
|
|
|
// car_total-${batchid}: ${carnum}
|
|
|
// term-${termid}:${term}
|
|
@@ -152,9 +122,11 @@ export default {
|
|
|
activeName: '1',
|
|
|
already: false,
|
|
|
options: undefined,
|
|
|
+ classTypeList: [],
|
|
|
};
|
|
|
},
|
|
|
async created() {
|
|
|
+ await this.getOtherList();
|
|
|
await this.toGetTrainPlan();
|
|
|
await this.toGetTrainTemplate();
|
|
|
await this.getSchool();
|
|
@@ -165,6 +137,7 @@ export default {
|
|
|
...trainPlan({ getTrainPlan: 'fetch' }),
|
|
|
...school(['query']),
|
|
|
...schPlan({ schPlanQuery: 'query', createSchPlan: 'create', updateSchPlan: 'update', setSchPlan: 'schArrange' }),
|
|
|
+ ...classtype({ getClassType: 'query' }),
|
|
|
//请求,处理学校列表
|
|
|
async getSchool() {
|
|
|
const res = await this.query();
|
|
@@ -194,7 +167,6 @@ export default {
|
|
|
},
|
|
|
//自动安排
|
|
|
async toArrange() {
|
|
|
- let msg = this.$message({ message: '正在分配中,请稍后', duration: 0 });
|
|
|
this.toReset();
|
|
|
let school = this.list.filter(f => f.daterange);
|
|
|
//整理之后的学校列表
|
|
@@ -203,28 +175,43 @@ export default {
|
|
|
school = this.changeRange(school);
|
|
|
let termList = JSON.parse(JSON.stringify(this.termList));
|
|
|
//批次分配的人数 batch_total-${batchid} = 人数
|
|
|
- for (const sch of school) {
|
|
|
- for (const t of termList) {
|
|
|
- for (const b of t.batchnum) {
|
|
|
+ for (let sch of school) {
|
|
|
+ for (let t of termList) {
|
|
|
+ for (let b of t.batchnum) {
|
|
|
+ // 用对应的 b 的 remaining 去判断 这期是否还有剩余
|
|
|
if (b.remaining && b.remaining <= 0) continue;
|
|
|
+ // break;
|
|
|
+ // 根据 b 中的classtype 取出对应的 remaining
|
|
|
+ // 用对应的 remaining 去分配,处理完后把结果赋回对应的 remaining
|
|
|
+
|
|
|
+ // 判断时间是否在 学校范围内
|
|
|
let { result } = this.$tqInRange(b.start, b.end, sch.daterange);
|
|
|
if (result) {
|
|
|
- //学校名额>本批次剩余名额:
|
|
|
- if (sch.remaining > b.remaining) {
|
|
|
- sch.remaining = sch.remaining - b.remaining; //学校剩余名额 = 学校剩余名额(原) - 本批次剩余名额
|
|
|
+ let { classtype } = b;
|
|
|
+ // 获取对应班级类型的 剩余人数
|
|
|
+ let schremaining = _.get(sch, this.proAffix(classtype, 'remaining'));
|
|
|
+ // 学校名额>本批次剩余名额:
|
|
|
+ if (schremaining > b.remaining) {
|
|
|
+ schremaining = schremaining - b.remaining; //学校剩余名额 = 学校剩余名额(原) - 本批次剩余名额
|
|
|
if (b.remaining > 0) {
|
|
|
this.setNumOthers(sch, b, b.remaining);
|
|
|
}
|
|
|
b.remaining = 0; //本批次剩余名额=0;
|
|
|
+ sch[this.proAffix(classtype, 'remaining')] = schremaining;
|
|
|
+ sch = this.computedSchRemaining(sch);
|
|
|
continue;
|
|
|
} else {
|
|
|
//学校名额<=本批次剩余名额
|
|
|
- b.remaining = b.remaining - sch.remaining; //本批次剩余名额 = 本批次剩余名额(原) - 学校剩余名额;
|
|
|
- if (sch.remaining > 0) {
|
|
|
+ b.remaining = b.remaining - schremaining; //本批次剩余名额 = 本批次剩余名额(原) - 学校剩余名额;
|
|
|
+ if (schremaining > 0) {
|
|
|
this.setNumOthers(sch, b, sch.remaining);
|
|
|
}
|
|
|
- sch.remaining = 0; //学校剩余名额 = 0
|
|
|
- break;
|
|
|
+ schremaining = 0; //学校剩余名额 = 0
|
|
|
+ sch[this.proAffix(classtype, 'remaining')] = schremaining;
|
|
|
+ sch = this.computedSchRemaining(sch);
|
|
|
+ //这个地方需要检查下所有 类型的 remaining
|
|
|
+ console.log(sch, b);
|
|
|
+ continue;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -234,7 +221,6 @@ export default {
|
|
|
}
|
|
|
this.$set(this, `termList`, termList);
|
|
|
this.getCarTotal();
|
|
|
- msg.close();
|
|
|
this.$message.success('分配完成');
|
|
|
},
|
|
|
//保存整体计划
|
|
@@ -274,13 +260,30 @@ export default {
|
|
|
},
|
|
|
cellClick(data) {
|
|
|
this.drawer = true;
|
|
|
+ let { sch, info } = data;
|
|
|
+ let { classtype } = info;
|
|
|
+ // TODO车辆没改
|
|
|
+ let keys = Object.keys(sch).filter(f => !f.includes('number') || !f.includes('remaining'));
|
|
|
+ let nsch = _.pick(sch, keys);
|
|
|
+ nsch[`remaining`] = sch[this.proAffix(classtype, 'remaining')];
|
|
|
+ nsch[`number`] = sch[this.proAffix(classtype, 'number')];
|
|
|
+ data.sch = nsch;
|
|
|
+ data.osch = sch;
|
|
|
this.$set(this, `form`, data);
|
|
|
},
|
|
|
toSend() {
|
|
|
let num = _.get(this.form, 'num');
|
|
|
- let sch = _.get(this.form, 'sch');
|
|
|
+ let sch = _.get(this.form, 'sch'); //修改部分
|
|
|
+ let osch = _.get(this.form, 'osch'); //原来所有的学校内容
|
|
|
let info = _.get(this.form, 'info');
|
|
|
+ let { classtype } = info; //获取班级类型,用来减去对应的人数
|
|
|
sch = this.setNumOthers(sch, info, num);
|
|
|
+ let { remaining } = sch;
|
|
|
+ sch.number = osch.number;
|
|
|
+ sch[this.proAffix(classtype, 'remaining')] = remaining;
|
|
|
+ let keys = Object.keys(sch).filter(f => f.includes('remaining-'));
|
|
|
+ let re = keys.reduce((p, n) => p + sch[n] * 1, 0);
|
|
|
+ sch.remaining = re;
|
|
|
let si = _.findIndex(this.list, f => f.code == sch.code);
|
|
|
let termIndex = this.termList.findIndex(f => f._id == info.termid);
|
|
|
let batchIndex = this.termList.find(f => f._id == info.termid).batchnum.findIndex(f => f._id == info._id);
|
|
@@ -428,8 +431,10 @@ export default {
|
|
|
//计算每批次人数上限
|
|
|
let res = events.map(i => {
|
|
|
i.batchnum = i.batchnum.map(b => {
|
|
|
- b.bpt = b.number * 1 * (b.class * 1);
|
|
|
- b.remaining = b.number * 1 * (b.class * 1);
|
|
|
+ //因为要分类型去分配,所以remaining要有多种类型,都带着自己的编号在后面
|
|
|
+ b.remaining = b.class.reduce((p, n) => p + (n.number || 0) * 1, 0);
|
|
|
+ b.bpt = _.clone(b.remaining);
|
|
|
+ b.classtype = _.get(_.head(b.class), 'type');
|
|
|
return b;
|
|
|
});
|
|
|
return i; //bpt:该批次总人数 ,remaining:剩余人数
|
|
@@ -467,13 +472,6 @@ export default {
|
|
|
//分配重置
|
|
|
async toReset() {
|
|
|
this.getBatchList();
|
|
|
- let list = this.list.map(i => {
|
|
|
- let arr = ['address', 'code', 'daterange', 'hascar', 'level', 'name', 'shortname', 'number', 'plan', 'cynum', 'jynum', 'mznum'];
|
|
|
- let object = _.pick(i, arr);
|
|
|
- object.remaining = object.number * 1;
|
|
|
- return object;
|
|
|
- });
|
|
|
- this.$set(this, `list`, list);
|
|
|
},
|
|
|
//抽屉名额响应式计算
|
|
|
dComputed(cv = 0, ov = 0) {
|
|
@@ -553,8 +551,13 @@ export default {
|
|
|
let nl = data.map(i => {
|
|
|
let r = planSchool.find(f => f.code == i.code);
|
|
|
if (r) {
|
|
|
- let { cynum = 0, jynum = 0, mznum = 0, num: number = 0 } = r;
|
|
|
- i = { ...i, cynum: cynum * 1, jynum: jynum * 1, mznum: mznum * 1, number: number * 1 };
|
|
|
+ let obj = {};
|
|
|
+ r.classnum.map(i => {
|
|
|
+ obj[this.proAffix(i.code, 'number')] = i.number * 1;
|
|
|
+ obj[this.proAffix(i.code, 'remaining')] = i.number * 1;
|
|
|
+ });
|
|
|
+ obj.number = r.classnum.reduce((p, n) => p + (n.number || 0) * 1, 0);
|
|
|
+ i = { ...i, ...obj };
|
|
|
}
|
|
|
return i;
|
|
|
});
|
|
@@ -621,15 +624,27 @@ export default {
|
|
|
i.remaining = remaining - n;
|
|
|
return i;
|
|
|
});
|
|
|
- console.log(dl);
|
|
|
this.$set(this, `list`, dl);
|
|
|
},
|
|
|
- },
|
|
|
- filters: {
|
|
|
+ //计算学校的剩余人数
|
|
|
+ computedSchRemaining(sch) {
|
|
|
+ let keys = Object.keys(sch).filter(f => f.includes(`remaining-`));
|
|
|
+ let num = keys.reduce((p, n) => p + sch[n] * 1, 0);
|
|
|
+ sch.remaining = num;
|
|
|
+ return sch;
|
|
|
+ },
|
|
|
+ async getOtherList() {
|
|
|
+ const res = await this.getClassType();
|
|
|
+ if (this.$checkRes(res)) this.$set(this, `classTypeList`, res.data);
|
|
|
+ },
|
|
|
getProp(data, prop) {
|
|
|
if (prop.includes('hascar')) {
|
|
|
let res = _.get(data, prop);
|
|
|
return res == '1' ? '需要' : '不需要';
|
|
|
+ } else if (prop.includes('classtype')) {
|
|
|
+ let value = _.get(data, prop);
|
|
|
+ let res = this.classTypeList.find(f => f.code == value);
|
|
|
+ if (res) return res.name;
|
|
|
} else return _.get(data, prop);
|
|
|
},
|
|
|
},
|