Merge remote-tracking branch 'origin/release/2.2.2.2211.03' into release/2.2.2.2211.03

This commit is contained in:
fcli 2022-11-17 14:43:59 +08:00
commit 0f51d44cd4
9 changed files with 272 additions and 5 deletions

View File

@ -123,6 +123,19 @@ public class SalaryArchiveItemBiz {
}
public void updateIgnoreNull(SalaryArchiveItemPO salaryArchiveItem) {
SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession();
try {
SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class);
SalaryArchiveItemPOEncrypt.encryptSalaryArchiveItemPO(salaryArchiveItem);
mapper.updateIgnoreNull(salaryArchiveItem);
sqlSession.commit();
} finally {
sqlSession.close();
}
}
public List<SalaryItemAdjustRecordListDTO> salaryItemAdjustRecordList(SalaryItemAdjustRecordQueryParam queryParam, List<Long> salaryItemIds) {
SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession();
try {

View File

@ -30,4 +30,7 @@ public class SalaryArchiveItemFormDTO {
//薪资项目调整明细")
private Map<String,Object> salaryArchiveItemDetail;
//是否可以编辑
private boolean canOperator;
}

View File

@ -30,12 +30,18 @@ import java.util.Set;
//薪资项目调整保存参数")
public class SalaryArchiveItemSaveParam {
// 主键id
private Long salaryArchiveItemId;
//薪资档案id
private Long salaryArchiveId;
//生效时间
private Date effectiveTime;
// 是否允许编辑
private Boolean canOperator;
/**
* 调整原因
*
@ -49,6 +55,8 @@ public class SalaryArchiveItemSaveParam {
//薪资项目
private List<SalaryArchiveItemDetailSaveParam> salaryArchiveItems;
public static void checkParam(SalaryArchiveItemSaveParam saveParam) {
if (saveParam.getSalaryArchiveId() == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100305, "薪资档案id必传"));
@ -56,9 +64,9 @@ public class SalaryArchiveItemSaveParam {
if (saveParam.getAdjustReason() == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100306, "请选择调整原因"));
}
if (SalaryArchiveItemAdjustReasonEnum.parseByValue(saveParam.getAdjustReason()) == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100306, "调整原因不在范围内"));
}
// if (SalaryArchiveItemAdjustReasonEnum.parseByValue(saveParam.getAdjustReason()) == null) {
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100306, "调整原因不在范围内"));
// }
if (saveParam.getEffectiveTime() == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100307, "请选择生效日期"));
}

View File

@ -43,6 +43,15 @@ public interface SalaryArchiveItemService {
*/
String getSalaryItemAdjustBeforeValue(SalaryItemAdjustBeforeParam adjustBeforeParam);
/**
* @description 根据薪资档案id和薪资项id获取薪资项目生效+不生效
* @return List<SalaryAtemPO>
* @author Harryxzy
* @date 2022/11/14 17:07
*/
List<SalaryArchiveItemPO> getSalaryItemsBySalaryArchiveIdAndItemIds(Long salaryArchiveId, List<Long> salaryItemPageIds);
/**
* 获取当前已生效
*
@ -140,5 +149,11 @@ public interface SalaryArchiveItemService {
Map<String, List<SalaryArchiveItemPO>> getIneffectiveItemListMap(Collection<Long> salaryArchiveIds, boolean isNoNeedSalaryItem, Collection<Long> salaryItemIds);
/**
* @description 单个档案的薪资项目调整的编辑
* @return String
* @author Harryxzy
* @date 2022/11/14 13:38
*/
String editSingleSalaryItem(SalaryArchiveItemSaveParam salaryArchiveItemSaveParam);
}

View File

@ -4,6 +4,7 @@ import com.engine.core.impl.Service;
import com.engine.salary.biz.SalaryArchiveBiz;
import com.engine.salary.biz.SalaryArchiveItemBiz;
import com.engine.salary.biz.SalaryItemBiz;
import com.engine.salary.constant.SalaryArchiveConstant;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO;
import com.engine.salary.entity.salaryarchive.param.*;
@ -12,6 +13,7 @@ import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.enums.UserStatusEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveItemAdjustReasonEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.SalaryArchiveItemService;
import com.engine.salary.util.SalaryEntityUtil;
@ -26,6 +28,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@ -57,8 +60,11 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi
private List<SalaryArchiveItemPO> getIneffectiveSalaryItems(Long salaryArchiveId, List<Long> salaryItemIds) {
// 没有薪资项目时给个不存在的否则加载所有不合理
salaryItemIds = CollectionUtils.isEmpty(salaryItemIds) ? Collections.singletonList(0L) : salaryItemIds;
ArrayList<Long> salaryArchiveIds = new ArrayList<>();
salaryArchiveIds.add(salaryArchiveId);
return salaryArchiveItemMapper.getIneffectiveSalaryItems(SalaryArchiveItemQueryParam.builder()
.salaryArchiveId(salaryArchiveId)
.salaryArchivesIds(salaryArchiveIds)
.salaryItemIds(salaryItemIds)
.effectiveTime(new Date()).build());
}
@ -74,6 +80,17 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi
.effectiveTime(new Date()).build());
}
@Override
public List<SalaryArchiveItemPO> getSalaryItemsBySalaryArchiveIdAndItemIds(Long salaryArchiveId, List<Long> salaryItemIds) {
// 没有薪资项目时给个不存在的否则加载所有不合理
salaryItemIds = CollectionUtils.isEmpty(salaryItemIds) ? Collections.singletonList(0L) : salaryItemIds;
return salaryArchiveItemMapper.getEffectiveSalaryItems(SalaryArchiveItemQueryParam.builder()
.salaryArchiveId(salaryArchiveId)
.salaryItemIds(salaryItemIds)
.build());
}
/**
* 获取当前已生效 gt
*
@ -169,6 +186,99 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi
return SalaryEntityUtil.group2Map(salaryArchiveItems, k -> k.getSalaryArchiveId() + "-" + k.getSalaryItemId());
}
@Override
public String editSingleSalaryItem(SalaryArchiveItemSaveParam salaryArchiveItemSaveParam) {
// 检查参数
SalaryArchiveItemSaveParam.checkParam(salaryArchiveItemSaveParam);
Long salaryArchiveId = salaryArchiveItemSaveParam.getSalaryArchiveId();
// 获取所有可被引用的薪资项目
List<SalaryItemPO> salaryItems = getCanAdjustSalaryItems();
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
// 待处理薪资项目
List<SalaryArchiveItemDetailSaveParam> salaryArchiveItems = salaryArchiveItemSaveParam.getSalaryArchiveItems().stream()
.filter(e -> salaryItemMap.containsKey(e.getSalaryItemId()))
.collect(Collectors.toList());
List<Long> salaryItemIds = salaryArchiveItems.stream().map(SalaryArchiveItemDetailSaveParam::getSalaryItemId).collect(Collectors.toList());
// 薪资档案
SalaryArchivePO salaryArchive = salaryArchiveMapper.getById(salaryArchiveId);
if (salaryArchive != null) {
// 停薪列表禁止操作
boolean isDisabled = salaryArchive.getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) ||
salaryArchive.getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue());
if (isDisabled) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(115437, "停薪列表禁止操作"));
}
SalaryArchiveItemPO salaryArchiveItem = null;
if (salaryArchiveItemSaveParam.getSalaryArchiveItemId() != null ) {
salaryArchiveItem = salaryArchiveItemMapper.getById(salaryArchiveItemSaveParam.getSalaryArchiveItemId());
if (salaryArchiveItem == null || !salaryArchiveItem.getSalaryArchiveId().equals(salaryArchiveId)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100428, "该薪资档案的薪资项目的调整记录不存在"));
}
if (salaryArchiveItemSaveParam.getSalaryArchiveItems().size() > 1) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(149535, "单个调整不能处理多个薪资项目"));
} else if (!salaryArchiveItems.get(0).getSalaryItemId().equals(salaryArchiveItem.getSalaryItemId())){
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel( 149539, "单个调薪的目标项目和调整明细项目id不一致"));
}
}
// 构建更新PO
SalaryArchiveItemPO updateSalaryArchiveItemPO = buildUpdateSalaryArchiveItemPO(salaryArchiveItemSaveParam,salaryArchiveItems,salaryItemIds,salaryArchiveItem);
salaryArchiveItemMapper.updateIgnoreNull(updateSalaryArchiveItemPO);
}
return StringUtils.EMPTY;
}
/**
* @description 构建薪资档案中调薪的更新PO
* @return null
* @author Harryxzy
* @date 2022/11/14 14:24
*/
private SalaryArchiveItemPO buildUpdateSalaryArchiveItemPO(SalaryArchiveItemSaveParam salaryArchiveItemSaveParam,List<SalaryArchiveItemDetailSaveParam> salaryArchiveItems,List<Long> salaryItemIds,SalaryArchiveItemPO salaryArchiveItem) {
// 获取生效+未生效的数据
List<SalaryArchiveItemPO> salaryItemsBySalaryArchiveIdAndItemIds = getSalaryItemsBySalaryArchiveIdAndItemIds(salaryArchiveItemSaveParam.getSalaryArchiveId(), salaryItemIds);
// 获取当前已生效数据
List<SalaryArchiveItemPO> effectiveSalaryItems = getEffectiveSalaryItems(salaryArchiveItemSaveParam.getSalaryArchiveId(), salaryItemIds);
// 待保存生效时间
Date saveEffectiveTime = salaryArchiveItemSaveParam.getEffectiveTime();
salaryArchiveItems.forEach(e -> {
// 已生效
List<SalaryArchiveItemPO> effectiveList = effectiveSalaryItems.stream().filter(i -> i.getSalaryItemId().equals(e.getSalaryItemId())).collect(Collectors.toList());
// 当前已生效
SalaryArchiveItemPO effectiveSalaryItem = CollectionUtils.isNotEmpty(effectiveList) && effectiveList.size() > 0 ? effectiveList.get(0) : null;
List<SalaryArchiveItemPO> list = salaryItemsBySalaryArchiveIdAndItemIds.stream().filter(i -> i.getSalaryItemId().equals(e.getSalaryItemId())).collect(Collectors.toList());
boolean isNotNumber = StringUtils.isNotEmpty(e.getAdjustValue()) && !Pattern.matches(SalaryArchiveConstant.NUMBER_REGEX, e.getAdjustValue());
if (isNotNumber) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100581, "请输入数字"));
}
// 修改了生效日期
if(!salaryArchiveItemSaveParam.getEffectiveTime().equals(salaryArchiveItem.getEffectiveTime())){
boolean isEffectiveTimeRepeat = list.stream().anyMatch(it -> it.getEffectiveTime().equals(saveEffectiveTime));
if (isEffectiveTimeRepeat) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(153539, "已经存在该生效日期的调整记录,请修改生效日期"));
}
}
// 1.检验是否可以调整
if (effectiveSalaryItem != null) {
// 当前已经生效的时间
Date effectiveTime = effectiveSalaryItem.getEffectiveTime();
// 1.1 如果保存的生效日期早于<当前已生效
if (saveEffectiveTime.before(effectiveTime)) {
if(salaryArchiveItemSaveParam.getCanOperator() == Boolean.TRUE){
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100429, "生效日期不可早于当前已生效的调整日期,仅修改备注"));
}
// 仅可编辑说明
salaryArchiveItemMapper.updateIgnoreNull( SalaryArchiveItemPO.builder().id(salaryArchiveItemSaveParam.getSalaryArchiveItemId())
.description(salaryArchiveItemSaveParam.getDescription()).build());
}
}
});
return SalaryArchiveItemPO.builder().id(salaryArchiveItemSaveParam.getSalaryArchiveItemId()).effectiveTime(salaryArchiveItemSaveParam.getEffectiveTime()).adjustReason(salaryArchiveItemSaveParam.getAdjustReason())
.description(salaryArchiveItemSaveParam.getDescription()).itemValue(salaryArchiveItemSaveParam.getSalaryArchiveItems().get(0).getAdjustValue()).build();
}
@Override
public List<SalaryArchiveItemPO> getCurrentEffectiveItemListIngoreValue(Collection<Long> salaryArchivesIds, List<Long> salaryItemIds) {

View File

@ -147,7 +147,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService {
@Override
public List<SalarySobPO> listByAdmin() {
List<SalarySobPO> salarySobPOS = salarySobMapper.listSome(SalarySobPO.builder().disable(NumberUtils.INTEGER_ZERO).build());
List<SalarySobPO> salarySobPOS = salarySobMapper.listSome(SalarySobPO.builder().build());
return filterByAdmin(salarySobPOS);
}

View File

@ -718,6 +718,36 @@ public class SalaryArchiveController {
return new ResponseResult<SingleSalaryItemAdjustRecordQueryParam, PageInfo<SingleSalaryItemAdjustRecordListDTO>>(user).run(getSalaryArchiveItemWrapper(user)::singleSalaryItemAdjustRecordList, queryParam);
}
/**
* @description 编辑前获取薪资项目调整信息
* @return String
* @author Harryxzy
* @date 2022/11/15 9:25
*/
@POST
@Path("/adjustRecord/getSingleSalaryItemInfo")
@Produces(MediaType.APPLICATION_JSON)
public String getSingleSalaryItemInfo(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SingleSalaryItemAdjustRecordListDTO queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SingleSalaryItemAdjustRecordListDTO, SalaryArchiveItemFormDTO>(user).run(getSalaryArchiveItemWrapper(user)::getSingleSalaryItemInfo, queryParam);
}
/**
* @description 单个档案的薪资项目调整的编辑
* @return String
* @author Harryxzy
* @date 2022/11/11 13:50
*/
@POST
@Path("/adjustRecord/editSingleSalaryItem")
@Produces(MediaType.APPLICATION_JSON)
public String editSingleSalaryItem(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveItemSaveParam updateParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalaryArchiveItemSaveParam, String>(user).run(getSalaryArchiveItemWrapper(user)::editSingleSalaryItem, updateParam);
}
/**
* 导出薪资项目调整记录列表
*/

View File

@ -280,6 +280,17 @@ public class SalaryArchiveItemWrapper extends Service implements SalaryArchiveIt
return listPage;
}
/**
* @description 单个档案的薪资项目调整的编辑
* @return void
* @author Harryxzy
* @date 2022/11/14 11:46
*/
@Override
public String editSingleSalaryItem(SalaryArchiveItemSaveParam salaryArchiveItemSaveParam) {
return getSalaryArchiveItemService(user).editSingleSalaryItem(salaryArchiveItemSaveParam);
}
/**
* 导出薪资项目调整记录列表
*
@ -291,4 +302,72 @@ public class SalaryArchiveItemWrapper extends Service implements SalaryArchiveIt
}
/**
* @description 获取单个档案的单个薪资项目调整信息
* @return void
* @author Harryxzy
* @date 2022/11/11 14:39
*/
public SalaryArchiveItemFormDTO getSingleSalaryItemInfo(SingleSalaryItemAdjustRecordListDTO queryParam) {
SalaryArchiveItemPO byId = getSalaryArchiveItemService(user).getById(queryParam.getId());
if(Objects.isNull(byId)){
throw new SalaryRunTimeException("该薪资项目调整信息不存在");
}
// 获取所有可被引用的薪资项目
List<SalaryItemPO> salaryItemList = getSalaryArchiveItemService(user).getCanAdjustSalaryItems();
List<Long> salaryItemIds = salaryItemList.stream().map(SalaryItemPO::getId).collect(Collectors.toList());
//所有调整记录
List<SalaryItemAdjustRecordListDTO> listAll = getSalaryArchiveItemService(user).salaryItemAdjustRecordList(SalaryItemAdjustRecordQueryParam.builder().build(), salaryItemIds);
//根据条件查询调整记录
List<SalaryItemAdjustRecordListDTO> adjustPageList = getSalaryArchiveItemService(user).salaryItemAdjustRecordList(SalaryItemAdjustRecordQueryParam.builder().salaryArchiveId(byId.getSalaryArchiveId()).build(), salaryItemIds);
List<SingleSalaryItemAdjustRecordListDTO> resultList = Lists.newArrayList();
adjustPageList.forEach(m -> {
if (CollectionUtils.isNotEmpty(listAll)) {
listAll.removeIf(a -> a.getId().equals(m.getId()));
}
Optional<SalaryItemAdjustRecordListDTO> optional = listAll.stream().filter(f -> f.getSalaryArchiveId().equals(m.getSalaryArchiveId()) && f.getSalaryItemId().equals(m.getSalaryItemId())).findFirst();
m.setAdjustBefore(optional.isPresent() ? optional.get().getAdjustAfter() : "");
m.setAdjustReason(SalaryArchiveItemAdjustReasonEnum.getDefaultLabelByValue(m.getAdjustReason()));
SingleSalaryItemAdjustRecordListDTO singleSalaryItemAdjustRecordList = new SingleSalaryItemAdjustRecordListDTO();
BeanUtils.copyProperties(m, singleSalaryItemAdjustRecordList);
resultList.add(singleSalaryItemAdjustRecordList);
});
List<Long> salaryItemPageIds = resultList.stream().map(SingleSalaryItemAdjustRecordListDTO::getSalaryItemId).collect(Collectors.toList());
List<SalaryArchiveItemPO> effectiveSalaryItems = getSalaryArchiveItemService(user).getEffectiveSalaryItems(byId.getSalaryArchiveId(), salaryItemPageIds);
// 行记录按钮权限控制
for (int i = 0; i < resultList.size(); i++) {
SingleSalaryItemAdjustRecordListDTO singleSalaryItemAdjustRecord = resultList.get(i);
if(singleSalaryItemAdjustRecord.getId().equals(queryParam.getId())){
Optional<SalaryArchiveItemPO> optional = effectiveSalaryItems.stream().filter(f -> f.getSalaryItemId().equals(singleSalaryItemAdjustRecord.getSalaryItemId())).findFirst();
Date effectiveDate = optional.map(SalaryArchiveItemPO::getEffectiveTime).orElse(null);
if (effectiveDate != null && singleSalaryItemAdjustRecord.getEffectiveTime().before(effectiveDate)) {
singleSalaryItemAdjustRecord.setCanOperator(Boolean.FALSE);
} else {
singleSalaryItemAdjustRecord.setCanOperator(Boolean.TRUE);
}
Map<String, Object> map = new HashMap<>(3);
map.put("salaryItem", String.valueOf(singleSalaryItemAdjustRecord.getSalaryItemId()));
map.put("salaryBefore", singleSalaryItemAdjustRecord.getAdjustBefore());
map.put("adjustAfter", singleSalaryItemAdjustRecord.getAdjustAfter());
// 调整明细数据
List<Map<String, Object>> tableData = Lists.newArrayList();
tableData.add(map);
return SalaryArchiveItemFormDTO.builder()
.canOperator(singleSalaryItemAdjustRecord.getCanOperator())
.salaryArchiveId(byId.getSalaryArchiveId())
.salaryArchiveItemForm(buildSalaryArchiveItemForm(byId.getEffectiveTime(), byId.getAdjustReason(), byId.getDescription()))
.salaryArchiveItemDetail(buildSalaryArchiveItemAdjustDetailTable(tableData))
.build();
}
}
return null;
}
}

View File

@ -55,4 +55,13 @@ public interface SalaryArchiveItemWrapperProxy {
PageInfo<SingleSalaryItemAdjustRecordListDTO> singleSalaryItemAdjustRecordList(SingleSalaryItemAdjustRecordQueryParam queryParam);
SalaryArchiveItemFormDTO getSingleSalaryItemInfo(SingleSalaryItemAdjustRecordListDTO queryParam);
/**
* @description 单个档案的薪资项目调整的编辑
* @return void
* @author Harryxzy
* @date 2022/11/14 11:45
*/
String editSingleSalaryItem(SalaryArchiveItemSaveParam salaryArchiveItemSaveParam);
}