wangggziwen 3 жил өмнө
parent
commit
3c06cd888f

+ 146 - 2
master/src/main/java/com/ruoyi/project/training/spec/controller/TStFeedbackController.java

@@ -46,10 +46,155 @@ public class TStFeedbackController extends BaseController
     @Autowired
     private ISysUserService sysUserService;
 
+    /**
+     * 导师查询季度反馈列表
+     */
+    @PreAuthorize("@ss.hasPermi('spec:feedback:list')")
+    @GetMapping("/list/mentor/season")
+    public TableDataInfo listMentorSeason(TStFeedback tStFeedback)
+    {
+        // 获取当前登录用户
+        Long userId = getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        String staffId = sysUser.getStaffId();
+        // 设置导师ID为当前登录用户
+        tStFeedback.setMentorId(staffId);
+        // 设置反馈类型为“季度反馈”
+        tStFeedback.setFeedbackType(3L);
+        startPage();
+        // 查询季度反馈列表
+        List<TStFeedback> list = tStFeedbackService.selectTStFeedbackList(tStFeedback);
+        // 月季度反馈VO列表
+        List<TStFeedbackVO> newList = new ArrayList<>();
+        for (TStFeedback feedback : list) {
+            feedback.setMentorId(staffId);
+            // 查询季度反馈中包含的计划列表
+            List<TStPlan> monthlyTStPlanList = tStPlanService.selectSeasonalTStPlanList(feedback);
+            // 季度反馈VO
+            TStFeedbackVO tStFeedbackVO = new TStFeedbackVO();
+            // 复制对象
+            tStFeedbackVO.setId(feedback.getId());
+            tStFeedbackVO.setFeedbackType(feedback.getFeedbackType());
+            tStFeedbackVO.setFeedbackMonth(feedback.getFeedbackMonth());
+            tStFeedbackVO.setFeedbackSeason(feedback.getFeedbackSeason());
+            tStFeedbackVO.setFeedbackYear(feedback.getFeedbackYear());
+            tStFeedbackVO.setMentorId(feedback.getMentorId());
+            tStFeedbackVO.setSuccessorId(feedback.getSuccessorId());
+            tStFeedbackVO.setParentId(feedback.getParentId());
+            tStFeedbackVO.setPlanId(feedback.getPlanId());
+            tStFeedbackVO.setSuccessorFeedback(feedback.getSuccessorFeedback());
+            tStFeedbackVO.setMentorFeedback(feedback.getMentorFeedback());
+            tStFeedbackVO.setFeedbackScore(feedback.getFeedbackScore());
+            tStFeedbackVO.setFeedbackStatus(feedback.getFeedbackStatus());
+            tStFeedbackVO.setMeetingDate(feedback.getMeetingDate());
+            // 设置季度培训计划清单
+            tStFeedbackVO.setPlanList(monthlyTStPlanList);
+            newList.add(tStFeedbackVO);
+        }
+        return getDataTable(newList);
+    }
+
+    /**
+     * 学员查询季度反馈列表
+     */
+    @PreAuthorize("@ss.hasPermi('spec:feedback:list')")
+    @GetMapping("/list/successor/season")
+    public TableDataInfo listSuccessorSeason(TStFeedback tStFeedback)
+    {
+        // 获取当前登录用户
+        Long userId = getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        String staffId = sysUser.getStaffId();
+        // 设置学员ID为当前登录用户
+        tStFeedback.setSuccessorId(staffId);
+        // 设置反馈类型为“月度反馈”
+        tStFeedback.setFeedbackType(3L);
+        startPage();
+        // 查询jid季度反馈列表
+        List<TStFeedback> list = tStFeedbackService.selectTStFeedbackList(tStFeedback);
+        // 季度反馈VO列表
+        List<TStFeedbackVO> newList = new ArrayList<>();
+        for (TStFeedback feedback : list) {
+            feedback.setSuccessorId(staffId);
+            // 查询季度反馈中包含的计划列表
+            List<TStPlan> monthlyTStPlanList = tStPlanService.selectSeasonalTStPlanList(feedback);
+            // 季度反馈VO
+            TStFeedbackVO tStFeedbackVO = new TStFeedbackVO();
+            // 复制对象
+            tStFeedbackVO.setId(feedback.getId());
+            tStFeedbackVO.setFeedbackType(feedback.getFeedbackType());
+            tStFeedbackVO.setFeedbackMonth(feedback.getFeedbackMonth());
+            tStFeedbackVO.setFeedbackSeason(feedback.getFeedbackSeason());
+            tStFeedbackVO.setFeedbackYear(feedback.getFeedbackYear());
+            tStFeedbackVO.setMentorId(feedback.getMentorId());
+            tStFeedbackVO.setSuccessorId(feedback.getSuccessorId());
+            tStFeedbackVO.setParentId(feedback.getParentId());
+            tStFeedbackVO.setPlanId(feedback.getPlanId());
+            tStFeedbackVO.setSuccessorFeedback(feedback.getSuccessorFeedback());
+            tStFeedbackVO.setMentorFeedback(feedback.getMentorFeedback());
+            tStFeedbackVO.setFeedbackScore(feedback.getFeedbackScore());
+            tStFeedbackVO.setFeedbackStatus(feedback.getFeedbackStatus());
+            tStFeedbackVO.setMeetingDate(feedback.getMeetingDate());
+            // 设置季度培训计划清单
+            tStFeedbackVO.setPlanList(monthlyTStPlanList);
+            newList.add(tStFeedbackVO);
+        }
+        System.out.println(newList);
+        return getDataTable(newList);
+    }
+
+    /**
+     * 导师查询月度反馈列表
+     */
+    @PreAuthorize("@ss.hasPermi('spec:feedback:list')")
+    @GetMapping("/list/mentor/month")
+    public TableDataInfo listMentorMonth(TStFeedback tStFeedback)
+    {
+        // 获取当前登录用户
+        Long userId = getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        String staffId = sysUser.getStaffId();
+        // 设置导师ID为当前登录用户
+        tStFeedback.setMentorId(staffId);
+        // 设置反馈类型为“月度反馈”
+        tStFeedback.setFeedbackType(2L);
+        startPage();
+        // 查询月度反馈列表
+        List<TStFeedback> list = tStFeedbackService.selectTStFeedbackList(tStFeedback);
+        // 月度反馈VO列表
+        List<TStFeedbackVO> newList = new ArrayList<>();
+        for (TStFeedback feedback : list) {
+            feedback.setMentorId(staffId);
+            // 查询月度反馈中包含的计划列表
+            List<TStPlan> monthlyTStPlanList = tStPlanService.selectMonthlyTStPlanList(feedback);
+            // 月度反馈VO
+            TStFeedbackVO tStFeedbackVO = new TStFeedbackVO();
+            // 复制对象
+            tStFeedbackVO.setId(feedback.getId());
+            tStFeedbackVO.setFeedbackType(feedback.getFeedbackType());
+            tStFeedbackVO.setFeedbackMonth(feedback.getFeedbackMonth());
+            tStFeedbackVO.setFeedbackSeason(feedback.getFeedbackSeason());
+            tStFeedbackVO.setFeedbackYear(feedback.getFeedbackYear());
+            tStFeedbackVO.setMentorId(feedback.getMentorId());
+            tStFeedbackVO.setSuccessorId(feedback.getSuccessorId());
+            tStFeedbackVO.setParentId(feedback.getParentId());
+            tStFeedbackVO.setPlanId(feedback.getPlanId());
+            tStFeedbackVO.setSuccessorFeedback(feedback.getSuccessorFeedback());
+            tStFeedbackVO.setMentorFeedback(feedback.getMentorFeedback());
+            tStFeedbackVO.setFeedbackScore(feedback.getFeedbackScore());
+            tStFeedbackVO.setFeedbackStatus(feedback.getFeedbackStatus());
+            tStFeedbackVO.setMeetingDate(feedback.getMeetingDate());
+            // 设置月度培训计划清单
+            tStFeedbackVO.setPlanList(monthlyTStPlanList);
+            newList.add(tStFeedbackVO);
+        }
+        return getDataTable(newList);
+    }
+
     /**
      * 学员查询月度反馈列表
      */
-//    @PreAuthorize("@ss.hasPermi('spec:feedback:list')")
+    @PreAuthorize("@ss.hasPermi('spec:feedback:list')")
     @GetMapping("/list/successor/month")
     public TableDataInfo listSuccessorMonth(TStFeedback tStFeedback)
     {
@@ -91,7 +236,6 @@ public class TStFeedbackController extends BaseController
             tStFeedbackVO.setPlanList(monthlyTStPlanList);
             newList.add(tStFeedbackVO);
         }
-        System.out.println(newList);
         return getDataTable(newList);
     }
 

+ 7 - 0
master/src/main/java/com/ruoyi/project/training/spec/mapper/TStPlanMapper.java

@@ -13,6 +13,13 @@ import com.ruoyi.project.training.spec.domain.TStPlan;
  */
 public interface TStPlanMapper
 {
+    /**
+     * 查询季度培训计划列表
+     * @param tStFeedback
+     * @return
+     */
+    List<TStPlan> selectSeasonalTStPlanList(TStFeedback tStFeedback);
+
     /**
      * 查询月度培训计划列表
      * @param tStFeedback

+ 7 - 0
master/src/main/java/com/ruoyi/project/training/spec/service/ITStPlanService.java

@@ -13,6 +13,13 @@ import com.ruoyi.project.training.spec.domain.TStPlan;
  */
 public interface ITStPlanService
 {
+    /**
+     * 查询季度培训计划列表
+     * @param tStFeedback
+     * @return
+     */
+    List<TStPlan> selectSeasonalTStPlanList(TStFeedback tStFeedback);
+
     /**
      * 查询月度培训计划列表
      * @param tStFeedback

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

@@ -21,6 +21,11 @@ public class TStPlanServiceImpl implements ITStPlanService
     @Autowired
     private TStPlanMapper tStPlanMapper;
 
+    @Override
+    public List<TStPlan> selectSeasonalTStPlanList(TStFeedback tStFeedback) {
+        return tStPlanMapper.selectSeasonalTStPlanList(tStFeedback);
+    }
+
     @Override
     public List<TStPlan> selectMonthlyTStPlanList(TStFeedback tStFeedback) {
         return tStPlanMapper.selectMonthlyTStPlanList(tStFeedback);

+ 2 - 1
master/src/main/resources/mybatis/training/spec/TStFeedbackMapper.xml

@@ -59,7 +59,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="feedbackStatus != null "> and feedback_status = #{feedbackStatus}</if>
             <if test="meetingDate != null "> and meeting_date = #{meetingDate}</if>
         </where>
-        order by d.successor_id asc, d.feedback_year desc, d.feedback_season asc, d.feedback_month asc
+        order by d.successor_id asc, d.feedback_year desc, d.feedback_season,
+       to_number(replace(d.feedback_month,',','')) asc
     </select>
     
     <select id="selectTStFeedbackById" parameterType="Long" resultMap="TStFeedbackResult">

+ 30 - 1
master/src/main/resources/mybatis/training/spec/TStPlanMapper.xml

@@ -59,11 +59,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join T_ST_SUCCESSOR suc on d.STAFF_ID = suc.STAFF_ID
     </sql>
 
+    <!-- 查询季度培训计划列表 -->
+    <select id="selectSeasonalTStPlanList" parameterType="TStFeedback" resultMap="TStPlanResult">
+        <include refid="selectTStPlanVo"/>
+        <where>
+            <if test="successorId != null  and successorId != ''">
+                and d.staff_id = #{successorId}
+            </if>
+            <if test="mentorId != null  and mentorId != ''">
+                and suc.MENTOR_STAFF_ID = #{mentorId}
+            </if>
+            <if test="feedbackYear != null  and feedbackYear != ''">
+                and extract(year from d.start_date) = #{feedbackYear}
+            </if>
+            <if test="feedbackSeason != null  and feedbackSeason != ''">
+                and (extract(month from d.start_date) + 2) / 3 &lt;= #{feedbackSeason}
+                and (extract(month from d.end_date) + 2) / 3 &gt;= #{feedbackSeason}
+            </if>
+            and d.del_flag = 0
+            <!-- 数据范围过滤 -->
+            ${params.dataScope}
+        </where>
+        order by d.start_date
+    </select>
+
     <!-- 查询月度培训计划列表 -->
     <select id="selectMonthlyTStPlanList" parameterType="TStFeedback" resultMap="TStPlanResult">
         <include refid="selectTStPlanVo"/>
         <where>
-            d.staff_id = #{successorId}
+            <if test="successorId != null  and successorId != ''">
+                and d.staff_id = #{successorId}
+            </if>
+            <if test="mentorId != null  and mentorId != ''">
+                and suc.MENTOR_STAFF_ID = #{mentorId}
+            </if>
             <if test="feedbackYear != null  and feedbackYear != ''">
                 and extract(year from d.start_date) = #{feedbackYear}
             </if>

+ 27 - 0
ui/src/api/training/spec/feedback.js

@@ -1,5 +1,32 @@
 import request from '@/utils/request'
 
+// 导师查询月度反馈列表
+export function listMentorSeasonalFeedback(query) {
+  return request({
+    url: '/spec/feedback/list/mentor/season',
+    method: 'get',
+    params: query
+  })
+}
+
+// 学员查询月度反馈列表
+export function listSuccessorSeasonalFeedback(query) {
+  return request({
+    url: '/spec/feedback/list/successor/season',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导师查询月度反馈列表
+export function listMentorMonthlyFeedback(query) {
+  return request({
+    url: '/spec/feedback/list/mentor/month',
+    method: 'get',
+    params: query
+  })
+}
+
 // 学员查询月度反馈列表
 export function listSuccessorMonthlyFeedback(query) {
   return request({

+ 522 - 233
ui/src/views/training/spec/mentorfeedback/index.vue

@@ -1,237 +1,262 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="反馈类型" prop="feedbackType">
-        <el-select v-model="queryParams.feedbackType" placeholder="请选择反馈类型" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="导师ID" prop="mentorId">
-        <el-input
-          v-model="queryParams.mentorId"
-          placeholder="请输入导师ID"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
+    <el-tabs type="border-card">
+      <el-tab-pane label="月度反馈">
+        <!-- 搜索栏 -->
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+          <el-form-item label="年" prop="feedbackYear"  label-width="35px">
+            <el-input
+              v-model="queryParams.feedbackYear"
+              placeholder="请输入年"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="月" prop="feedbackMonth"  label-width="35px">
+            <el-input
+              v-model="queryParams.feedbackMonth"
+              placeholder="请输入月"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="学员编号" prop="feedbackMonth" label-width="80px">
+            <el-input
+              v-model="queryParams.successorId"
+              placeholder="请输入学员编号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </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-button icon="el-icon-refresh" size="mini" @click="refresh()">刷新</el-button>
+          </el-form-item>
+        </el-form>
+        <!-- 列表 -->
+        <el-table
+          :span-method="spanMethod" 
+          v-loading="loading" 
+          :data="feedbackList" 
+          @selection-change="handleSelectionChange" 
+          :height="clientHeight" 
+          border
+        >
+          <el-table-column label="学员编号" align="center" :show-overflow-tooltip="true" prop="successorId"/>
+          <el-table-column label="时间" align="center" :show-overflow-tooltip="true" width="120">
+            <template slot-scope="scope">
+              <span>{{scope.row.feedbackYear}}年{{scope.row.feedbackMonth}}月</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="培训内容" align="center" :show-overflow-tooltip="true" prop="plantName"/>
+          <el-table-column label="开始日期" align="center" :show-overflow-tooltip="true" width="120" prop="startDate"/>
+          <el-table-column label="结束日期" align="center" :show-overflow-tooltip="true" width="120" prop="endDate"/>
+          <el-table-column label="实际完成日期" align="center" :show-overflow-tooltip="true" width="120" prop="dateOfCompletion"/>
+          <el-table-column label="学习状态" align="center" :show-overflow-tooltip="true" width="120" prop="studyStatus"/>
+          <el-table-column label="学员反馈" align="center" prop="successorFeedback" :show-overflow-tooltip="true"/>
+          <el-table-column label="导师反馈" align="center" prop="mentorFeedback" :show-overflow-tooltip="true"/>
+          <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['spec:feedback:edit']"
+                v-if="scope.row.mentorFeedback==null"
+              >反馈</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['spec:feedback:edit']"
+                v-if="scope.row.mentorFeedback!=null"
+              >修改</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
         />
-      </el-form-item>
-      <el-form-item label="学员ID" prop="successorId">
-        <el-input
-          v-model="queryParams.successorId"
-          placeholder="请输入学员ID"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="受邀导师父级主键ID" prop="parentId">
-        <el-input
-          v-model="queryParams.parentId"
-          placeholder="请输入受邀导师父级主键ID"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="培训计划ID" prop="planId">
-        <el-input
-          v-model="queryParams.planId"
-          placeholder="请输入培训计划ID"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="年" prop="feedbackYear">
-        <el-input
-          v-model="queryParams.feedbackYear"
-          placeholder="请输入年"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="季度" prop="feedbackSeason">
-        <el-input
-          v-model="queryParams.feedbackSeason"
-          placeholder="请输入季度"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="月" prop="feedbackMonth">
-        <el-input
-          v-model="queryParams.feedbackMonth"
-          placeholder="请输入月"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="学员反馈" prop="successorFeedback">
-        <el-input
-          v-model="queryParams.successorFeedback"
-          placeholder="请输入学员反馈"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="导师反馈" prop="mentorFeedback">
-        <el-input
-          v-model="queryParams.mentorFeedback"
-          placeholder="请输入导师反馈"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="导师评分" prop="feedbackScore">
-        <el-input
-          v-model="queryParams.feedbackScore"
-          placeholder="请输入导师评分"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="反馈状态" prop="feedbackStatus">
-        <el-select v-model="queryParams.feedbackStatus" placeholder="请选择反馈状态" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="面试会议日期" prop="meetingDate">
-        <el-date-picker clearable size="small" style="width: 200px"
-          v-model="queryParams.meetingDate"
-          type="date"
-          value-format="yyyy-MM-dd"
-          placeholder="选择面试会议日期">
-        </el-date-picker>
-      </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-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['spec:feedback:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['spec:feedback:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['spec:feedback:remove']"
-        >删除</el-button>
-      </el-col>
-        <el-col :span="1.5">
-            <el-button
-                    type="info"
-                    icon="el-icon-upload2"
-                    size="mini"
-                    @click="handleImport"
-                    v-hasPermi="['spec:feedback:edit']"
-            >导入</el-button>
-        </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['spec:feedback:export']"
-        >导出</el-button>
-      </el-col>
-	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="feedbackList" @selection-change="handleSelectionChange" :height="clientHeight" border>
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="反馈类型" align="center" prop="feedbackType" :show-overflow-tooltip="true"/>
-      <el-table-column label="导师ID" align="center" prop="mentorId" :show-overflow-tooltip="true"/>
-      <el-table-column label="学员ID" align="center" prop="successorId" :show-overflow-tooltip="true"/>
-      <el-table-column label="受邀导师父级主键ID" align="center" prop="parentId" :show-overflow-tooltip="true"/>
-      <el-table-column label="培训计划ID" align="center" prop="planId" :show-overflow-tooltip="true"/>
-      <el-table-column label="年" align="center" prop="feedbackYear" :show-overflow-tooltip="true"/>
-      <el-table-column label="季度" align="center" prop="feedbackSeason" :show-overflow-tooltip="true"/>
-      <el-table-column label="月" align="center" prop="feedbackMonth" :show-overflow-tooltip="true"/>
-      <el-table-column label="学员反馈" align="center" prop="successorFeedback" :show-overflow-tooltip="true"/>
-      <el-table-column label="导师反馈" align="center" prop="mentorFeedback" :show-overflow-tooltip="true"/>
-      <el-table-column label="导师评分" align="center" prop="feedbackScore" :show-overflow-tooltip="true"/>
-      <el-table-column label="反馈状态" align="center" prop="feedbackStatus" :show-overflow-tooltip="true"/>
-      <el-table-column label="面试会议日期" align="center" prop="meetingDate" width="100">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.meetingDate, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['spec:feedback:edit']"
-            v-if="scope.row.mentorFeedback==null"
-          >反馈</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['spec:feedback:edit']"
-            v-if="scope.row.mentorFeedback!=null"
-          >修改</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules">
-        <el-form-item prop="successorFeedback">
-          <el-input type="textarea" rows="6" v-model="form.mentorFeedback" placeholder="请输入反馈内容" />
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
+        <!-- 添加或修改对话框 -->
+        <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+          <el-form ref="form" :model="form" :rules="rules">
+            <el-form-item prop="successorFeedback">
+              <el-input type="textarea" rows="6" v-model="form.mentorFeedback" placeholder="请输入反馈内容" />
+            </el-form-item>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">确 定</el-button>
+            <el-button @click="cancel">取 消</el-button>
+          </div>
+        </el-dialog>
+      </el-tab-pane>
+      <el-tab-pane label="季度反馈">
+        <!-- 搜索栏 -->
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+          <el-form-item label="年" prop="feedbackYear"  label-width="35px">
+            <el-input
+              v-model="queryParams.feedbackYear"
+              placeholder="请输入年"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="季度" prop="feedbackSeason">
+            <el-input
+              v-model="queryParams.feedbackSeason"
+              placeholder="请输入季度"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+              label-width="50px"
+            />
+          </el-form-item>
+          <el-form-item label="学员编号" prop="feedbackMonth" label-width="80px">
+            <el-input
+              v-model="queryParams.successorId"
+              placeholder="请输入学员编号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </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-button icon="el-icon-refresh" size="mini" @click="refresh()">刷新</el-button>
+          </el-form-item>
+        </el-form>
+        <!-- 列表 -->
+        <el-table
+          :span-method="spanMethod" 
+          v-loading="loading" 
+          :data="feedbackListSeasonal" 
+          @selection-change="handleSelectionChange" 
+          :height="clientHeight" 
+          ref="feedbackListSeasonalTable"
+          border
+        >
+          <el-table-column label="学员编号" align="center" :show-overflow-tooltip="true" prop="successorId"/>
+          <el-table-column label="时间" align="center" :show-overflow-tooltip="true" width="120">
+            <template slot-scope="scope">
+              <span>{{scope.row.feedbackYear}}年{{scope.row.feedbackSeason}}季度</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="培训内容" align="center" :show-overflow-tooltip="true" prop="plantName"/>
+          <el-table-column label="开始日期" align="center" :show-overflow-tooltip="true" width="120" prop="startDate"/>
+          <el-table-column label="结束日期" align="center" :show-overflow-tooltip="true" width="120" prop="endDate"/>
+          <el-table-column label="实际完成日期" align="center" :show-overflow-tooltip="true" width="120" prop="dateOfCompletion"/>
+          <el-table-column label="学习状态" align="center" :show-overflow-tooltip="true" width="120" prop="studyStatus"/>
+          <el-table-column label="学员反馈" align="center" prop="successorFeedback" :show-overflow-tooltip="true"/>
+          <el-table-column label="导师反馈" align="center" prop="mentorFeedback" :show-overflow-tooltip="true"/>
+          <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['spec:feedback:edit']"
+                v-if="scope.row.mentorFeedback==null"
+              >反馈</el-button>
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['spec:feedback:edit']"
+                v-if="scope.row.mentorFeedback!=null"
+              >修改</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <!-- <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        /> -->
+        <!-- 添加或修改对话框 -->
+        <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+          <el-form ref="form" :model="form" :rules="rules">
+            <el-form-item prop="successorFeedback">
+              <el-input type="textarea" rows="6" v-model="form.mentorFeedback" placeholder="请输入反馈内容" />
+            </el-form-item>
+          </el-form>
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">确 定</el-button>
+            <el-button @click="cancel">取 消</el-button>
+          </div>
+        </el-dialog>
+      </el-tab-pane>
+      <el-tab-pane label="受邀反馈"></el-tab-pane>
+      <!-- 报告附件对话框 -->
+        <el-dialog v-dialogDrag :title="doc.title" :visible.sync="doc.open" width="700px" append-to-body>
+          <el-table :data="doc.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>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDeleteDoc(scope.row)"
+                >{{ $t('删除') }}</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-dialog v-dialogDrag :title="pdf.title" :visible.sync="pdf.open" width="1300px" append-to-body>
+            <div style="margin-top: -60px;float: right;margin-right: 40px;">
+              <el-button size="mini" type="text" @click="openPdf">{{$t('新页面打开PDF')}}</el-button></div>
+            <div style="margin-top: -30px">
+              <iframe :src="pdf.pdfUrl" frameborder="0" width="100%" height="700px"></iframe>
+            </div>
+          </el-dialog>
+          <div slot="footer" class="dialog-footer">
+            <el-button @click="doc.open = false">{{ $t('返 回') }}</el-button>
+          </div>
+        </el-dialog>
+    </el-tabs>
   </div>
 </template>
 
 <script>
-import { listFeedback, getFeedback, delFeedback, addFeedback, updateFeedback, exportFeedback, importTemplate} from "@/api/training/spec/feedback";
+import { listMentorMonthlyFeedback, listMentorSeasonalFeedback, getFeedback, delFeedback, addFeedback, updateFeedback, exportFeedback, importTemplate} from "@/api/training/spec/feedback";
 import { treeselect } from "@/api/system/dept";
 import { getToken } from "@/utils/auth";
 import Treeselect from "@riophae/vue-treeselect";
@@ -242,6 +267,8 @@ export default {
   components: { Treeselect },
   data() {
     return {
+      // 标签页选中项
+      activeName: 'first',
       // 遮罩层
       loading: true,
       // 选中数组
@@ -251,11 +278,13 @@ export default {
       // 非多个禁用
       multiple: true,
       // 显示搜索条件
-      showSearch: false,
+      showSearch: true,
       // 总条数
       total: 0,
       // 专项培训反馈表格数据
       feedbackList: [],
+      // 专项培训季度反馈表格数据
+      feedbackListSeasonal: [],
       // 弹出层标题
       title: "",
       // 部门树选项
@@ -281,7 +310,7 @@ export default {
       // 查询参数
       queryParams: {
         pageNum: 1,
-        pageSize: 20,
+        pageSize: 1000,
         feedbackType: null,
         mentorId: null,
         successorId: null,
@@ -300,7 +329,45 @@ export default {
       form: {},
       // 表单校验
       rules: {
-      }
+      },
+      //合并单元格参数
+      spanArr: [],
+      spanArr2: [],
+      // 报告附件参数
+      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
+      },
+      // pdf文件参数
+      pdf : {
+          title: '',
+          pdfUrl: '',
+          numPages: null,
+          open: false,
+          pageNum: 1,
+          pageTotalNum: 1,
+          loadedRatio: 0,
+      },
     };
   },
   watch: {
@@ -315,17 +382,225 @@ export default {
           this.clientHeight = document.body.clientHeight -250
       })
     this.getList();
+    this.getListSeasonal();
     this.getTreeselect();
   },
   methods: {
+    // 合并单元格
+    spanMethod({ row, column, rowIndex, columnIndex }) {
+      // 按月合并单元格
+      if (columnIndex === 1 || columnIndex === 7 || columnIndex === 8 || columnIndex === 9) {
+        if (row.isFirstLine == 1) {
+          return {
+            rowspan: row.rowspan,
+            colspan: 1
+          };
+        } else {
+          return {
+            rowspan: 0,
+            colspan: 0
+          };
+        }
+      }
+      // 按人合并单元格
+      if (columnIndex === 0) {
+        if(this.spanArr[rowIndex]){
+          return {
+            rowspan:this.spanArr[rowIndex],
+            colspan:1
+          }
+        }else{
+          return {
+            rowspan: 0,
+            colspan: 0
+          }
+        }
+      }
+    },
+    // 合并单元格
+    spanMethod2({ row, column, rowIndex, columnIndex }) {
+      // 按月合并单元格
+      if (columnIndex === 1 || columnIndex === 7 || columnIndex === 8 || columnIndex === 9) {
+        if (row.isFirstLine == 1) {
+          return {
+            rowspan: row.rowspan,
+            colspan: 1
+          };
+        } else {
+          return {
+            rowspan: 0,
+            colspan: 0
+          };
+        }
+      }
+      // 按人合并单元格
+      if (columnIndex === 0) {
+        if(this.spanArr2[rowIndex]){
+          return {
+            rowspan:this.spanArr2[rowIndex],
+            colspan:1
+          }
+        }else{
+          return {
+            rowspan: 0,
+            colspan: 0
+          }
+        }
+      }
+    },
+    // 刷新
+    refresh() {
+      // 保留检索条件
+      this.getList(this.form);
+    },
+    // 标签页切换
+    handleClick(tab, event) {
+        console.log(tab, event);
+      },
     /** 查询专项培训反馈列表 */
     getList() {
       this.loading = true;
-      listFeedback(this.queryParams).then(response => {
-        this.feedbackList = response.rows;
+      listMentorMonthlyFeedback(this.queryParams).then(response => {
+        let dataList = [];
+        let responseRows = response.rows;
+        let rowCount = 0;
+        for (let i = 0; i < responseRows.length; i++) {
+          let planList = responseRows[i].planList;
+          for (let j = 0; j < planList.length; j++) {
+            rowCount = rowCount + 1;
+            let data = {...planList[j]};
+            data.id = responseRows[i].id;
+            data.feedbackStatus = responseRows[i].feedbackStatus;
+            data.feedbackYear = responseRows[i].feedbackYear;
+            data.feedbackMonth = responseRows[i].feedbackMonth;
+            data.mentorFeedback = responseRows[i].mentorFeedback;
+            data.successorFeedback = responseRows[i].successorFeedback;
+            data.successorId = responseRows[i].successorId;
+            if (j == 0) { // 第一条计划
+              data.isFirstLine = 1;
+              data.rowspan = planList.length;
+            } else {
+              data.isFirstLine = 0;
+            }
+            dataList.push(data);
+          }
+        }
+        let contactDot = 0;
+        for (let i = 0; i < dataList.length; i++) {
+          if (i == 0) {
+            this.spanArr.push(1);
+          } else {
+                if(dataList[i].successorId === dataList[i-1].successorId){
+                    this.spanArr[contactDot] += 1;
+                    this.spanArr.push(0);
+                }else{
+                    contactDot = i;
+                    this.spanArr.push(1);
+                }
+          }
+        }
+        this.feedbackList = dataList;
         this.total = response.total;
         this.loading = false;
       });
+    },
+    /** 查询专项培训季度反馈列表 */
+    getListSeasonal() {
+      this.loading = true;
+      listMentorSeasonalFeedback(this.queryParams).then(response => {
+        let dataList = [];
+        let responseRows = response.rows;
+        let rowCount = 0;
+        for (let i = 0; i < responseRows.length; i++) {
+          let planList = responseRows[i].planList;
+          for (let j = 0; j < planList.length; j++) {
+            rowCount = rowCount + 1;
+            let data = {...planList[j]};
+            data.id = responseRows[i].id;
+            data.feedbackStatus = responseRows[i].feedbackStatus;
+            data.feedbackYear = responseRows[i].feedbackYear;
+            data.feedbackSeason = responseRows[i].feedbackSeason;
+            data.mentorFeedback = responseRows[i].mentorFeedback;
+            data.successorFeedback = responseRows[i].successorFeedback;
+            data.successorId = responseRows[i].successorId;
+            if (j == 0) { // 第一条计划
+              data.isFirstLine = 1;
+              data.rowspan = planList.length;
+            } else {
+              data.isFirstLine = 0;
+            }
+            dataList.push(data);
+          }
+        }
+        let contactDot = 0;
+        for (let i = 0; i < dataList.length; i++) {
+          if (i == 0) {
+            this.spanArr2.push(1);
+          } else {
+                if(dataList[i].successorId === dataList[i-1].successorId){
+                    this.spanArr2[contactDot] += 1;
+                    this.spanArr2.push(0);
+                }else{
+                    contactDot = i;
+                    this.spanArr2.push(1);
+                }
+          }
+        }
+        console.log(dataList);
+        this.feedbackListSeasonal = dataList;
+        this.total = response.total;
+        this.$nextTick(() => {
+          this.$refs.feedbackListSeasonalTable.doLayout(); // 解决表格错位
+        });
+        this.loading = false;
+      });
+    },
+    /** 文件下载处理 */
+    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
+    },
+    /** 报告附件按钮操作 */
+    handleDoc(row) {
+      this.doc.id = row.id;
+      this.doc.title = row.feedbackYear + "年" + row.feedbackSeason + "季度" + this.$t('学习汇报附件');
+      this.doc.open = true;
+      this.doc.queryParams.pId = row.id
+      this.doc.pId = row.id
+      this.getFileList()
+      this.$nextTick(() => {
+        this.$refs.doc.clearFiles()
+      })
+    },
+    getFileList (){
+      allFileList(this.doc.queryParams).then(response => {
+        this.doc.commonfileList = response;
+      });
+    },
+    /** 附件上传中处理 */
+    handleFileDocProgress(event, file, fileList) {
+      this.doc.file = file;
+      this.doc.isUploading = true;
+    },
+    /** 附件上传成功处理 */
+    handleFileDocSuccess(response, file, fileList) {
+      this.doc.isUploading = false;
+      this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
+      this.getFileList()
     },
      /** 查询部门下拉树结构 */
      getTreeselect() {
@@ -390,6 +665,20 @@ export default {
         this.title = "导师反馈(" + row.successorId + " " + row.feedbackYear + "年" + row.feedbackMonth + "月)";
       });
     },
+    /** 提交操作 */
+    handleSubmit(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getFeedback(id).then(response => {
+        this.form = response.data;
+        this.form.feedbackStatus = 1;
+        updateFeedback(this.form).then(response => {
+              this.msgSuccess("提交成功");
+              this.open = false;
+              this.getList();
+            });
+      });
+    },
     /** 提交按钮 */
     submitForm() {
       this.$refs["form"].validate(valid => {
@@ -466,4 +755,4 @@ export default {
       }
   }
 };
-</script>
+</script>

+ 266 - 113
ui/src/views/training/spec/successorfeedback/index.vue

@@ -3,48 +3,7 @@
     <el-tabs type="border-card">
       <el-tab-pane label="月度反馈">
         <!-- 搜索栏 -->
-        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-          <!-- <el-form-item label="反馈类型" prop="feedbackType">
-            <el-select v-model="queryParams.feedbackType" placeholder="请选择反馈类型" clearable size="small">
-              <el-option label="请选择字典生成" value="" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="导师ID" prop="mentorId">
-            <el-input
-              v-model="queryParams.mentorId"
-              placeholder="请输入导师ID"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="学员ID" prop="successorId">
-            <el-input
-              v-model="queryParams.successorId"
-              placeholder="请输入学员ID"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="受邀导师父级主键ID" prop="parentId">
-            <el-input
-              v-model="queryParams.parentId"
-              placeholder="请输入受邀导师父级主键ID"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="培训计划ID" prop="planId">
-            <el-input
-              v-model="queryParams.planId"
-              placeholder="请输入培训计划ID"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="35px">
           <el-form-item label="年" prop="feedbackYear">
             <el-input
               v-model="queryParams.feedbackYear"
@@ -54,15 +13,6 @@
               @keyup.enter.native="handleQuery"
             />
           </el-form-item>
-          <el-form-item label="季度" prop="feedbackSeason">
-            <el-input
-              v-model="queryParams.feedbackSeason"
-              placeholder="请输入季度"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
           <el-form-item label="月" prop="feedbackMonth">
             <el-input
               v-model="queryParams.feedbackMonth"
@@ -72,46 +22,6 @@
               @keyup.enter.native="handleQuery"
             />
           </el-form-item>
-          <el-form-item label="学员反馈" prop="successorFeedback">
-            <el-input
-              v-model="queryParams.successorFeedback"
-              placeholder="请输入学员反馈"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="导师反馈" prop="mentorFeedback">
-            <el-input
-              v-model="queryParams.mentorFeedback"
-              placeholder="请输入导师反馈"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="导师评分" prop="feedbackScore">
-            <el-input
-              v-model="queryParams.feedbackScore"
-              placeholder="请输入导师评分"
-              clearable
-              size="small"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
-          <el-form-item label="反馈状态" prop="feedbackStatus">
-            <el-select v-model="queryParams.feedbackStatus" placeholder="请选择反馈状态" clearable size="small">
-              <el-option label="请选择字典生成" value="" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="面试会议日期" prop="meetingDate">
-            <el-date-picker clearable size="small" style="width: 200px"
-              v-model="queryParams.meetingDate"
-              type="date"
-              value-format="yyyy-MM-dd"
-              placeholder="选择面试会议日期">
-            </el-date-picker>
-          </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>
@@ -132,8 +42,6 @@
               <span>{{scope.row.feedbackYear}}年{{scope.row.feedbackMonth}}月</span>
             </template>
           </el-table-column>
-          <!-- <el-table-column label="年份" align="center" :show-overflow-tooltip="true" width="120" prop="feedbackYear"/>
-          <el-table-column label="月份" align="center" :show-overflow-tooltip="true" width="120" prop="feedbackMonth"/> -->
           <el-table-column label="培训内容" align="center" :show-overflow-tooltip="true" prop="plantName"/>
           <el-table-column label="开始日期" align="center" :show-overflow-tooltip="true" width="120" prop="startDate"/>
           <el-table-column label="结束日期" align="center" :show-overflow-tooltip="true" width="120" prop="endDate"/>
@@ -157,7 +65,7 @@
                 icon="el-icon-edit"
                 @click="handleUpdate(scope.row)"
                 v-hasPermi="['spec:feedback:edit']"
-                v-if="scope.row.feedbackStatus==0"
+                v-if="scope.row.successorFeedback!=null && scope.row.feedbackStatus==0"
               >修改</el-button>
               <el-button
                 size="mini"
@@ -165,7 +73,7 @@
                 icon="el-icon-edit"
                 @click="handleSubmit(scope.row)"
                 v-hasPermi="['spec:feedback:edit']"
-                v-if="scope.row.successorFeedback!=null && scope.row.feedbackStatus!=1"
+                v-if="scope.row.successorFeedback!=null && scope.row.feedbackStatus==0"
               >提交</el-button>
             </template>
           </el-table-column>
@@ -191,13 +99,146 @@
           </div>
         </el-dialog>
       </el-tab-pane>
-      <el-tab-pane label="季度反馈"></el-tab-pane>
+      <el-tab-pane label="季度反馈">
+        <!-- 搜索栏 -->
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+          <el-form-item label="年" prop="feedbackYear">
+            <el-input
+              v-model="queryParams.feedbackYear"
+              placeholder="请输入年"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+              label-width="35px"
+            />
+          </el-form-item>
+          <el-form-item label="季度" prop="feedbackSeason">
+            <el-input
+              v-model="queryParams.feedbackSeason"
+              placeholder="请输入季度"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+              label-width="50px"
+            />
+          </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-button icon="el-icon-refresh" size="mini" @click="refresh()">刷新</el-button>
+          </el-form-item>
+        </el-form>
+        <!-- 列表 -->
+        <el-table
+          :span-method="spanMethod" 
+          v-loading="loading" 
+          :data="feedbackListSeasonal" 
+          @selection-change="handleSelectionChange" 
+          :height="clientHeight" 
+          border
+        >
+          <el-table-column label="时间" align="center" :show-overflow-tooltip="true" width="120">
+            <template slot-scope="scope">
+              <span>{{scope.row.feedbackYear}}年{{scope.row.feedbackSeason}}季度</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="培训内容" align="center" :show-overflow-tooltip="true" prop="plantName"/>
+          <el-table-column label="开始日期" align="center" :show-overflow-tooltip="true" width="120" prop="startDate"/>
+          <el-table-column label="结束日期" align="center" :show-overflow-tooltip="true" width="120" prop="endDate"/>
+          <el-table-column label="实际完成日期" align="center" :show-overflow-tooltip="true" width="120" prop="dateOfCompletion"/>
+          <el-table-column label="学习状态" align="center" :show-overflow-tooltip="true" width="120" prop="studyStatus"/>
+          <el-table-column label="导师反馈" align="center" prop="mentorFeedback" :show-overflow-tooltip="true"/>
+          <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-document"
+                @click="handleDoc(scope.row)"
+                v-hasPermi="['spec:feedback:edit']"
+              >上传附件</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+        <!-- 报告附件对话框 -->
+        <el-dialog v-dialogDrag :title="doc.title" :visible.sync="doc.open" width="700px" append-to-body>
+          <el-upload
+            ref="doc"
+            :limit="50"
+            :headers="doc.headers"
+            :action="doc.url + '?pType=' + doc.pType + '&pId=' + doc.pId"
+            :disabled="doc.isUploading"
+            :on-progress="handleFileDocProgress"
+            :on-success="handleFileDocSuccess"
+            :auto-upload="true"
+            drag
+          >
+            <i class="el-icon-upload"></i>
+            <div class="el-upload__text">
+              {{ $t('将文件拖到此处,或') }}
+              <em>{{ $t('点击上传') }}</em>
+            </div>
+          </el-upload>
+          <el-table :data="doc.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>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDeleteDoc(scope.row)"
+                >{{ $t('删除') }}</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-dialog v-dialogDrag :title="pdf.title" :visible.sync="pdf.open" width="1300px" append-to-body>
+            <div style="margin-top: -60px;float: right;margin-right: 40px;">
+              <el-button size="mini" type="text" @click="openPdf">{{$t('新页面打开PDF')}}</el-button></div>
+            <div style="margin-top: -30px">
+              <iframe :src="pdf.pdfUrl" frameborder="0" width="100%" height="700px"></iframe>
+            </div>
+          </el-dialog>
+          <div slot="footer" class="dialog-footer">
+            <el-button @click="doc.open = false">{{ $t('返 回') }}</el-button>
+          </div>
+        </el-dialog>
+      </el-tab-pane>
     </el-tabs>
   </div>
 </template>
 
 <script>
-import { listSuccessorMonthlyFeedback, getFeedback, delFeedback, addFeedback, updateFeedback, exportFeedback, importTemplate} from "@/api/training/spec/feedback";
+import { listSuccessorMonthlyFeedback, listSuccessorSeasonalFeedback, getFeedback, delFeedback, addFeedback, updateFeedback, exportFeedback, importTemplate} from "@/api/training/spec/feedback";
 import { treeselect } from "@/api/system/dept";
 import { getToken } from "@/utils/auth";
 import Treeselect from "@riophae/vue-treeselect";
@@ -208,6 +249,7 @@ export default {
   components: { Treeselect },
   data() {
     return {
+      // 标签页选中项
       activeName: 'first',
       // 遮罩层
       loading: true,
@@ -223,6 +265,8 @@ export default {
       total: 0,
       // 专项培训反馈表格数据
       feedbackList: [],
+      // 专项培训季度反馈表格数据
+      feedbackListSeasonal: [],
       // 弹出层标题
       title: "",
       // 部门树选项
@@ -267,7 +311,42 @@ export default {
       form: {},
       // 表单校验
       rules: {
-      }
+      },
+      // 报告附件参数
+      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
+      },
+      // pdf文件参数
+      pdf : {
+          title: '',
+          pdfUrl: '',
+          numPages: null,
+          open: false,
+          pageNum: 1,
+          pageTotalNum: 1,
+          loadedRatio: 0,
+      },
     };
   },
   watch: {
@@ -282,15 +361,16 @@ export default {
           this.clientHeight = document.body.clientHeight -250
       })
     this.getList();
+    this.getListSeasonal();
     this.getTreeselect();
   },
   methods: {
     // 合并单元格
     spanMethod({ row, column, rowIndex, columnIndex }) {
       if (columnIndex === 0 || columnIndex === 6 || columnIndex === 7 || columnIndex === 8) {
-        if (rowIndex === 0) {
+        if (row.isFirstLine == 1) {
           return {
-            rowspan: 3,
+            rowspan: row.rowspan,
             colspan: 1
           };
         } else {
@@ -299,18 +379,6 @@ export default {
             colspan: 0
           };
         }
-        
-        // if (rowIndex % 2 === 0) {
-        //   return {
-        //     rowspan: 2,
-        //     colspan: 1
-        //   };
-        // } else {
-          // return {
-          //   rowspan: 1,
-          //   colspan: 1
-          // };
-        // }
       }
     },
     // 刷新
@@ -318,6 +386,7 @@ export default {
       // 保留检索条件
       this.getList(this.form);
     },
+    // 标签页切换
     handleClick(tab, event) {
         console.log(tab, event);
       },
@@ -332,10 +401,17 @@ export default {
           for (let j = 0; j < planList.length; j++) {
             let data = {...planList[j]};
             data.id = responseRows[i].id;
+            data.feedbackStatus = responseRows[i].feedbackStatus;
             data.feedbackYear = responseRows[i].feedbackYear;
             data.feedbackMonth = responseRows[i].feedbackMonth;
             data.mentorFeedback = responseRows[i].mentorFeedback;
             data.successorFeedback = responseRows[i].successorFeedback;
+            if (j == 0) {
+              data.isFirstLine = 1;
+              data.rowspan = planList.length;
+            } else {
+              data.isFirstLine = 0;
+            }
             dataList.push(data);
           }
         }
@@ -343,6 +419,83 @@ export default {
         this.total = response.total;
         this.loading = false;
       });
+    },
+    /** 查询专项培训季度反馈列表 */
+    getListSeasonal() {
+      this.loading = true;
+      listSuccessorSeasonalFeedback(this.queryParams).then(response => {
+        let dataList = [];
+        let responseRows = response.rows;
+        for (let i = 0; i < responseRows.length; i++) {
+          let planList = responseRows[i].planList;
+          for (let j = 0; j < planList.length; j++) {
+            let data = {...planList[j]};
+            data.id = responseRows[i].id;
+            data.feedbackStatus = responseRows[i].feedbackStatus;
+            data.feedbackYear = responseRows[i].feedbackYear;
+            data.feedbackSeason = responseRows[i].feedbackSeason;
+            data.mentorFeedback = responseRows[i].mentorFeedback;
+            data.successorFeedback = responseRows[i].successorFeedback;
+            if (j == 0) { // 第一条计划
+              data.isFirstLine = 1;
+              data.rowspan = planList.length;
+            } else {
+              data.isFirstLine = 0;
+            }
+            dataList.push(data);
+          }
+        }
+        this.feedbackListSeasonal = dataList;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 文件下载处理 */
+    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
+    },
+    /** 报告附件按钮操作 */
+    handleDoc(row) {
+      this.doc.id = row.id;
+      this.doc.title = row.feedbackYear + "年" + row.feedbackSeason + "季度" + this.$t('学习汇报附件');
+      this.doc.open = true;
+      this.doc.queryParams.pId = row.id
+      this.doc.pId = row.id
+      this.getFileList()
+      this.$nextTick(() => {
+        this.$refs.doc.clearFiles()
+      })
+    },
+    getFileList (){
+      allFileList(this.doc.queryParams).then(response => {
+        this.doc.commonfileList = response;
+      });
+    },
+    /** 附件上传中处理 */
+    handleFileDocProgress(event, file, fileList) {
+      this.doc.file = file;
+      this.doc.isUploading = true;
+    },
+    /** 附件上传成功处理 */
+    handleFileDocSuccess(response, file, fileList) {
+      this.doc.isUploading = false;
+      this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
+      this.getFileList()
     },
      /** 查询部门下拉树结构 */
      getTreeselect() {
@@ -497,4 +650,4 @@ export default {
       }
   }
 };
-</script>
+</script>