Просмотр исходного кода

添加期,问卷关联.修改问卷进度查询流程

lrf402788946 5 лет назад
Родитель
Сommit
adfe884781

+ 12 - 6
src/router/index.js

@@ -33,12 +33,12 @@ const routes = [
         component: () => import('@/views/Itembank/index.vue'),
       },
 
-      {
-        path: '/questionstate/detail',
-        name: 'questionstate_detail',
-        meta: { title: '问卷状态', sub: '详情' },
-        component: () => import('@/views/questionstate/detail.vue'),
-      },
+      // {
+      //   path: '/questionstate/detail',
+      //   name: 'questionstate_detail',
+      //   meta: { title: '问卷状态', sub: '详情' },
+      //   component: () => import('@/views/questionstate/detail.vue'),
+      // },
       {
         path: '/questionstate/index',
         name: 'questionstate_index',
@@ -256,6 +256,12 @@ const routes = [
         meta: { title: '发送', sub: '通知' },
         component: () => import('@/views/plan/msg.vue'),
       },
+      {
+        path: '/plan/question',
+        name: 'plan_question',
+        meta: { title: '问卷', sub: '管理' },
+        component: () => import('@/views/plan/question.vue'),
+      },
     ],
   },
   {

+ 2 - 0
src/store/index.js

@@ -19,6 +19,7 @@ import teaPlan from '@frame/store/tea-plan';
 import lesson from '@frame/store/lesson';
 import nation from '@frame/store/nation';
 import completion from '@frame/store/question-completion';
+import termquest from '@frame/store/termquest';
 
 Vue.use(Vuex);
 
@@ -43,6 +44,7 @@ export default new Vuex.Store({
     lesson,
     nation,
     completion,
+    termquest,
   },
   state: {},
   mutations: {},

+ 10 - 0
src/views/plan/index.vue

@@ -11,6 +11,7 @@
         @classes="toClasses"
         @lesson="toLesson"
         @msg="toMsg"
+        @ques="toQues"
       ></data-table>
     </list-frame>
   </div>
@@ -71,6 +72,12 @@ export default {
         display: i => i.status === '1',
         method: 'msg',
       },
+      {
+        label: '添加调查问卷',
+        icon: 'el-icon-edit-outline',
+        display: i => i.status === '1',
+        method: 'ques',
+      },
     ],
     fields: [
       { label: '计划标题', prop: 'title' },
@@ -120,6 +127,9 @@ export default {
     toMsg({ data }) {
       this.$router.push({ path: '/plan/msg', query: { id: data.id } });
     },
+    toQues({ data }) {
+      this.$router.push({ path: '/plan/question', query: { id: data.id } });
+    },
   },
   computed: {
     mainTitle() {

+ 1 - 1
src/views/plan/msg.vue

@@ -1,6 +1,6 @@
 <template>
   <div id="msg">
-    <list-frame v-if="view === 'list'" :title="mainTitle" @query="search" :needFilter="false" :needAdd="false" :needPag="false">
+    <list-frame v-if="view === 'list'" :title="mainTitle" @query="search" :needFilter="false" :needAdd="false" :needPag="false" returns="/plan/index">
       <data-table ref="table" :fields="fields" :data="list" :opera="opera" @msg="toMsg"></data-table>
     </list-frame>
   </div>

+ 126 - 0
src/views/plan/question.vue

@@ -0,0 +1,126 @@
+<template>
+  <div id="question">
+    <list-frame v-if="view === 'list'" :title="mainTitle" @query="search" :needFilter="false" :needAdd="false" :needPag="false" returns="/plan/index">
+      <data-table ref="table" :fields="fields" :data="list" :opera="opera" @edit="toEdit"></data-table>
+    </list-frame>
+    <el-dialog :visible.sync="dialog" title="选择问卷" center @close="toClose">
+      <data-table :fields="quesFields" :data="questionList" :select="true" :selected="selected" @handleSelect="toSelect"></data-table>
+      <el-row type="flex" justify="center" :gutter="10">
+        <el-col :span="2" style="padding-top:20px">
+          <el-button type="primary" plain size="mini" @click="toSave">保&nbsp;&nbsp;&nbsp;&nbsp;存</el-button>
+        </el-col>
+        <el-col :span="2" style="padding-top:20px">
+          <el-button plain size="mini" @click="dialog = false">关&nbsp;&nbsp;&nbsp;&nbsp;闭</el-button>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import listFrame from '@frame/layout/admin/list-frame';
+import dataTable from '@frame/components/data-table';
+import _ from 'lodash';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
+const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
+const { mapActions: termquest } = createNamespacedHelpers('termquest');
+
+export default {
+  metaInfo: { title: '问卷分配' },
+  name: 'question',
+  props: {},
+  components: { listFrame, dataTable },
+  data: () => ({
+    view: 'list',
+    dialog: false,
+    opera: [
+      {
+        label: '分配问卷',
+        icon: 'el-icon-document-add',
+        method: 'edit',
+      },
+    ],
+    fields: [{ label: '期数', prop: 'term' }],
+    quesFields: [
+      { label: '问卷序号', prop: 'num' },
+      { label: '问卷标题', prop: 'name' },
+    ],
+    questionList: [],
+    list: [],
+    form: {},
+    selected: [],
+    total: 0,
+  }),
+  created() {
+    this.search();
+    this.getQuesList();
+  },
+  methods: {
+    ...trainPlan({ getTrainPlan: 'fetch' }),
+    ...questionnaire({ getQuestionnaireList: 'query' }),
+    ...termquest({ getTermQuestList: 'query', termQuestCreate: 'create', termQuestUpdate: 'update' }),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.getTrainPlan(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data.termnum);
+      }
+    },
+    async getQuesList() {
+      let ques = await this.getQuestionnaireList();
+      if (this.$checkRes(ques)) this.$set(this, `questionList`, ques.data);
+    },
+    async toEdit({ data }) {
+      this.dialog = true;
+      let res = await this.getTermQuestList({ termid: data._id });
+      if (this.$checkRes(res)) {
+        if (res.data.length > 0) {
+          let { questionnaireid, ...othrers } = res.data[0];
+          this.$set(this, `form`, othrers);
+          let newArr = this.questionList.filter(q => (_.find(questionnaireid, sq => sq === q.id) ? q : ''));
+          this.$set(this, `selected`, newArr);
+        } else {
+          this.$set(this, `form`, { termid: data._id });
+        }
+      }
+    },
+    toSelect(sels) {
+      this.$set(this, `selected`, sels);
+    },
+    async toSave() {
+      let res;
+      let questionnaireid = this.selected.map(p => p.id);
+      let data = { termid: this.form.termid, questionnaireid };
+      if (!this.form.id) {
+        res = await this.termQuestCreate(data);
+      } else {
+        data.id = this.form.id;
+        res = await this.termQuestUpdate(data);
+      }
+      this.$checkRes(res, this.form.id ? '修改成功' : '保存成功', this.form.id ? '修改失败' : '添加失败');
+    },
+    toClose() {
+      this.dialog = false;
+      this.form = {};
+    },
+  },
+  computed: {
+    mainTitle() {
+      let meta = this.$route.meta;
+      let main = meta.title || '';
+      let sub = meta.sub || '';
+      return `${main}${sub}`;
+    },
+    keyWord() {
+      let meta = this.$route.meta;
+      let main = meta.title || '';
+      return main;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 2 - 2
src/views/questionnaire/index.vue

@@ -10,7 +10,7 @@
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
 import { createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('questionnaire');
+const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
 
 export default {
   name: 'index',
@@ -49,7 +49,7 @@ export default {
   },
   computed: {},
   methods: {
-    ...mapActions(['query', 'delete']),
+    ...questionnaire(['query', 'delete']),
     async search({ skip = 0, limit = 10, ...info } = {}) {
       const res = await this.query({ skip, limit, ...info });
       if (this.$checkRes(res)) {

+ 0 - 0
src/views/questionstate/detail.vue


+ 48 - 14
src/views/questionstate/index.vue

@@ -6,7 +6,10 @@
           <data-table :fields="fields" :data="list" :opera="opera" @view="data => toView(data, 'term')"></data-table>
         </self-cards>
         <self-cards :title="termTitle" v-if="views === `term`" :returns="toReturns">
-          <data-table :fields="termFields" :data="termList" :opera="opera" @view="data => toView(data, 'batch')"></data-table>
+          <data-table :fields="termFields" :data="termList" :opera="opera" @view="data => toView(data, 'pool')"></data-table>
+        </self-cards>
+        <self-cards title="问卷列表" v-if="views === `pool`" :returns="toReturns">
+          <data-table :fields="quesFields" :data="quesList" :opera="opera" @view="data => toView(data, 'batch')"></data-table>
         </self-cards>
         <self-cards :title="batchTitle" v-if="views === `batch`" :returns="toReturns">
           <el-alert :title="`进度:${batch.answertotal || 0}/${batch.alltotal || 0}`" :closable="false"></el-alert>
@@ -29,11 +32,14 @@
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
 import selfCards from './parts/cards';
+import _ from 'lodash';
 import { createNamespacedHelpers } from 'vuex';
 const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
 const { mapActions: classes } = createNamespacedHelpers('classes');
 const { mapActions: student } = createNamespacedHelpers('student');
 const { mapActions: completion } = createNamespacedHelpers('completion');
+const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
+const { mapActions: termquest } = createNamespacedHelpers('termquest');
 export default {
   name: 'index',
   metaInfo: { title: '问卷完成度查询' },
@@ -72,6 +78,9 @@ export default {
     list: [],
     termFields: [{ label: '期数', prop: 'term' }],
     termList: [],
+    quesFields: [{ label: '标题', prop: 'name' }],
+    quesList: [],
+    quest: [],
     batchFields: [
       { label: '批次', prop: 'name' },
       { label: '进度', prop: 'completion' },
@@ -94,10 +103,6 @@ export default {
     student: {
       list: [],
     },
-    studFilter: [
-      { label: '姓名', model: 'name' },
-      { label: '进度', prop: 'completion' },
-    ],
     classid: '',
     studTotal: 0,
   }),
@@ -111,12 +116,18 @@ export default {
     ...completion({ getCompletion: 'query' }),
     ...classes({ getClassesList: 'query' }),
     ...student({ getStudentList: 'query' }),
+    ...termquest({ getTermQuestList: 'query' }),
+    ...questionnaire({ getQuestionnaireList: 'query' }),
     async search({ skip = 0, limit = 10, ...info } = {}) {
       const res = await this.query({ skip, limit, status: '1', ...info });
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
       }
+      const quest = await this.getQuestionnaireList();
+      if (this.$checkRes(res)) {
+        this.$set(this, `quest`, quest.data);
+      }
     },
     async toView({ data }, type) {
       this.views = type;
@@ -126,34 +137,56 @@ export default {
         this.$set(this, `termTitle`, data.title);
         this.$set(this, `termList`, data.termnum);
       }
-      if (type === 'batch') {
+      if (type === 'pool') {
         let termid = data._id;
-        let res = await this.getCompletion({ type: '0', typeid: termid, trainplanid: this.planid });
+        let res = await this.getTermQuestList({ termid: termid });
+        if (this.$checkRes(res)) {
+          let { term } = data;
+          let { questionnaireid, termid, ...othrers } = res.data[0];
+          let newArr = this.quest.filter(q => (_.find(questionnaireid, sq => sq === q.id) ? q : ''));
+          newArr = newArr.map(q => {
+            q.term = term;
+            q.termid = termid;
+            return q;
+          });
+          this.$set(this, `quesList`, newArr);
+        }
+      }
+      if (type === 'batch') {
+        let termid = data.termid;
+        let questionnaireid = data.id;
+        let res = await this.getCompletion({ type: '0', typeid: termid, trainplanid: this.planid, questionnaireid });
         if (this.$checkRes(res)) {
           let { data: completion, answertotal, alltotal, completiontotal } = res;
           completion = completion.map(i => {
             i.completion.includes('NaN') ? (i.completion = '-') : '';
+            i.questname = data.name;
+            i.term = data.term;
+            i.questionnaireid = questionnaireid;
             return i;
           });
           this.$set(this, `batch`, { list: completion, answertotal, alltotal, completiontotal });
         }
-        this.$set(this, `batchTitle`, `第${data.term}期`);
+        this.$set(this, `batchTitle`, `第${data.term}期 问卷${data.name}进度`);
       }
       if (type === 'class') {
-        let batch = data.id;
-        let res = await this.getCompletion({ type: '1', typeid: batch });
+        let { id: batch, questname, term, questionnaireid } = data;
+        let res = await this.getCompletion({ type: '1', typeid: batch, questionnaireid });
         if (this.$checkRes(res)) {
           let { data: completion, answertotal, alltotal, completiontotal } = res;
           completion = completion.map(i => {
             i.completion.includes('NaN') ? (i.completion = '-') : '';
+            i.questname = data.questname;
+            i.questionnaireid = questionnaireid;
             return i;
           });
           this.$set(this, `classes`, { list: completion, answertotal, alltotal, completiontotal });
         }
-        this.$set(this, `classTitle`, `${data.name}`);
+        this.$set(this, `classTitle`, `${data.name} 问卷${questname}进度`);
       }
       if (type === 'student') {
-        let res = await this.getCompletion({ type: '2', typeid: data.id });
+        let { id, questname, questionnaireid } = data;
+        let res = await this.getCompletion({ type: '2', typeid: data.id, questionnaireid });
         if (this.$checkRes(res)) {
           let { data: completion, answertotal, alltotal, completiontotal } = res;
           completion = completion.map(i => {
@@ -162,12 +195,13 @@ export default {
           });
           this.$set(this, `student`, { list: completion, answertotal, alltotal, completiontotal });
         }
-        this.$set(this, `studentTitle`, `${data.name}`);
+        this.$set(this, `studentTitle`, `${data.name} 问卷${questname}进度`);
       }
     },
     toReturns() {
       if (this.views === 'term') this.views = 'plan';
-      else if (this.views === 'batch') this.views = 'term';
+      else if (this.views === 'pool') this.views = 'term';
+      else if (this.views === 'batch') this.views = 'pool';
       else if (this.views === 'class') this.views = 'batch';
       else if (this.views === 'student') this.views = 'class';
     },

+ 6 - 6
src/views/teacher/index.vue

@@ -3,14 +3,14 @@
     <list-frame title="教师列表页" @query="search" :total="total" :filter="filFields" :needAdd="false">
       <template #options="{item}">
         <template v-if="item.model == 'gender'">
-          <el-option v-for="(item, index) in list" :key="index" :value="item.label"></el-option>
+          <el-option v-for="(item, index) in gender" :key="index" :value="item.label"></el-option>
         </template>
         <template v-if="item.model == 'status'">
           <el-option v-for="(item, index) in lists" :key="index" :value="item.label"></el-option>
         </template>
       </template>
       <!-- <data-table :fields="fields" :data="index" :opera="opera" @edit="toEdit" @select="toSelect"></data-table> -->
-      <data-table :fields="fields" :data="index" :opera="opera" @edit="toEdit" @delete="toDelete" @select="toSelect"></data-table>
+      <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toDelete" @select="toSelect"></data-table>
     </list-frame>
   </div>
 </template>
@@ -28,7 +28,7 @@ export default {
     dataTable,
   },
   data: () => ({
-    list: [
+    gender: [
       { label: '男', value: '男' },
       { label: '女', value: '女' },
     ],
@@ -59,7 +59,7 @@ export default {
       { label: '性别', prop: 'gender' },
       { label: '手机号', prop: 'phone' },
 
-      { label: '学校名称', prop: 'school_name' },
+      { label: '学校名称', prop: 'schname' },
       { label: '邮箱', prop: 'email' },
       { label: '年龄', prop: 'age' },
 
@@ -82,7 +82,7 @@ export default {
         },
       },
     ],
-    index: [],
+    list: [],
     filFields: [
       { label: '教师名称', model: 'name' },
       { label: '年龄', model: 'age' },
@@ -108,7 +108,7 @@ export default {
     async search({ skip = 0, limit = 10, ...info } = {}) {
       const res = await this.query({ skip, limit, ...info });
       if (this.$checkRes(res)) {
-        this.$set(this, `index`, res.data);
+        this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
       }
     },