@@ -35,4 +35,36 @@ public interface BizConst { | |||||
* 复评员 | * 复评员 | ||||
*/ | */ | ||||
String REAPPRAISAL_ROLE = "复评员"; | String REAPPRAISAL_ROLE = "复评员"; | ||||
String FIRST_INDEX_NAME = "firstIndexName"; | |||||
String FIRST_INDEX_TITLE = "一级指标"; | |||||
String SECOND_INDEX_NAME = "secondIndexName"; | |||||
String SECOND_INDEX_TITLE = "二级指标"; | |||||
String THIRD_INDEX_NAME = "thirdIndexName"; | |||||
String THIRD_INDEX_TITLE = "三级指标"; | |||||
String INDEX_SCORE = "indexScore"; | |||||
String INDEX_SCORE_TITLE = "指标分值"; | |||||
String INDEX_DETAIL = "indexDetail"; | |||||
String INDEX_DETAIL_TITLE = "指标细则"; | |||||
String GRADE_DETAIL = "gradeDetail"; | |||||
String GRADE_DETAIL_TITLE = "评分细则"; | |||||
String SUPPORT_MATERIAL = "supportMaterial"; | |||||
String SUPPORT_MATERIAL_TITLE = "佐证材料"; | |||||
String SELF_APPRAISAL_BASIS = "selfAppraisalBasis"; | |||||
String SELF_APPRAISAL_BASIS_TITLE = "自评依据"; | |||||
String SELF_APPRAISAL_SCORE = "selfAppraisalScore"; | |||||
String SELF_APPRAISAL_SCORE_TITLE = "自评得分"; | |||||
String RE_APPRAISAL_BASIS = "refAppraisalBasis"; | |||||
String RE_APPRAISAL_BASIS_TITLE = "复评依据"; | |||||
String RE_APPRAISAL_SCORE = "reAppraisalScore"; | |||||
String RE_APPRAISAL_SCORE_TITLE = "复评得分"; | |||||
String VERIFY_BASIS = "verifyBasis"; | |||||
String VERIFY_BASIS_TITLE = "核查依据"; | |||||
String VERIFY_SCORE = "verifyScore"; | |||||
String VERIFY_SCORE_TITLE = "核查得分"; | |||||
String IS_ADDITIONAL = "isAdditional"; | |||||
String IS_ADDITIONAL_TITLE = "是否附加指标"; | |||||
String RE_APPRAISAL = "(复评)"; | |||||
String VERIFY = "(核查)"; | |||||
} | } |
@@ -12,6 +12,7 @@ import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalApplication | |||||
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectGroupVO; | import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectGroupVO; | ||||
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectVO; | import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectVO; | ||||
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalVO; | import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalVO; | ||||
import com.ningdatech.pmapi.projectlib.model.vo.ProjectLibListItemVO; | |||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
@@ -53,6 +54,12 @@ public class PerformanceAppraisalPlanController { | |||||
return performanceAppraisalPlanManage.create(createDTO); | return performanceAppraisalPlanManage.create(createDTO); | ||||
} | } | ||||
@GetMapping("/final-project-list") | |||||
@ApiOperation("评价计划-终验项目列表") | |||||
public PageVo<ProjectLibListItemVO> finalProjectList(PerformanceAppraisalListReq req) { | |||||
return performanceAppraisalPlanManage.finalProjectList(req); | |||||
} | |||||
@PostMapping("/addProject") | @PostMapping("/addProject") | ||||
@ApiOperation("评价计划-添加待评价项目") | @ApiOperation("评价计划-添加待评价项目") | ||||
@WebLog("评价计划-添加待评价项目") | @WebLog("评价计划-添加待评价项目") | ||||
@@ -1,9 +1,12 @@ | |||||
package com.ningdatech.pmapi.performance.controller; | package com.ningdatech.pmapi.performance.controller; | ||||
import javax.servlet.http.HttpServletResponse; | |||||
import javax.validation.Valid; | import javax.validation.Valid; | ||||
import com.ningdatech.log.annotation.WebLog; | import com.ningdatech.log.annotation.WebLog; | ||||
import com.ningdatech.pmapi.common.util.ExcelDownUtil; | |||||
import com.ningdatech.pmapi.performance.manage.VerifyManage; | import com.ningdatech.pmapi.performance.manage.VerifyManage; | ||||
import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalExportReq; | |||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
@@ -49,4 +52,11 @@ public class VerifyController { | |||||
return verifyManage.submitVerify(param); | return verifyManage.submitVerify(param); | ||||
} | } | ||||
@GetMapping("/score/export") | |||||
@ApiOperation("核查打分导出") | |||||
@WebLog(value = "核查打分导出",modular = "绩效评价-专家核查") | |||||
public void exportScore(@Valid @ModelAttribute PerformanceAppraisalExportReq param, HttpServletResponse response){ | |||||
ExcelDownUtil.downXls(response, param, verifyManage::exportScore); | |||||
} | |||||
} | } |
@@ -6,6 +6,10 @@ import java.util.stream.Collectors; | |||||
import com.ningdatech.pmapi.performance.model.entity.*; | import com.ningdatech.pmapi.performance.model.entity.*; | ||||
import com.ningdatech.pmapi.performance.service.*; | import com.ningdatech.pmapi.performance.service.*; | ||||
import com.ningdatech.pmapi.projectlib.helper.ProjectHelper; | |||||
import com.ningdatech.pmapi.projectlib.manage.ProjectLibManage; | |||||
import com.ningdatech.pmapi.projectlib.model.req.ProjectListReq; | |||||
import com.ningdatech.pmapi.projectlib.model.vo.ProjectLibListItemVO; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
@@ -80,6 +84,7 @@ public class PerformanceAppraisalPlanManage { | |||||
private final BuildUserUtils buildUserUtils; | private final BuildUserUtils buildUserUtils; | ||||
private final IPerformanceAppraisalScoreInfoService performanceAppraisalScoreInfoService; | private final IPerformanceAppraisalScoreInfoService performanceAppraisalScoreInfoService; | ||||
private final IPerformanceAppraisalAppScoreInfoService performanceAppraisalAppScoreInfoService; | private final IPerformanceAppraisalAppScoreInfoService performanceAppraisalAppScoreInfoService; | ||||
private final ProjectLibManage projectLibManage; | |||||
/** | /** | ||||
* 绩效列表 | * 绩效列表 | ||||
@@ -320,11 +325,30 @@ public class PerformanceAppraisalPlanManage { | |||||
if(CollUtil.isEmpty(createDTO.getProjects())){ | if(CollUtil.isEmpty(createDTO.getProjects())){ | ||||
return; | return; | ||||
} | } | ||||
Integer startSelfDays = createDTO.getStartSelfDays(); | Integer startSelfDays = createDTO.getStartSelfDays(); | ||||
Integer completeSelfDays = createDTO.getCompleteSelfDays(); | Integer completeSelfDays = createDTO.getCompleteSelfDays(); | ||||
List<AppraisalProjectDTO> projects = createDTO.getProjects(); | List<AppraisalProjectDTO> projects = createDTO.getProjects(); | ||||
List<Long> proIdList = performanceAppraisalProjectService.list().stream() | |||||
.map(PerformanceAppraisalProject::getProjectId).collect(Collectors.toList()); | |||||
List<Long> projectIdList = projects.stream().map(AppraisalProjectDTO::getId).collect(Collectors.toList()); | |||||
// 判断提交时,项目是否已经被添加到其他评价计划中 | |||||
if (Boolean.TRUE.equals(haveIntersection(projectIdList, proIdList))){ | |||||
// 得到交集 | |||||
List<Long> intersection = Lists.newArrayList(projectIdList); | |||||
intersection.retainAll(proIdList); | |||||
// 获取重复添加的项目名称 | |||||
String names = intersection.stream().map(i -> { | |||||
Project project = projectService.getById(i); | |||||
if (Objects.nonNull(project)) { | |||||
return project.getProjectName(); | |||||
} | |||||
return StrPool.EMPTY; | |||||
}).collect(Collectors.joining(StrPool.COMMA)); | |||||
throw new BizException(names + CommonConst.PROJECT_REPEAT); | |||||
} | |||||
for(AppraisalProjectDTO appraisalProject : projects){ | for(AppraisalProjectDTO appraisalProject : projects){ | ||||
Project newProject = projectService.getNewProject(appraisalProject.getId()); | Project newProject = projectService.getNewProject(appraisalProject.getId()); | ||||
VUtils.isTrue(Objects.isNull(newProject)).throwMessage("项目不存在 " + appraisalProject.getId()); | VUtils.isTrue(Objects.isNull(newProject)).throwMessage("项目不存在 " + appraisalProject.getId()); | ||||
@@ -384,7 +408,28 @@ public class PerformanceAppraisalPlanManage { | |||||
return; | return; | ||||
} | } | ||||
List<Long> applicationIds = createDTO.getApplicationIds(); | |||||
List<Long> applicationIdList = createDTO.getApplicationIds(); | |||||
// 获取已经创建的评价计划中添加的评价应用ID | |||||
List<Long> applicationIds = performanceAppraisalApplicationService.list().stream() | |||||
.map(PerformanceAppraisalApplication::getApplicationId).collect(Collectors.toList()); | |||||
// 如果有交集,说明选择的应用中,有已经在其他评价计划中的应用 | |||||
if (Boolean.TRUE.equals(haveIntersection(applicationIdList, applicationIds))){ | |||||
// 得到交集 | |||||
List<Long> intersection = Lists.newArrayList(applicationIdList); | |||||
intersection.retainAll(applicationIds); | |||||
// 获取重复添加的应用名称 | |||||
String names = intersection.stream().map(i -> { | |||||
ProjectApplication application = applicationService.getById(i); | |||||
if (Objects.nonNull(application)) { | |||||
return Objects.nonNull(application.getApplicationName()) ? application.getApplicationName() | |||||
: application.getRelatedExistsApplication(); | |||||
} | |||||
return StrPool.EMPTY; | |||||
}).collect(Collectors.joining(StrPool.COMMA)); | |||||
throw new BizException(names + CommonConst.APP_REPEAT); | |||||
} | |||||
Map<Long, ProjectApplication> applicationMap = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class).in(ProjectApplication::getId, applicationIds)).stream() | Map<Long, ProjectApplication> applicationMap = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class).in(ProjectApplication::getId, applicationIds)).stream() | ||||
.collect(Collectors.toMap(ProjectApplication::getId, a -> a)); | .collect(Collectors.toMap(ProjectApplication::getId, a -> a)); | ||||
for(Long applicationId : applicationIds){ | for(Long applicationId : applicationIds){ | ||||
@@ -992,4 +1037,38 @@ public class PerformanceAppraisalPlanManage { | |||||
}).collect(Collectors.toList()); | }).collect(Collectors.toList()); | ||||
return PageVo.of(voList,voList.size()); | return PageVo.of(voList,voList.size()); | ||||
} | } | ||||
public PageVo<ProjectLibListItemVO> finalProjectList(PerformanceAppraisalListReq req) { | |||||
UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId()); | |||||
Long appraisalId = req.getAppraisalId(); | |||||
String projectName = req.getProjectName(); | |||||
String buildOrgName = req.getBuildOrgName(); | |||||
Integer projectType = req.getProjectType(); | |||||
Integer projectYear = req.getProjectYear(); | |||||
// 从项目库获取本区域已验收的项目列表 | |||||
ProjectListReq param = new ProjectListReq(); | |||||
param.setProjectName(projectName); | |||||
param.setBuildOrgName(buildOrgName); | |||||
param.setProjectType(projectType); | |||||
param.setProjectYear(projectYear); | |||||
param.setStatus(ProjectStatusEnum.ACCEPTED.getCode()); | |||||
PageVo<ProjectLibListItemVO> resList = projectLibManage.projectLibListWithPermission(param, user); | |||||
// 获取已添加到评价计划中的项目 | |||||
List<String> projectCodes = performanceAppraisalProjectService.list().stream() | |||||
.map(PerformanceAppraisalProject::getProjectCode).collect(Collectors.toList()); | |||||
// 如果是编辑评价计划,获取当前评价计划已添加的项目,并保留当前计划已添加的项目 | |||||
if (Objects.nonNull(appraisalId)) { | |||||
List<PerformanceAppraisalProject> projects = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class) | |||||
.eq(PerformanceAppraisalProject::getAppraisalId, appraisalId)); | |||||
if (CollUtil.isNotEmpty(projects)){ | |||||
List<String> projectCodeList = projects.stream().map(PerformanceAppraisalProject::getProjectCode).collect(Collectors.toList()); | |||||
projectCodes.removeAll(projectCodeList); | |||||
} | |||||
} | |||||
// 过滤掉已经添加到评价计划中的项目(如果是编辑评价计划,保留当前计划已添加的项目) | |||||
List<ProjectLibListItemVO> result = resList.getRecords().stream().filter(r -> !projectCodes.contains(r.getProjectCode())).collect(Collectors.toList()); | |||||
return PageVo.of(result,result.size()); | |||||
} | |||||
} | } |
@@ -6,20 +6,20 @@ import java.time.LocalDateTime; | |||||
import java.util.*; | import java.util.*; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
import cn.hutool.core.map.MapUtil; | |||||
import cn.hutool.core.util.CharsetUtil; | |||||
import com.alibaba.excel.EasyExcel; | import com.alibaba.excel.EasyExcel; | ||||
import com.alibaba.excel.write.builder.ExcelWriterBuilder; | |||||
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
import com.ningdatech.pmapi.common.enumeration.CommonEnum; | import com.ningdatech.pmapi.common.enumeration.CommonEnum; | ||||
import com.ningdatech.pmapi.common.util.ExcelDownUtil; | import com.ningdatech.pmapi.common.util.ExcelDownUtil; | ||||
import com.ningdatech.pmapi.common.util.ExcelExportStyle; | |||||
import com.ningdatech.pmapi.performance.model.dto.ReAppraisalScoreExportDTO; | |||||
import com.ningdatech.pmapi.performance.model.dto.SelfAppraisalScoreExportDTO; | |||||
import com.ningdatech.pmapi.performance.model.dto.*; | |||||
import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalExportReq; | import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalExportReq; | ||||
import com.ningdatech.pmapi.performance.util.ExcelFillCellMergeStrategy; | |||||
import com.ningdatech.pmapi.performance.util.MultiColumnMergeStrategy; | |||||
import com.ningdatech.pmapi.performance.util.*; | |||||
import com.ningdatech.pmapi.portrait.model.entity.ProjectTag; | import com.ningdatech.pmapi.portrait.model.entity.ProjectTag; | ||||
import com.ningdatech.pmapi.portrait.service.IProjectTagService; | import com.ningdatech.pmapi.portrait.service.IProjectTagService; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.checkerframework.checker.nullness.qual.Nullable; | |||||
import org.apache.poi.ss.formula.functions.T; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
@@ -32,8 +32,6 @@ import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.basic.util.StrPool; | import com.ningdatech.basic.util.StrPool; | ||||
import com.ningdatech.pmapi.performance.constant.BizConst; | import com.ningdatech.pmapi.performance.constant.BizConst; | ||||
import com.ningdatech.pmapi.performance.enumration.AppraisalTypeEnum; | import com.ningdatech.pmapi.performance.enumration.AppraisalTypeEnum; | ||||
import com.ningdatech.pmapi.performance.model.dto.ProjectAppraisalDTO; | |||||
import com.ningdatech.pmapi.performance.model.dto.ProjectAppraisalInfoDTO; | |||||
import com.ningdatech.pmapi.performance.model.entity.*; | import com.ningdatech.pmapi.performance.model.entity.*; | ||||
import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalListReq; | import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalListReq; | ||||
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectVO; | import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectVO; | ||||
@@ -384,143 +382,112 @@ public class ReAppraisalManage { | |||||
.eq(PerformanceIndicatorProjectTemplateDetail::getTemplateId, projectTemplate.getId())); | .eq(PerformanceIndicatorProjectTemplateDetail::getTemplateId, projectTemplate.getId())); | ||||
Map<Long, PerformanceIndicatorProjectTemplateDetail> templateDetailMap = templateDetails.stream().collect(Collectors.toMap(PerformanceIndicatorProjectTemplateDetail::getId, t -> t)); | Map<Long, PerformanceIndicatorProjectTemplateDetail> templateDetailMap = templateDetails.stream().collect(Collectors.toMap(PerformanceIndicatorProjectTemplateDetail::getId, t -> t)); | ||||
List<SelfAppraisalScoreExportDTO> exportDataList = Lists.newArrayList(); | |||||
List<SelfAppraisalScoreExportDTO> exportAdditionalDataList = Lists.newArrayList(); | |||||
List<Map<String, Object>> exportDataList = Lists.newArrayList(); | |||||
List<Map<String, Object>> exportAdditionalDataList = Lists.newArrayList(); | |||||
// 构建指标和打分详情 | // 构建指标和打分详情 | ||||
List<PerformanceAppraisalScoreInfo> scoreInfoList = performanceAppraisalScoreInfoService.list(Wrappers.lambdaQuery(PerformanceAppraisalScoreInfo.class) | List<PerformanceAppraisalScoreInfo> scoreInfoList = performanceAppraisalScoreInfoService.list(Wrappers.lambdaQuery(PerformanceAppraisalScoreInfo.class) | ||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalId, appraisalId) | .eq(PerformanceAppraisalScoreInfo::getAppraisalId, appraisalId) | ||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalType, AppraisalTypeEnum.RE_APPRAISAL.getCode()) | |||||
.and(wp -> wp.eq(PerformanceAppraisalScoreInfo::getAppraisalType, AppraisalTypeEnum.SELF_APPRAISAL.getCode()).or() | |||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalType, AppraisalTypeEnum.RE_APPRAISAL.getCode())) | |||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalProjectCode, projectCode) | .eq(PerformanceAppraisalScoreInfo::getAppraisalProjectCode, projectCode) | ||||
.orderBy(Boolean.TRUE, Boolean.TRUE, PerformanceAppraisalScoreInfo::getTemplateDetailId)); | .orderBy(Boolean.TRUE, Boolean.TRUE, PerformanceAppraisalScoreInfo::getTemplateDetailId)); | ||||
Map<Long, PerformanceAppraisalScoreInfo> scoreInfoMap = scoreInfoList.stream() | Map<Long, PerformanceAppraisalScoreInfo> scoreInfoMap = scoreInfoList.stream() | ||||
.collect(Collectors.toMap(PerformanceAppraisalScoreInfo::getTemplateDetailId, p -> p)); | .collect(Collectors.toMap(PerformanceAppraisalScoreInfo::getTemplateDetailId, p -> p)); | ||||
// 按照复评打分人员分组 | |||||
Map<String, List<PerformanceAppraisalScoreInfo>> scoreInfoUserMap = scoreInfoList.stream() | |||||
.collect(Collectors.groupingBy(PerformanceAppraisalScoreInfo::getAppraisalEmployeeName)); | |||||
Set<String> reUserList = scoreInfoUserMap.keySet(); | |||||
// 获取复评打分人员信息 | |||||
List<PerformanceAppraisalScoreInfo> reScoreInfoList = scoreInfoList.stream() | |||||
.filter(s -> AppraisalTypeEnum.RE_APPRAISAL.getCode().equals(s.getAppraisalType())) | |||||
.collect(Collectors.toList()); | |||||
List<String> reUserList = reScoreInfoList.stream() | |||||
.map(PerformanceAppraisalScoreInfo::getAppraisalEmployeeName) | |||||
.collect(Collectors.toList()); | |||||
// 筛选出所有打分的三级指标模板详情ID | // 筛选出所有打分的三级指标模板详情ID | ||||
for (PerformanceAppraisalScoreInfo scoreInfo : scoreInfoList) { | for (PerformanceAppraisalScoreInfo scoreInfo : scoreInfoList) { | ||||
SelfAppraisalScoreExportDTO thirdDto = new SelfAppraisalScoreExportDTO(); | |||||
HashMap<String, Object> scoreMap = MapUtil.newHashMap(); | |||||
Long detailId = scoreInfo.getTemplateDetailId(); | Long detailId = scoreInfo.getTemplateDetailId(); | ||||
PerformanceIndicatorProjectTemplateDetail thirdTemplateDetail = templateDetailMap.get(detailId); | PerformanceIndicatorProjectTemplateDetail thirdTemplateDetail = templateDetailMap.get(detailId); | ||||
thirdDto.setThirdIndexName(thirdTemplateDetail.getName()); | |||||
thirdDto.setIndexDetail(thirdTemplateDetail.getIndexDetail()); | |||||
thirdDto.setGradeDetail(thirdTemplateDetail.getGradeDetail()); | |||||
thirdDto.setSupportMaterial(thirdTemplateDetail.getSupportMaterial()); | |||||
thirdDto.setIndexScore(thirdTemplateDetail.getIndexScore()); | |||||
if (Boolean.TRUE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
thirdDto.setIsAdditional(CommonEnum.YES.getDesc()); | |||||
} else if (Boolean.FALSE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
thirdDto.setIsAdditional(CommonEnum.NO.getDesc()); | |||||
} | |||||
PerformanceAppraisalScoreInfo appraisalScoreInfo = scoreInfoMap.get(thirdTemplateDetail.getId()); | |||||
if (Objects.nonNull(appraisalScoreInfo)) { | |||||
thirdDto.setAppraisalBasis(appraisalScoreInfo.getAppraisalBasis()); | |||||
thirdDto.setAppraisalScore(appraisalScoreInfo.getAppraisalScore()); | |||||
} | |||||
// 二级指标名称 | // 二级指标名称 | ||||
Long secondId = thirdTemplateDetail.getParentId(); | Long secondId = thirdTemplateDetail.getParentId(); | ||||
if (Objects.nonNull(secondId)) { | if (Objects.nonNull(secondId)) { | ||||
PerformanceIndicatorProjectTemplateDetail secondTemplateDetail = templateDetailMap.get(secondId); | PerformanceIndicatorProjectTemplateDetail secondTemplateDetail = templateDetailMap.get(secondId); | ||||
if (Objects.nonNull(secondTemplateDetail)) { | if (Objects.nonNull(secondTemplateDetail)) { | ||||
thirdDto.setSecondIndexName(secondTemplateDetail.getName()); | |||||
// 一级指标名称 | // 一级指标名称 | ||||
Long firstId = secondTemplateDetail.getParentId(); | Long firstId = secondTemplateDetail.getParentId(); | ||||
if (Objects.nonNull(firstId)){ | if (Objects.nonNull(firstId)){ | ||||
PerformanceIndicatorProjectTemplateDetail firstTemplateDetail = templateDetailMap.get(firstId); | PerformanceIndicatorProjectTemplateDetail firstTemplateDetail = templateDetailMap.get(firstId); | ||||
if (Objects.nonNull(firstTemplateDetail)) { | if (Objects.nonNull(firstTemplateDetail)) { | ||||
thirdDto.setFirstIndexName(firstTemplateDetail.getName()); | |||||
scoreMap.put(BizConst.FIRST_INDEX_NAME,firstTemplateDetail.getName()); | |||||
scoreMap.put(BizConst.SECOND_INDEX_NAME,secondTemplateDetail.getName()); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
scoreMap.put(BizConst.THIRD_INDEX_NAME,thirdTemplateDetail.getName()); | |||||
scoreMap.put(BizConst.INDEX_SCORE,thirdTemplateDetail.getIndexScore()); | |||||
scoreMap.put(BizConst.INDEX_DETAIL,thirdTemplateDetail.getIndexDetail()); | |||||
scoreMap.put(BizConst.GRADE_DETAIL,thirdTemplateDetail.getGradeDetail()); | |||||
scoreMap.put(BizConst.SUPPORT_MATERIAL,thirdTemplateDetail.getSupportMaterial()); | |||||
PerformanceAppraisalScoreInfo appraisalScoreInfo = scoreInfoMap.get(thirdTemplateDetail.getId()); | |||||
// 构建自评和复评打分信息 | |||||
if (AppraisalTypeEnum.SELF_APPRAISAL.getCode().equals(appraisalScoreInfo.getAppraisalType())){ | |||||
scoreMap.put(BizConst.SELF_APPRAISAL_BASIS,appraisalScoreInfo.getAppraisalBasis()); | |||||
scoreMap.put(BizConst.SELF_APPRAISAL_SCORE,appraisalScoreInfo.getAppraisalScore()); | |||||
} else if (AppraisalTypeEnum.RE_APPRAISAL.getCode().equals(appraisalScoreInfo.getAppraisalType())) { | |||||
scoreMap.put(appraisalScoreInfo.getAppraisalEmployeeName() + BizConst.RE_APPRAISAL_BASIS, appraisalScoreInfo.getAppraisalBasis()); | |||||
scoreMap.put(appraisalScoreInfo.getAppraisalEmployeeName() + BizConst.RE_APPRAISAL_SCORE, appraisalScoreInfo.getAppraisalScore()); | |||||
} | |||||
if (Boolean.TRUE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
scoreMap.put(BizConst.IS_ADDITIONAL,CommonEnum.YES.getDesc()); | |||||
} else if (Boolean.FALSE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
scoreMap.put(BizConst.IS_ADDITIONAL,CommonEnum.NO.getDesc()); | |||||
} | |||||
if (Boolean.FALSE.equals(thirdTemplateDetail.getIsAdditional())) { | if (Boolean.FALSE.equals(thirdTemplateDetail.getIsAdditional())) { | ||||
exportDataList.add(thirdDto); | |||||
exportDataList.add(scoreMap); | |||||
}else { | }else { | ||||
exportAdditionalDataList.add(thirdDto); | |||||
exportAdditionalDataList.add(scoreMap); | |||||
} | } | ||||
} | } | ||||
exportDataList.addAll(exportAdditionalDataList); | exportDataList.addAll(exportAdditionalDataList); | ||||
List<List<SelfAppraisalScoreExportDTO>> dataList = Lists.newArrayList(); | |||||
dataList.add(exportDataList); | |||||
String fileName = "绩效评价_人工复评_评分明细表"; | String fileName = "绩效评价_人工复评_评分明细表"; | ||||
ExcelDownUtil.setFileName(fileName, response); | ExcelDownUtil.setFileName(fileName, response); | ||||
int[] mergeColumnIndex = {0}; | int[] mergeColumnIndex = {0}; | ||||
// 需要从第几行开始合并 | // 需要从第几行开始合并 | ||||
int mergeRowIndex = 2; | int mergeRowIndex = 2; | ||||
//数据导出处理函数 | |||||
try { | |||||
EasyExcel.write(response.getOutputStream(), SelfAppraisalScoreExportDTO.class) | |||||
.autoCloseStream(false) | |||||
.head(head(reUserList)) | |||||
.registerWriteHandler(new MultiColumnMergeStrategy(exportDataList.size(),0,1)) | |||||
.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex,mergeColumnIndex)) | |||||
.registerWriteHandler(ExcelExportStyle.formalStyle()) | |||||
.sheet(fileName) | |||||
//.doWrite(dataList); | |||||
.doWrite(getData()); | |||||
} catch (IOException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
private List<List<String>> head(Set<String> reUserList) { | |||||
List<List<String>> list = Lists.newArrayList(); | |||||
List<String> head0 = Lists.newArrayList(); | |||||
head0.add("一级指标"); | |||||
List<String> head1 = Lists.newArrayList(); | |||||
head1.add("二级指标"); | |||||
List<String> head2 = Lists.newArrayList(); | |||||
head2.add("三级指标"); | |||||
List<String> head3 = Lists.newArrayList(); | |||||
head2.add("指标分值"); | |||||
List<String> head4 = Lists.newArrayList(); | |||||
head2.add("指标细则"); | |||||
List<String> head5 = Lists.newArrayList(); | |||||
head2.add("评分细则"); | |||||
List<String> head6 = Lists.newArrayList(); | |||||
head2.add("佐证材料"); | |||||
List<String> head7 = Lists.newArrayList(); | |||||
head2.add("自评依据"); | |||||
List<String> head8 = Lists.newArrayList(); | |||||
head2.add("自评得分"); | |||||
list.add(head0); | |||||
list.add(head1); | |||||
list.add(head2); | |||||
list.add(head3); | |||||
list.add(head4); | |||||
list.add(head5); | |||||
list.add(head6); | |||||
list.add(head7); | |||||
list.add(head8); | |||||
List<String> reUserHead = Lists.newArrayList(); | |||||
reUserHead.add("复评依据"); | |||||
reUserHead.add("复评得分"); | |||||
List<ExcelHead> headList = Lists.newArrayList(); | |||||
headList.add(new ExcelHead(BizConst.FIRST_INDEX_NAME,BizConst.FIRST_INDEX_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SECOND_INDEX_NAME,BizConst.SECOND_INDEX_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.THIRD_INDEX_NAME,BizConst.THIRD_INDEX_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.INDEX_SCORE,BizConst.INDEX_SCORE_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.INDEX_DETAIL,BizConst.INDEX_DETAIL_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.GRADE_DETAIL,BizConst.GRADE_DETAIL_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SUPPORT_MATERIAL,BizConst.SUPPORT_MATERIAL_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SELF_APPRAISAL_BASIS,BizConst.SELF_APPRAISAL_BASIS_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SELF_APPRAISAL_SCORE,BizConst.SELF_APPRAISAL_SCORE_TITLE,StrPool.EMPTY)); | |||||
for (String reUser : reUserList) { | for (String reUser : reUserList) { | ||||
for (String h : reUserHead) { | |||||
List<String> reUsers = Lists.newArrayList(); | |||||
reUsers.add(reUser + "(复评)"); | |||||
reUsers.add(h); | |||||
list.add(reUsers); | |||||
} | |||||
headList.add(new ExcelHead(reUser + BizConst.RE_APPRAISAL_BASIS,BizConst.RE_APPRAISAL_BASIS_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(reUser + BizConst.RE_APPRAISAL_SCORE,BizConst.RE_APPRAISAL_SCORE_TITLE,StrPool.EMPTY)); | |||||
} | } | ||||
return list; | |||||
} | |||||
headList.add(new ExcelHead(BizConst.IS_ADDITIONAL,BizConst.IS_ADDITIONAL_TITLE,StrPool.EMPTY)); | |||||
public List<List<ReAppraisalScoreExportDTO>> getData() { | |||||
List<List<ReAppraisalScoreExportDTO>> total = new ArrayList<>(); | |||||
List<ReAppraisalScoreExportDTO> list = new ArrayList<>(); | |||||
for (int i = 0; i < 15; i++) { | |||||
ReAppraisalScoreExportDTO dto = new ReAppraisalScoreExportDTO(); | |||||
dto.setFirstIndexName("一级指标" + i); | |||||
list.add(dto); | |||||
// 数据导出处理函数 | |||||
try { | |||||
response.setCharacterEncoding(CharsetUtil.UTF_8); | |||||
response.setContentType(ContentTypeUtils.APPLICATION_EXCEL); | |||||
ExcelWriterBuilder writerBuilder = EasyExcel.write(); | |||||
writerBuilder.file(response.getOutputStream()); | |||||
writerBuilder.autoCloseStream(true); | |||||
writerBuilder.registerWriteHandler(new ExcelSheetVerticalCellStyleStrategy()); | |||||
writerBuilder.registerWriteHandler(new MultiColumnMergeStrategy(exportDataList.size(),0,1)); | |||||
writerBuilder.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex,mergeColumnIndex)); | |||||
writerBuilder.head(ExcelUtils.getHead(reUserList,Lists.newArrayList())) | |||||
.sheet(fileName) | |||||
.doWrite(ExcelUtils.convertData(headList, exportDataList)); | |||||
} catch (IOException e) { | |||||
throw new BizException(e.getMessage()); | |||||
} | } | ||||
total.add(list); | |||||
return total; | |||||
} | } | ||||
} | } |
@@ -1,13 +1,22 @@ | |||||
package com.ningdatech.pmapi.performance.manage; | package com.ningdatech.pmapi.performance.manage; | ||||
import java.io.IOException; | |||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
import java.util.*; | |||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
import cn.hutool.core.map.MapUtil; | |||||
import cn.hutool.core.util.CharsetUtil; | |||||
import com.alibaba.excel.EasyExcel; | |||||
import com.alibaba.excel.write.builder.ExcelWriterBuilder; | |||||
import com.ningdatech.pmapi.common.enumeration.CommonEnum; | |||||
import com.ningdatech.pmapi.common.util.ExcelDownUtil; | |||||
import com.ningdatech.pmapi.performance.constant.BizConst; | |||||
import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalExportReq; | |||||
import com.ningdatech.pmapi.performance.util.*; | |||||
import com.ningdatech.pmapi.portrait.model.entity.ProjectTag; | |||||
import com.ningdatech.pmapi.portrait.service.IProjectTagService; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
@@ -43,6 +52,8 @@ import cn.hutool.core.collection.CollUtil; | |||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import javax.servlet.http.HttpServletResponse; | |||||
/** | /** | ||||
* VerifyManage | * VerifyManage | ||||
* @return | * @return | ||||
@@ -61,6 +72,8 @@ public class VerifyManage { | |||||
private final IPerformanceIndicatorProjectTemplateDetailService indicatorProjectTemplateDetailService; | private final IPerformanceIndicatorProjectTemplateDetailService indicatorProjectTemplateDetailService; | ||||
private final IPerformanceAppraisalScoreInfoService performanceAppraisalScoreInfoService; | private final IPerformanceAppraisalScoreInfoService performanceAppraisalScoreInfoService; | ||||
private final IPerformanceAppraisalProjectGroupService groupService; | private final IPerformanceAppraisalProjectGroupService groupService; | ||||
private final IProjectTagService projectTagService; | |||||
private final IPerformanceIndicatorProjectTemplateService indicatorProjectTemplateService; | |||||
/** | /** | ||||
* 核查-评价计划列表 | * 核查-评价计划列表 | ||||
* @param req | * @param req | ||||
@@ -316,4 +329,184 @@ public class VerifyManage { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
public void exportScore(HttpServletResponse response, PerformanceAppraisalExportReq param) { | |||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||||
String regionCode = user.getRegionCode(); | |||||
String projectCode = param.getProjectCode(); | |||||
Long appraisalId = param.getAppraisalId(); | |||||
// 根据项目编码获取最新版本的项目信息 | |||||
Project project = projectService.getProjectByCode(projectCode); | |||||
VUtils.isTrue(Objects.isNull(project)).throwMessage("项目不存在!"); | |||||
// 根据项目类型、预算年度、批复金额、项目标签匹配本区域指标模版 | |||||
Integer projectType = project.getProjectType(); | |||||
Integer projectYear = project.getProjectYear(); | |||||
BigDecimal approvalAmount = project.getApprovalAmount(); | |||||
VUtils.isTrue(Objects.isNull(approvalAmount)).throwMessage("未获取到该项目的立项批复金额"); | |||||
// 根据项目code获取项目标签ID列表 | |||||
List<Long> tagIdList = projectTagService.list(Wrappers.lambdaQuery(ProjectTag.class) | |||||
.eq(ProjectTag::getProjectCode, projectCode)).stream() | |||||
.map(ProjectTag::getTagId).collect(Collectors.toList()); | |||||
VUtils.isTrue(CollUtil.isEmpty(tagIdList)).throwMessage("当前项目未设置标签,匹配不到指标模板,请至项目库或评价计划编辑页面设置标签!"); | |||||
List<String> strIdList = tagIdList.stream().map(String::valueOf).collect(Collectors.toList()); | |||||
String projectTagIds = String.join(StrPool.COMMA, strIdList); | |||||
Integer amountRange = null; | |||||
if (approvalAmount.compareTo(BigDecimal.valueOf(BizConst.FIVE_MILLION)) < 0){ | |||||
amountRange = BizConst.AMOUNT_RANGE_ONE; | |||||
} else if (approvalAmount.compareTo(BigDecimal.valueOf(BizConst.FIVE_MILLION)) >= 0 && | |||||
approvalAmount.compareTo(BigDecimal.valueOf(BizConst.TWENTY_MILLION)) < 0) { | |||||
amountRange = BizConst.AMOUNT_RANGE_TWO; | |||||
}else if (approvalAmount.compareTo(BigDecimal.valueOf(BizConst.TWENTY_MILLION)) >= 0){ | |||||
amountRange = BizConst.AMOUNT_RANGE_THREE; | |||||
} | |||||
LambdaQueryWrapper<PerformanceIndicatorProjectTemplate> wrapper = Wrappers.lambdaQuery(PerformanceIndicatorProjectTemplate.class) | |||||
.eq(PerformanceIndicatorProjectTemplate::getRegionCode, regionCode) | |||||
.eq(PerformanceIndicatorProjectTemplate::getProjectType, projectType) | |||||
.eq(PerformanceIndicatorProjectTemplate::getProjectYear, projectYear) | |||||
.eq(PerformanceIndicatorProjectTemplate::getAmountRange, amountRange) | |||||
.eq(PerformanceIndicatorProjectTemplate::getProjectTagIds,projectTagIds) | |||||
.eq(PerformanceIndicatorProjectTemplate::getStatus, CommonEnum.YES.getCode()) | |||||
.orderByDesc(PerformanceIndicatorProjectTemplate::getUpdateOn); | |||||
List<PerformanceIndicatorProjectTemplate> templates = indicatorProjectTemplateService.list(wrapper); | |||||
VUtils.isTrue(CollUtil.isEmpty(templates)).throwMessage("该项目匹配不到指标模板,请返回上一页或者刷新重试。"); | |||||
if (templates.size() > 1){ | |||||
throw new BizException("当前项目匹配到多个模板,请返回模板库检查模板配置!"); | |||||
} | |||||
PerformanceIndicatorProjectTemplate projectTemplate = templates.get(0); | |||||
// 装配项目指标详情及分数信息 | |||||
// 获取模版绩效指标详情 | |||||
List<PerformanceIndicatorProjectTemplateDetail> templateDetails = indicatorProjectTemplateDetailService.list(Wrappers.lambdaQuery(PerformanceIndicatorProjectTemplateDetail.class) | |||||
.eq(PerformanceIndicatorProjectTemplateDetail::getTemplateId, projectTemplate.getId())); | |||||
Map<Long, PerformanceIndicatorProjectTemplateDetail> templateDetailMap = templateDetails.stream().collect(Collectors.toMap(PerformanceIndicatorProjectTemplateDetail::getId, t -> t)); | |||||
List<Map<String, Object>> exportDataList = Lists.newArrayList(); | |||||
List<Map<String, Object>> exportAdditionalDataList = Lists.newArrayList(); | |||||
// 构建指标和打分详情 | |||||
List<PerformanceAppraisalScoreInfo> scoreInfoList = performanceAppraisalScoreInfoService.list(Wrappers.lambdaQuery(PerformanceAppraisalScoreInfo.class) | |||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalId, appraisalId) | |||||
.and(wp -> wp.eq(PerformanceAppraisalScoreInfo::getAppraisalType, AppraisalTypeEnum.SELF_APPRAISAL.getCode()).or() | |||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalType, AppraisalTypeEnum.RE_APPRAISAL.getCode()).or() | |||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalType, AppraisalTypeEnum.EXPERT_VERIFY.getCode())) | |||||
.eq(PerformanceAppraisalScoreInfo::getAppraisalProjectCode, projectCode) | |||||
.orderBy(Boolean.TRUE, Boolean.TRUE, PerformanceAppraisalScoreInfo::getTemplateDetailId)); | |||||
Map<Long, PerformanceAppraisalScoreInfo> scoreInfoMap = scoreInfoList.stream() | |||||
.collect(Collectors.toMap(PerformanceAppraisalScoreInfo::getTemplateDetailId, p -> p)); | |||||
// 获取复评打分人员信息 | |||||
List<PerformanceAppraisalScoreInfo> reScoreInfoList = scoreInfoList.stream() | |||||
.filter(s -> AppraisalTypeEnum.RE_APPRAISAL.getCode().equals(s.getAppraisalType())) | |||||
.collect(Collectors.toList()); | |||||
List<String> reUserList = reScoreInfoList.stream() | |||||
.map(PerformanceAppraisalScoreInfo::getAppraisalEmployeeName) | |||||
.collect(Collectors.toList()); | |||||
// 获取核查打分人员信息 | |||||
List<PerformanceAppraisalScoreInfo> verifyScoreInfoList = scoreInfoList.stream() | |||||
.filter(s -> AppraisalTypeEnum.EXPERT_VERIFY.getCode().equals(s.getAppraisalType())) | |||||
.collect(Collectors.toList()); | |||||
List<String> verifyUserList = verifyScoreInfoList.stream() | |||||
.map(PerformanceAppraisalScoreInfo::getAppraisalEmployeeName) | |||||
.collect(Collectors.toList()); | |||||
// 筛选出所有打分的三级指标模板详情ID | |||||
for (PerformanceAppraisalScoreInfo scoreInfo : scoreInfoList) { | |||||
HashMap<String, Object> scoreMap = MapUtil.newHashMap(); | |||||
Long detailId = scoreInfo.getTemplateDetailId(); | |||||
PerformanceIndicatorProjectTemplateDetail thirdTemplateDetail = templateDetailMap.get(detailId); | |||||
// 二级指标名称 | |||||
Long secondId = thirdTemplateDetail.getParentId(); | |||||
if (Objects.nonNull(secondId)) { | |||||
PerformanceIndicatorProjectTemplateDetail secondTemplateDetail = templateDetailMap.get(secondId); | |||||
if (Objects.nonNull(secondTemplateDetail)) { | |||||
// 一级指标名称 | |||||
Long firstId = secondTemplateDetail.getParentId(); | |||||
if (Objects.nonNull(firstId)){ | |||||
PerformanceIndicatorProjectTemplateDetail firstTemplateDetail = templateDetailMap.get(firstId); | |||||
if (Objects.nonNull(firstTemplateDetail)) { | |||||
scoreMap.put(BizConst.FIRST_INDEX_NAME,firstTemplateDetail.getName()); | |||||
scoreMap.put(BizConst.SECOND_INDEX_NAME,secondTemplateDetail.getName()); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
scoreMap.put(BizConst.THIRD_INDEX_NAME,thirdTemplateDetail.getName()); | |||||
scoreMap.put(BizConst.INDEX_SCORE,thirdTemplateDetail.getIndexScore()); | |||||
scoreMap.put(BizConst.INDEX_DETAIL,thirdTemplateDetail.getIndexDetail()); | |||||
scoreMap.put(BizConst.GRADE_DETAIL,thirdTemplateDetail.getGradeDetail()); | |||||
scoreMap.put(BizConst.SUPPORT_MATERIAL,thirdTemplateDetail.getSupportMaterial()); | |||||
PerformanceAppraisalScoreInfo appraisalScoreInfo = scoreInfoMap.get(thirdTemplateDetail.getId()); | |||||
// 构建自评和复评打分信息 | |||||
if (AppraisalTypeEnum.SELF_APPRAISAL.getCode().equals(appraisalScoreInfo.getAppraisalType())){ | |||||
scoreMap.put(BizConst.SELF_APPRAISAL_BASIS,appraisalScoreInfo.getAppraisalBasis()); | |||||
scoreMap.put(BizConst.SELF_APPRAISAL_SCORE,appraisalScoreInfo.getAppraisalScore()); | |||||
} else if (AppraisalTypeEnum.RE_APPRAISAL.getCode().equals(appraisalScoreInfo.getAppraisalType())) { | |||||
scoreMap.put(appraisalScoreInfo.getAppraisalEmployeeName() + BizConst.RE_APPRAISAL_BASIS, appraisalScoreInfo.getAppraisalBasis()); | |||||
scoreMap.put(appraisalScoreInfo.getAppraisalEmployeeName() + BizConst.RE_APPRAISAL_SCORE, appraisalScoreInfo.getAppraisalScore()); | |||||
} else if (AppraisalTypeEnum.EXPERT_VERIFY.getCode().equals(appraisalScoreInfo.getAppraisalType())) { | |||||
scoreMap.put(appraisalScoreInfo.getAppraisalEmployeeName() + BizConst.VERIFY_BASIS, appraisalScoreInfo.getAppraisalBasis()); | |||||
scoreMap.put(appraisalScoreInfo.getAppraisalEmployeeName() + BizConst.VERIFY_SCORE, appraisalScoreInfo.getAppraisalScore()); | |||||
} | |||||
if (Boolean.TRUE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
scoreMap.put(BizConst.IS_ADDITIONAL,CommonEnum.YES.getDesc()); | |||||
} else if (Boolean.FALSE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
scoreMap.put(BizConst.IS_ADDITIONAL,CommonEnum.NO.getDesc()); | |||||
} | |||||
if (Boolean.FALSE.equals(thirdTemplateDetail.getIsAdditional())) { | |||||
exportDataList.add(scoreMap); | |||||
}else { | |||||
exportAdditionalDataList.add(scoreMap); | |||||
} | |||||
} | |||||
exportDataList.addAll(exportAdditionalDataList); | |||||
String fileName = "绩效评价_专家核查_评分明细表"; | |||||
ExcelDownUtil.setFileName(fileName, response); | |||||
int[] mergeColumnIndex = {0}; | |||||
// 需要从第几行开始合并 | |||||
int mergeRowIndex = 2; | |||||
List<ExcelHead> headList = Lists.newArrayList(); | |||||
headList.add(new ExcelHead(BizConst.FIRST_INDEX_NAME,BizConst.FIRST_INDEX_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SECOND_INDEX_NAME,BizConst.SECOND_INDEX_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.THIRD_INDEX_NAME,BizConst.THIRD_INDEX_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.INDEX_SCORE,BizConst.INDEX_SCORE_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.INDEX_DETAIL,BizConst.INDEX_DETAIL_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.GRADE_DETAIL,BizConst.GRADE_DETAIL_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SUPPORT_MATERIAL,BizConst.SUPPORT_MATERIAL_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SELF_APPRAISAL_BASIS,BizConst.SELF_APPRAISAL_BASIS_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(BizConst.SELF_APPRAISAL_SCORE,BizConst.SELF_APPRAISAL_SCORE_TITLE,StrPool.EMPTY)); | |||||
for (String reUser : reUserList) { | |||||
headList.add(new ExcelHead(reUser + BizConst.RE_APPRAISAL_BASIS,BizConst.RE_APPRAISAL_BASIS_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(reUser + BizConst.RE_APPRAISAL_SCORE,BizConst.RE_APPRAISAL_SCORE_TITLE,StrPool.EMPTY)); | |||||
} | |||||
for (String verifyUser : verifyUserList) { | |||||
headList.add(new ExcelHead(verifyUser + BizConst.VERIFY_BASIS,BizConst.VERIFY_BASIS_TITLE,StrPool.EMPTY)); | |||||
headList.add(new ExcelHead(verifyUser + BizConst.VERIFY_SCORE,BizConst.VERIFY_SCORE_TITLE,StrPool.EMPTY)); | |||||
} | |||||
headList.add(new ExcelHead(BizConst.IS_ADDITIONAL,BizConst.IS_ADDITIONAL_TITLE,StrPool.EMPTY)); | |||||
// 数据导出处理函数 | |||||
try { | |||||
response.setCharacterEncoding(CharsetUtil.UTF_8); | |||||
response.setContentType(ContentTypeUtils.APPLICATION_EXCEL); | |||||
ExcelWriterBuilder writerBuilder = EasyExcel.write(); | |||||
writerBuilder.file(response.getOutputStream()); | |||||
writerBuilder.autoCloseStream(true); | |||||
writerBuilder.registerWriteHandler(new ExcelSheetVerticalCellStyleStrategy()); | |||||
writerBuilder.registerWriteHandler(new MultiColumnMergeStrategy(exportDataList.size(),0,1)); | |||||
writerBuilder.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex,mergeColumnIndex)); | |||||
writerBuilder.head(ExcelUtils.getHead(reUserList,verifyUserList)) | |||||
.sheet(fileName) | |||||
.doWrite(ExcelUtils.convertData(headList, exportDataList)); | |||||
} catch (IOException e) { | |||||
throw new BizException(e.getMessage()); | |||||
} | |||||
} | |||||
} | } |
@@ -0,0 +1,27 @@ | |||||
package com.ningdatech.pmapi.performance.model.dto; | |||||
import java.io.Serializable; | |||||
import java.math.BigDecimal; | |||||
import javax.validation.constraints.NotNull; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* 应用评价信息 | |||||
* @return | |||||
* @author CMM | |||||
* @since 2023/08/08 18:46 | |||||
*/ | |||||
@Data | |||||
public class ReAppraisalInfoDTO implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("复评依据") | |||||
private String reAppraisalBasis; | |||||
@ApiModelProperty("复评得分") | |||||
private BigDecimal reAppraisalScore; | |||||
} |
@@ -2,6 +2,7 @@ package com.ningdatech.pmapi.performance.model.dto; | |||||
import java.io.Serializable; | import java.io.Serializable; | ||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
import java.util.List; | |||||
import com.alibaba.excel.annotation.ExcelProperty; | import com.alibaba.excel.annotation.ExcelProperty; | ||||
@@ -57,7 +58,7 @@ public class ReAppraisalScoreExportDTO implements Serializable { | |||||
@ApiModelProperty("复评依据") | @ApiModelProperty("复评依据") | ||||
@ExcelProperty(value = "复评依据",index = 9) | @ExcelProperty(value = "复评依据",index = 9) | ||||
private String reAppraisalBasis; | |||||
private String refAppraisalBasis; | |||||
@ApiModelProperty("复评得分") | @ApiModelProperty("复评得分") | ||||
@ExcelProperty(value = "复评得分",index = 10) | @ExcelProperty(value = "复评得分",index = 10) | ||||
@@ -0,0 +1,36 @@ | |||||
package com.ningdatech.pmapi.performance.model.entity; | |||||
/** | |||||
* @author CMM | |||||
* @since 2023/08/17 21:03 | |||||
*/ | |||||
import lombok.Data; | |||||
/** | |||||
* Excel 导出类 - ExcelHead | |||||
*/ | |||||
@Data | |||||
public class ExcelHead<T> { | |||||
/** | |||||
* 内容里的字段名称 | |||||
*/ | |||||
private String fieldName; | |||||
/** | |||||
* 显示值,一般为中文的 | |||||
*/ | |||||
private String title; | |||||
/** | |||||
* 如果为 null 的值 | |||||
*/ | |||||
private T nullValue; | |||||
public ExcelHead(String fieldName, String title) { | |||||
this.fieldName = fieldName; | |||||
this.title = title; | |||||
} | |||||
public ExcelHead(String fieldName, String title, T nullValue) { | |||||
this.fieldName = fieldName; | |||||
this.title = title; | |||||
this.nullValue = nullValue; | |||||
} | |||||
} |
@@ -12,7 +12,7 @@ import lombok.Data; | |||||
@Data | @Data | ||||
public class PerformanceAppraisalExportReq { | public class PerformanceAppraisalExportReq { | ||||
@ApiModelProperty("计划名称") | |||||
@ApiModelProperty("项目编号") | |||||
private String projectCode; | private String projectCode; | ||||
@ApiModelProperty("评价计划Id") | @ApiModelProperty("评价计划Id") | ||||
@@ -48,4 +48,10 @@ public class PerformanceAppraisalListReq extends PagePo { | |||||
@ApiModelProperty("评价计划ID") | @ApiModelProperty("评价计划ID") | ||||
private Long appraisalId; | private Long appraisalId; | ||||
@ApiModelProperty("项目类型") | |||||
private Integer projectType; | |||||
@ApiModelProperty("预算年度") | |||||
private Integer projectYear; | |||||
} | } |
@@ -0,0 +1,37 @@ | |||||
package com.ningdatech.pmapi.performance.util; | |||||
/** | |||||
* @author CMM | |||||
* @since 2023/08/17 21:02 | |||||
*/ | |||||
import cn.hutool.core.util.CharsetUtil; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.wflow.config.ResponseCode; | |||||
import java.io.UnsupportedEncodingException; | |||||
import java.net.URLEncoder; | |||||
/** | |||||
* Content-type 工具类 | |||||
* @return | |||||
* @author CMM | |||||
* @since 2023/08/17 21:05 | |||||
*/ | |||||
public final class ContentTypeUtils { | |||||
public static final String CONTENT_DISPOSITION; | |||||
public static final String APPLICATION_EXCEL; | |||||
static { | |||||
CONTENT_DISPOSITION = "Content-Disposition"; | |||||
APPLICATION_EXCEL = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; | |||||
} | |||||
public static String encode(String fileName) { | |||||
try { | |||||
return "attachment;filename=" + URLEncoder.encode(fileName, CharsetUtil.UTF_8) + ".xlsx"; | |||||
} catch (UnsupportedEncodingException e) { | |||||
throw new BizException(e.getMessage()); | |||||
} | |||||
} | |||||
} | |||||
@@ -0,0 +1,37 @@ | |||||
package com.ningdatech.pmapi.performance.util; | |||||
/** | |||||
* @author CMM | |||||
* @since 2023/08/17 21:01 | |||||
*/ | |||||
import com.alibaba.excel.metadata.Head; | |||||
import com.alibaba.excel.write.metadata.style.WriteCellStyle; | |||||
import com.alibaba.excel.write.style.AbstractVerticalCellStyleStrategy; | |||||
/** | |||||
* excel 样式设置 | |||||
* @return | |||||
* @author CMM | |||||
* @since 2023/08/17 21:07 | |||||
*/ | |||||
public class ExcelSheetVerticalCellStyleStrategy extends AbstractVerticalCellStyleStrategy { | |||||
/** | |||||
* 头部样式 | |||||
* | |||||
* @return 样式 | |||||
*/ | |||||
@Override | |||||
protected WriteCellStyle headCellStyle(Head head) { | |||||
return ExcelUtils.writeCellStyle(); | |||||
} | |||||
/** | |||||
* 内容样式 | |||||
* | |||||
* @return 样式 | |||||
*/ | |||||
@Override | |||||
protected WriteCellStyle contentCellStyle(Head head) { | |||||
return ExcelUtils.writeCellStyle(); | |||||
} | |||||
} |
@@ -0,0 +1,118 @@ | |||||
package com.ningdatech.pmapi.performance.util; | |||||
/** | |||||
* @author CMM | |||||
* @since 2023/08/17 20:59 | |||||
*/ | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.ningdatech.pmapi.performance.constant.BizConst; | |||||
import org.apache.poi.ss.formula.functions.T; | |||||
import org.apache.poi.ss.usermodel.BorderStyle; | |||||
import org.apache.poi.ss.usermodel.HorizontalAlignment; | |||||
import org.apache.poi.ss.usermodel.VerticalAlignment; | |||||
import com.alibaba.excel.write.metadata.style.WriteCellStyle; | |||||
import com.google.common.collect.Lists; | |||||
import com.ningdatech.pmapi.performance.model.entity.ExcelHead; | |||||
/** | |||||
* excel 工具类 | |||||
* @return | |||||
* @author CMM | |||||
* @since 2023/08/17 21:07 | |||||
*/ | |||||
public class ExcelUtils { | |||||
/** | |||||
* 构造excel基础样式 | |||||
* | |||||
* @return 样式 | |||||
*/ | |||||
public static WriteCellStyle writeCellStyle() { | |||||
WriteCellStyle writeCellStyle = new WriteCellStyle(); | |||||
writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); | |||||
writeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); | |||||
writeCellStyle.setWrapped(true); | |||||
writeCellStyle.setBorderBottom(BorderStyle.THIN); | |||||
writeCellStyle.setBorderLeft(BorderStyle.THIN); | |||||
writeCellStyle.setBorderRight(BorderStyle.THIN); | |||||
writeCellStyle.setBorderTop(BorderStyle.THIN); | |||||
return writeCellStyle; | |||||
} | |||||
/** | |||||
* 表内容数据转换 | |||||
* | |||||
* @param headList 表头数据 | |||||
* @param dataList 表内容数据转换 | |||||
* @return List<List<Object>> | |||||
*/ | |||||
public static List<List<Object>> convertData(List<ExcelHead> headList, List<Map<String, Object>> dataList) { | |||||
List<List<Object>> result = Lists.newArrayList(); | |||||
//对 dataList 转为 easyExcel 的数据格式 | |||||
for (Map<String, Object> data : dataList) { | |||||
List<Object> row = Lists.newArrayList(); | |||||
for (ExcelHead<T> h : headList) { | |||||
Object o = data.get(h.getFieldName()); | |||||
//需要对null的处理,转换为空字符串 | |||||
row.add(handler(o, h.getNullValue())); | |||||
} | |||||
result.add(row); | |||||
} | |||||
return result; | |||||
} | |||||
/** | |||||
* null 值处理 | |||||
* @param nullValue 默认值 | |||||
* @return 默认值 | |||||
*/ | |||||
private static Object handler(Object o, Object nullValue) { | |||||
return o != null ? o : nullValue; | |||||
} | |||||
public static List<List<String>> getHead(List<String> reUserList,List<String> verifyUserList) { | |||||
List<List<String>> list = Lists.newArrayList(); | |||||
list.add(Lists.newArrayList(BizConst.FIRST_INDEX_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.SECOND_INDEX_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.THIRD_INDEX_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.INDEX_SCORE_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.INDEX_DETAIL_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.GRADE_DETAIL_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.SUPPORT_MATERIAL_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.SELF_APPRAISAL_BASIS_TITLE)); | |||||
list.add(Lists.newArrayList(BizConst.SELF_APPRAISAL_SCORE_TITLE)); | |||||
if (CollUtil.isNotEmpty(reUserList)) { | |||||
List<String> reUserHead = Lists.newArrayList(); | |||||
reUserHead.add(BizConst.RE_APPRAISAL_BASIS_TITLE); | |||||
reUserHead.add(BizConst.RE_APPRAISAL_SCORE_TITLE); | |||||
for (String reUser : reUserList) { | |||||
for (String h : reUserHead) { | |||||
List<String> reUsers = Lists.newArrayList(); | |||||
reUsers.add(reUser + BizConst.RE_APPRAISAL); | |||||
reUsers.add(h); | |||||
list.add(reUsers); | |||||
} | |||||
} | |||||
} | |||||
if (CollUtil.isNotEmpty(verifyUserList)) { | |||||
List<String> verifyUserHead = Lists.newArrayList(); | |||||
verifyUserHead.add(BizConst.VERIFY_BASIS_TITLE); | |||||
verifyUserHead.add(BizConst.VERIFY_SCORE_TITLE); | |||||
for (String verifyUser : reUserList) { | |||||
for (String h : verifyUserHead) { | |||||
List<String> reUsers = Lists.newArrayList(); | |||||
reUsers.add(verifyUser + BizConst.VERIFY); | |||||
reUsers.add(h); | |||||
list.add(reUsers); | |||||
} | |||||
} | |||||
} | |||||
list.add(Lists.newArrayList(BizConst.IS_ADDITIONAL_TITLE)); | |||||
return list; | |||||
} | |||||
} |