lrf402788946 4 years ago
parent
commit
fbb9f873c1

+ 0 - 132
src/components/export-range.vue

@@ -1,132 +0,0 @@
-<template>
-  <div id="experience-export">
-    <el-row class="btn_bar" type="flex" justify="end">
-      <el-col :span="2">
-        <el-button type="primary" size="small" @click="dialog = true">导出</el-button>
-      </el-col>
-    </el-row>
-    <el-dialog title="请选择要导出的范围" width="30%" :visible.sync="dialog" center @close="toClose">
-      <el-form size="small">
-        <el-form-item label="年度计划">
-          <el-select clearable v-model="form.planid" @change="toGetTerm">
-            <el-option v-for="(i, index) in planList" :key="index" :label="i.title" :value="i._id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="期(可选)">
-          <el-select clearable v-model="form.termid" @change="selectTerm">
-            <el-option v-for="(i, index) in termList" :key="index" :label="`第${i.term}期`" :value="i._id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="批(可选)">
-          <el-select clearable v-model="form.batchid">
-            <el-option v-for="(i, index) in batchList" :key="index" :label="`第${i.batch}批`" :value="i._id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="班(可选)">
-          <el-select clearable v-model="form.classid" @change="selectClass">
-            <el-option v-for="(c, index) in classList" :key="index" :label="`${c.name.includes('班') ? c.name : `${c.name}班`}`" :value="c._id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="人(可选)">
-          <el-select clearable v-model="form.studentid">
-            <el-option v-for="(i, index) in studentList" :key="index" :label="`${i.name}(${i.job})`" :value="i._id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-row type="flex" justify="space-around">
-          <el-col :span="2">
-            <el-button type="primary" size="small" @click="toExport">导出</el-button>
-          </el-col>
-        </el-row>
-      </el-form>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash');
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: experience } = createNamespacedHelpers('experience');
-const { mapActions: classes } = createNamespacedHelpers('classes');
-const { mapActions: trainplan } = createNamespacedHelpers('trainplan');
-export default {
-  name: 'experience-export',
-  props: {
-    studentList: { type: Array, default: () => [] },
-  },
-  components: {},
-  data: function() {
-    return {
-      dialog: false,
-      form: {},
-      planList: [],
-      termList: [],
-      batchList: [],
-      classList: [],
-    };
-  },
-  async created() {
-    await this.toGetPlan();
-  },
-  methods: {
-    ...experience(['export']),
-    ...trainplan({ getPlan: 'query' }),
-    ...classes({ getClass: 'query' }),
-    // 查询年度计划
-    async toGetPlan() {
-      const res = await this.getPlan();
-      if (this.$checkRes(res)) this.$set(this, `planList`, res.data);
-    },
-    // 找到期列表
-    async toGetTerm(planid) {
-      const res = await this.planList.find(f => f._id === planid);
-      if (!res) return;
-      const { termnum } = res;
-      this.$set(this, `termList`, termnum);
-    },
-    // 找到批次列表,查询班级列表
-    async selectTerm(termid) {
-      const r = this.termList.find(f => f._id === termid);
-      if (!r) return;
-      const { batchnum } = r;
-      this.$set(this, `batchList`, batchnum);
-      const stures = await this.getClass({ termid });
-      if (this.$checkRes(stures)) {
-        let duplicate = _.cloneDeep(stures.data);
-        duplicate = duplicate.map(i => {
-          if (parseInt(i.name)) {
-            i.order = parseInt(i.name);
-          } else {
-            // i.order = i.name;
-          }
-          return i;
-        });
-        duplicate = _.orderBy(duplicate, ['order'], ['asc']);
-        this.$set(this, `classList`, duplicate);
-      }
-    },
-    // 找到班级的班长,学委
-    async selectClass(classid) {
-      this.$emit('getStudent', classid);
-    },
-    //导出
-    async toExport() {
-      this.$emit('toExport', this.form);
-    },
-    toClose() {
-      this.dialog = false;
-      this.$set(this, `form`, {});
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 10 - 2
src/views/newspaper/index.vue

@@ -8,15 +8,22 @@
           </el-select>
         </el-form-item>
       </el-form>
-      <export-range @getStudent="toGetStudent" :studentList="studentList" @toExport="toExport"></export-range>
+      <el-row class="btn_bar" type="flex" justify="end">
+        <el-col :span="2">
+          <el-button type="primary" size="small" @click="eDialog = true">导出</el-button>
+        </el-col>
+      </el-row>
       <data-table :fields="fields" :data="list" :opera="opera" @download="download"></data-table>
     </list-frame>
+    <el-dialog :visible.sync="eDialog" title="导出" width="30%">
+      <export-range @getStudent="toGetStudent" :studentList="studentList" @toExport="toExport" @close="eDialog = false"></export-range>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import _ from 'lodash';
-import exportRange from '@/components/export-range.vue';
+import exportRange from '@frame/components/export-range.vue';
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
 import { mapState, createNamespacedHelpers } from 'vuex';
@@ -34,6 +41,7 @@ export default {
     exportRange,
   },
   data: () => ({
+    eDialog: false,
     opera: [
       {
         label: '下载',

+ 95 - 30
src/views/student/index.vue

@@ -21,7 +21,7 @@
       </el-form>
       <el-row style="margin: 20px 0 5px 0" type="flex" align="middle" justify="end">
         <el-col :span="2">
-          <el-button type="primary" size="mini" @click="toExportStudent">导出学生</el-button>
+          <el-button type="primary" size="mini" @click="eDialog = true">导出学生</el-button>
         </el-col>
         <el-col :span="2">
           <el-button type="danger" size="mini" :disabled="batchdet.length <= 0" @click="batchdelete">批量删除</el-button>
@@ -41,25 +41,42 @@
         </template>
       </data-form>
     </el-dialog>
-    <el-dialog title="选择导出学生的范围" :visible.sync="exportDialog" @close="toClose" width="30%">
-      <data-form :data="exportInfo" :fields="exportFields" :rules="{}" @save="toExportExcel" submitText="导出">
-        <template #custom="{ item, form }">
-          <template v-if="item.model === 'termid'">
-            {{ getTerm(form[item.model]) }}
+    <el-dialog title="导出" center :visible.sync="eDialog">
+      <export-range :usestudent="false" @close="eDialog = false" @toExport="toExportExcel">
+        <el-card>
+          <template #header>
+            <el-row>
+              <el-col :span="24">选择导出的字段-学生表(点击字段可以更换顺序)</el-col>
+              <el-col :span="24">
+                <span v-for="(i, index) in selectModel" :key="`select-${index}`" style="padding-right:15px;zoom:1.1">
+                  <el-link type="primary" v-if="index === selectIndex && index !== 0" icon="el-icon-back" @click="toChangePos(i, -1)"></el-link>
+                  <el-link @click="toDisplayPos(index)">{{ i }}</el-link>
+                  <el-link
+                    type="primary"
+                    v-if="index === selectIndex && index !== selectModel.length - 1"
+                    icon="el-icon-right"
+                    @click="toChangePos(i, 1)"
+                  ></el-link>
+                </span>
+              </el-col>
+            </el-row>
           </template>
-        </template>
-        <template #options="{item,form}">
-          <template v-if="item.model === 'batchid'">
-            <el-option v-for="(i, index) in batchList" :key="index" :label="`第${i.batch}批`" :value="i._id"></el-option>
-          </template>
-        </template>
-      </data-form>
+          <el-checkbox-group v-model="selectModel">
+            <el-row>
+              <el-col :span="4" v-for="(i, index) in models.student" :key="`model-${index}`">
+                <el-checkbox :label="i.zh">{{ i.zh }}</el-checkbox>
+              </el-col>
+            </el-row>
+          </el-checkbox-group>
+        </el-card>
+      </export-range>
     </el-dialog>
   </div>
 </template>
 
 <script>
 import _ from 'lodash';
+import exportRange from '@frame/components/export-range';
 import listFrame from '@frame/layout/admin/list-frame';
 import dataForm from '@frame/components/form';
 import dataTable from '@frame/components/data-table';
@@ -67,6 +84,7 @@ import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions } = createNamespacedHelpers('student');
 const { mapActions: classes } = createNamespacedHelpers('classes');
 const { mapActions: trainplan } = createNamespacedHelpers('trainplan');
+const { mapActions: util } = createNamespacedHelpers('util');
 
 export default {
   metaInfo: { title: '学生管理' },
@@ -76,9 +94,11 @@ export default {
     listFrame,
     dataTable,
     dataForm,
+    exportRange,
   },
   data: () => ({
     dialog: false,
+    eDialog: false,
     exportDialog: false,
     opera: [
       {
@@ -126,18 +146,22 @@ export default {
     total: 0,
     selectClassList: [],
     batchdet: [],
-    exportInfo: {},
     exportFields: [
       { label: '导出期', model: 'termid', custom: true },
       { label: '导出批次', model: 'batchid', type: 'select' },
     ],
     allClassList: [],
+    models: {},
+    selectModel: [],
+    selectIndex: '',
   }),
   created() {
     this.getPlan();
+    this.toFindModel();
   },
   computed: { ...mapState(['user', 'defaultOption']) },
   methods: {
+    ...util(['findModel', 'exportExcel']),
     ...trainplan({ planfetch: 'fetch' }),
     ...mapActions(['query', 'delete', 'update', 'removeAll', 'computedIsFine', 'toExport']),
     ...classes({ classesquery: 'query' }),
@@ -216,14 +240,6 @@ export default {
     toClose() {
       this.exportDialog = false;
       this.dialog = false;
-      this.exportInfo = {};
-    },
-    // 导出学生弹框
-    toExportStudent() {
-      const { termid } = this.defaultOption;
-      this.$set(this.exportInfo, `termid`, termid);
-      this.toBatchList(termid);
-      this.exportDialog = true;
     },
     // 批次列表更改
     async toBatchList(termid) {
@@ -233,21 +249,70 @@ export default {
         if (batchnum) this.$set(this, `batchList`, batchnum);
       }
     },
-    async toExportExcel() {
+    async toExportExcel(data) {
+      // 重新整理model
+      let model = this.selectModel.map(i => {
+        const om = this.models.student.find(f => f.zh == i);
+        if (om) return om;
+      });
+      model = _.compact(model);
+      // 将查询条件和model整理在一起
+      const obj = { ...data, model };
       const msg = this.$message({ duration: 0, message: '正在导出,请稍后...' });
-      let duplicate = _.cloneDeep(this.exportInfo);
-      const res = await this.toExport(duplicate);
-      msg.close();
-      if (this.$checkRes(res)) {
-        const { data } = res;
-        window.open(data);
-      }
+      const res = await this.toExport(obj);
+      // msg.close();
+      // if (this.$checkRes(res)) {
+      //   const { data } = res;
+      //   window.open(data);
+      // }
     },
     getTerm(termid) {
       console.log(termid);
       const r = this.termList.find(f => f._id === termid);
       if (r) return `第${r.term}期`;
     },
+
+    async toFindModel() {
+      const res = await this.findModel('student');
+      if (this.$checkRes(res)) {
+        const { data } = res;
+        if (!(data && _.isObject(data))) return;
+        const keys = Object.keys(data);
+        let obj = {};
+        const arr = [];
+        for (const key of keys) {
+          const o = data[key];
+          const { zh } = o;
+          if (zh) {
+            const ao = { zh };
+            ao['model'] = key;
+            arr.push(ao);
+          }
+        }
+        obj['student'] = arr;
+        this.$set(this, `models`, obj);
+      }
+    },
+
+    // 显示已经选择的字段的移动位置按钮
+    toDisplayPos(index) {
+      this.selectIndex = index;
+    },
+    // 移动位置,
+    toChangePos(data, num) {
+      const dup = _.cloneDeep(this.selectModel);
+      // 当前元素位置
+      const di = dup.findIndex(f => f == data);
+      // 要交换的元素位置及数据
+      const ci = di + num;
+      const c = dup[ci];
+      // 交换
+      dup[ci] = data;
+      dup[di] = c;
+      this.$set(this, `selectModel`, dup);
+      // 将目标也跟随过去
+      this.toDisplayPos(ci);
+    },
   },
   watch: {
     defaultOption: {

+ 11 - 2
src/views/train-plan/experience.vue

@@ -8,7 +8,11 @@
           </el-select>
         </el-form-item>
       </el-form>
-      <export-range @getStudent="toGetStudent" :studentList="studentList" @toExport="toExport"></export-range>
+      <el-row class="btn_bar" type="flex" justify="end">
+        <el-col :span="2">
+          <el-button type="primary" size="small" @click="eDialog = true">导出</el-button>
+        </el-col>
+      </el-row>
       <data-table :fields="fields" :data="list" :opera="opera" @view="toView" @delete="toDelete"></data-table>
     </list-frame>
     <el-dialog :visible.sync="dialog" title="培训心得" @close="toClose" width="30%">
@@ -20,12 +24,15 @@
         </template>
       </data-form>
     </el-dialog>
+    <el-dialog :visible.sync="eDialog" title="导出" @close="toClose" width="30%">
+      <export-range @getStudent="toGetStudent" :studentList="studentList" @toExport="toExport" @close="eDialog = false"></export-range>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import _ from 'lodash';
-import exportRange from '@/components/export-range.vue';
+import exportRange from '@frame/components/export-range.vue';
 import listFrame from '@frame/layout/admin/list-frame';
 import dataForm from '@frame/components/form';
 import dataTable from '@frame/components/data-table';
@@ -45,6 +52,7 @@ export default {
     exportRange,
   },
   data: () => ({
+    eDialog: false,
     opera: [
       {
         label: '查看',
@@ -137,6 +145,7 @@ export default {
     // 关闭
     toClose() {
       this.form = {};
+      this.eDialog = false;
       this.dialog = false;
     },
   },