Merge branch 'release/2.15.1.2407.01' into release/个税版本

This commit is contained in:
钱涛 2024-07-16 17:25:37 +08:00
commit e45ee09c7e
17 changed files with 460 additions and 215 deletions

View File

@ -2,11 +2,23 @@ package com.engine.salary.action;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionParam;
import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum;
import com.engine.salary.mapper.archive.SalaryArchiveMapper;
import com.engine.salary.service.SalaryArchiveService;
import com.engine.salary.service.TaxAgentService;
import com.engine.salary.service.impl.SalaryArchiveServiceImpl;
import com.engine.salary.service.impl.TaxAgentServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.wrapper.SalaryArchiveWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.conn.RecordSet;
import weaver.general.Util;
import weaver.hrm.User;
@ -25,6 +37,18 @@ public class CheckInitSalaryAction implements Action {
return ServiceUtil.getService(SalaryArchiveWrapper.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryArchiveService getSalaryArchiveService(User user) {
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
}
private SalaryArchiveMapper getSalaryArchiveMapper() {
return MapperProxyFactory.getProxy(SalaryArchiveMapper.class);
}
private String tableName;
@ -57,40 +81,72 @@ public class CheckInitSalaryAction implements Action {
String value = fieldMap.get(processField);
list.add(new SalaryField(processField, salaryName, value));
}
List<Map<String, Object>> importData = new ArrayList<>();
Map<String, Object> importDataMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue);
if(!importDataMap.containsKey("生效日期")){
importDataMap.put("生效日期", SalaryDateUtil.getFormatDate(new Date()));
}
if(!importDataMap.containsKey("最后发薪日期")){
importDataMap.put("最后发薪日期", "");
}
importData.add(importDataMap);
SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder()
.importDatas(importData)
.build();
//操作人
String uid = list.stream().filter(f -> f.salaryName.equals("操作人")).findFirst().map(SalaryField::getValue).orElse("1");
Map<String, Object> map = getSalaryArchiveWrapper(new User(Integer.parseInt(uid))).checkSalaryArchiveInit(build);
List errorNotice = (List) map.get("errorNotice");
if (CollectionUtils.isNotEmpty(errorNotice)) {
log.error("定薪检查存在异常 requestId:{} ,参数:{}, map:{}", requestInfo.getRequestid(), build, map);
List<Map<String, String>> excelComments = (List<Map<String, String>>) map.get("errorNotice");
StringBuilder message = new StringBuilder("");
for (Map<String, String> comments : excelComments) {
message.append(comments.get("message")).append("\n");
}
requestInfo.getRequestManager().setMessage(message.toString());
return FAILURE_AND_CONTINUE;
}
return doSalaryArchiveInit(requestInfo, importDataMap);
} catch (Exception e) {
log.error("定薪检查异常", e);
requestInfo.getRequestManager().setMessage(e.getMessage());
return FAILURE_AND_CONTINUE;
}
}
public String doSalaryArchiveInit(RequestInfo requestInfo, Map<String, Object> importDataMap) {
User user = new User();
user.setLoginid("sysadmin");
user.setUid(1);
List<Map<String, Object>> importData = new ArrayList<>();
if(!importDataMap.containsKey("生效日期")){
importDataMap.put("生效日期", SalaryDateUtil.getFormatDate(new Date()));
}
if(!importDataMap.containsKey("最后发薪日期")){
importDataMap.put("最后发薪日期", "");
}
importData.add(importDataMap);
// 首先判断是否已经存在薪资档案且薪资档案状态为待定薪
String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString();
String empIdStr = importDataMap.getOrDefault("员工id", "").toString();
if (StringUtils.isBlank(taxAgentName)) {
requestInfo.getRequestManager().setMessage("个税扣缴义务人不能为空");
return FAILURE_AND_CONTINUE;
}
// 获取义务人信息
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).list(TaxAgentQueryParam.builder().name(taxAgentName).build());
if (CollectionUtils.isEmpty(taxAgentPOS)) {
requestInfo.getRequestManager().setMessage("个税扣缴义务人不存在");
return FAILURE_AND_CONTINUE;
}
Long taxAgentId = taxAgentPOS.get(0).getId();
// 获取员工id
if (NumberUtils.isCreatable(empIdStr)) {
List<SalaryArchivePO> salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().taxAgentId(taxAgentId).employeeId(Long.valueOf(empIdStr)).build());
if (CollectionUtils.isNotEmpty(salaryArchivePOList) && !salaryArchivePOList.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.PENDING.getValue())) {
// 存在薪资档案且薪资档案状态不是待定薪修改状态为待定薪
salaryArchivePOList.get(0).setRunStatus(SalaryArchiveStatusEnum.PENDING.getValue());
salaryArchivePOList.get(0).setPayEndDate(null);
getSalaryArchiveMapper().update(salaryArchivePOList.get(0));
}
}
SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder()
.importDatas(importData)
.build();
//操作人
Map<String, Object> map = getSalaryArchiveWrapper(user).checkSalaryArchiveInit(build);
List errorNotice = (List) map.get("errorNotice");
if (CollectionUtils.isNotEmpty(errorNotice)) {
log.error("定薪检查存在异常 requestId:{} ,参数:{}, map:{}", requestInfo.getRequestid(), build, map);
List<Map<String, String>> excelComments = (List<Map<String, String>>) map.get("errorNotice");
StringBuilder message = new StringBuilder("");
for (Map<String, String> comments : excelComments) {
message.append(comments.get("message")).append("\n");
}
requestInfo.getRequestManager().setMessage(message.toString());
return FAILURE_AND_CONTINUE;
}
return SUCCESS;
}

View File

@ -2,11 +2,23 @@ package com.engine.salary.action;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionParam;
import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum;
import com.engine.salary.mapper.archive.SalaryArchiveMapper;
import com.engine.salary.service.SalaryArchiveService;
import com.engine.salary.service.TaxAgentService;
import com.engine.salary.service.impl.SalaryArchiveServiceImpl;
import com.engine.salary.service.impl.TaxAgentServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.wrapper.SalaryArchiveWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.conn.RecordSet;
import weaver.general.Util;
import weaver.hrm.User;
@ -25,6 +37,18 @@ public class InitSalaryAction implements Action {
return ServiceUtil.getService(SalaryArchiveWrapper.class, user);
}
private SalaryArchiveService getSalaryArchiveService(User user) {
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryArchiveMapper getSalaryArchiveMapper() {
return MapperProxyFactory.getProxy(SalaryArchiveMapper.class);
}
private String tableName;
@ -39,12 +63,10 @@ public class InitSalaryAction implements Action {
@Override
public String execute(RequestInfo requestInfo) {
try {
Property[] properties = requestInfo.getMainTableInfo().getProperty();
Map<String, String> fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName,
property -> Util.null2String(property.getValue())));
RecordSet rs = new RecordSet();
String queryImageId = "select salaryname,processfield from " + tableName + " where workflowid = ?";
@ -57,44 +79,79 @@ public class InitSalaryAction implements Action {
String value = fieldMap.get(processField);
list.add(new SalaryField(processField, salaryName, value));
}
List<Map<String, Object>> importData = new ArrayList<>();
Map<String, Object> importDataMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue);
if(!importDataMap.containsKey("生效日期")){
importDataMap.put("生效日期", SalaryDateUtil.getFormatDate(new Date()));
}
if(!importDataMap.containsKey("最后发薪日期")){
importDataMap.put("最后发薪日期", "");
}
importData.add(importDataMap);
SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder()
.importDatas(importData)
.build();
//操作人
String uid = list.stream().filter(f -> f.salaryName.equals("操作人")).findFirst().map(SalaryField::getValue).orElse("1");
Map<String, Object> map = getSalaryArchiveWrapper(new User(Integer.parseInt(uid))).importSalaryArchiveInit(build);
List errorNotice = (List) map.get("errorNotice");
if (CollectionUtils.isNotEmpty(errorNotice)) {
log.error("定薪存在异常 requestId:{} ,参数:{}, map:{}", requestInfo.getRequestid(), build, map);
List<Map<String, String>> excelComments = (List<Map<String, String>>) map.get("errorNotice");
StringBuilder message = new StringBuilder("");
for (Map<String, String> comments : excelComments) {
message.append(comments.get("message")).append("\n");
}
requestInfo.getRequestManager().setMessage(message.toString());
return FAILURE_AND_CONTINUE;
}
return doSalaryArchiveInit(requestInfo, importDataMap);
} catch (Exception e) {
log.error("定薪异常", e);
requestInfo.getRequestManager().setMessage(e.getMessage());
return FAILURE_AND_CONTINUE;
}
}
public String doSalaryArchiveInit(RequestInfo requestInfo, Map<String, Object> importDataMap) {
User user = new User();
user.setLoginid("sysadmin");
user.setUid(1);
List<Map<String, Object>> importData = new ArrayList<>();
if(!importDataMap.containsKey("生效日期")){
importDataMap.put("生效日期", SalaryDateUtil.getFormatDate(new Date()));
}
if(!importDataMap.containsKey("最后发薪日期")){
importDataMap.put("最后发薪日期", "");
}
importData.add(importDataMap);
// 首先判断是否已经存在薪资档案且薪资档案状态为待定薪
String taxAgentName = importDataMap.getOrDefault("个税扣缴义务人", "").toString();
String empIdStr = importDataMap.getOrDefault("员工id", "").toString();
if (StringUtils.isBlank(taxAgentName)) {
requestInfo.getRequestManager().setMessage("个税扣缴义务人不能为空");
return FAILURE_AND_CONTINUE;
}
// 获取义务人信息
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).list(TaxAgentQueryParam.builder().name(taxAgentName).build());
if (CollectionUtils.isEmpty(taxAgentPOS)) {
requestInfo.getRequestManager().setMessage("个税扣缴义务人不存在");
return FAILURE_AND_CONTINUE;
}
Long taxAgentId = taxAgentPOS.get(0).getId();
// 获取员工id
if (NumberUtils.isCreatable(empIdStr)) {
List<SalaryArchivePO> salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().taxAgentId(taxAgentId).employeeId(Long.valueOf(empIdStr)).build());
if (CollectionUtils.isNotEmpty(salaryArchivePOList) && !salaryArchivePOList.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.PENDING.getValue())) {
// 存在薪资档案且薪资档案状态不是待定薪修改状态为待定薪
salaryArchivePOList.get(0).setRunStatus(SalaryArchiveStatusEnum.PENDING.getValue());
salaryArchivePOList.get(0).setPayEndDate(null);
getSalaryArchiveMapper().update(salaryArchivePOList.get(0));
}
}
SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder()
.importDatas(importData)
.build();
//操作人
String uid = importDataMap.getOrDefault("操作人", "1").toString();
Map<String, Object> map = getSalaryArchiveWrapper(new User(Integer.parseInt(uid))).importSalaryArchiveInit(build);
List errorNotice = (List) map.get("errorNotice");
if (CollectionUtils.isNotEmpty(errorNotice)) {
log.error("定薪存在异常 requestId:{} ,参数:{}, map:{}", requestInfo.getRequestid(), build, map);
List<Map<String, String>> excelComments = (List<Map<String, String>>) map.get("errorNotice");
StringBuilder message = new StringBuilder("");
for (Map<String, String> comments : excelComments) {
message.append(comments.get("message")).append("\n");
}
requestInfo.getRequestManager().setMessage(message.toString());
return FAILURE_AND_CONTINUE;
}
return SUCCESS;
}
class SalaryField {
private String processField;

View File

@ -16,6 +16,7 @@ import com.engine.salary.service.TaxAgentService;
import com.engine.salary.service.impl.SalaryArchiveServiceImpl;
import com.engine.salary.service.impl.TaxAgentManageRangeServiceImpl;
import com.engine.salary.service.impl.TaxAgentServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.wrapper.SalaryArchiveWrapper;
@ -89,9 +90,9 @@ public class RehireAction implements Action {
String value = fieldMap.get(processField);
list.add(new SalaryField(processField, salaryName, value));
}
Map<String, String> salaryFieldMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue);
String taxAgentName = salaryFieldMap.get("个税扣缴义务人");
String empIdStr = salaryFieldMap.get("员工id");
Map<String, Object> salaryFieldMap = SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue);
String taxAgentName = salaryFieldMap.getOrDefault("个税扣缴义务人", "").toString();
String empIdStr = salaryFieldMap.getOrDefault("员工id", "").toString();
if (StringUtils.isBlank(taxAgentName) || StringUtils.isBlank(empIdStr)) {
requestInfo.getRequestManager().setMessage("个税扣缴义务人、或员工id不能为空");
return FAILURE_AND_CONTINUE;
@ -107,47 +108,69 @@ public class RehireAction implements Action {
Long employeeId = Long.valueOf(empIdStr);
List<SalaryArchivePO> salaryArchivePOS = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().taxAgentId(taxAgentId).employeeId(employeeId).build());
if (CollectionUtils.isEmpty(salaryArchivePOS)){
requestInfo.getRequestManager().setMessage("该个税扣缴义务人下,该员工不存在薪资档案!");
return FAILURE_AND_CONTINUE;
// 直接走定薪action生成档案
InitSalaryAction initSalaryAction = new InitSalaryAction();
return initSalaryAction.doSalaryArchiveInit(requestInfo, salaryFieldMap);
// requestInfo.getRequestManager().setMessage("该个税扣缴义务人下,该员工不存在薪资档案!");
// return FAILURE_AND_CONTINUE;
} else if (salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue())) {
requestInfo.getRequestManager().setMessage("该个税扣缴义务人下,该员工没有发过薪。需取消停薪后,申请定薪流程!");
return FAILURE_AND_CONTINUE;
}
if (salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue())) {
// 停薪来自待停薪 1取消停薪
getSalaryArchiveWrapper(user).cancelStop(Collections.singletonList(salaryArchivePOS.get(0).getId()));
}
if (salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()) || salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.SUSPEND.getValue())) {
// 1如果不在人员范围内则把他加入义务人的人员范围2删除待办
addTaxAgentRangeIfNotExist(taxAgentId, employeeId, user);
getSalaryArchiveWrapper(user).deleteSuspendTodo(Collections.singletonList(salaryArchivePOS.get(0).getId()));
}
// 调薪
List<Map<String, Object>> importData = new ArrayList<>();
importData.add(SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue));
SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder()
.importDatas(importData)
.build();
//操作人
String uid = list.stream().filter(f -> f.salaryName.equals("操作人")).findFirst().map(RehireAction.SalaryField::getValue).orElse("1");
Map<String, Object> map = getSalaryArchiveWrapper(new User(Integer.parseInt(uid))).adjustmentSalaryArchive(build);
List errorNotice = (List) map.get("errorNotice");
if (CollectionUtils.isNotEmpty(errorNotice)) {
// 回滚档案状态
// 先把状态变成待定薪然后走定薪action
salaryArchivePOS.get(0).setRunStatus(SalaryArchiveStatusEnum.PENDING.getValue());
salaryArchivePOS.get(0).setPayEndDate(null);
getSalaryArchiveMapper().update(salaryArchivePOS.get(0));
log.error("调薪存在异常 requestId:{} map:{}", requestInfo.getRequestid(), map);
List<Map<String, String>> excelComments = (List<Map<String, String>>) map.get("errorNotice");
StringBuilder message = new StringBuilder("");
for (Map<String, String> comments : excelComments) {
message.append(comments.get("message")).append("\n");
InitSalaryAction initSalaryAction = new InitSalaryAction();
return initSalaryAction.doSalaryArchiveInit(requestInfo, salaryFieldMap);
// requestInfo.getRequestManager().setMessage("该个税扣缴义务人下,该员工没有发过薪。需取消停薪后,申请定薪流程!");
// return FAILURE_AND_CONTINUE;
} else {
if (salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue())) {
// 停薪来自待停薪 1取消停薪
getSalaryArchiveWrapper(user).cancelStop(Collections.singletonList(salaryArchivePOS.get(0).getId()));
}
if (salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()) ||
salaryArchivePOS.get(0).getRunStatus().equals(SalaryArchiveStatusEnum.SUSPEND.getValue())) {
// 1如果不在人员范围内则把他加入义务人的人员范围2删除待办
addTaxAgentRangeIfNotExist(taxAgentId, employeeId, user);
getSalaryArchiveWrapper(user).deleteSuspendTodo(Collections.singletonList(salaryArchivePOS.get(0).getId()));
}
// 调薪
List<Map<String, Object>> importData = new ArrayList<>();
importData.add(SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue));
SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder()
.importDatas(importData)
.build();
//操作人
String uid = list.stream().filter(f -> f.salaryName.equals("操作人")).findFirst().map(RehireAction.SalaryField::getValue).orElse("1");
Map<String, Object> map = getSalaryArchiveWrapper(new User(Integer.parseInt(uid))).adjustmentSalaryArchive(build);
List errorNotice = (List) map.get("errorNotice");
if (CollectionUtils.isNotEmpty(errorNotice)) {
// 回滚档案状态
getSalaryArchiveMapper().update(salaryArchivePOS.get(0));
log.error("调薪存在异常 requestId:{} map:{}", requestInfo.getRequestid(), map);
List<Map<String, String>> excelComments = (List<Map<String, String>>) map.get("errorNotice");
StringBuilder message = new StringBuilder("");
for (Map<String, String> comments : excelComments) {
message.append(comments.get("message")).append("\n");
}
requestInfo.getRequestManager().setMessage(message.toString());
return FAILURE_AND_CONTINUE;
}
// 如果有起始发薪日期字段则更新档案的起始发薪日期
String startPayDate = salaryFieldMap.getOrDefault("起始发薪日期", "").toString();
if (StringUtils.isNotBlank(startPayDate)) {
Date date = SalaryDateUtil.dateStrToLocalDate(startPayDate);
if (date != null) {
Long salaryArchiveId = salaryArchivePOS.get(0).getId();
getSalaryArchiveMapper().updatePayStartDateById(salaryArchiveId, date);
}
}
requestInfo.getRequestManager().setMessage(message.toString());
return FAILURE_AND_CONTINUE;
}
} catch (Exception e) {
log.error("返聘调薪异常", e);

View File

@ -68,6 +68,10 @@ public class SalarySendDetailQueryParam extends BaseQueryParam {
// @JsonIgnore
private List<Integer> sendStatuss;
// 导出时显示列定制信息
List<String> columns;
public static String checkParam(SalarySendDetailQueryParam saveParam) {
if (saveParam.getSalarySendId() == null) {
throw new SalaryRunTimeException("工资单发放Id必传");

View File

@ -21,14 +21,16 @@ import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum;
import com.engine.salary.enums.salarysob.TargetTypeEnum;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.IdGenerator;
import com.engine.salary.util.excel.ExcelComment;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.engine.salary.util.db.IdGenerator;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.general.Util;
import weaver.hrm.User;
import java.time.LocalDate;
import java.util.*;
@ -338,7 +340,7 @@ public class SalaryArchiveExcelBO extends Service {
* @param importHandleParam
* @return
*/
public static boolean singleRowCheck(List<String> allTodoSalaryArchives, Map<String, Object> map, List<String> headers, int effectiveTimeIndex, List<Map<String, String>> excelComments, int errorCount, SalaryArchiveImportHandleParam importHandleParam) {
public static boolean singleRowCheck(List<String> allTodoSalaryArchives, Map<String, Object> map, List<String> headers, int effectiveTimeIndex, List<Map<String, String>> excelComments, int errorCount, SalaryArchiveImportHandleParam importHandleParam, User user) {
//是否是流程
boolean process = importHandleParam.isProcess();
@ -655,7 +657,7 @@ public class SalaryArchiveExcelBO extends Service {
// 7.薪资项目列处理(待定薪\定薪的初始化\定薪的调薪)
} else {
isError = handleSalaryItem(isError, effectiveTimeIndex, excelComments, errorCount, j,
effectiveTime, finalSalaryArchive, adjustReason, importHandleParam, key.toString(), cellVal, map);
effectiveTime, finalSalaryArchive, adjustReason, importHandleParam, key.toString(), cellVal, map, user);
}
}
@ -805,14 +807,14 @@ public class SalaryArchiveExcelBO extends Service {
public static boolean handleSalaryItem(boolean isError, int effectiveTimeIndex,
List<Map<String, String>> excelComments, int errorCount, int j,
Date effectiveTime, SalaryArchivePO finalSalaryArchive, String salaryItemAdjustReason, SalaryArchiveImportHandleParam importHandleParam,
String key, String cellVal, Map<String, Object> map) {
String key, String cellVal, Map<String, Object> map, User user) {
String rowindex = "" + map.get("index") + "";
// 薪资项目数据
if (isError || importHandleParam.isSuspendList() || (importHandleParam.isSalaryItemAdjust() && effectiveTime == null) || finalSalaryArchive == null) {
return isError;
}
Optional<SalaryItemPO> optionalSalaryItem = importHandleParam.getSalaryItems().stream().filter(e -> e.getName().equals(key)).findFirst();
Optional<SalaryItemPO> optionalSalaryItem = importHandleParam.getSalaryItems().stream().filter(e -> Util.formatMultiLang(e.getName(), String.valueOf(user.getLanguage())).equals(key)).findFirst();
// 可以处理薪资项目的条件有薪资项目+待定薪列表+定薪列表调薪和初始化导入
boolean isEnable = optionalSalaryItem.isPresent() && (importHandleParam.isPendingList() || importHandleParam.isInit() || importHandleParam.isSalaryItemAdjust());
if (isEnable) {

View File

@ -6,6 +6,7 @@ import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.Date;
import java.util.List;
public interface SalaryArchiveMapper {
@ -135,4 +136,11 @@ public interface SalaryArchiveMapper {
List<SalaryArchivePO> listPayEndDateIsNull(@Param("ids")List<Long> employeeIds);
List<SalaryArchivePO> listPayStartDateIsNull(@Param("runStatus")String runStatus);
/**
* 更新起始发薪日期
* @param salaryArchiveId
* @param date
*/
void updatePayStartDateById(@Param("id")Long salaryArchiveId, @Param("payStartDate")Date date);
}

View File

@ -871,5 +871,12 @@
#{id}
</foreach>
</update>
<update id="updatePayStartDateById">
UPDATE hrsa_salary_archive
<set>
pay_start_date= #{payStartDate}
</set>
WHERE id = #{id}
</update>
</mapper>

View File

@ -88,4 +88,28 @@ public class SalaryStatisticsReportDataQueryParam extends BaseQueryParam {
// "分享批次id
private Long batchId;
@Override
public String toString() {
return "SalaryStatisticsReportDataQueryParam{" +
"id=" + id +
", dimensionId=" + dimensionId +
", salaryStartMonth='" + salaryStartMonth + '\'' +
", salaryEndMonth='" + salaryEndMonth + '\'' +
", taxAgent=" + taxAgent +
", salarySob=" + salarySob +
", incomeCategory=" + incomeCategory +
", subCompany=" + subCompany +
", depart=" + depart +
", grade=" + grade +
", position=" + position +
", status=" + status +
", employee=" + employee +
", hiredate=" + hiredate +
", leavedate=" + leavedate +
", unitType=" + unitType +
", isShare=" + isShare +
", batchId=" + batchId +
'}';
}
}

View File

@ -1102,8 +1102,6 @@ public class SalaryStatisticsReportServiceImpl extends Service implements Salary
List<FieldSetting> fieldSettings = Optional.ofNullable(Optional.ofNullable(employeeInfoExpandDTO).orElse(new EmployeeInfoExpandDTO()).getFieldSettings()).orElse(new ArrayList<>());
Map<Long, Map<String, String>> expandEmployeeMap = getSalaryEmployeeService(user).expandEmployeeMap(empIds, employeeInfoExpandDTO);
log.info("扩展属性" + expandEmployeeMap);
// List<ExtEmployeePO> extEmployees = extEmployeeService.listByIdsWithDeleted(accountDetailPOList.stream().filter(e -> EmployeeTypeEnum.EXT_EMPLOYEE.getValue().equals(e.getEmployeeType())).map(SalaryAcctEmployeePO::getEmployeeId).distinct().collect(Collectors.toList()), data.getTenantKey());
// Map<Long, String> employeeExtByIdMap = SalaryEntityUtil.convert2Map(extEmployees, ExtEmployeePO::getId, ExtEmployeePO::getUsername);

View File

@ -6,7 +6,6 @@ import com.engine.salary.report.wrapper.SalaryStatisticsReportWrapper;
import com.engine.salary.util.ResponseResult;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
@ -158,17 +157,10 @@ public class SalaryStatisticsReportController {
*
* @return
*/
@GET
@POST
@Path("/exportData")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportData(@Context HttpServletRequest request, @Context HttpServletResponse response) {
SalaryStatisticsReportDataQueryParam param = SalaryStatisticsReportDataQueryParam.builder()
.id(Long.parseLong(request.getParameter("id")))
.dimensionId(Long.parseLong(request.getParameter("dimensionId")))
.salaryStartMonth(request.getParameter("salaryStartMonth"))
.salaryEndMonth(request.getParameter("salaryEndMonth"))
.isShare(StringUtils.equals(request.getParameter("isShare"), "true"))
.build();
public Response exportData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryStatisticsReportDataQueryParam param) {
try {
User user = HrmUserVarify.getUser(request, response);
Map<String, Object> map = getSalaryStatisticsReportWrapper(user).exportData(param);

View File

@ -30,6 +30,7 @@ import com.engine.salary.service.impl.*;
import com.engine.salary.util.*;
import com.engine.salary.util.excel.ExcelUtilPlus;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
@ -325,11 +326,32 @@ public class SalaryStatisticsReportWrapper extends Service {
//已缓存的报表id
String salaryReportIds = Utils.null2String(getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_IDS));
String salaryReportConditions = "";
// 获取人员维度id
Optional<Long> empDimensionOptional = getSalaryStatisticsDimensionService(user).listAllDefaultDimension().stream().filter(dim -> dim.getDimName().equals("人员")).map(SalaryStatisticsDimensionPO::getId).findFirst();
Long empDimensionId = 0L;
if (empDimensionOptional.isPresent()) {
empDimensionId = empDimensionOptional.get();
}
if (StringUtils.isNotBlank(salaryReportIds) && salaryReportIds.contains(id + "")) {
//报表中缓存的条件
salaryReportConditions = Utils.null2String(getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_CONDITIONS + id));
if (StringUtils.isNotBlank(salaryReportConditions) && salaryReportConditions.contains(paramMd5)) {
return getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5);
Map<String, Object> result = getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5);
if (param.getDimensionId().equals(empDimensionId)) {
// 人员维度需要分页
Map<String, Object> finalResultMap = new HashMap<>();
PageInfo<Map<String, Object>> pageInfo = (PageInfo<Map<String, Object>>) result.get("pageInfo");
PageInfo<Map<String, Object>> finalPageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize());
finalPageInfo.setTotal(pageInfo.getList().size());
finalPageInfo.setList(SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), pageInfo.getList()));
finalResultMap.put("pageInfo", finalPageInfo);
finalResultMap.put("columns", result.get("columns"));
finalResultMap.put("countResult", result.get("countResult"));
finalResultMap.put("reportId", id);
return finalResultMap;
}
return result;
}
}
@ -356,6 +378,20 @@ public class SalaryStatisticsReportWrapper extends Service {
getSalaryCacheService(user).set(SalaryCacheKey.SALARY_REPORT_CONDITIONS + id, salaryReportConditions + "," + paramMd5);
getSalaryCacheService(user).set(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5, resultMap);
Map<String, Object> finalResultMap = Maps.newHashMap();
// 缓存完之后结果分页
if (param.getDimensionId().equals(empDimensionId)) {
// 只有是人员维度才分页
PageInfo<Map<String, Object>> pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize());
pageInfo.setTotal(page.getList().size());
pageInfo.setList(SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), page.getList()));
finalResultMap.put("pageInfo", pageInfo);
finalResultMap.put("columns", weaTableColumns);
finalResultMap.put("countResult", countResultMap);
finalResultMap.put("reportId", id);
return finalResultMap;
}
return resultMap;
}
@ -368,11 +404,12 @@ public class SalaryStatisticsReportWrapper extends Service {
* @return
*/
public Map<String, Object> exportData(SalaryStatisticsReportDataQueryParam param) {
if (param.getId() == null || param.getDimensionId() == null) {
Long id = param.getId();
if (id == null || param.getDimensionId() == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误"));
}
SalaryStatisticsReportPO po = this.getSalaryStatisticsReportService(user).getById(param.getId());
SalaryStatisticsReportPO po = this.getSalaryStatisticsReportService(user).getById(id);
if (po == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(161845, "薪酬统计报表不存在"));
}
@ -381,90 +418,98 @@ public class SalaryStatisticsReportWrapper extends Service {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(161300, "统计维度不存在"));
}
sharedReportCheck(param.isShare(), po);
// 参数转换
SalaryStatisticsReportBO.poToQueryParam(param, po);
// 查询自定义统计项目
List<SalaryStatisticsItemPO> salaryStatisticsItemList = this.getSalaryStatisticsItemService(user).listByStatisticsReportId(po.getId());
// 列表data
PageInfo<Map<String, Object>> page = this.getSalaryStatisticsReportService(user).buildReportRecords(dimension, param, salaryStatisticsItemList);
// 组装合计
Map<String, Object> countResultMap = SalaryStatisticsReportBO.buildTotal(page, salaryStatisticsItemList, (long) user.getUID());
List<Map<String, Object>> list = page.getList();
if (CollectionUtils.isNotEmpty(list) && MapUtils.isNotEmpty(countResultMap)) {
list.add(countResultMap);
}
// 获取数据
List<Map<String, String>> records = list.stream().map(m -> m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() + StringUtils.EMPTY))).collect(Collectors.toList());
// 参数转换
SalaryStatisticsReportBO.poToQueryParam(param, po);
String paramMd5 = SecureUtil.md5(param + salaryStatisticsItemList.toString());
// 获取列头
List<WeaTableColumnGroup> weaTableColumns = SalaryStatisticsReportBO.buildReportColumns(dimension, salaryStatisticsItemList);
//已缓存的报表id
String salaryReportIds = Utils.null2String(getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_IDS));
String salaryReportConditions = "";
// 组装导出参数
// ExportCommonParam exportParam = SalaryStatisticsReportBO.buildExportParam(dimension.getDimName(), weaTableColumns, records);
// exportParam.setSheetName(SalaryI18nUtil.getI18nLabel(179263, "薪酬统计报表") + "-" + exportParam.getDimensionName());
//
List rows = new ArrayList<>();
rows.add(weaTableColumns);
List<String> head = new ArrayList<>();
weaTableColumns.forEach(weaTableColumn -> {
String column = weaTableColumn.getColumn();
if (CollectionUtils.isEmpty(weaTableColumn.getChildren())) {
head.add(column);
} else {
weaTableColumn.getChildren().forEach(children -> {
head.add(children.getColumn());
});
}
});
List<Long> itemIds = salaryStatisticsItemList.stream().map(item -> item.getItemValue().split(",")).flatMap(Arrays::stream).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
List<SalaryItemPO> salaryItemPOList = getSalaryItemService(user).listByIds(itemIds);
List<String> numberItemIds = salaryItemPOList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).map(salaryItemPO -> salaryItemPO.getId().toString()).collect(Collectors.toList());
Map<String, SalaryStatisticsItemPO> salaryStatisticsItemMap = SalaryEntityUtil.convert2Map(salaryStatisticsItemList, statisticsItemPO -> statisticsItemPO.getId().toString());
for (Map<String, String> map : records) {
List<Object> row = Lists.newArrayListWithExpectedSize(records.size());
head.forEach(k -> {
// 获取是数值还是文本
if (k.contains(SalaryStatisticsReportBO.UD)) {
String[] split = k.split(SalaryStatisticsReportBO.UD);
String salaryItemId = split[0];
SalaryStatisticsItemPO salaryStatisticsItemPO = salaryStatisticsItemMap.get(salaryItemId);
if (salaryStatisticsItemPO != null) {
Optional<String> textItemOptional = Arrays.stream(salaryStatisticsItemPO.getItemValue().split(",")).filter(id -> !numberItemIds.contains(id)).findFirst();
row.add( (!textItemOptional.isPresent() && NumberUtils.isCreatable(map.getOrDefault(k, StringUtils.EMPTY).replace(",", ""))) ? new BigDecimal(map.get(k).replace(",", "")) : map.getOrDefault(k, StringUtils.EMPTY));
} else {
row.add(map.getOrDefault(k, StringUtils.EMPTY));
}
} else {
row.add(map.getOrDefault(k, StringUtils.EMPTY));
if (StringUtils.isNotBlank(salaryReportIds) && salaryReportIds.contains(id + "")) {
//报表中缓存的条件
salaryReportConditions = Utils.null2String(getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_CONDITIONS + id));
if (StringUtils.isNotBlank(salaryReportConditions) && salaryReportConditions.contains(paramMd5)) {
Map<String, Object> result = getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5);
// 获取列头
List<WeaTableColumnGroup> weaTableColumns = (List<WeaTableColumnGroup>) result.get("columns");
PageInfo<Map<String, Object>> page = (PageInfo<Map<String, Object>>) result.get("pageInfo");
// 组装合计
Map<String, Object> countResultMap = SalaryStatisticsReportBO.buildTotal(page, salaryStatisticsItemList, (long) user.getUID());
List<Map<String, Object>> list = page.getList();
if (CollectionUtils.isNotEmpty(list) && MapUtils.isNotEmpty(countResultMap)) {
list.add(countResultMap);
}
});
rows.add(row);
// 获取数据
List<Map<String, String>> records = list.stream().map(m -> m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() + StringUtils.EMPTY))).collect(Collectors.toList());
List rows = new ArrayList<>();
rows.add(weaTableColumns);
List<String> head = new ArrayList<>();
weaTableColumns.forEach(weaTableColumn -> {
String column = weaTableColumn.getColumn();
if (CollectionUtils.isEmpty(weaTableColumn.getChildren())) {
head.add(column);
} else {
weaTableColumn.getChildren().forEach(children -> {
head.add(children.getColumn());
});
}
});
List<Long> itemIds = salaryStatisticsItemList.stream().map(item -> item.getItemValue().split(",")).flatMap(Arrays::stream).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList());
List<SalaryItemPO> salaryItemPOList = getSalaryItemService(user).listByIds(itemIds);
List<String> numberItemIds = salaryItemPOList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).map(salaryItemPO -> salaryItemPO.getId().toString()).collect(Collectors.toList());
Map<String, SalaryStatisticsItemPO> salaryStatisticsItemMap = SalaryEntityUtil.convert2Map(salaryStatisticsItemList, statisticsItemPO -> statisticsItemPO.getId().toString());
for (Map<String, String> map : records) {
List<Object> row = Lists.newArrayListWithExpectedSize(records.size());
head.forEach(k -> {
// 获取是数值还是文本
if (k.contains(SalaryStatisticsReportBO.UD)) {
String[] split = k.split(SalaryStatisticsReportBO.UD);
String salaryItemId = split[0];
SalaryStatisticsItemPO salaryStatisticsItemPO = salaryStatisticsItemMap.get(salaryItemId);
if (salaryStatisticsItemPO != null) {
Optional<String> textItemOptional = Arrays.stream(salaryStatisticsItemPO.getItemValue().split(",")).filter(itemId -> !numberItemIds.contains(itemId)).findFirst();
row.add((!textItemOptional.isPresent() && NumberUtils.isCreatable(map.getOrDefault(k, StringUtils.EMPTY).replace(",", ""))) ? new BigDecimal(map.get(k).replace(",", "")) : map.getOrDefault(k, StringUtils.EMPTY));
} else {
row.add(map.getOrDefault(k, StringUtils.EMPTY));
}
} else {
row.add(map.getOrDefault(k, StringUtils.EMPTY));
}
});
rows.add(row);
}
String sheetName = SalaryI18nUtil.getI18nLabel(179263, "薪酬统计报表") + "-" + dimension.getDimName();
XSSFWorkbook book = ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, true);
Map<String, Object> map = new HashMap<>();
map.put("workbook", book);
map.put("fileName", sheetName);
// 记录操作日志
String name = SalaryI18nUtil.getI18nLabel(0, "导出");
LoggerContext loggerContext = new LoggerContext<>();
loggerContext.setTargetId(po.getId().toString());
loggerContext.setTargetName(po.getReportName());
loggerContext.setOperateType(OperateTypeEnum.EXCEL_EXPORT.getValue());
loggerContext.setOperateTypeName(name);
loggerContext.setOperatedesc(name + SalaryI18nUtil.getI18nLabel(0, "薪酬统计报表") + "-" + po.getReportName());
loggerContext.setUser(user);
SalaryElogConfig.salaryStatReportLoggerTemplate.write(loggerContext);
return map;
}
}
String sheetName = SalaryI18nUtil.getI18nLabel(179263, "薪酬统计报表") + "-" + dimension.getDimName();
XSSFWorkbook book = ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, true);
Map<String, Object> map = new HashMap<>();
map.put("workbook", book);
map.put("fileName", sheetName);
// 记录操作日志
String name = SalaryI18nUtil.getI18nLabel(0, "导出");
LoggerContext loggerContext = new LoggerContext<>();
loggerContext.setTargetId(po.getId().toString());
loggerContext.setTargetName(po.getReportName());
loggerContext.setOperateType(OperateTypeEnum.EXCEL_EXPORT.getValue());
loggerContext.setOperateTypeName(name);
loggerContext.setOperatedesc(name + SalaryI18nUtil.getI18nLabel(0, "薪酬统计报表") + "-" + po.getReportName());
loggerContext.setUser(user);
SalaryElogConfig.salaryStatReportLoggerTemplate.write(loggerContext);
return map;
throw new SalaryRunTimeException("未查询报表数据!");
}
/**

View File

@ -491,7 +491,7 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch
map = data.get(i);
map.put("index", i + 2);
// 3.校验行内容
boolean isError = SalaryArchiveExcelBO.singleRowCheck(allTodoSalaryArchives, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam);
boolean isError = SalaryArchiveExcelBO.singleRowCheck(allTodoSalaryArchives, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam, user);
if (isError) {
errorCount += 1;
// 添加错误数据
@ -599,7 +599,7 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch
map = data.get(i);
map.put("index", i + 2);
// 3.校验行内容
boolean isError = SalaryArchiveExcelBO.singleRowCheck(allTodoSalaryArchives, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam);
boolean isError = SalaryArchiveExcelBO.singleRowCheck(allTodoSalaryArchives, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam, user);
if (isError) {
errorCount += 1;
// 添加错误数据

View File

@ -113,7 +113,7 @@ public class SalaryBillBaseSetServiceImpl extends Service implements SalaryBillB
salaryBillViewingLimitSetting salaryBillViewingLimitDTO = saveParam.getSalaryBillViewingLimitSetting();
if (salaryBillViewingLimitDTO != null) {
getSalarySysConfService(user).saveSettingByType(Util.null2String(salaryBillViewingLimitDTO.getLimitMonth()), SALARY_BILL_VIEWING_LIMIT_MONTH, "工资单时效性设置", "billSend");
getSalarySysConfService(user).saveSettingByType(Util.null2String(salaryBillViewingLimitDTO.getBurningAfterReadingMin()), SALARY_BILL_BURNING_AFTER_READING_MIN, "工资单查看后销毁设置", "billSend");
getSalarySysConfService(user).saveSettingByType(salaryBillViewingLimitDTO.getBurningAfterReadingMin() == null ? " " : salaryBillViewingLimitDTO.getBurningAfterReadingMin().toString(), SALARY_BILL_BURNING_AFTER_READING_MIN, "工资单查看后销毁设置", "billSend");
}
return StringUtils.EMPTY;
}

View File

@ -56,6 +56,7 @@ import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper;
import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper;
import com.engine.salary.mapper.salarybill.SalarySendInfoMapper;
import com.engine.salary.mapper.salarybill.SalarySendMapper;
import com.engine.salary.report.common.constant.SalaryConstant;
import com.engine.salary.service.*;
import com.engine.salary.sys.entity.vo.OrderRuleVO;
import com.engine.salary.sys.service.SalarySysConfService;
@ -1570,13 +1571,25 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
// 1.工作簿名称
String sheetName = SalaryI18nUtil.getI18nLabel(97036, "工资单发放详情");
List<Object> header = new ArrayList<>();
// 员工信息字段
header.add(SalaryI18nUtil.getI18nLabel(85429, "姓名"));
header.add(SalaryI18nUtil.getI18nLabel(86185, "部门"));
header.add(SalaryI18nUtil.getI18nLabel(86186, "手机号"));
header.add(SalaryI18nUtil.getI18nLabel(86317, "工号"));
Map<String, SalaryTemplateSalaryItemListDTO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, dto -> dto.getSalaryItemId() + SalaryConstant.DYNAMIC_SUFFIX);
List<SalaryTemplateSalaryItemListDTO> sortedSalaryItems = new ArrayList<>();
for(String column : queryParam.getColumns()) {
if (column.contains(SalaryConstant.DYNAMIC_SUFFIX)) {
SalaryTemplateSalaryItemListDTO salaryTemplateSalaryItemListDTO = salaryItemMap.get(column);
if (salaryTemplateSalaryItemListDTO != null) {
sortedSalaryItems.add(salaryTemplateSalaryItemListDTO);
}
}
}
// 动态列
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(salaryItems)) {
for (SalaryTemplateSalaryItemListDTO salaryItem : salaryItems) {
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(sortedSalaryItems)) {
for (SalaryTemplateSalaryItemListDTO salaryItem : sortedSalaryItems) {
header.add(salaryItem.getName());
}
}
@ -1595,7 +1608,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
// 动态列
Map<String, Object> mapColumn = listMaps.get(0);
for (SalaryTemplateSalaryItemListDTO salaryItem : salaryItems) {
for (SalaryTemplateSalaryItemListDTO salaryItem : sortedSalaryItems) {
if (mapColumn.containsKey(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)) {
row.add(dto.get(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX));
}
@ -1706,7 +1719,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
.filter(NumberUtils::isCreatable)
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
map.put(item.getId().toString(), SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap));
map.put(item.getId() + SalaryItemConstant.DYNAMIC_SUFFIX, SalaryAcctFormulaBO.roundResultValue(sum.toString(), item, Collections.emptyList(), Collections.emptyMap(), salaryItemIdKeySalarySobItemPOMap));
});
return map;
}

View File

@ -591,14 +591,27 @@ public class ExcelUtilPlus {
start = "0";
}
XSSFCellStyle numberRedCellStyle = workbook.createCellStyle();
BeanUtils.copyProperties(redCellStyle, numberRedCellStyle);
// 不能copy在excel里编辑时背景变成了黑色
// BeanUtils.copyProperties(redCellStyle, numberRedCellStyle);
numberRedCellStyle.setWrapText(true);
numberRedCellStyle.setBorderLeft(BorderStyle.THIN);
numberRedCellStyle.setBorderRight(BorderStyle.THIN);
numberRedCellStyle.setBorderTop(BorderStyle.THIN);
numberRedCellStyle.setBorderBottom(BorderStyle.THIN);
numberRedCellStyle.setFont(redFont);
short format = df.getFormat(start + Stream.generate(() -> "0").limit(p).collect(Collectors.joining()) + "_ ");
numberRedCellStyle.setDataFormat(format);
// 最后一行红色
numberRedCellStyleMap.put(p, numberRedCellStyle);
XSSFCellStyle numberCellStyle = workbook.createCellStyle();
BeanUtils.copyProperties(cellStyle, numberCellStyle);
// BeanUtils.copyProperties(cellStyle, numberCellStyle);
numberCellStyle.setFont(font);// 选择需要用到的字体格式
numberCellStyle.setWrapText(true);
numberCellStyle.setBorderLeft(BorderStyle.THIN);
numberCellStyle.setBorderRight(BorderStyle.THIN);
numberCellStyle.setBorderTop(BorderStyle.THIN);
numberCellStyle.setBorderBottom(BorderStyle.THIN);
numberCellStyle.setDataFormat(format);
numberCellStyleMap.put(p, numberCellStyle);
});
@ -626,13 +639,14 @@ public class ExcelUtilPlus {
cell.setCellType(CellType.STRING);
cell.setCellValue(String.valueOf(o));
} else if (o instanceof BigDecimal) {
cell.setCellType(CellType.NUMERIC);
cell.setCellValue(o == null ? 0 : ((BigDecimal) o).doubleValue());
if (lastRowRed && rowIndex == rowList.size() - 1) {
cell.setCellStyle(numberRedCellStyleMap.get(patternList.get(cellIndex)));
} else {
cell.setCellStyle(numberCellStyleMap.get(patternList.get(cellIndex)));
}
cell.setCellType(CellType.NUMERIC);
double value = o == null ? 0 : ((BigDecimal) o).doubleValue();
cell.setCellValue(value);
} else if (o instanceof Boolean) {
cell.setCellType(CellType.BOOLEAN);
cell.setCellValue(String.valueOf(o));
@ -696,6 +710,7 @@ public class ExcelUtilPlus {
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setFillPattern(FillPatternType.NO_FILL);
XSSFCellStyle redCellStyle = workbook.createCellStyle();
XSSFFont redFont = workbook.createFont();

View File

@ -531,21 +531,21 @@ public class SalaryBillController {
*
* @return
*/
@GET
@POST
@Path("/send/exportDetailList")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportDetailList(@Context HttpServletRequest request, @Context HttpServletResponse response) {
public Response exportDetailList(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody SalarySendDetailQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
SalarySendDetailQueryParam queryParam = new SalarySendDetailQueryParam();
String salarySendId = request.getParameter("salarySendId");
String ids = request.getParameter("ids");
if (StringUtils.isNotBlank(ids)) {
queryParam.setIds(Arrays.asList(ids.split(",")).stream().map(Long::new).collect(Collectors.toList()));
}
if (StringUtils.isNotBlank(salarySendId)) {
queryParam.setSalarySendId(Long.parseLong(salarySendId));
}
// SalarySendDetailQueryParam queryParam = new SalarySendDetailQueryParam();
// String salarySendId = request.getParameter("salarySendId");
// String ids = request.getParameter("ids");
// if (StringUtils.isNotBlank(ids)) {
// queryParam.setIds(Arrays.asList(ids.split(",")).stream().map(Long::new).collect(Collectors.toList()));
// }
// if (StringUtils.isNotBlank(salarySendId)) {
// queryParam.setSalarySendId(Long.parseLong(salarySendId));
// }
XSSFWorkbook workbook = getSalarySendWrapper(user).exportDetailList(queryParam);
String fileName = "工资单发放详情列表" + LocalDate.now();

View File

@ -562,6 +562,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy
checkboxpopedom.setPopedompara("column:system_type");
checkboxpopedom.setShowmethod("com.engine.salary.transmethod.TaxRateTransMethod.getCheckBoxPopedom");
checkboxpopedomList.add(checkboxpopedom);
table.setPageUID(queryParam.getSalarySendId().toString());
table.setCheckboxList(checkboxpopedomList);
table.setCheckboxpopedom(null);