Browse Source

绩效评价

master
PoffyZhang 1 year ago
parent
commit
fbcf527e94
26 changed files with 1118 additions and 1 deletions
  1. +2
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/common/handler/GlobalResponseHandler.java
  2. +54
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/controller/PerformanceAppraisalController.java
  3. +71
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/convert/PerformanceAppraisalConveter.java
  4. +347
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/manage/PerformanceAppraisalManage.java
  5. +16
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalApplicationMapper.java
  6. +5
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalApplicationMapper.xml
  7. +17
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalMapper.java
  8. +5
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalMapper.xml
  9. +17
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalProjectMapper.java
  10. +5
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalProjectMapper.xml
  11. +24
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/dto/AppraisalProjectDTO.java
  12. +64
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/dto/PerformanceAppraisalCreateDTO.java
  13. +66
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/dto/PerformanceAppraisalEditDTO.java
  14. +58
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/entity/PerformanceAppraisal.java
  15. +40
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/entity/PerformanceAppraisalApplication.java
  16. +46
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/entity/PerformanceAppraisalProject.java
  17. +32
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/req/PerformanceAppraisalListReq.java
  18. +38
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/vo/PerformanceAppraisalApplicationVO.java
  19. +41
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/vo/PerformanceAppraisalProjectVO.java
  20. +60
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/model/vo/PerformanceAppraisalVO.java
  21. +16
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/service/IPerformanceAppraisalApplicationService.java
  22. +16
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/service/IPerformanceAppraisalProjectService.java
  23. +16
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/service/IPerformanceAppraisalService.java
  24. +21
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/service/impl/PerformanceAppraisalApplicationServiceImpl.java
  25. +21
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/service/impl/PerformanceAppraisalProjectServiceImpl.java
  26. +20
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/performance/service/impl/PerformanceAppraisalServiceImpl.java

+ 2
- 1
pmapi/src/main/java/com/ningdatech/pmapi/common/handler/GlobalResponseHandler.java View File

@@ -28,7 +28,8 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
"com.ningdatech.pmapi.sms.controller",
"com.ningdatech.pmapi.workbench.controller",
"com.ningdatech.pmapi.ding.controller",
"com.ningdatech.pmapi.filemanage.controller"
"com.ningdatech.pmapi.filemanage.controller",
"com.ningdatech.pmapi.performance.controller"
})
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {



+ 54
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/controller/PerformanceAppraisalController.java View File

@@ -0,0 +1,54 @@
package com.ningdatech.pmapi.performance.controller;

import com.ningdatech.basic.model.PageVo;
import com.ningdatech.log.annotation.WebLog;
import com.ningdatech.pmapi.performance.manage.PerformanceAppraisalManage;
import com.ningdatech.pmapi.performance.model.dto.PerformanceAppraisalCreateDTO;
import com.ningdatech.pmapi.performance.model.dto.PerformanceAppraisalEditDTO;
import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalListReq;
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
* @Classname PerformanceAppraisalController
* @Description
* @Date 2023/6/19 14:16
* @Author PoffyZhang
*/
@RestController
@RequiredArgsConstructor
@Api(tags = "绩效评价控制器")
@RequestMapping("/api/v1/performance-appraisal")
public class PerformanceAppraisalController {

private final PerformanceAppraisalManage performanceAppraisalManage;

@GetMapping("/list")
@ApiOperation("绩效列表")
public PageVo<PerformanceAppraisalVO> list(PerformanceAppraisalListReq req) {
return performanceAppraisalManage.list(req);
}

@GetMapping("/detail/{id}")
@ApiOperation("绩效详情")
public PerformanceAppraisalVO detail(@PathVariable Long id) {
return performanceAppraisalManage.detail(id);
}

@PostMapping("/create")
@ApiOperation("新建绩效")
@WebLog("新建绩效")
public String create(PerformanceAppraisalCreateDTO createDTO) {
return performanceAppraisalManage.create(createDTO);
}

@PostMapping("/edit")
@ApiOperation("编辑绩效")
@WebLog("编辑绩效")
public String edit(PerformanceAppraisalEditDTO editDTO) {
return performanceAppraisalManage.edit(editDTO);
}
}

+ 71
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/convert/PerformanceAppraisalConveter.java View File

@@ -0,0 +1,71 @@
package com.ningdatech.pmapi.performance.convert;

import cn.hutool.core.collection.CollUtil;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalApplication;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject;
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalApplicationVO;
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectVO;
import com.ningdatech.pmapi.projectlib.enumeration.ProjectTypeEnum;
import com.ningdatech.pmapi.projectlib.model.entity.Project;
import com.ningdatech.pmapi.projectlib.model.entity.ProjectApplication;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
* @Classname PerformanceAppraisalConverer
* @Description
* @Date 2023/6/19 15:31
* @Author PoffyZhang
*/
public class PerformanceAppraisalConveter {

public static List<PerformanceAppraisalProjectVO> convertProjects(
List<PerformanceAppraisalProject> projects, Map<String, Project> map) {
if(CollUtil.isNotEmpty(projects) && CollUtil.isNotEmpty(map)){
return projects.stream().map(p -> {
PerformanceAppraisalProjectVO vo = new PerformanceAppraisalProjectVO();
vo.setIsReAppraisal(p.getIsReAppraisal());
vo.setId(p.getProjectId());
if(map.containsKey(p.getProjectId())){
Project project = map.get(p.getProjectId());
vo.setProjectName(project.getProjectName());
vo.setProjectType(project.getProjectType());
vo.setProjectTypeName(getProjectTypeName(project.getProjectType()));
vo.setBuildOrgName(project.getBuildOrgName());
}
return vo;
}).collect(Collectors.toList());
}
return Collections.emptyList();
}

public static List<PerformanceAppraisalApplicationVO> convertApplications(
List<PerformanceAppraisalApplication> applications, Map<Long, ProjectApplication> map) {
if(CollUtil.isNotEmpty(applications) && CollUtil.isNotEmpty(map)){
return applications.stream().map(a -> {
PerformanceAppraisalApplicationVO vo = new PerformanceAppraisalApplicationVO();
vo.setId(a.getApplicationId());
if(map.containsKey(a.getApplicationId())){
ProjectApplication application = map.get(a.getApplicationId());
vo.setApplicationName(StringUtils.isNotBlank(application.getApplicationName())?
application.getApplicationName() : application.getAccountAppName());
vo.setApplicationType(application.getApplicationType());
vo.setBizDomain(application.getBizDomain());
// vo.setBuildOrgName(application.get());
vo.setPublishSide(application.getPublishSide());
}
return vo;
}).collect(Collectors.toList());
}
return Collections.emptyList();
}

public static String getProjectTypeName(Integer projectType) {
if (Objects.nonNull(projectType)) {
return ProjectTypeEnum.getDesc(projectType);
}
return StringUtils.EMPTY;
}
}

+ 347
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/manage/PerformanceAppraisalManage.java View File

@@ -0,0 +1,347 @@
package com.ningdatech.pmapi.performance.manage;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Maps;
import com.ningdatech.basic.function.VUtils;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.pmapi.performance.convert.PerformanceAppraisalConveter;
import com.ningdatech.pmapi.performance.model.dto.AppraisalProjectDTO;
import com.ningdatech.pmapi.performance.model.dto.PerformanceAppraisalCreateDTO;
import com.ningdatech.pmapi.performance.model.dto.PerformanceAppraisalEditDTO;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisal;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalApplication;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject;
import com.ningdatech.pmapi.performance.model.req.PerformanceAppraisalListReq;
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalVO;
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalApplicationService;
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalProjectService;
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalService;
import com.ningdatech.pmapi.projectlib.model.entity.Project;
import com.ningdatech.pmapi.projectlib.model.entity.ProjectApplication;
import com.ningdatech.pmapi.projectlib.service.IProjectApplicationService;
import com.ningdatech.pmapi.projectlib.service.IProjectService;
import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails;
import com.ningdatech.pmapi.user.util.LoginUserUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* @Classname PerformanceAppraisalManage
* @Description
* @Date 2023/6/19 14:18
* @Author PoffyZhang
*/
@Component
@Slf4j
@AllArgsConstructor
public class PerformanceAppraisalManage {

private final IPerformanceAppraisalService performanceAppraisalService;

private final IPerformanceAppraisalProjectService performanceAppraisalProjectService;

private final IPerformanceAppraisalApplicationService performanceAppraisalApplicationService;

private final IProjectService projectService;

private final IProjectApplicationService applicationService;

/**
* 绩效列表
* @param req
* @return
*/
public PageVo<PerformanceAppraisalVO> list(PerformanceAppraisalListReq req) {
Page<PerformanceAppraisal> page = req.page();
LambdaQueryWrapper<PerformanceAppraisal> wrapper = Wrappers.lambdaQuery(PerformanceAppraisal.class)
.like(StringUtils.isNotBlank(req.getName()),PerformanceAppraisal::getName,req.getName())
.ge(Objects.nonNull(req.getStart()),PerformanceAppraisal::getCreateOn,req.getStart())
.le(Objects.nonNull(req.getEnd()),PerformanceAppraisal::getCreateOn,req.getEnd())
.orderByDesc(PerformanceAppraisal::getUpdateOn);
performanceAppraisalService.page(page,wrapper);
if(0L == page.getTotal()){
return PageVo.empty();
}

List<Long> paIds = page.getRecords().stream().map(PerformanceAppraisal::getId).collect(Collectors.toList());
List<PerformanceAppraisalProject> paps = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class)
.in(PerformanceAppraisalProject::getAppraisalId, paIds));

Map<String,Project> projectMap = Maps.newHashMap();
Map<Long,List<PerformanceAppraisalProject>> papsGroupMap = Maps.newHashMap();
if(CollUtil.isNotEmpty(paps)){
papsGroupMap = paps.stream().collect(Collectors.groupingBy(PerformanceAppraisalProject::getAppraisalId));

List<String> projectCodes = paps.stream().map(PerformanceAppraisalProject::getProjectCode).collect(Collectors.toList());
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class)
.in(Project::getProjectCode, projectCodes)
.eq(Project::getNewest, Boolean.TRUE));
if(CollUtil.isNotEmpty(projects)){
projectMap = projects.stream().collect(Collectors.toMap(Project::getProjectCode,p -> p));
}
}

List<PerformanceAppraisalApplication> paas = performanceAppraisalApplicationService.list(Wrappers.lambdaQuery(PerformanceAppraisalApplication.class)
.in(PerformanceAppraisalApplication::getAppraisalId, paIds));
Map<Long,ProjectApplication> applicationMap = Maps.newHashMap();
Map<Long,List<PerformanceAppraisalApplication>> paasGroupMap = Maps.newHashMap();
if(CollUtil.isNotEmpty(paas)){
paasGroupMap = paas.stream().collect(Collectors.groupingBy(PerformanceAppraisalApplication::getAppraisalId));

List<Long> applicationIds = paas.stream().map(PerformanceAppraisalApplication::getApplicationId).collect(Collectors.toList());
List<ProjectApplication> apps = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class)
.in(ProjectApplication::getId, applicationIds));
if(CollUtil.isNotEmpty(apps)){
applicationMap = apps.stream().collect(Collectors.toMap(ProjectApplication::getId,a -> a));
}
}

Map<Long, List<PerformanceAppraisalProject>> finalPapsGroupMap = papsGroupMap;
Map<Long,List<PerformanceAppraisalApplication>> finalPaasGroupMap = paasGroupMap;
Map<String,Project> finalProjectMap = projectMap;
Map<Long,ProjectApplication> finalApplicationMap = applicationMap;
List<PerformanceAppraisalVO> res = page.getRecords().stream().map(p -> {
PerformanceAppraisalVO vo = BeanUtil.copyProperties(p,PerformanceAppraisalVO.class);
if(finalPapsGroupMap.containsKey(p.getId())){
vo.setProjects(PerformanceAppraisalConveter.convertProjects(finalPapsGroupMap.get(p.getId()),finalProjectMap));
}
if(finalPaasGroupMap.containsKey(p.getId())){
vo.setApplications(PerformanceAppraisalConveter.convertApplications(finalPaasGroupMap.get(p.getId()),finalApplicationMap));
}
return vo;
}).collect(Collectors.toList());
return PageVo.of(res,page.getTotal());
}

public PerformanceAppraisalVO detail(Long id) {

PerformanceAppraisal pa = performanceAppraisalService.getById(id);
VUtils.isTrue(Objects.isNull(pa)).throwMessage("该计划不存在");

PerformanceAppraisalVO vo = BeanUtil.copyProperties(pa,PerformanceAppraisalVO.class);
//绩效关联的项目
List<PerformanceAppraisalProject> paps = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class)
.eq(PerformanceAppraisalProject::getAppraisalId, id));
Map<String,Project> projectMap = Maps.newHashMap();
Map<Long,List<PerformanceAppraisalProject>> papsGroupMap = Maps.newHashMap();
if(CollUtil.isNotEmpty(paps)){
papsGroupMap = paps.stream().collect(Collectors.groupingBy(PerformanceAppraisalProject::getAppraisalId));

List<String> projectCodes = paps.stream().map(PerformanceAppraisalProject::getProjectCode).collect(Collectors.toList());
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class)
.in(Project::getProjectCode, projectCodes)
.eq(Project::getNewest, Boolean.TRUE));
if(CollUtil.isNotEmpty(projects)){
projectMap = projects.stream().collect(Collectors.toMap(Project::getProjectCode,p -> p));
}
}

//绩效关联的应用
List<PerformanceAppraisalApplication> paas = performanceAppraisalApplicationService.list(Wrappers.lambdaQuery(PerformanceAppraisalApplication.class)
.eq(PerformanceAppraisalApplication::getAppraisalId, id));
Map<Long,ProjectApplication> applicationMap = Maps.newHashMap();
Map<Long,List<PerformanceAppraisalApplication>> paasGroupMap = Maps.newHashMap();
if(CollUtil.isNotEmpty(paas)){
paasGroupMap = paas.stream().collect(Collectors.groupingBy(PerformanceAppraisalApplication::getAppraisalId));

List<Long> applicationIds = paas.stream().map(PerformanceAppraisalApplication::getApplicationId).collect(Collectors.toList());
List<ProjectApplication> apps = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class)
.in(ProjectApplication::getId, applicationIds));
if(CollUtil.isNotEmpty(apps)){
applicationMap = apps.stream().collect(Collectors.toMap(ProjectApplication::getId,a -> a));
}
}

Map<Long, List<PerformanceAppraisalProject>> finalPapsGroupMap = papsGroupMap;
Map<Long,List<PerformanceAppraisalApplication>> finalPaasGroupMap = paasGroupMap;
Map<String,Project> finalProjectMap = projectMap;
Map<Long,ProjectApplication> finalApplicationMap = applicationMap;
if(finalPapsGroupMap.containsKey(vo.getId())){
vo.setProjects(PerformanceAppraisalConveter.convertProjects(finalPapsGroupMap.get(vo.getId()),finalProjectMap));
}
if(finalPaasGroupMap.containsKey(vo.getId())){
vo.setApplications(PerformanceAppraisalConveter.convertApplications(finalPaasGroupMap.get(vo.getId()),finalApplicationMap));
}
return vo;
}

/**
* 新建计划
* @param createDTO
* @return
*/
public String create(PerformanceAppraisalCreateDTO createDTO) {
UserInfoDetails user = LoginUserUtil.loginUserDetail();

deduplicationName(createDTO);

PerformanceAppraisal pa = BeanUtil.copyProperties(createDTO,PerformanceAppraisal.class);
pa.setCreateOn(LocalDateTime.now());
pa.setCreateBy(user.getUsername());
pa.setUpdateOn(LocalDateTime.now());
pa.setUpdateBy(user.getUsername());
performanceAppraisalService.save(pa);

if(CollUtil.isNotEmpty(createDTO.getProjects())){
saveProjects(createDTO,pa.getId(),user);
}

if(CollUtil.isNotEmpty(createDTO.getApplicationIds())){
saveApplications(createDTO,pa.getId(),user);
}

return "新建成功";
}


/**
* 编辑计划
* @param editDTO
* @return
*/
public String edit(PerformanceAppraisalEditDTO editDTO) {
UserInfoDetails user = LoginUserUtil.loginUserDetail();

deduplicationName(editDTO);

PerformanceAppraisal pa = BeanUtil.copyProperties(editDTO,PerformanceAppraisal.class);

pa.setUpdateOn(LocalDateTime.now());
pa.setUpdateBy(user.getUsername());
performanceAppraisalService.updateById(pa);

if(CollUtil.isNotEmpty(editDTO.getProjects())){
saveProjects(editDTO,user);
}

if(CollUtil.isNotEmpty(editDTO.getApplicationIds())){
saveApplications(editDTO,user);
}

return "编辑成功";
}

/**
* 名称去重
* @param dto
*/
private void deduplicationName(PerformanceAppraisalCreateDTO dto) {
long count = performanceAppraisalService.count(Wrappers.lambdaQuery(PerformanceAppraisal.class)
.eq(PerformanceAppraisal::getName, dto.getName()));
VUtils.isTrue(count > 0).throwMessage("名称已经存在");
}

private void deduplicationName(PerformanceAppraisalEditDTO dto) {
if(StringUtils.isNotBlank(dto.getName())){
long count =performanceAppraisalService.count(Wrappers.lambdaQuery(PerformanceAppraisal.class)
.eq(PerformanceAppraisal::getName,dto.getName())
.ne(Objects.nonNull(dto.getId()),PerformanceAppraisal::getId,dto.getId()));
VUtils.isTrue(count > 0).throwMessage("名称已经存在");
}
}

private void saveProjects(PerformanceAppraisalCreateDTO createDTO,Long id,UserInfoDetails user) {
if(CollUtil.isEmpty(createDTO.getProjects())){
return;
}

List<AppraisalProjectDTO> projects = createDTO.getProjects();

for(AppraisalProjectDTO appraisalProject : projects){
Project newProject = projectService.getNewProject(appraisalProject.getId());
VUtils.isTrue(Objects.isNull(newProject)).throwMessage("项目不存在 " + appraisalProject.getId());
PerformanceAppraisalProject pap = new PerformanceAppraisalProject();
pap.setAppraisalId(id);
pap.setProjectId(appraisalProject.getId());
pap.setProjectCode(newProject.getProjectCode());
pap.setIsReAppraisal(appraisalProject.getIsReAppraisal());
pap.setCreateBy(user.getUsername());
pap.setCreateOn(LocalDateTime.now());
pap.setUpdateBy(user.getUsername());
pap.setUpdateOn(LocalDateTime.now());
performanceAppraisalProjectService.save(pap);
}
}

private void saveApplications(PerformanceAppraisalCreateDTO createDTO,Long id,UserInfoDetails user) {
if(CollUtil.isEmpty(createDTO.getApplicationIds())){
return;
}

List<Long> applicationIds = createDTO.getApplicationIds();

for(Long applicationId : applicationIds){
ProjectApplication projectApplication = applicationService.getById(applicationId);
VUtils.isTrue(Objects.isNull(projectApplication)).throwMessage("应用不存在 " + applicationId);
PerformanceAppraisalApplication paa = new PerformanceAppraisalApplication();
paa.setAppraisalId(id);
paa.setApplicationId(applicationId);
paa.setCreateBy(user.getUsername());
paa.setCreateOn(LocalDateTime.now());
paa.setUpdateBy(user.getUsername());
paa.setUpdateOn(LocalDateTime.now());
performanceAppraisalApplicationService.save(paa);
}
}

private void saveProjects(PerformanceAppraisalEditDTO editDTO,UserInfoDetails user) {
if(Objects.isNull(editDTO.getProjects())){
return;
}

//删除先
performanceAppraisalProjectService.remove(Wrappers.lambdaQuery(PerformanceAppraisalProject.class)
.eq(PerformanceAppraisalProject::getAppraisalId,editDTO.getId()));
List<AppraisalProjectDTO> projects = editDTO.getProjects();
for(AppraisalProjectDTO appraisalProject : projects){
Project newProject = projectService.getNewProject(appraisalProject.getId());
VUtils.isTrue(Objects.isNull(newProject)).throwMessage("项目不存在 " + appraisalProject.getId());
PerformanceAppraisalProject pap = new PerformanceAppraisalProject();
pap.setAppraisalId(editDTO.getId());
pap.setProjectId(appraisalProject.getId());
pap.setProjectCode(newProject.getProjectCode());
pap.setIsReAppraisal(appraisalProject.getIsReAppraisal());
pap.setCreateBy(user.getUsername());
pap.setCreateOn(LocalDateTime.now());
pap.setUpdateBy(user.getUsername());
pap.setUpdateOn(LocalDateTime.now());
performanceAppraisalProjectService.save(pap);
}
}

private void saveApplications(PerformanceAppraisalEditDTO editDTO,UserInfoDetails user) {
if(CollUtil.isEmpty(editDTO.getApplicationIds())){
return;
}

//删除先
performanceAppraisalApplicationService.remove(Wrappers.lambdaQuery(PerformanceAppraisalApplication.class)
.eq(PerformanceAppraisalApplication::getAppraisalId,editDTO.getId()));
List<Long> applicationIds = editDTO.getApplicationIds();

for(Long applicationId : applicationIds){
ProjectApplication projectApplication = applicationService.getById(applicationId);
VUtils.isTrue(Objects.isNull(projectApplication)).throwMessage("应用不存在 " + applicationId);
PerformanceAppraisalApplication paa = new PerformanceAppraisalApplication();
paa.setAppraisalId(editDTO.getId());
paa.setApplicationId(applicationId);
paa.setCreateBy(user.getUsername());
paa.setCreateOn(LocalDateTime.now());
paa.setUpdateBy(user.getUsername());
paa.setUpdateOn(LocalDateTime.now());
performanceAppraisalApplicationService.save(paa);
}
}
}

+ 16
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalApplicationMapper.java View File

@@ -0,0 +1,16 @@
package com.ningdatech.pmapi.performance.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalApplication;

/**
* <p>
* Mapper 接口
* </p>
*
* @author Zpf
* @since 2023-06-03
*/
public interface PerformanceAppraisalApplicationMapper extends BaseMapper<PerformanceAppraisalApplication> {

}

+ 5
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalApplicationMapper.xml View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.performance.mapper.PerformanceAppraisalApplicationMapper">

</mapper>

+ 17
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalMapper.java View File

@@ -0,0 +1,17 @@
package com.ningdatech.pmapi.performance.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisal;
import com.ningdatech.pmapi.projectlib.model.entity.Project;

/**
* <p>
* Mapper 接口
* </p>
*
* @author Zpf
* @since 2023-06-03
*/
public interface PerformanceAppraisalMapper extends BaseMapper<PerformanceAppraisal> {

}

+ 5
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalMapper.xml View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.performance.mapper.PerformanceAppraisalMapper">

</mapper>

+ 17
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalProjectMapper.java View File

@@ -0,0 +1,17 @@
package com.ningdatech.pmapi.performance.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisal;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject;

/**
* <p>
* Mapper 接口
* </p>
*
* @author Zpf
* @since 2023-06-03
*/
public interface PerformanceAppraisalProjectMapper extends BaseMapper<PerformanceAppraisalProject> {

}

+ 5
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/mapper/PerformanceAppraisalProjectMapper.xml View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ningdatech.pmapi.performance.mapper.PerformanceAppraisalProjectMapper">

</mapper>

+ 24
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/dto/AppraisalProjectDTO.java View File

@@ -0,0 +1,24 @@
package com.ningdatech.pmapi.performance.model.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
* @Classname AppraisalProjectDTO
* @Description
* @Date 2023/6/19 17:08
* @Author PoffyZhang
*/
@Data
public class AppraisalProjectDTO {

@ApiModelProperty("项目ID")
@NotNull(message = "项目ID 必填")
private Long id;

@ApiModelProperty("是否复评")
private Boolean isReAppraisal = Boolean.FALSE;
}

+ 64
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/dto/PerformanceAppraisalCreateDTO.java View File

@@ -0,0 +1,64 @@
package com.ningdatech.pmapi.performance.model.dto;

import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalApplicationVO;
import com.ningdatech.pmapi.performance.model.vo.PerformanceAppraisalProjectVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

/**
* @Classname PerformanceAppraisalCreateDTO
* @Description 绩效评价对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@ApiModel(value = "绩效评价创建对象", description = "绩效评价创建对象")
public class PerformanceAppraisalCreateDTO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("计划名称")
@NotBlank(message = "请输入计划名称")
private String name;

@ApiModelProperty("自评开始时间")
@NotNull(message = "自评时间错误")
private LocalDateTime selfAppraisalStart;

@ApiModelProperty("自评结束时间")
@NotNull(message = "自评时间错误")
private LocalDateTime selfAppraisalEnd;

@ApiModelProperty("复评开始时间")
@NotNull(message = "复评时间错误")
private LocalDateTime reAppraisalStart;

@ApiModelProperty("复评结束时间")
@NotNull(message = "复评时间错误")
private LocalDateTime reAppraisalEnd;

@ApiModelProperty("核查开始时间")
@NotNull(message = "核查时间错误")
private LocalDateTime verificationStart;

@ApiModelProperty("核查结束时间")
@NotNull(message = "核查时间错误")
private LocalDateTime verificationEnd;

@ApiModelProperty("评价目标 1项目 2应用 可多选 1,2")
@NotBlank(message = "评价目标不能为空")
private String target;

@ApiModelProperty("评价项目 只有ID 和是否复评")
private List<AppraisalProjectDTO> projects;

@ApiModelProperty("评价应用ids")
private List<Long> applicationIds;
}

+ 66
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/dto/PerformanceAppraisalEditDTO.java View File

@@ -0,0 +1,66 @@
package com.ningdatech.pmapi.performance.model.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

/**
* @Classname PerformanceAppraisalEditDTO
* @Description 绩效评价对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@ApiModel(value = "绩效评价编辑对象", description = "绩效评价编辑对象")
public class PerformanceAppraisalEditDTO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("id")
@NotNull(message = "编辑的时候 id必填")
private Long id;

@ApiModelProperty("计划名称")
@NotBlank(message = "请输入计划名称")
private String name;

@ApiModelProperty("自评开始时间")
@NotNull(message = "自评时间错误")
private LocalDateTime selfAppraisalStart;

@ApiModelProperty("自评结束时间")
@NotNull(message = "自评时间错误")
private LocalDateTime selfAppraisalEnd;

@ApiModelProperty("复评开始时间")
@NotNull(message = "复评时间错误")
private LocalDateTime reAppraisalStart;

@ApiModelProperty("复评结束时间")
@NotNull(message = "复评时间错误")
private LocalDateTime reAppraisalEnd;

@ApiModelProperty("核查开始时间")
@NotNull(message = "核查时间错误")
private LocalDateTime verificationStart;

@ApiModelProperty("核查结束时间")
@NotNull(message = "核查时间错误")
private LocalDateTime verificationEnd;

@ApiModelProperty("评价目标 1项目 2应用 可多选 1,2")
@NotBlank(message = "评价目标不能为空")
private String target;

@ApiModelProperty("评价项目 只有ID 和是否复评")
private List<AppraisalProjectDTO> projects;

@ApiModelProperty("评价应用ids")
private List<Long> applicationIds;
}

+ 58
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/entity/PerformanceAppraisal.java View File

@@ -0,0 +1,58 @@
package com.ningdatech.pmapi.performance.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
* @Classname PerformanceAppraisal
* @Description 绩效评价对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@TableName("nd_performance_appraisal")
@ApiModel(value = "绩效评价对象", description = "绩效评价对象")
public class PerformanceAppraisal implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("主键")
@TableId(type = IdType.AUTO)
private Long id;

private LocalDateTime createOn;
private LocalDateTime updateOn;
private String createBy;
private String updateBy;

@ApiModelProperty("计划名称")
private String name;

@ApiModelProperty("自评开始时间")
private LocalDateTime selfAppraisalStart;

@ApiModelProperty("自评结束时间")
private LocalDateTime selfAppraisalEnd;

@ApiModelProperty("复评开始时间")
private LocalDateTime reAppraisalStart;

@ApiModelProperty("复评结束时间")
private LocalDateTime reAppraisalEnd;

@ApiModelProperty("核查开始时间")
private LocalDateTime verificationStart;

@ApiModelProperty("核查结束时间")
private LocalDateTime verificationEnd;

@ApiModelProperty("评价目标 1项目 2应用 可多选 1,2")
private String target;
}

+ 40
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/entity/PerformanceAppraisalApplication.java View File

@@ -0,0 +1,40 @@
package com.ningdatech.pmapi.performance.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
* @Classname PerformanceAppraisalApplication
* @Description 绩效评价和应用关联对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@TableName("nd_performance_appraisal_application")
@ApiModel(value = "绩效评价和应用关联对象", description = "绩效评价和应用关联对象")
public class PerformanceAppraisalApplication implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("主键")
@TableId(type = IdType.AUTO)
private Long id;

private LocalDateTime createOn;
private LocalDateTime updateOn;
private String createBy;
private String updateBy;

@ApiModelProperty("计划id")
private Long appraisalId;

@ApiModelProperty("应用id")
private Long applicationId;
}

+ 46
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/entity/PerformanceAppraisalProject.java View File

@@ -0,0 +1,46 @@
package com.ningdatech.pmapi.performance.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
* @Classname PerformanceAppraisalProject
* @Description 绩效评价和项目关联对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@TableName("nd_performance_appraisal_project")
@ApiModel(value = "绩效评价和项目关联对象", description = "绩效评价和项目关联对象")
public class PerformanceAppraisalProject implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("主键")
@TableId(type = IdType.AUTO)
private Long id;

private LocalDateTime createOn;
private LocalDateTime updateOn;
private String createBy;
private String updateBy;

@ApiModelProperty("计划id")
private Long appraisalId;

@ApiModelProperty("项目id")
private Long projectId;

@ApiModelProperty("项目编码")
private String projectCode;

@ApiModelProperty("是否核查")
private Boolean isReAppraisal;
}

+ 32
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/req/PerformanceAppraisalListReq.java View File

@@ -0,0 +1,32 @@
package com.ningdatech.pmapi.performance.model.req;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.ningdatech.basic.model.PagePo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
* <p>
* PerformanceAppraisalListReq
* </p>
*
* @author ZPF
* @since 09:32 2023/06/13
*/
@Data
public class PerformanceAppraisalListReq extends PagePo {

@ApiModelProperty("计划名称")
private String name;

@ApiModelProperty("开始时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime start;

@ApiModelProperty("结束时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime end;
}

+ 38
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/vo/PerformanceAppraisalApplicationVO.java View File

@@ -0,0 +1,38 @@
package com.ningdatech.pmapi.performance.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
* @Classname PerformanceAppraisalApplicationVO
* @Description 绩效评价对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@ApiModel(value = "绩效评价应用对象", description = "绩效评价应用对象")
public class PerformanceAppraisalApplicationVO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("项目ID")
private Long id;

@ApiModelProperty("应用名称")
private String applicationName;

@ApiModelProperty("申报单位")
private String buildOrgName;

@ApiModelProperty("应用类型")
private String applicationType;

@ApiModelProperty("应用领域")
private String bizDomain;

@ApiModelProperty("发布端")
private String publishSide;
}

+ 41
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/vo/PerformanceAppraisalProjectVO.java View File

@@ -0,0 +1,41 @@
package com.ningdatech.pmapi.performance.model.vo;

import com.ningdatech.pmapi.projectlib.model.vo.ProjectDetailVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

/**
* @Classname PerformanceAppraisalProjectVO
* @Description 绩效评价对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@ApiModel(value = "绩效评价项目对象", description = "绩效评价项目对象")
public class PerformanceAppraisalProjectVO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("项目ID")
private Long id;

@ApiModelProperty("项目名称")
private String projectName;

@ApiModelProperty("申报单位")
private String buildOrgName;

@ApiModelProperty("项目类型")
private Integer projectType;

@ApiModelProperty("项目类型名")
private String projectTypeName;

@ApiModelProperty("是否复评")
private Boolean isReAppraisal;
}

+ 60
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/model/vo/PerformanceAppraisalVO.java View File

@@ -0,0 +1,60 @@
package com.ningdatech.pmapi.performance.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;

/**
* @Classname PerformanceAppraisal
* @Description 绩效评价对象
* @Date 2023/6/19 14:02
* @Author PoffyZhang
*/
@Data
@ApiModel(value = "绩效评价对象", description = "绩效评价对象")
public class PerformanceAppraisalVO implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty("主键")
private Long id;

private LocalDateTime createOn;
private LocalDateTime updateOn;
private String createBy;
private String updateBy;

@ApiModelProperty("计划名称")
private String name;

@ApiModelProperty("自评开始时间")
private LocalDateTime selfAppraisalStart;

@ApiModelProperty("自评结束时间")
private LocalDateTime selfAppraisalEnd;

@ApiModelProperty("复评开始时间")
private LocalDateTime reAppraisalStart;

@ApiModelProperty("复评结束时间")
private LocalDateTime reAppraisalEnd;

@ApiModelProperty("核查开始时间")
private LocalDateTime verificationStart;

@ApiModelProperty("核查结束时间")
private LocalDateTime verificationEnd;

@ApiModelProperty("评价目标 1项目 2应用 可多选 1,2")
private String target;

@ApiModelProperty("评价项目列表")
private List<PerformanceAppraisalProjectVO> projects;

@ApiModelProperty("评价应用列表")
private List<PerformanceAppraisalApplicationVO> applications;
}

+ 16
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/service/IPerformanceAppraisalApplicationService.java View File

@@ -0,0 +1,16 @@
package com.ningdatech.pmapi.performance.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalApplication;

/**
* <p>
* 服务类
* </p>
*
* @author PoffyZhang
* @since 2023-06-03
*/
public interface IPerformanceAppraisalApplicationService extends IService<PerformanceAppraisalApplication> {

}

+ 16
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/service/IPerformanceAppraisalProjectService.java View File

@@ -0,0 +1,16 @@
package com.ningdatech.pmapi.performance.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject;

/**
* <p>
* 服务类
* </p>
*
* @author PoffyZhang
* @since 2023-06-03
*/
public interface IPerformanceAppraisalProjectService extends IService<PerformanceAppraisalProject> {

}

+ 16
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/service/IPerformanceAppraisalService.java View File

@@ -0,0 +1,16 @@
package com.ningdatech.pmapi.performance.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisal;

/**
* <p>
* 服务类
* </p>
*
* @author PoffyZhang
* @since 2023-06-03
*/
public interface IPerformanceAppraisalService extends IService<PerformanceAppraisal> {

}

+ 21
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/service/impl/PerformanceAppraisalApplicationServiceImpl.java View File

@@ -0,0 +1,21 @@
package com.ningdatech.pmapi.performance.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.pmapi.performance.mapper.PerformanceAppraisalApplicationMapper;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalApplication;
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalApplicationService;
import org.springframework.stereotype.Service;

/**
* <p>
* 绩效评价和应用 服务实现类
* </p>
*
* @author ZPF
* @since 2023-06-15
*/
@Service
public class PerformanceAppraisalApplicationServiceImpl extends ServiceImpl<PerformanceAppraisalApplicationMapper,
PerformanceAppraisalApplication> implements IPerformanceAppraisalApplicationService {

}

+ 21
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/service/impl/PerformanceAppraisalProjectServiceImpl.java View File

@@ -0,0 +1,21 @@
package com.ningdatech.pmapi.performance.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.pmapi.performance.mapper.PerformanceAppraisalProjectMapper;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject;
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalProjectService;
import org.springframework.stereotype.Service;

/**
* <p>
* 绩效评价和项目 服务实现类
* </p>
*
* @author ZPF
* @since 2023-06-15
*/
@Service
public class PerformanceAppraisalProjectServiceImpl extends ServiceImpl<PerformanceAppraisalProjectMapper,
PerformanceAppraisalProject> implements IPerformanceAppraisalProjectService {

}

+ 20
- 0
pmapi/src/main/java/com/ningdatech/pmapi/performance/service/impl/PerformanceAppraisalServiceImpl.java View File

@@ -0,0 +1,20 @@
package com.ningdatech.pmapi.performance.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ningdatech.pmapi.performance.mapper.PerformanceAppraisalMapper;
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisal;
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalService;
import org.springframework.stereotype.Service;

/**
* <p>
* 绩效评价 服务实现类
* </p>
*
* @author ZPF
* @since 2023-06-15
*/
@Service
public class PerformanceAppraisalServiceImpl extends ServiceImpl<PerformanceAppraisalMapper, PerformanceAppraisal> implements IPerformanceAppraisalService {

}

Loading…
Cancel
Save