Browse Source

学校全年计划:差组织数据,和回显数据

lrf402788946 5 years ago
parent
commit
18835bb457
2 changed files with 197 additions and 264 deletions
  1. 119 253
      src/views/new-plan/arrange/school-arrange.vue
  2. 78 11
      src/views/new-plan/arrange/table/table.vue

+ 119 - 253
src/views/new-plan/arrange/school-arrange.vue

@@ -10,33 +10,10 @@
           <el-col :span="2">
             <el-button type="primary" size="mini" @click="toConfirm">一键分配</el-button>
           </el-col>
-          <el-col :span="2">
+          <!-- <el-col :span="2">
             <el-button type="primary" size="mini" plain @click="dialog = true">查看汇总</el-button>
-          </el-col>
+          </el-col> -->
         </el-row>
-        <!-- <el-table :data="list" border stripe size="mini" max-height="650px" @cell-click="cellClick" :show-summary="true" 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.remaining }} </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${i.term}`">
-              <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> -->
         <a-table
           :termList="termList"
           :data="list"
@@ -49,7 +26,7 @@
     </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">
+      <el-row type="flex" align="top" justify="center" style="padding:20px" :gutter="20">
         <el-col :span="12">
           <el-card>
             <el-form size="mini">
@@ -64,11 +41,12 @@
         <el-col :span="12">
           <el-card>
             <el-form size="mini">
-              <el-form-item label="期数">{{ form | getProp('term.term') }}</el-form-item>
-              <el-form-item label="开始时间">{{ form | getProp('term.start') }}</el-form-item>
-              <el-form-item label="结束时间">{{ form | getProp('term.end') }}</el-form-item>
-              <el-form-item label="总名额">{{ form | getProp('term.tpt') }}</el-form-item>
-              <el-form-item label="剩余名额">{{ form | getProp('term.remaining') }}</el-form-item>
+              <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>
           </el-card>
         </el-col>
@@ -105,7 +83,7 @@
     </el-drawer>
 
     <!-- 数据汇总 -->
-    <el-dialog :visible.sync="dialog" title="数据汇总">
+    <!-- <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">
@@ -133,7 +111,7 @@
           </el-table>
         </el-collapse-item>
       </el-collapse>
-    </el-dialog>
+    </el-dialog> -->
   </div>
 </template>
 
@@ -153,76 +131,9 @@ export default {
   components: { detailFrame, aTable },
   data: () => {
     return {
-      list: [
-        {
-          code: '10183',
-          name: '吉林大学',
-          level: '本科',
-          address: '长春',
-          hascar: '1',
-          shortname: '吉大',
-          cynum: 100,
-          jynum: 200,
-          mznum: 0,
-          number: 300,
-          remaining: 300,
-          daterange: [{ start: '2020-06-01', end: '2020-10-31' }],
-          carTerm: [],
-          plan: {
-            meta: { state: 0, createdAt: '2020-06-22T01:30:46.633Z', updatedAt: '2020-06-22T06:34:32.640Z' },
-            daterange: ['6', '7', '8', '9', '10'],
-            _id: '5ef009c620af53716453aab1',
-            schid: '10183',
-            year: '2020',
-            planid: '5eec849a8b3bc60be869867e',
-            term: [{ _id: '5ef050f8a4cae173b00e8a4c', termnum: '336', number: '100', termid: '5eec89778b3bc60be8698703', carnum: '2' }],
-            __v: 10,
-            id: '5ef009c620af53716453aab1',
-          },
-        },
-      ],
+      list: [],
       plan: {},
-      termList: [
-        {
-          batchnum: [
-            {
-              _id: '5eec89778b3bc60be8698704',
-              batch: '1',
-              class: '2',
-              type: '0',
-              number: '56',
-              color: '#FF9D00',
-              name: '第336期第1批次',
-              term: '336',
-              termid: '5eec89778b3bc60be8698703',
-              start: '2020-06-28',
-              end: '2020-07-03',
-              bpt: 112,
-              remaining: 112,
-            },
-            {
-              _id: '5eec89778b3bc60be8698705',
-              batch: '2',
-              class: '2',
-              type: '0',
-              number: '56',
-              color: '#FF9D00',
-              name: '第336期第2批次',
-              term: '336',
-              termid: '5eec89778b3bc60be8698703',
-              start: '2020-06-29',
-              end: '2020-07-04',
-              bpt: 112,
-              remaining: 112,
-            },
-          ],
-          _id: '5eec89778b3bc60be8698703',
-          term: '336',
-          classnum: '4',
-          total: 0,
-          remaining: 0,
-        },
-      ],
+      termList: [],
       totalList: [],
       carList: [],
       template: {},
@@ -258,7 +169,7 @@ export default {
         });
         this.$set(this, `list`, school);
         await this.getSchoolPlan();
-        await this.getTotal();
+        // await this.getTotal();
       }
     },
     //自动安排提示确认
@@ -282,12 +193,7 @@ export default {
       //整理每个学校的daterange:[{start,end}]的形式
       school = this.changeRange(school);
       let termList = JSON.parse(JSON.stringify(this.termList));
-      let setInfo = (sch, b) => {
-        sch[this.proAffix(b._id, 'term_batch')] = b.termid; //记录这期和批次的对应关系 term_batch-${batchid} = termid
-        sch[this.proAffix(b.termid, 'term')] = b.term; //记录该期 term-${termid} = term
-        sch[this.proAffix(b._id, 'batch')] = b.batch; //记录该批次 batch-${batchid} = batch
-        //之前添加 批次分配的人数 batch_total-${batchid} = 人数
-      };
+      //批次分配的人数 batch_total-${batchid} = 人数
       for (const sch of school) {
         for (const t of termList) {
           for (const b of t.batchnum) {
@@ -298,8 +204,7 @@ export default {
               if (sch.remaining > b.remaining) {
                 sch.remaining = sch.remaining - b.remaining; //学校剩余名额 = 学校剩余名额(原) - 本批次剩余名额
                 if (b.remaining > 0) {
-                  sch[this.proAffix(b._id, 'batch_total')] = b.remaining; //学校哪一批次有多少人,表格上显示的
-                  setInfo(sch, b);
+                  this.setNumOthers(sch, b, b.remaining);
                 }
                 b.remaining = 0; //本批次剩余名额=0;
                 continue;
@@ -307,8 +212,7 @@ export default {
                 //学校名额<=本批次剩余名额
                 b.remaining = b.remaining - sch.remaining; //本批次剩余名额 = 本批次剩余名额(原) - 学校剩余名额;
                 if (sch.remaining > 0) {
-                  sch[this.proAffix(b._id, 'batch_total')] = sch.remaining; //学校哪一批次有多少人,表格上显示的
-                  setInfo(sch, b);
+                  this.setNumOthers(sch, b, sch.remaining);
                 }
                 sch.remaining = 0; //学校剩余名额 = 0
                 break;
@@ -320,57 +224,68 @@ export default {
         if (index >= 0) this.$set(this.list, index, sch);
       }
       this.$set(this, `termList`, termList);
-      // this.listClear();
-      // this.getTotal();
-      // this.getCarTotal();
+      this.getCarTotal();
     },
     //保存整体计划
     async toSave() {
       //修改学校上报计划,整理数据
-      let schPlan = this.list.map(i => {
+      let duplicate = _.cloneDeep(this.list);
+      duplicate = duplicate.filter(f => Object.keys(f).find(key => key.includes('batch_total')));
+      console.log(duplicate);
+      let schPlan = duplicate.map(i => {
         let plan = _.cloneDeep(i.plan);
-        let keys = Object.keys(i).filter(f => _.startsWith(f, 'term'));
-        if (keys.length > 0) {
-          let term = [];
-          for (const key of keys) {
-            let object = {};
-            object.termnum = key.match(/\d+(.\d+)?/g)[0];
-            object._id = i[`_id_term${object.termnum}`];
-            object.number = i[`term${object.termnum}`];
-            object.termid = i[`id_term${object.termnum}`];
-            if (i.carTerm) {
-              let car = i.carTerm.find(f => f.term == object.termnum);
-              if (car) object.carnum = car.num;
-            }
-            term.push(object);
-            plan.term.push(object);
-          }
-          plan.term = term;
-          return plan;
-        }
+        console.log(i);
+        // let keys = Object.keys(i).filter(f => _.startsWith(f, 'term'));
+        // if (keys.length > 0) {
+        //   let term = [];
+        //   for (const key of keys) {
+        //     let object = {};
+        //     object.termnum = key.match(/\d+(.\d+)?/g)[0];
+        //     object._id = i[`_id_term${object.termnum}`];
+        //     object.number = i[`term${object.termnum}`];
+        //     object.termid = i[`id_term${object.termnum}`];
+        //     if (i.carTerm) {
+        //       let car = i.carTerm.find(f => f.term == object.termnum);
+        //       if (car) object.carnum = car.num;
+        //     }
+        //     term.push(object);
+        //     plan.term.push(object);
+        //   }
+        //   plan.term = term;
+        return plan;
+        // }
       });
       schPlan = _.compact(schPlan);
-      const res = await this.setSchPlan(schPlan);
-      this.$checkRes(res, '保存成功', res.errmsg);
+      // const res = await this.setSchPlan(schPlan);
+      // this.$checkRes(res, '保存成功', res.errmsg);
+    },
+    cellClick(data) {
+      this.drawer = true;
+      this.$set(this, `form`, data);
     },
-    cellClick() {},
     toSend() {
       let num = _.get(this.form, 'num');
-      let term = _.get(this.form, 'term');
       let sch = _.get(this.form, 'sch');
-      let tn = term.term;
-      sch[`term${tn}`] = num;
-      sch[`id_term${tn}`] = term.termid;
-      // sch[`remaining`] = sch.remaining;
-      // term.remaining = term.remaining;
+      let info = _.get(this.form, 'info');
+      sch = this.setNumOthers(sch, info, num);
       let si = _.findIndex(this.list, f => f.code == sch.code);
-      let ti = _.findIndex(this.termList, f => f.term == term.term);
-      this.$set(this.list, si, sch);
-      this.$set(this.termList, ti, term);
+      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);
+      if (termIndex >= 0 && batchIndex >= 0 && si >= 0) {
+        this.$set(this.list, si, sch);
+        this.$set(this.termList[termIndex].batchnum, batchIndex, info);
+      } else this.$message.error('数据处理错误,请反馈该bug:未找到指定学校或指定期或指定批次');
       this.toClose();
-      this.getTotal();
       this.getCarTotal();
     },
+    //设置人数的配套信息
+    setNumOthers(sch, b, number) {
+      sch[this.proAffix(b._id, 'term_batch')] = b.termid; //记录这期和批次的对应关系 term_batch-${batchid} = termid
+      sch[this.proAffix(b.termid, 'term')] = b.term; //记录该期 term-${termid} = term
+      sch[this.proAffix(b._id, 'batch')] = b.batch; //记录该批次 batch-${batchid} = batch
+      sch[this.proAffix(b._id, 'batch_total')] = number; //学校哪一批次有多少人,表格上显示的
+      return sch;
+    },
     //将学校上报的月份数组[String]=>[{start,end}]方法
     changeRange(data) {
       let duplicate = JSON.parse(JSON.stringify(data));
@@ -420,6 +335,7 @@ export default {
         .format('YYYY-MM-DD');
       return { start, end };
     },
+    //处理不连续月份
     getConRange(array) {
       let res = [];
       let limit = _.get(array, 'length') - 1;
@@ -511,131 +427,77 @@ export default {
       });
       return events;
     },
-    //名额统计
-    getTotal() {
-      let res = this.termList.map((i, index) => {
-        i.total = this.list.reduce((prev, next) => prev + (next[`term${i.term}`] * 1 || 0), 0);
-        return i;
-      });
-      let aObject = { type: '已分配' };
-      let rObject = { type: '未分配' };
-      res.map(i => {
-        aObject[`term${i.term}`] = i.total || 0;
-        i.remaining = i.tpt - i.total || 0;
-        rObject[`term${i.term}`] = i.remaining || 0;
-      });
-      this.$set(this, `totalList`, [aObject, rObject]);
-    },
     //车辆统计
     getCarTotal() {
-      let school = this.list.filter(f => f.hascar == '1');
-      let carpnum = this.template.carpnum;
-      school.map(sch => {
-        let keys = Object.keys(sch).filter(f => _.startsWith(f, 'term'));
-        let pt = 0; //人数总数
-        sch.carTerm = [];
-        for (const key of keys) {
-          let term = key.match(/\d+(.\d+)?/g)[0];
-          let num = Math.ceil(sch[key] / carpnum);
-          sch.carTerm.push({ term, num });
-        }
+      let carpnum = this.template.carpnum * 1 || 53;
+      let list = this.list.map(i => {
+        let keys = Object.keys(i).filter(f => f.includes('batch_total'));
+        keys.map(key => {
+          let { value: batchid } = this.proAffix(key);
+          let carnum = Math.ceil(i[key] / carpnum);
+          i[this.proAffix(batchid, 'car_total')] = carnum;
+        });
+        return i;
       });
-      school = school.filter(f => _.get(f, 'carTerm.length', 0) > 0);
-      this.$set(this, `carList`, school);
-    },
-    //计算车辆
-    getTableCarTotal(data) {
-      return data.reduce((prev, next) => {
-        return prev + (next.num || 0);
-      }, 0);
-    },
-    //所有车辆和计算
-    getAllCarTotal() {
-      return this.carList.reduce((prev, next) => {
-        let num = next.carTerm.reduce((p, n) => p + (n.num || 0), 0);
-        return prev + num;
-      }, 0);
-    },
-    //是否分配完毕,按期来说
-    isOk() {
-      let res = true;
-      let obj = this.totalList[1];
-      if (obj) {
-        let keys = Object.keys(obj).filter(f => f != 'type');
-        for (const key of keys) {
-          if (obj[key] > 0) {
-            res = false;
-            break;
-          }
-        }
-      } else res = false;
-
-      return res;
+      this.$set(this, `list`, list);
     },
     //分配重置
     async toReset() {
       this.getBatchList();
       let list = this.list.map(i => {
-        let arr = ['address', 'code', 'daterange', 'hascar', 'level', 'name', 'shortname', 'number', 'plan'];
+        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);
     },
-    //将分配为0的数据清除
-    listClear() {
-      let list = this.list.map(i => {
-        let keys = Object.keys(i).filter(f => _.startsWith(f, 'term'));
-        for (const key of keys) {
-          if (i[key] == 0) {
-            delete i[key];
-            delete i[`id_${key}`];
-          }
-        }
-        return i;
-      });
-      this.$set(this, `list`, list);
-    },
     //抽屉名额响应式计算
-    dComputed(cv, ov) {
-      let sch = this.form.sch;
-      let term = this.form.term;
-      let keys = Object.keys(sch)
-        .filter(f => _.startsWith(f, 'term'))
-        .filter(f => f != `term${term.term}`);
-      let sr = keys.reduce((prev, next) => prev - sch[next], sch.number) - cv;
-      let tr = this.list.reduce((prev, next) => {
-        if (next.code != sch.code) return prev - (next[`term${term.term}`] * 1 || 0);
-        else return prev;
-      }, term.tpt);
-      tr = tr - cv;
-      this.$set(this.form.sch, `remaining`, sr);
-      this.$set(this.form.term, `remaining`, tr);
+    dComputed(cv = 0, ov = 0) {
+      let sr = _.get(this.form.sch, 'remaining');
+      let pr = _.get(this.form.info, 'remaining');
+      let remainder = cv - ov;
+      // console.log(cv, ov, remainder, sr, pr);
+      this.$set(this.form.sch, `remaining`, sr - remainder);
+      this.$set(this.form.info, `remaining`, pr - remainder);
     },
     //计算抽屉最大值
     dGetMax(data) {
       if (!this.drawer) return 0;
+      // console.log(data);
+      let { num = 0, info, sch } = data;
+      let { remaining: pl, bpt, _id: batchid } = info; //批次限制,批次总限制,批次id
+      let { remaining: sl, number: spt, code } = sch; ////学校限制
+      // console.log(pl, sl);
       let res = 0;
-      let t = this.termList.find(f => f.termid == this.form.term.termid);
-      let sch = this.list.find(f => f.code == this.form.sch.code);
-      let s = _.get(data, 'sch');
-      let tr = _.get(data, 'term.remaining', 0) * 1;
-      let sr = _.get(data, 'sch.remaining', 0) * 1;
-      let num = this.form.num;
-      if (s.remaining == 0) return num;
-      if (tr > sr) {
-        res = sch.number * 1 || 0;
-      } else if (tr == sr) {
-        let keys = Object.keys(s)
-          .filter(f => _.startsWith(f, 'term'))
-          .filter(f => f != `term${t.term}`);
-        let nsr = keys.reduce((prev, next) => prev - s[next], s.number);
-        res = nsr;
-      } else {
-        res = t.tpt * 1 - t.total * 1 || 0;
+      //如果学校没有名额了,那么数字框内的最大值就是当前的值
+      if (sl == 0) {
+        console.log('学校名额没了');
+        res = num;
       }
-      return res * 1;
+      //根据这个表来看,2中算法
+      // 1) 纵向计算(按批次算) 批次总限制 - 这批次  除了这个学校外  所有学校分配的人数之和
+      // 2) 横向计算(按学校算) 学校总限制 - 这个学校 除了当前批次外 所有批次的分配的人数之和
+      //如果批次限制 大于 学校限制:那么最大值 = 横向计算结果
+      if (pl > sl) {
+        let keys = Object.keys(sch).filter(f => f.includes('batch_total') && f != this.proAffix(batchid, 'batch_total'));
+        let obj = _.pick(sch, keys);
+        let ot = Object.values(obj).reduce((prev, next) => prev + next * 1, 0);
+        res = spt * 1 - ot || 0;
+      }
+      //如果批次限制 小于等于 学校限制:那么最大值 = 批次总限制 - 纵向计算结果
+      if (pl <= sl) {
+        let bTotal = this.list.reduce((prev, next) => {
+          let num = 0;
+          if (next.code != code) {
+            num = next[this.proAffix(batchid, 'batch_total')] * 1 || 0;
+          }
+
+          return prev + num;
+        }, 0);
+        res = bpt - bTotal;
+      }
+      return res;
     },
     //关闭抽屉
     toClose() {
@@ -684,6 +546,10 @@ export default {
       await this.getSchool();
     },
     //batch分离与拼接
+    /**
+     * value 拼接标识值
+     * affix 拼接词缀
+     */
     proAffix(value, affix) {
       if (affix) return `${affix}-${value}`;
       else {

+ 78 - 11
src/views/new-plan/arrange/table/table.vue

@@ -1,19 +1,40 @@
 <template>
   <div id="table-frame">
-    <el-table :data="list" border stripe size="mini" max-height="650px" @cell-click="cellClick" :cell-style="cellStyle">
-      <el-table-column label="学校" fixed align="center" prop="name" width="180"></el-table-column>
+    <el-table
+      :data="list"
+      border
+      stripe
+      size="mini"
+      max-height="650px"
+      @cell-click="cellClick"
+      :cell-style="cellStyle"
+      :highlight-current-row="true"
+      :show-summary="true"
+      :summary-method="sumComputed"
+    >
+      <el-table-column fixed align="center" prop="name" width="180">
+        <template #header>
+          <el-row>
+            <el-col :span="24">学校</el-col>
+            <el-col :span="24">
+              <el-link style="font-size:12px" type="primary" @click="display = !display">(查看{{ display ? '车辆分配' : '人数分配' }})</el-link>
+            </el-col>
+          </el-row>
+        </template>
+      </el-table-column>
+
       <el-table-column label="期数" fixed align="center">
         <el-table-column label="班级数" align="center">
-          <el-table-column label="时间" align="center" width="80">
-            <el-table-column label="备注" align="center" width="80">
-              <el-table-column label="总人数" align="center" prop="number" width="80">
+          <el-table-column label="时间" align="center">
+            <el-table-column label="备注" align="center">
+              <el-table-column label="总人数" align="center" prop="number">
                 <template v-slot="{ row }">
                   <el-tooltip effect="dark" placement="top">
                     <template #content>
-                      <el-row style="width:100px">
-                        <el-col :span="24">就业班人数:{{ row.jynum }}</el-col>
-                        <el-col :span="24">创业班人数:{{ row.cynum }}</el-col>
-                        <el-col :span="24">少数民族班人数:{{ row.mznum }}</el-col>
+                      <el-row style="width:120px">
+                        <el-col :span="24">就业班人数: {{ row.jynum }}</el-col>
+                        <el-col :span="24">创业班人数: {{ row.cynum }}</el-col>
+                        <el-col :span="24">少数民族班人数: {{ row.mznum }}</el-col>
                       </el-row>
                     </template>
                     <el-link type="primary" :underline="false">{{ row.number }}</el-link>
@@ -27,13 +48,21 @@
 
       <el-table-column align="center" v-for="(i, index) in tList" :key="index" :label="`${i.term}`">
         <template v-for="(batch, bindex) in i.batchnum">
-          <el-table-column :label="batch.class" :key="bindex" align="center">
+          <el-table-column :label="batch.batch ? batch.class : batch.name" :key="bindex" align="center">
             <el-table-column :label="getBatchDate(batch)" :key="bindex" align="center">
-              <el-table-column :key="bindex" align="center" min-width="100" :prop="`batch_total-${batch._id}`">
+              <el-table-column :key="bindex" align="center" width="100" :prop="`batch_total-${batch._id}`">
                 <!-- 用batch_batch.id batch_+对应_id拼成唯一数据存放在学校列表中,对应每个表格 -->
                 <template #header>
                   <el-input v-model="remarks[batch._id]" size="mini" placeholder="备注" type="textarea"></el-input>
                 </template>
+                <template v-slot="{ row }">
+                  <el-tooltip effect="dark" placement="top">
+                    <template #content>
+                      {{ getContent(row, batch._id) }}
+                    </template>
+                    <el-link>{{ getInfo(row, batch._id) }}</el-link>
+                  </el-tooltip>
+                </template>
               </el-table-column>
             </el-table-column>
           </el-table-column>
@@ -60,6 +89,7 @@ export default {
   components: {},
   data: function() {
     return {
+      display: true, //true:表格显示人数,鼠标经过显示车辆;false就反过来
       tList: [],
       list: [],
       remarks: {},
@@ -75,6 +105,43 @@ export default {
     findBatch(termid) {
       return this.bList.filter(f => f.termid == termid);
     },
+    getInfo(data, batchid) {
+      if (this.display) return data[`batch_total-${batchid}`];
+      else return data[`car_total-${batchid}`];
+    },
+    getContent(data, batchid) {
+      if (this.display) return `需求车辆: ${data[`car_total-${batchid}`]} 辆`;
+      else return `分配名额: ${data[`batch_total-${batchid}`]} 人`;
+    },
+    //尾行计算
+    sumComputed({ columns, data }) {
+      let arr = [];
+      columns.map((col, index) => {
+        if (index == 0) arr.push('合计');
+        else {
+          let prop = _.get(col, 'property');
+          if (prop == 'number') {
+            let num = this.list.reduce((prev, next) => prev + next.number * 1, 0);
+            arr.push(num);
+          } else arr.push(this.columnComputed(prop, data));
+        }
+      });
+      return arr;
+    },
+    //列计算
+    columnComputed(prop, data) {
+      let { value: batchid, affix } = this.proAffix(prop);
+      let num = data.reduce((prev, next) => prev + (next[prop] || 0), 0);
+      let batch = this.termList
+        .map(i => i.batchnum)
+        .flat()
+        .find(f => f._id == batchid);
+      if (batch) {
+        let word = batch.remaining > 0 ? `(缺少${batch.remaining}人)` : '(ok)';
+        num = `${num}${word}`;
+      }
+      return num;
+    },
     //手动更改
     cellClick(row, column) {
       let r = this.proAffix(column.property);