浏览代码

王子文 专项培养
1) 继任者清单页面点击“月度数据”->按年、月查询选中学员月度数据
2) 继任者清单页面点击“季度数据”->按年、季度查询选中学员季度数据

wangggziwen 3 年之前
父节点
当前提交
3051c77cd5

+ 13 - 0
master/src/main/java/com/ruoyi/project/training/spec/controller/TStSuccessorController.java

@@ -49,10 +49,23 @@ public class TStSuccessorController extends BaseController
 
     @Autowired
     private ISysUserService sysUserService;
+
     @Autowired
     private ITStSuccessorScoreService tStSuccessorScoreService;
+
     @Autowired
     private TStYearplanMapper tStYearplanMapper;
+
+    /**
+     * 根据学员id查询继任者清单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('spec:successor:query')")
+    @GetMapping("/getInfoBySuccessorId/{staffId}")
+    public AjaxResult getInfoBySuccessorId(@PathVariable("staffId") Long staffId)
+    {
+        return AjaxResult.success(tStSuccessorService.selectTStSuccessorBySuccessorId(staffId));
+    }
+
     /**
      * 查询导师列表
      */

+ 5 - 0
master/src/main/java/com/ruoyi/project/training/spec/mapper/TStSuccessorMapper.java

@@ -78,4 +78,9 @@ public interface TStSuccessorMapper
      * @return
      */
     public int updateStateByStaffId(Long staffId);
+
+    /**
+     * 根据学员id查询继任者清单详细信息
+     */
+    public TStSuccessor selectTStSuccessorBySuccessorId(Long staffId);
 }

+ 5 - 0
master/src/main/java/com/ruoyi/project/training/spec/service/ITStSuccessorService.java

@@ -75,4 +75,9 @@ public interface ITStSuccessorService
      * @return
      */
     public int updateStateByStaffId(Long staffId);
+
+    /**
+     * 根据学员id查询继任者清单详细信息
+     */
+    public TStSuccessor selectTStSuccessorBySuccessorId(Long staffId);
 }

+ 8 - 0
master/src/main/java/com/ruoyi/project/training/spec/service/impl/TStSuccessorServiceImpl.java

@@ -114,4 +114,12 @@ public class TStSuccessorServiceImpl implements ITStSuccessorService
     public int updateStateByStaffId(Long staffId) {
         return tStSuccessorMapper.updateStateByStaffId(staffId);
     }
+
+    /**
+     * 根据学员id查询继任者清单详细信息
+     */
+    @Override
+    public TStSuccessor selectTStSuccessorBySuccessorId(Long staffId) {
+        return tStSuccessorMapper.selectTStSuccessorBySuccessorId(staffId);
+    }
 }

+ 6 - 0
master/src/main/resources/mybatis/training/spec/TStSuccessorMapper.xml

@@ -29,6 +29,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join t_staffmgr m on m.staffid = d.mentor_staff_id
     </sql>
 
+    <!-- 根据学员id查询继任者清单详细信息 -->
+    <select id="selectTStSuccessorBySuccessorId" parameterType="Long" resultMap="TStSuccessorResult">
+        <include refid="selectTStSuccessorVo"/>
+        where d.staff_id = #{staffId}
+    </select>
+
     <!-- 根据staffId修改“进行中”的继任者计划状态为“因离职中止” -->
     <update id="updateStateByStaffId" parameterType="Long">
         update t_st_successor set state = 2 where (staff_id = #{staffId} or mentor_staff_id = #{staffId}) and state = 0

+ 8 - 0
ui/src/api/training/spec/successor.js

@@ -1,5 +1,13 @@
 import request from '@/utils/request'
 
+// 根据学员id查询继任者清单详细信息
+export function getSuccessorBySuccessorId(successorId) {
+  return request({
+    url: '/spec/successor/getInfoBySuccessorId/' + successorId,
+    method: 'get'
+  })
+}
+
 // 查询导师列表
 export function listMentors() {
   return request({

+ 12 - 0
ui/src/router/index.js

@@ -173,6 +173,18 @@ export const constantRoutes = [
         component: (resolve) => require(['@/views/training/spec/successor/successorPlan'], resolve),
         name: 'SuccessorPlan',
         meta: { title: '培训计划清单' }
+      },
+      {
+        path: 'monthdata/:staffId(\\d+)',
+        component: (resolve) => require(['@/views/training/spec/successor/monthdata'], resolve),
+        name: 'monthdata',
+        meta: { title: '月度数据' }
+      },
+      {
+        path: 'seasondata/:staffId(\\d+)',
+        component: (resolve) => require(['@/views/training/spec/successor/seasondata'], resolve),
+        name: 'seasondata',
+        meta: { title: '季度数据' }
       }
     ]
   },

+ 18 - 0
ui/src/views/training/spec/successor/index.vue

@@ -108,6 +108,16 @@
             type="text"
             @click="planList(scope.row)"
           >培养计划</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            @click="monthData(scope.row)"
+          >月度历史</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            @click="seasonData(scope.row)"
+          >季度历史</el-button>
           <el-button
             size="mini"
             type="text"
@@ -502,6 +512,14 @@ export default {
         const staffId = row.staffId
         this.$router.push("/training/spec/successorPlan/" + staffId);
       },
+      monthData(row){
+        const staffId = row.staffId
+        this.$router.push("/training/spec/monthdata/" + staffId);
+      },
+      seasonData(row){
+        const staffId = row.staffId
+        this.$router.push("/training/spec/seasondata/" + staffId);
+      },
       openStaffResume(row){
         this.staffResumeVisible = true
         this.$nextTick(() => {

+ 715 - 0
ui/src/views/training/spec/successor/monthdata.vue

@@ -0,0 +1,715 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索栏 -->
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+      <el-form-item label="年" prop="feedbackYear">
+        <el-date-picker
+          v-model="queryParams.feedbackYearTemp"
+          placeholder="请选择年"
+          clearable
+          type="year"
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width:200px"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- 标签页 -->
+    <el-tabs type="border-card" @tab-click="handleTabClick" v-model="activeMonth">
+      <el-tab-pane
+        :key="item.key"
+        v-for="(item) in monthTabs"
+        :label="item.value"
+        :name="item.key"
+        :lazy="true"
+      >
+        <div v-if="item.key == activeMonth">
+          <!-- 培养计划总表 -->
+          <el-table
+            v-loading="loading"
+            :data="dataList"
+            @selection-change="handleSelectionChange"
+            ref="feedbackListSeasonalTable"
+            border
+            :cell-style="tableCellStyle"
+          >
+            <template slot="empty">
+              <el-empty :image-size="100" description='当月无学习计划'></el-empty>
+            </template>
+            <el-table-column label="培养内容" align="center" prop="plantName" width="600px"/>
+            <el-table-column label="开始日期" align="center" prop="startDate"/>
+            <el-table-column label="结束日期" align="center" prop="endDate"/>
+            <el-table-column label="实际完成日期" align="center" prop="dateOfCompletion"/>
+            <el-table-column label="学习状态" align="center" prop="studyState" :formatter="studyStateFormat"/>
+            <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-chat-dot-round"
+                  v-hasPermi="['spec:plan:edit']"
+                  @click="handleFeedback(scope.row)"
+                >详情</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <!-- 导师反馈 -->
+          <div>
+            <h3>导师反馈</h3>
+            <span
+              v-html="mentorFeedback" 
+              style="overflow:scroll; display:block; border:1px solid #CCCCCC; height: 300px; padding:15px;font-family: Helvetica, Arial, sans-serif; font-size: 13px;"
+            >
+            </span>
+          </div>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+    <!-- 详情对话框 -->
+    <el-dialog v-dialogDrag :title="feedbackDialog.title" :visible.sync="feedbackDialog.open" width="800px" append-to-body>
+      <div style="width:700px; margin:0px auto;">
+        <h3 style="margin-bottom:20px;">学员心得</h3>
+        <el-table :data="tableData" border style="width: 100%">
+          <el-table-column prop="id" label="编号" width="50"></el-table-column>
+          <el-table-column prop="question" label="问题" width="250"></el-table-column>
+          <el-table-column prop="answer" label="答案"></el-table-column>
+        </el-table>
+        <el-table :data="docFeedback.commonfileList" border>
+          <el-table-column :label="$t('文件名')" align="center" prop="fileName" :show-overflow-tooltip="true">
+            <template slot-scope="scope">
+              <a  class="link-type"  @click="handleDownload(scope.row)">
+                <span>{{ scope.row.fileName }}</span>
+              </a>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('大小(Kb)')" align="center" prop="fileSize" :show-overflow-tooltip="true" width="80" />
+          <el-table-column :label="$t('上传人')" align="center" prop="creator" :show-overflow-tooltip="true" width="120"/>
+          <el-table-column :label="$t('操作')" align="center" width="120" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                v-if="scope.row.fileName.endsWith('pdf')"
+                size="mini"
+                type="text"
+                icon="el-icon-view"
+                @click="handleSee(scope.row)"
+              >{{ $t('预览') }}</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-download"
+                @click="handleDownload(scope.row)"
+              >{{ $t('下载') }}</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-form v-if="detailFeedback != null">
+          <h3 style="margin-top:30px;margin-bottom:20px;">导师反馈</h3>
+          <el-form-item>
+            <p v-html="detailFeedback" style="border:1px solid #DFE6EC; overflow:scroll; height:200px;"/>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getAnswer, addAnswer, updateAnswer, listAnswer } from "@/api/training/spec/answer";
+import { allFileList, delCommonfile } from "@/api/common/commonfile";
+import { addFeedback, getFeedbackByParams, listInvitedSuccessor, updateFeedback, listFeedback, getFeedbackByPlanId } from "@/api/training/spec/feedback";
+import { listMentors, getSuccessorBySuccessorId } from "@/api/training/spec/successor";
+import { listSuccessorsByMentorId, listPlanMonthly } from "@/api/training/spec/plan";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Editor from '@/components/Editor';
+import { getStaffId, isMentor } from "@/api/plant/staffmgr";
+
+export default {
+  name: "MonthlyFeedback",
+  components: { Treeselect, Editor },
+  data() {
+    return {
+      // 当前用户id
+      staffId: null,
+      // 是否为导师
+      isMentor: null,
+      // 首选标签页
+      activeMonth: null,
+      // 月份标签页
+      monthTabs: [
+        { key: "1", value: "1月" },
+        { key: "2", value: "2月" },
+        { key: "3", value: "3月" },
+        { key: "4", value: "4月" },
+        { key: "5", value: "5月" },
+        { key: "6", value: "6月" },
+        { key: "7", value: "7月" },
+        { key: "8", value: "8月" },
+        { key: "9", value: "9月" },
+        { key: "10", value: "10月" },
+        { key: "11", value: "11月" },
+        { key: "12", value: "12月" }
+      ],
+      // 导师标签
+      mentorTabs: [],
+      // 详情对话框表格数据
+      tableData: [],
+      // 反馈id
+      feedbackId: null,
+      // 父级反馈id
+      parentId: null,
+      // 会议日期快捷选项
+      pickerOptions: {
+        shortcuts: [{
+          text: '今天',
+          onClick(picker) {
+            picker.$emit('pick', new Date());
+          }
+        }, {
+          text: '昨天',
+          onClick(picker) {
+            const date = new Date();
+            date.setTime(date.getTime() - 3600 * 1000 * 24);
+            picker.$emit('pick', date);
+          }
+        }, {
+          text: '一周前',
+          onClick(picker) {
+            const date = new Date();
+            date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+            picker.$emit('pick', date);
+          }
+        }, {
+          text: '一周后',
+          onClick(picker) {
+            const date = new Date();
+            date.setTime(date.getTime() + 3600 * 1000 * 24 * 7);
+            picker.$emit('pick', date);
+          }
+        }]
+      },
+      // 会议日期
+      meetingDate: null,
+      // 学习状态字典
+      studyStateOptions: [],
+      // 汇报展示附件参数
+      doc: {  // 反馈附件
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
+        commonfileList: null,
+        queryParams: {
+          pId: null,
+          pType: 'docSeasonal'
+        },
+        pType: 'docSeasonal',
+        pId: null
+      },
+      // 培养计划总表数据
+      dataList: [],
+      // 首选标签页
+      activeName: null,
+      // 学员下拉列表
+      successorOptions: [],
+      // 导师下拉列表
+      mentorOptions: [],
+      // 导师数组
+      mentorOptionsArray: [],
+      // 包含导师id的查询对象
+      queryObject: {
+        mentorStaffId: ""
+      },
+      // 导师反馈内容
+      mentorFeedback: "", // 季度反馈内容
+      detailFeedback: "", // 计划详情反馈内容
+      // 反馈对话框参数
+      feedbackDialog: {
+        id: 0,
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: ""
+      },
+      // 问卷单选框
+      radio1: '',
+      radio2: '',
+      radio3: '',
+      radio4: '',
+      radio5: '',
+      radio6: '',
+      radio7: '',
+      radio8: '',
+      radio9: '',
+      radio10: '',
+      radio11: '',
+      radio12: '',
+      radio13: '',
+      radio14: '',
+      // 报告附件参数
+      doc: {  // 季度汇报附件
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
+        commonfileList: null,
+        queryParams: {
+          pId: null,
+          pType: 'plan'
+        },
+        pType: 'plan',
+        pId: null
+      },
+      docFeedback: {  // 反馈附件
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
+        commonfileList: null,
+        queryParams: {
+          pId: null,
+          pType: 'docFeedback'
+        },
+        pType: 'docFeedback',
+        pId: null
+      },
+      // 标签页选中项
+      activeName: 'zhu',
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 专项培训反馈表格数据
+      feedbackList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+        // 用户导入参数
+        upload: {
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 是否更新已经存在的用户数据
+            updateSupport: 0,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/spec/feedback/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 100,
+        feedbackType: null,
+        mentorId: null,
+        successorId: null,
+        successorName: null,
+        parentId: null,
+        planId: null,
+        feedbackYear: null,
+        feedbackYearTemp: null,
+        feedbackSeason: null,
+        feedbackMonth: null,
+        successorFeedback: null,
+        mentorFeedback: null,
+        feedbackScore: null,
+        feedbackStatus: null,
+        meetingDate: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight -250
+    })
+    const staffId = this.$route.params && this.$route.params.staffId;
+    this.queryParams.successorId = staffId;
+    // 获取学习状态字典
+    this.getDicts("st_study_state").then(response => {
+      this.studyStateOptions = response.data;
+    });
+    // 初始化页面数据
+    this.initPageData();
+  },
+  methods: {
+    /** 标签页切换事件 */
+    handleTabClick(tab) {
+      this.queryParams.feedbackMonth = tab.name;
+      this.getList();
+      // 清空导师反馈内容
+      this.mentorFeedback = "";
+      // 根据月获取反馈id
+      getFeedbackByParams({
+        successorId: this.queryParams.successorId,
+        feedbackYear: this.queryParams.feedbackYear,
+        feedbackMonth: this.queryParams.feedbackMonth,
+      }).then(response => {
+        let data = response.data;
+        // 设置反馈id为当前月反馈id
+        this.feedbackId = data.id;
+        // 刷新导师反馈内容
+        this.mentorFeedback = data.mentorFeedback;
+      });
+    },
+    /** 初始化页面数据 */
+    initPageData() {
+      // 获取当前日期
+      let date = new Date();
+      // 搜索条件默认为当年、当月
+      this.queryParams.feedbackYear = date.getFullYear().toString();
+      this.queryParams.feedbackYearTemp = date.getFullYear().toString();
+      this.queryParams.feedbackMonth = ( date.getMonth() + 1 ).toString();
+      this.activeMonth = ( date.getMonth() + 1 ).toString();
+      // 获取当前用户id
+      getStaffId().then(response => {
+        this.staffId = response.data;
+        // 判断当前用户是否为导师
+        return isMentor();
+      })
+      .then(response => {
+        this.isMentor = response.data;
+        if (this.isMentor) {  // 当前用户是导师
+          // 获取当前导师的学员列表
+          listSuccessorsByMentorId(this.queryObject).then(response => {
+            let data = response.data;
+            for (let i = 0; i < data.length; i++) {
+              if (i == 0 && data.length != 0) {
+                getSuccessorBySuccessorId(this.queryParams.successorId).then(response => {
+                  this.queryParams.mentorId = response.data.mentorId;
+                });
+                // 查询学习计划列表
+                this.getList();
+              }
+              this.successorOptions.push( { key: data[i].staffId, value: data[i].staffName } );
+            }
+            if (data.length != 0) {
+              // 获取当前学员当年当月反馈id
+              getFeedbackByParams({
+                successorId: this.queryParams.successorId,
+                feedbackYear: this.queryParams.feedbackYear,
+                feedbackMonth: this.queryParams.feedbackMonth
+              }).then(response => {
+                let data = response.data;
+                this.feedbackId = data.id;
+                this.mentorFeedback = data.mentorFeedback;
+              });
+            }else {
+              this.loading = false;
+              return;
+            }
+          });
+        } else {  // 当前用户是学员
+          // 学员id = 当当前用户id
+          this.queryParams.successorId = this.staffId;
+          // 查询学习计划列表
+          this.getList();
+          // 获取当前学员当年当月反馈id
+          getFeedbackByParams({
+            successorId: this.queryParams.successorId,
+            feedbackYear: this.queryParams.feedbackYear,
+            feedbackMonth: this.queryParams.feedbackMonth
+          }).then(response => {
+            let data = response.data;
+            this.feedbackId = data.id;
+            this.mentorFeedback = data.mentorFeedback;
+          });
+        }
+      });
+    },
+    /** 保存导师反馈内容 */
+    saveMentorFeedback() {
+      let feedback = {};
+      feedback.id = this.feedbackId;
+      feedback.mentorFeedback = this.mentorFeedback;
+      updateFeedback(feedback);
+    },
+    /** 保存按钮处理 */
+    handleSave() {
+      // 保存导师反馈内容
+      this.saveMentorFeedback();
+      this.msgSuccess("保存成功");
+    },
+    /** 培养计划详情处理 */
+    handleFeedback(row) {
+      // 加载反馈附件
+      this.docFeedback.id = row.id;
+      this.docFeedback.queryParams.pId = row.id
+      this.docFeedback.pId = row.id
+      this.getFileListFeedback();
+      // 清空导师反馈内容
+      this.detailFeedback = null;
+      // 清空表格数据
+      this.tableData = [];
+      let feedback1 = {};
+      feedback1.planId = row.id;
+      feedback1.questionId = 1;
+      let feedback2 = {};
+      feedback2.planId = row.id;
+      feedback2.questionId = 2;
+      let feedback3 = {};
+      feedback3.planId = row.id;
+      feedback3.questionId = 3;
+      let answerObj1 = {};
+      let answerObj2 = {};
+      let answerObj3 = {};
+      // 获取问题和答案
+      getAnswer(feedback1).then(response => {
+        let data = response.data;
+        if (data != null) {
+          answerObj1 = { id: 1, question: data.question, answer: data.answer};
+        }
+        return getAnswer(feedback2);
+      }).then(response => {
+        let data = response.data;
+        if (data != null) {
+          answerObj2 = { id: 2, question: data.question, answer: data.answer};
+        }
+        return getAnswer(feedback3);
+      }).then(response => {
+        let data = response.data;
+        if (data != null) {
+          answerObj3 = { id: 3, question: data.question, answer: data.answer};
+          this.tableData.push(answerObj1);
+          this.tableData.push(answerObj2);
+          this.tableData.push(answerObj3);
+        }
+        // 获取导师反馈内容
+        return getFeedbackByPlanId(row.id);
+      }).then(response => {
+        if (response.data != null) {
+          let data = response.data;
+          this.detailFeedback = data.mentorFeedback;
+        }
+        this.feedbackDialog.title = row.staffName + row.plantName + "学习情况详情";
+        this.feedbackDialog.planId = row.id;
+        this.feedbackDialog.studyState = row.studyState;
+        this.feedbackDialog.open = true;
+      });
+    },
+    /** 单元格样式 */
+    tableCellStyle(row, column, rowIndex, columnIndex) {
+      if (row.column.label === "实际完成日期" && row.row.dateOfCompletion > row.row.endDate) {
+        return "background: #FFEEEE"
+      }
+    },
+    /** 学习状态字典翻译 */
+    studyStateFormat(row, column) {
+      return this.selectDictLabel(this.studyStateOptions, row.studyState);
+    },
+    /** 文件下载处理 */
+    handleDownload(row) {
+      var name = row.fileName;
+      var url = row.fileUrl;
+      var suffix = url.substring(url.lastIndexOf("."), url.length);
+      const a = document.createElement('a');
+      a.setAttribute('download', name);
+      a.setAttribute('target', '_blank');
+      a.setAttribute('href', process.env.VUE_APP_BASE_API + url);
+      a.click();
+    },
+    openPdf() {
+      window.open(this.pdf.pdfUrl);//path是文件的全路径地址
+    },
+    handleSee(row) {
+      this.pdf.open = true;
+      this.pdf.title = row.fileName;
+      this.pdf.pdfUrl = process.env.VUE_APP_BASE_API +'/pdf/web/viewer.html?file=' + process.env.VUE_APP_BASE_API + row.fileUrl;
+    },
+    /** 汇报附件参数初始化 */
+    initFileList(id) {
+      this.doc.queryParams.pId = id
+      this.doc.pId = id
+      this.getFileList()
+      // this.$nextTick(() => {
+      //   this.$refs.doc.clearFiles()
+      // })
+    },
+    getFileList() {
+      allFileList(this.doc.queryParams).then(response => {
+        this.doc.commonfileList = response;
+      });
+    },
+    getFileListFeedback() {
+      allFileList(this.docFeedback.queryParams).then(response => {
+        this.docFeedback.commonfileList = response;
+      });
+    },
+    /** 附件上传中处理 */
+    handleFileDocProgress(event, file, fileList) {
+      this.doc.file = file;
+      this.doc.isUploading = true;
+    },
+    handleFileDocProgressFeedback(event, file, fileList) {
+      this.docFeedback.file = file;
+      this.docFeedback.isUploading = true;
+    },
+    /** 附件上传成功处理 */
+    handleFileDocSuccess(response, file, fileList) {
+      this.doc.isUploading = false;
+      this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
+      this.getFileList()
+    },
+    handleFileDocSuccessFeedback(response, file, fileList) {
+      this.docMentorFeedback.isUploading = false;
+      this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
+      this.getFileListFeedback()
+    },
+    /** 删除按钮操作 */
+    handleDeleteDoc(row) {
+      const ids = row.id || this.ids;
+      this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: "warning"
+      }).then(function() {
+        return delCommonfile(ids);
+      }).then(() => {
+        this.getFileList()
+        this.msgSuccess(this.$t('删除成功'));
+      })
+    },
+    /** 查询专项培训反馈列表 */
+    getList() {
+      this.loading = true;
+      listPlanMonthly(this.queryParams).then(response => {
+        this.dataList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+        console.log(this.queryParams);
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        feedbackType: null,
+        mentorId: null,
+        successorId: null,
+        successorName: null,
+        parentId: null,
+        planId: null,
+        feedbackYear: null,
+        feedbackSeason: null,
+        feedbackMonth: null,
+        successorFeedback: null,
+        mentorFeedback: null,
+        feedbackScore: null,
+        feedbackStatus: 0,
+        meetingDate: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      if (typeof(this.queryParams.feedbackYearTemp) == 'string') {
+        this.queryParams.feedbackYear = this.queryParams.feedbackYearTemp;
+      } else {
+        this.queryParams.feedbackYear = this.queryParams.feedbackYearTemp.getFullYear();
+      }
+      this.queryParams.pageNum = 1;
+      this.getList();
+      // 清空导师反馈内容
+      this.mentorFeedback = "";
+      getFeedbackByParams({
+        successorId: this.queryParams.successorId,
+        feedbackYear: this.queryParams.feedbackYear,
+        feedbackMonth: this.queryParams.feedbackMonth,
+      }).then(response => {
+        let data = response.data;
+        this.feedbackId = data.id;
+        this.mentorFeedback = data.mentorFeedback;
+      });
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
+
+<style scoped>
+  .question{
+    margin: 20px 0px;
+    padding-left: 20px;
+  }
+  .answer{
+    padding-bottom: 10px;
+    padding-left: 40px;
+  }
+  h3{
+    margin: 20px 0px;
+  }
+</style>

+ 1241 - 0
ui/src/views/training/spec/successor/seasondata.vue

@@ -0,0 +1,1241 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索栏 -->
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+      <el-form-item label="年" prop="feedbackYear">
+        <el-date-picker
+          v-model="queryParams.feedbackYearTemp"
+          placeholder="请选择年"
+          clearable
+          type="year"
+          size="small"
+          @keyup.enter.native="handleQuery"
+          @change="yearFormateter"
+          style="width:200px"
+        />
+      </el-form-item>
+      <el-form-item label="季度" prop="feedbackSason">
+        <el-select
+          v-model="queryParams.feedbackSeason"
+          placeholder="请选择季度"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width:200px"
+        >
+          <el-option label="第一季度" value="1"></el-option>
+          <el-option label="第二季度" value="2"></el-option>
+          <el-option label="第三季度" value="3"></el-option>
+          <el-option label="第四季度" value="4"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <!-- <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> -->
+      </el-form-item>
+    </el-form>
+    <!-- 标签页 -->
+    <el-tabs type="border-card" @tab-click="handleTabClick" v-model="activeName">
+      <el-tab-pane
+        :key="item.name"
+         v-for="(item) in mentorTabs"
+        :label="item.title"
+        :name="item.name"
+        :lazy="true"
+      >
+        <div v-if="item.name == activeName">
+        <!-- 培养计划总表 -->
+        <el-table
+          v-loading="loading"
+          :data="dataList"
+          @selection-change="handleSelectionChange"
+          ref="feedbackListSeasonalTable"
+          border
+          :cell-style="tableCellStyle"
+        >
+          <el-table-column label="培养内容" align="center" prop="plantName" width="600px"/>
+          <el-table-column label="开始日期" align="center" prop="startDate"/>
+          <el-table-column label="结束日期" align="center" prop="endDate"/>
+          <el-table-column label="实际完成日期" align="center" prop="dateOfCompletion"/>
+          <el-table-column label="学习状态" align="center" prop="studyState" :formatter="studyStateFormat"/>
+          <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-chat-dot-round"
+                v-hasPermi="['spec:plan:edit']"
+                @click="handleFeedback(scope.row)"
+              >详情</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 汇报附件 -->
+        <div>
+          <h3>汇报展示PPT</h3>
+          
+          <el-table :data="doc.commonfileList" border style="width:600px;">
+            <el-table-column :label="$t('文件名')" align="center" prop="fileName" :show-overflow-tooltip="true">
+              <template slot-scope="scope">
+                <a  class="link-type"  @click="handleDownload(scope.row)">
+                  <span>{{ scope.row.fileName }}</span>
+                </a>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('操作')" align="center" width="120" class-name="small-padding fixed-width">
+              <template slot-scope="scope">
+                <el-button
+                  v-if="scope.row.fileName.endsWith('pdf')"
+                  size="mini"
+                  type="text"
+                  icon="el-icon-view"
+                  @click="handleSee(scope.row)"
+                >{{ $t('预览') }}</el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-download"
+                  @click="handleDownload(scope.row)"
+                >{{ $t('下载') }}</el-button>
+                <el-button
+                  v-if="!isMentor"
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDeleteDoc(scope.row)"
+                >{{ $t('删除') }}</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <!-- 问卷 -->
+        <div v-if="isMentor">
+          <div style="display:inline-block;width:40%;">
+            <h3 style="margin-bottom:0px;">学员表现</h3>
+            <div class="question">
+              1.	学员的现场汇报精神面貌如何?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio1" size="small">
+                <el-radio label="1">优秀</el-radio>
+                <el-radio label="2">良好</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              2.	学员的现场汇报语言表达如何?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio2" size="small">
+                <el-radio label="1">优秀</el-radio>
+                <el-radio label="2">良好</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              3.	学员的现场汇报逻辑思维如何?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio3" size="small">
+                <el-radio label="1">优秀</el-radio>
+                <el-radio label="2">良好</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <h3 style="margin-bottom:0px;">汇报材料及内容</h3>
+            <div class="question">
+              4.	汇报材料准备是否充分,汇报材料是否紧贴本季学习内容?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio4" size="small">
+                <el-radio label="1">充分</el-radio>
+                <el-radio label="2">比较充分</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              5.	汇报内容是否符合学习材料(SOP或者程序)的要求?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio5" size="small">
+                <el-radio label="1">完全符合</el-radio>
+                <el-radio label="2">基本符合</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              6.	学员对本季的学习内容、学习目标及学习结果的阐述是否具体、完整、准确?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio6" size="small">
+                <el-radio label="1">非常全面</el-radio>
+                <el-radio label="2">全面</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              7.	学员本季汇报内容较上次是否有所提升?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio7" size="small">
+                <el-radio label="1">进步明显</el-radio>
+                <el-radio label="2">略有提升</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+          </div>
+          <div style="display:inline-block;width:40%;">
+            <div class="question">
+              8.	汇报内容针对本季学习范围是否存在明显的汇报漏项或者不足?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio8" size="small">
+                <el-radio label="1">完全不存在</el-radio>
+                <el-radio label="2">基本不存在</el-radio>
+                <el-radio label="3">无明显存在</el-radio>
+                <el-radio label="4">存在</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              9.	学员的本季汇报内容是否结合岗位工作实际?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio9" size="small">
+                <el-radio label="1">紧密结合</el-radio>
+                <el-radio label="2">结合</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              10.	学员在实际工作中是否能够学有所用?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio10" size="small">
+                <el-radio label="1">灵活运用</el-radio>
+                <el-radio label="2">基本运用</el-radio>
+                <el-radio label="3">尝试运用</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              11.	汇报内容对目标岗位建设是否能起到启发促进作用?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio11" size="small">
+                <el-radio label="1">极有建设性</el-radio>
+                <el-radio label="2">建设性</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              12.	汇报内容对于装置及公司的人才培养计划是否能起到建设性促进作用?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio12" size="small">
+                <el-radio label="1">极有建设性</el-radio>
+                <el-radio label="2">建设性</el-radio>
+                <el-radio label="3">一般</el-radio>
+                <el-radio label="4">基本合格</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              13.	汇报内容是否有对装置生产、管理、建设提出合理化建议?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio13" size="small">
+                <el-radio label="1">有可采用的合理化建议</el-radio>
+                <el-radio label="2">有可行性合理化建议</el-radio>
+                <el-radio label="3">有合理化建议</el-radio>
+                <el-radio label="4">无</el-radio>
+              </el-radio-group>
+            </div>
+            <div class="question">
+              14.	汇报内容是否对下期培训提出新的培训需求?
+            </div>
+            <div class="answer">
+              <el-radio-group v-model="radio14" size="small">
+                <el-radio label="1">有计划外需求</el-radio>
+                <el-radio label="2">有计划内需求</el-radio>
+                <el-radio label="3">有需求</el-radio>
+                <el-radio label="4">无具体需求</el-radio>
+              </el-radio-group>
+            </div>
+          </div>
+        </div>
+        <!-- 导师反馈 -->
+        <div>
+          <div>
+            <h3>导师反馈</h3>
+            <span
+              v-html="mentorFeedback"
+              style="overflow:scroll; display:block; border:1px solid #CCCCCC; height: 300px; padding:15px;font-family: Helvetica, Arial, sans-serif; font-size: 13px;"
+            ></span>
+          </div>
+        </div>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+    <!-- 详情对话框 -->
+    <el-dialog v-dialogDrag :title="feedbackDialog.title" :visible.sync="feedbackDialog.open" width="800px" append-to-body>
+      <div style="width:700px; margin:0px auto;">
+        <h3 style="margin-bottom:20px;">学员心得</h3>
+        <el-table :data="tableData" border style="width: 100%">
+          <el-table-column prop="id" label="编号" width="50"></el-table-column>
+          <el-table-column prop="question" label="问题" width="250"></el-table-column>
+          <el-table-column prop="answer" label="答案"></el-table-column>
+        </el-table>
+        <el-table :data="docFeedback.commonfileList" border>
+          <el-table-column :label="$t('文件名')" align="center" prop="fileName" :show-overflow-tooltip="true">
+            <template slot-scope="scope">
+              <a  class="link-type"  @click="handleDownload(scope.row)">
+                <span>{{ scope.row.fileName }}</span>
+              </a>
+            </template>
+          </el-table-column>
+          <el-table-column :label="$t('大小(Kb)')" align="center" prop="fileSize" :show-overflow-tooltip="true" width="80" />
+          <el-table-column :label="$t('上传人')" align="center" prop="creator" :show-overflow-tooltip="true" width="120"/>
+          <el-table-column :label="$t('操作')" align="center" width="120" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                v-if="scope.row.fileName.endsWith('pdf')"
+                size="mini"
+                type="text"
+                icon="el-icon-view"
+                @click="handleSee(scope.row)"
+              >{{ $t('预览') }}</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-download"
+                @click="handleDownload(scope.row)"
+              >{{ $t('下载') }}</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-form v-if="detailFeedback != null">
+          <h3 style="margin-top:30px;margin-bottom:20px;">导师反馈</h3>
+          <el-form-item>
+            <p v-html="detailFeedback" style="border:1px solid #DFE6EC; overflow:scroll; height:200px;"/>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getAnswer, addAnswer, updateAnswer, listAnswer } from "@/api/training/spec/answer";
+import { listScore, getScore, delScore, addScore, updateScore, exportScore, importTemplate} from "@/api/training/spec/score";
+import { allFileList, delCommonfile } from "@/api/common/commonfile";
+import { saveSeasonalFeedback, addFeedback, getFeedbackByParams, listInvitedSuccessor, updateFeedback, listFeedback, getFeedbackByPlanId } from "@/api/training/spec/feedback";
+import { listMentors, getSuccessorBySuccessorId } from "@/api/training/spec/successor";
+import { listSuccessorsByMentorId, listPlanSeasonal } from "@/api/training/spec/plan";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import Editor from '@/components/Editor';
+import { listMentors2, getStaffId, isMentor } from "@/api/plant/staffmgr";
+
+export default {
+  name: "SeasonalFeedback",
+  components: { Treeselect, Editor },
+  data() {
+    return {
+      // 当前导师是否为父级导师
+      isParentMentor: false,
+      // 父级反馈导师id
+      mentorId: null,
+      // 是否为第一次搜索
+      isFirstSearch: true,
+      // 当前用户id
+      staffId: null,
+      // 是否为导师
+      isMentor: null,
+      // 显示保存按钮
+      showSaveButton: false,
+      // 导师标签
+      mentorTabs: [],
+      // 详情对话框表格数据
+      tableData: [],
+      // 反馈id
+      feedbackId: null,
+      // 父级反馈id
+      parentId: null,
+      // 会议日期快捷选项
+      pickerOptions: {
+        shortcuts: [{
+          text: '今天',
+          onClick(picker) {
+            picker.$emit('pick', new Date());
+          }
+        }, {
+          text: '昨天',
+          onClick(picker) {
+            const date = new Date();
+            date.setTime(date.getTime() - 3600 * 1000 * 24);
+            picker.$emit('pick', date);
+          }
+        }, {
+          text: '一周前',
+          onClick(picker) {
+            const date = new Date();
+            date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+            picker.$emit('pick', date);
+          }
+        }, {
+          text: '一周后',
+          onClick(picker) {
+            const date = new Date();
+            date.setTime(date.getTime() + 3600 * 1000 * 24 * 7);
+            picker.$emit('pick', date);
+          }
+        }]
+      },
+      // 会议日期
+      meetingDate: null,
+      // 学习状态字典
+      studyStateOptions: [],
+      // 汇报展示附件参数
+      doc: {  // 反馈附件
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
+        commonfileList: null,
+        queryParams: {
+          pId: null,
+          pType: 'docSeasonal'
+        },
+        pType: 'docSeasonal',
+        pId: null
+      },
+      // 培养计划总表数据
+      dataList: [],
+      // 首选标签页
+      activeName: null,
+      // 学员下拉列表
+      successorOptions: [],
+      // 导师下拉列表
+      mentorOptions: [],
+      // 导师数组
+      mentorOptionsArray: [],
+      // 包含导师id的查询对象
+      queryObject: {
+        mentorStaffId: ""
+      },
+      // 导师反馈内容
+      mentorFeedback: "", // 季度反馈内容
+      detailFeedback: "", // 计划详情反馈内容
+      // 反馈对话框参数
+      feedbackDialog: {
+        id: 0,
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: ""
+      },
+      // 问卷单选框
+      radio1: '',
+      radio2: '',
+      radio3: '',
+      radio4: '',
+      radio5: '',
+      radio6: '',
+      radio7: '',
+      radio8: '',
+      radio9: '',
+      radio10: '',
+      radio11: '',
+      radio12: '',
+      radio13: '',
+      radio14: '',
+      // 报告附件参数
+      doc: {  // 季度汇报附件
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
+        commonfileList: null,
+        queryParams: {
+          pId: null,
+          pType: 'plan'
+        },
+        pType: 'plan',
+        pId: null
+      },
+      docFeedback: {  // 反馈附件
+        file: "",
+        // 是否显示弹出层(报告附件)
+        open: false,
+        // 弹出层标题(报告附件)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 报告附件上传位置编号
+        ids: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/common/commonfile/uploadFile",
+        commonfileList: null,
+        queryParams: {
+          pId: null,
+          pType: 'docFeedback'
+        },
+        pType: 'docFeedback',
+        pId: null
+      },
+      // 标签页选中项
+      activeName: 'zhu',
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 专项培训反馈表格数据
+      feedbackList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+        // 用户导入参数
+        upload: {
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 是否更新已经存在的用户数据
+            updateSupport: 0,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/spec/feedback/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 100,
+        feedbackType: null,
+        mentorId: null,
+        successorId: null,
+        successorName: null,
+        parentId: null,
+        planId: null,
+        feedbackYear: null,
+        feedbackYearTemp: null,
+        feedbackSeason: null,
+        feedbackMonth: null,
+        successorFeedback: null,
+        mentorFeedback: null,
+        feedbackScore: null,
+        feedbackStatus: null,
+        meetingDate: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+  },
+  created() {
+    //设置表格高度对应屏幕高度
+    this.$nextTick(() => {
+      this.clientHeight = document.body.clientHeight -250
+    })
+    const staffId = this.$route.params && this.$route.params.staffId;
+    this.queryParams.successorId = staffId;
+    // 获取学习状态字典
+    this.getDicts("st_study_state").then(response => {
+      this.studyStateOptions = response.data;
+    });
+    // 初始化页面数据
+    this.initPageData();
+  },
+  methods: {
+    /** 保存按钮处理 */
+    handleSave() {
+      // 问卷判空
+      if (this.isEmpty()) {
+        this.$message.error('问卷答案不能为空')
+        return;
+      }
+      // 保存季度反馈
+      saveSeasonalFeedback({
+        // 反馈id
+        feedbackId: this.feedbackId,
+        // 导师反馈内容
+        mentorFeedback: this.mentorFeedback,
+        // 问卷内容
+        tStQuestionAnswerArray: 
+        [
+          { questionId: 4, answer:this.radio1 },
+          { questionId: 5, answer:this.radio2 },
+          { questionId: 6, answer:this.radio3 },
+          { questionId: 7, answer:this.radio4 },
+          { questionId: 8, answer:this.radio5 },
+          { questionId: 9, answer:this.radio6 },
+          { questionId: 10, answer:this.radio7 },
+          { questionId: 11, answer:this.radio8 },
+          { questionId: 12, answer:this.radio9 },
+          { questionId: 13, answer:this.radio10 },
+          { questionId: 14, answer:this.radio11 },
+          { questionId: 15, answer:this.radio12 },
+          { questionId: 16, answer:this.radio13 },
+          { questionId: 17, answer:this.radio14 },
+        ]
+      }).then(() => {
+        this.msgSuccess("保存成功");
+      });
+    },
+    /** 设置最后截止日期 */
+    resetLastDay() {
+      // 最后截止日期
+      let lastDay = new Date(this.meetingDate);
+      lastDay.setTime(lastDay.getTime() + 3600 * 1000 * 24 * 7);
+      // 当前日期
+      let now = new Date();
+      if (lastDay > now) {
+        // 导师可修改反馈内容,学员不可查看导师反馈内容
+        this.showSaveButton = true;
+      } else {
+        // 导师不可修改反馈内容,学员可查看导师反馈内容
+        this.showSaveButton = false;
+      }
+    },
+    /** 标签页切换事件 */
+    handleTabClick(tab) {
+      this.activeName = tab.name;
+      if (this.isMentor) {
+        // 清空问卷
+        this.radio1 = null;
+        this.radio2 = null;
+        this.radio3 = null;
+        this.radio4 = null;
+        this.radio5 = null;
+        this.radio6 = null;
+        this.radio7 = null;
+        this.radio8 = null;
+        this.radio9 = null;
+        this.radio10 = null;
+        this.radio11 = null;
+        this.radio12 = null;
+        this.radio13 = null;
+        this.radio14 = null;
+      }
+      // 清空导师反馈内容
+      this.mentorFeedback = "";
+      // 查询参数
+      let feedback = {};
+      feedback.mentorId = tab.name;
+      feedback.successorId = this.queryParams.successorId;
+      feedback.feedbackYear = this.queryParams.feedbackYear;
+      feedback.feedbackSeason = this.queryParams.feedbackSeason;
+      // 是子节点
+      if (this.mentorId != tab.name) {
+        // 设置父节点id
+        feedback.parentId = this.parentId;
+      }
+      // 根据标签页导师id获取反馈id
+      getFeedbackByParams(feedback).then(response => {
+        let data = response.data;
+        // 设置反馈id为当前tab导师反馈id
+        this.feedbackId = data.id;
+        // 刷新导师反馈内容
+        this.mentorFeedback = data.mentorFeedback;
+        if (this.isMentor) {
+          // 刷新问卷
+          listAnswer( { feedbackId: this.feedbackId } ).then(response => {
+            let data = response.rows;
+            for (let i = 0; i < data.length; i++) {
+              if (data[i].questionId == "4") { this.radio1 = data[i].answer; }
+              if (data[i].questionId == "5") { this.radio2 = data[i].answer; }
+              if (data[i].questionId == "6") { this.radio3 = data[i].answer; }
+              if (data[i].questionId == "7") { this.radio4 = data[i].answer; }
+              if (data[i].questionId == "8") { this.radio5 = data[i].answer; }
+              if (data[i].questionId == "9") { this.radio6 = data[i].answer; }
+              if (data[i].questionId == "10") { this.radio7 = data[i].answer; }
+              if (data[i].questionId == "11") { this.radio8 = data[i].answer; }
+              if (data[i].questionId == "12") { this.radio9 = data[i].answer; }
+              if (data[i].questionId == "13") { this.radio10 = data[i].answer; }
+              if (data[i].questionId == "14") { this.radio11 = data[i].answer; }
+              if (data[i].questionId == "15") { this.radio12 = data[i].answer; }
+              if (data[i].questionId == "16") { this.radio13 = data[i].answer; }
+              if (data[i].questionId == "17") { this.radio14 = data[i].answer; }
+            }
+            window.scrollTo(0, 0);
+          });
+        }
+      });
+    },
+    /** 初始化页面数据 */
+    initPageData() {
+      // 获取当前日期
+      let date = new Date();
+      // 搜索条件默认为当年、当季度
+      this.queryParams.feedbackYear = date.getFullYear().toString();
+      this.queryParams.feedbackYearTemp = date.getFullYear().toString();
+      switch (date.getMonth() + 1) {
+        case 1:
+        case 2:
+        case 3:
+          this.queryParams.feedbackSeason = "1";
+          break;
+        case 4:
+        case 5:
+        case 6:
+          this.queryParams.feedbackSeason = "2";
+          break;
+        case 7:
+        case 8:
+        case 9:
+          this.queryParams.feedbackSeason = "3";
+          break;
+        case 10:
+        case 11:
+        case 12:
+          this.queryParams.feedbackSeason = "4";
+          break;
+      }
+      // 获取当前用户id
+      getStaffId().then(response => {
+        this.staffId = response.data;
+        // 判断当前用户是否为导师
+        return isMentor();
+      }).then(response => {
+        this.isMentor = response.data;
+        if (this.isMentor) {  // 当前用户是导师
+          // ====================获取导师下拉列表====================
+          listMentors2().then(response => {
+            let mentorList = response.data;
+            for (let i = 0; i < mentorList.length; i++) {
+              if (mentorList[i].staffid!=this.staffId) {
+                let mentor = {};
+                mentor.key = mentorList[i].staffid;
+                mentor.value = mentorList[i].name;
+                this.mentorOptions.push(mentor);
+              }
+            }
+          });
+          // ====================获取当前导师的学员列表====================
+          listSuccessorsByMentorId(this.queryObject).then(response => {
+            let data = response.data;
+            for (let i = 0; i < data.length; i++) {
+              this.successorOptions.push( { key: data[i].staffId, value: data[i].staffName } );
+            }
+            // ====================获取当前导师作为受邀导师的学员列表====================
+            return listInvitedSuccessor(null);
+          })
+          .then(response => {
+            let data = response.data;
+            for (let i = 0; i < data.length; i++) {
+              this.successorOptions.push( { key: data[i].successorId, value: data[i].successorName } );
+            }
+            // 学员数组去重
+            let map = new Map();
+            this.successorOptions.forEach((item, index) => {
+              if (!map.has(item["key"])) {
+                map.set(item["key"], item);
+              }
+            });
+            this.successorOptions = [...map.values()];
+            if (this.successorOptions.length != 0) {
+              getSuccessorBySuccessorId(this.queryParams.successorId).then(response => {
+                this.queryParams.mentorId = response.data.mentorId;
+              });
+              this.getList();
+            }
+            // 获取当前学员当年当季度反馈id
+            return getFeedbackByParams({
+              successorId: this.queryParams.successorId,
+              feedbackYear: this.queryParams.feedbackYear,
+              feedbackSeason: this.queryParams.feedbackSeason
+            });
+          })
+          .then(response => {
+              let data = response.data;
+              this.feedbackId = data.id;
+              this.mentorId = data.mentorId;
+              if (this.staffId == this.mentorId) {
+                this.isParentMentor = true;
+              }
+              this.parentId = data.id;
+              this.meetingDate = data.meetingDate;
+              this.resetLastDay();
+              this.mentorFeedback = data.mentorFeedback;
+              // 初始化汇报附件
+              this.initFileList(data.id);
+              // ====================初始化导师标签页====================
+              this.activeName = data.mentorId;
+              this.mentorTabs.push({ name: data.mentorId, title: data.mentorName});
+              listFeedback( { parentId: data.id } ).then(response => {
+                let data = response.rows;
+                for (let i = 0; i < data.length; i++) {
+                  this.mentorTabs.push({ name: data[i].mentorId, title: data[i].mentorName});
+                }
+              });
+              // ====================获取问卷答案====================
+              listAnswer( { feedbackId: this.feedbackId } ).then(response => {
+                let data = response.rows;
+                for (let i = 0; i < data.length; i++) {
+                  if (data[i].questionId == "4") { this.radio1 = data[i].answer; }
+                  if (data[i].questionId == "5") { this.radio2 = data[i].answer; }
+                  if (data[i].questionId == "6") { this.radio3 = data[i].answer; }
+                  if (data[i].questionId == "7") { this.radio4 = data[i].answer; }
+                  if (data[i].questionId == "8") { this.radio5 = data[i].answer; }
+                  if (data[i].questionId == "9") { this.radio6 = data[i].answer; }
+                  if (data[i].questionId == "10") { this.radio7 = data[i].answer; }
+                  if (data[i].questionId == "11") { this.radio8 = data[i].answer; }
+                  if (data[i].questionId == "12") { this.radio9 = data[i].answer; }
+                  if (data[i].questionId == "13") { this.radio10 = data[i].answer; }
+                  if (data[i].questionId == "14") { this.radio11 = data[i].answer; }
+                  if (data[i].questionId == "15") { this.radio12 = data[i].answer; }
+                  if (data[i].questionId == "16") { this.radio13 = data[i].answer; }
+                  if (data[i].questionId == "17") { this.radio14 = data[i].answer; }
+                }
+              window.scrollTo(0, 0);
+              });
+          });
+        } else {  // 当前用户是学员
+          this.queryParams.successorId = this.staffId;
+          this.getList();
+          // 获取当前学员当年当季度反馈id
+          getFeedbackByParams({
+            successorId: this.queryParams.successorId,
+            feedbackYear: this.queryParams.feedbackYear,
+            feedbackSeason: this.queryParams.feedbackSeason
+          }).then(response => {
+            let data = response.data;
+            this.feedbackId = data.id;
+            this.parentId = data.id;
+            this.meetingDate = data.meetingDate;
+            this.resetLastDay();
+            this.mentorFeedback = data.mentorFeedback;
+            // 初始化汇报附件
+            this.initFileList(data.id);
+            // ====================初始化导师标签页====================
+            this.activeName = data.mentorId;
+            this.mentorTabs.push({ name: data.mentorId, title: data.mentorName});
+            listFeedback( { parentId: data.id } ).then(response => {
+              let data = response.rows;
+              for (let i = 0; i < data.length; i++) {
+                this.mentorTabs.push({ name: data[i].mentorId, title: data[i].mentorName});
+              }
+            });
+          });
+        }
+      });
+    },
+    /** 问卷判空 */
+    isEmpty() {
+      let radioArray = [ this.radio1, this.radio2, this.radio3, this.radio4, this.radio5, this.radio6, this.radio7, this.radio8, this.radio9, this.radio10, this.radio11, this.radio12, this.radio13, this.radio14 ];
+      let isEmpty = false;
+      for (let i = 0; i < radioArray.length; i++) {
+        if (radioArray[i] == "") {
+          isEmpty = true;
+        }
+      }
+      return isEmpty;
+    },
+    /** 邀请表格判空 */
+    isInvitationFormEmpty() {
+      if (this.meetingDate == "" || this.mentorOptionsArray.length == 0) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+    /** 培养计划详情处理 */
+    handleFeedback(row) {
+      // 加载反馈附件
+      this.docFeedback.id = row.id;
+      this.docFeedback.queryParams.pId = row.id
+      this.docFeedback.pId = row.id
+      this.getFileListFeedback();
+      // 清空导师反馈内容
+      this.detailFeedback = null;
+      // 清空表格数据
+      this.tableData = [];
+      let feedback1 = {};
+      feedback1.planId = row.id;
+      feedback1.questionId = 1;
+      let feedback2 = {};
+      feedback2.planId = row.id;
+      feedback2.questionId = 2;
+      let feedback3 = {};
+      feedback3.planId = row.id;
+      feedback3.questionId = 3;
+      let answerObj1 = {};
+      let answerObj2 = {};
+      let answerObj3 = {};
+      // 获取问题和答案
+      getAnswer(feedback1).then(response => {
+        let data = response.data;
+        if (data != null) {
+          answerObj1 = { id: 1, question: data.question, answer: data.answer};
+        }
+        return getAnswer(feedback2);
+      }).then(response => {
+        let data = response.data;
+        if (data != null) {
+          answerObj2 = { id: 2, question: data.question, answer: data.answer};
+        }
+        return getAnswer(feedback3);
+      }).then(response => {
+        let data = response.data;
+        if (data != null) {
+          answerObj3 = { id: 3, question: data.question, answer: data.answer};
+          this.tableData.push(answerObj1);
+          this.tableData.push(answerObj2);
+          this.tableData.push(answerObj3);
+        }
+        // 获取导师反馈内容
+        return getFeedbackByPlanId(row.id);
+      }).then(response => {
+        if (response.data != null) {
+          let data = response.data;
+          this.detailFeedback = data.mentorFeedback;
+        }
+        this.feedbackDialog.title = row.staffName + row.plantName + "学习情况详情";
+        this.feedbackDialog.planId = row.id;
+        this.feedbackDialog.studyState = row.studyState;
+        this.feedbackDialog.open = true;
+      });
+    },
+    /** 单元格样式 */
+    tableCellStyle(row, column, rowIndex, columnIndex) {
+      if (row.column.label === "实际完成日期" && row.row.dateOfCompletion > row.row.endDate) {
+        return "background: #FFEEEE"
+      }
+    },
+    /** 学习状态字典翻译 */
+    studyStateFormat(row, column) {
+      return this.selectDictLabel(this.studyStateOptions, row.studyState);
+    },
+    /** 文件下载处理 */
+    handleDownload(row) {
+      var name = row.fileName;
+      var url = row.fileUrl;
+      var suffix = url.substring(url.lastIndexOf("."), url.length);
+      const a = document.createElement('a');
+      a.setAttribute('download', name);
+      a.setAttribute('target', '_blank');
+      a.setAttribute('href', process.env.VUE_APP_BASE_API + url);
+      a.click();
+    },
+    openPdf() {
+      window.open(this.pdf.pdfUrl);//path是文件的全路径地址
+    },
+    handleSee(row) {
+      this.pdf.open = true;
+      this.pdf.title = row.fileName;
+      this.pdf.pdfUrl = process.env.VUE_APP_BASE_API +'/pdf/web/viewer.html?file=' + process.env.VUE_APP_BASE_API + row.fileUrl;
+    },
+    /** 汇报附件参数初始化 */
+    initFileList(id) {
+      this.doc.queryParams.pId = id
+      this.doc.pId = id
+      this.getFileList()
+      // this.$nextTick(() => {
+      //   this.$refs.doc.clearFiles()
+      // })
+    },
+    getFileList() {
+      allFileList(this.doc.queryParams).then(response => {
+        this.doc.commonfileList = response;
+      });
+    },
+    getFileListFeedback() {
+      allFileList(this.docFeedback.queryParams).then(response => {
+        this.docFeedback.commonfileList = response;
+      });
+    },
+    /** 附件上传中处理 */
+    handleFileDocProgress(event, file, fileList) {
+      this.doc.file = file;
+      this.doc.isUploading = true;
+    },
+    handleFileDocProgressFeedback(event, file, fileList) {
+      this.docFeedback.file = file;
+      this.docFeedback.isUploading = true;
+    },
+    /** 附件上传成功处理 */
+    handleFileDocSuccess(response, file, fileList) {
+      this.doc.isUploading = false;
+      this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
+      this.getFileList()
+    },
+    handleFileDocSuccessFeedback(response, file, fileList) {
+      this.docMentorFeedback.isUploading = false;
+      this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
+      this.getFileListFeedback()
+    },
+    /** 删除按钮操作 */
+    handleDeleteDoc(row) {
+      const ids = row.id || this.ids;
+      this.$confirm(this.$t('是否确认删除?'), this.$t('警告'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: "warning"
+      }).then(function() {
+        return delCommonfile(ids);
+      }).then(() => {
+        this.getFileList()
+        this.msgSuccess(this.$t('删除成功'));
+      })
+    },
+    /** 邀请导师 */
+    handleInvite() {
+      if (this.isInvitationFormEmpty()) {
+        this.$message.error('会议日期和受邀导师导师不能为空')
+        return;
+      }
+      let updateParams = {};
+      updateParams.id = this.feedbackId;
+      if (typeof(this.meetingDate) == "string") {
+        console.log("type is string");
+      } else {
+        console.log("type is not string");
+        this.meetingDate.setTime(this.meetingDate.getTime() + 3600 * 1000 * 24);
+      }
+      updateParams.meetingDate = this.meetingDate;
+      updateParams.id = this.parentId;
+      // 修改会议日期
+      updateFeedback(updateParams).then(response => {
+        this.meetingDate.setTime(this.meetingDate.getTime() - 3600 * 1000 * 24);
+      });
+      for (let i = 0; i < this.mentorOptionsArray.length; i++) {
+        let feedback = {};
+        feedback.parentId = this.feedbackId;  // 设置父级id
+        feedback.feedbackYear = this.queryParams.feedbackYear;
+        feedback.feedbackSeason = this.queryParams.feedbackSeason;
+        feedback.feedbackType = 3;
+        feedback.mentorId = this.mentorOptionsArray[i];
+        feedback.successorId = this.queryParams.successorId;
+        getFeedbackByParams(feedback).then(response => {
+          let data = response.data;
+          if (data == null) { // 该导师没有受邀
+            // 新增受邀导师反馈记录
+            addFeedback(feedback).then(response => {
+              getFeedbackByParams({
+                successorId: this.queryParams.successorId,
+                feedbackYear: this.queryParams.feedbackYear,
+                feedbackSeason: this.queryParams.feedbackSeason,
+              }).then(response => {
+                let data = response.data;
+                let firstMentor = {};
+                firstMentor.name = data.mentorId;
+                firstMentor.title = data.mentorName;
+                listFeedback( { parentId: data.id } ).then(response => {
+                  let data = response.rows;
+                  let mentorTabsTemp = [];
+                  this.mentorTabs = [];
+                  this.activeName = firstMentor.name;
+                  mentorTabsTemp.push(firstMentor);
+                  for (let i = 0; i < data.length; i++) {
+                    mentorTabsTemp.push({ name: data[i].mentorId, title: data[i].mentorName});
+                  }
+                  this.mentorTabs = mentorTabsTemp;
+                });
+              });
+            });
+          }
+        });
+        // 发送邮件提醒受邀导师
+
+      }
+      this.msgSuccess("邀请成功,邮件已发送");
+    },
+    /** 查询专项培训反馈列表 */
+    getList() {
+        console.log(this.queryParams);
+      this.loading = true;
+      listPlanSeasonal(this.queryParams).then(response => {
+        this.dataList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        feedbackType: null,
+        mentorId: null,
+        successorId: null,
+        successorName: null,
+        parentId: null,
+        planId: null,
+        feedbackYear: null,
+        feedbackSeason: null,
+        feedbackMonth: null,
+        successorFeedback: null,
+        mentorFeedback: null,
+        feedbackScore: null,
+        feedbackStatus: 0,
+        meetingDate: null
+      };
+      this.resetForm("form");
+    },
+    yearFormateter() {
+      this.isFirstSearch = false;
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.feedbackYear = this.queryParams.feedbackYearTemp;
+      if (this.isFirstSearch) {
+        this.queryParams.feedbackYear = this.queryParams.feedbackYearTemp;
+      } else {
+        this.queryParams.feedbackYear = this.queryParams.feedbackYearTemp.getFullYear();
+      }
+      this.queryParams.pageNum = 1;
+      this.getList();
+      // 清空问卷
+      this.radio1 = null;
+      this.radio2 = null;
+      this.radio3 = null;
+      this.radio4 = null;
+      this.radio5 = null;
+      this.radio6 = null;
+      this.radio7 = null;
+      this.radio8 = null;
+      this.radio9 = null;
+      this.radio10 = null;
+      this.radio11 = null;
+      this.radio12 = null;
+      this.radio13 = null;
+      this.radio14 = null;
+      // 清空导师反馈内容
+      this.mentorFeedback = "";
+      // 清空会议日期
+      this.meetingDate = null;
+      getFeedbackByParams({
+        successorId: this.queryParams.successorId,
+        feedbackYear: this.queryParams.feedbackYear,
+        feedbackSeason: this.queryParams.feedbackSeason,
+      }).then(response => {
+        let data = response.data;
+        this.feedbackId = data.id;
+        this.parentId = data.id;
+        this.mentorId = data.mentorId;
+        this.meetingDate = data.meetingDate;
+        this.resetLastDay();
+        this.mentorFeedback = data.mentorFeedback;
+        window.scrollTo(0, 0);
+        // 刷新汇报附件
+        this.initFileList(data.id);
+        // 初始化导师标签页
+        this.mentorTabs = [];
+        this.activeName = data.mentorId;
+        this.mentorTabs.push({ name: data.mentorId, title: data.mentorName});
+        listFeedback( { parentId: data.id } ).then(response => {
+          let data = response.rows;
+          for (let i = 0; i < data.length; i++) {
+            this.mentorTabs.push({ name: data[i].mentorId, title: data[i].mentorName});
+          }
+        });
+        // 刷新问卷
+        listAnswer( { feedbackId: this.feedbackId } ).then(response => {
+          let data = response.rows;
+          for (let i = 0; i < data.length; i++) {
+            if (data[i].questionId == "4") { this.radio1 = data[i].answer; }
+            if (data[i].questionId == "5") { this.radio2 = data[i].answer; }
+            if (data[i].questionId == "6") { this.radio3 = data[i].answer; }
+            if (data[i].questionId == "7") { this.radio4 = data[i].answer; }
+            if (data[i].questionId == "8") { this.radio5 = data[i].answer; }
+            if (data[i].questionId == "9") { this.radio6 = data[i].answer; }
+            if (data[i].questionId == "10") { this.radio7 = data[i].answer; }
+            if (data[i].questionId == "11") { this.radio8 = data[i].answer; }
+            if (data[i].questionId == "12") { this.radio9 = data[i].answer; }
+            if (data[i].questionId == "13") { this.radio10 = data[i].answer; }
+            if (data[i].questionId == "14") { this.radio11 = data[i].answer; }
+            if (data[i].questionId == "15") { this.radio12 = data[i].answer; }
+            if (data[i].questionId == "16") { this.radio13 = data[i].answer; }
+            if (data[i].questionId == "17") { this.radio14 = data[i].answer; }
+
+          }
+          window.scrollTo(0, 0);
+        });
+      });
+
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
+
+<style scoped>
+  .question{
+    margin: 20px 0px;
+    padding-left: 20px;
+  }
+  .answer{
+    padding-bottom: 10px;
+    padding-left: 40px;
+  }
+  h3{
+    margin: 20px 0px;
+  }
+</style>