昂立薪酬二开

This commit is contained in:
Harryxzy 2024-06-04 16:13:06 +08:00
parent ae25e554c1
commit 137006b6bd
21 changed files with 706 additions and 18 deletions

View File

@ -1,5 +1,6 @@
package com.engine.salary.biz;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.config.SalaryElogConfig;
import com.engine.salary.encrypt.EncryptUtil;
import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO;
@ -248,4 +249,16 @@ public class SalaryArchiveItemBiz {
sqlSession.close();
}
}
public List<Long> listArchiveIdByEffectiveTimeAndArchiveIds(LocalDateRange salaryCycle, List<Long> salaryArchiveIds) {
SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession();
try {
SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class);
List<Long> salaryArchiveItemPOS = mapper.listArchiveIdByEffectiveTimeAndArchiveIds(salaryCycle, salaryArchiveIds);
sqlSession.commit();
return salaryArchiveItemPOS;
} finally {
sqlSession.close();
}
}
}

View File

@ -167,7 +167,7 @@ public class SalaryAcctResultBO {
* @param salarySobItemAggregateDTO
* @return
*/
public static List<WeaTableColumnGroup> buildTableColumns(SalarySobItemAggregateDTO salarySobItemAggregateDTO, List<Long> lockSalaryItemIds) {
public static List<WeaTableColumnGroup> buildTableColumns(SalarySobItemAggregateDTO salarySobItemAggregateDTO, List<Long> lockSalaryItemIds, Long onlySalaryItemId) {
List<WeaTableColumnGroup> columns = Lists.newArrayList();
// 员工信息字段
for (SalarySobEmpFieldDTO salarySobEmpFieldDTO : salarySobItemAggregateDTO.getEmpFields()) {
@ -180,17 +180,30 @@ public class SalaryAcctResultBO {
}
List<WeaTableColumnGroup> childrenColumns = Lists.newArrayList();
for (SalarySobItemDTO salarySobItemDTO : salarySobItemGroupDTO.getItems()) {
if (onlySalaryItemId != null) {
if (!onlySalaryItemId.equals(salarySobItemDTO.getSalaryItemId())) {
continue;
}
}
if (lockSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) {
childrenColumns.add(new WeaTableColumnGroup(SalaryPageUtil.selfAdaption(salarySobItemDTO.getName(), salarySobItemDTO.getWidth()), salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), LockStatusEnum.LOCK.getValue(), salarySobItemDTO.getPattern(), salarySobItemDTO.getDataType()));
} else {
childrenColumns.add(new WeaTableColumnGroup(SalaryPageUtil.selfAdaption(salarySobItemDTO.getName(), salarySobItemDTO.getWidth()), salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), LockStatusEnum.UNLOCK.getValue(), salarySobItemDTO.getPattern(), salarySobItemDTO.getDataType()));
}
}
if (CollectionUtils.isEmpty(childrenColumns)) {
continue;
}
WeaTableColumnGroup weaTableColumnWapper = new WeaTableColumnGroup(SalaryPageUtil.selfAdaption(salarySobItemGroupDTO.getName(), 0), salarySobItemGroupDTO.getName(), String.valueOf(salarySobItemGroupDTO.getId()), childrenColumns);
columns.add(weaTableColumnWapper);
}
// 没有分类的薪资项目
for (SalarySobItemDTO salarySobItemDTO : salarySobItemAggregateDTO.getItems()) {
if (onlySalaryItemId != null) {
if (!onlySalaryItemId.equals(salarySobItemDTO.getSalaryItemId())) {
continue;
}
}
if (lockSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) {
columns.add(new WeaTableColumnGroup(SalaryPageUtil.selfAdaption(salarySobItemDTO.getName(), salarySobItemDTO.getWidth()), salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), LockStatusEnum.LOCK.getValue(), salarySobItemDTO.getPattern(), salarySobItemDTO.getDataType()));
} else {

View File

@ -0,0 +1,30 @@
package com.engine.salary.entity.salaryacct.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* @author Harryxzy
* @ClassName alWorkflowInfoDTO
* @date 2024/06/03 11:12
* @description
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class AlWorkflowInfoDTO {
// 薪资核算人数
private Integer empNum;
// 核算记录id
private Long salaryAcctRecordId;
List<Map<String, Object>> resultList;
}

View File

@ -67,4 +67,7 @@ public class SalaryAcctEmployeeQueryParam extends BaseQueryParam {
private List<Long> ids;
private String workcode;
// 人员id
private List<Long> employeeIds;
}

View File

@ -31,6 +31,11 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam {
@DataCheck(require = true, message = "参数错误薪资核算记录ID不能为空")
private Long salaryAcctRecordId;
/**
* 昂立 - 是否是流程
*/
private boolean isWorkflow;
//人员姓名
private String employeeName;
@ -69,6 +74,10 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam {
private List<OtherCondition> otherConditions;
// 员工id
private Collection<Long> employeeIds;
@Data
@NoArgsConstructor
@AllArgsConstructor

View File

@ -90,7 +90,7 @@ public enum FilterEnum implements BaseEnum<String> {
return StringUtils::isEmpty;
}
},
ISNOTEMPTY("ISNOTEMPTY", "包含", 1) {
ISNOTEMPTY("ISNOTEMPTY", "不为空", 1) {
@Override
public Predicate<String> filter(List<String> params) {
return StringUtils::isNotEmpty;

View File

@ -1,10 +1,10 @@
package com.engine.salary.mapper.archive;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO;
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveItemQueryParam;
import com.engine.salary.entity.salaryarchive.param.SalaryItemAdjustRecordQueryParam;
import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO;
import com.engine.salary.entity.siarchives.po.InsuranceArchivesOtherSchemePO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -97,4 +97,6 @@ public interface SalaryArchiveItemMapper {
void batchDeleteHistoryData(SalaryArchiveItemPO build);
int batchUpdate(@Param("collection") List<SalaryArchiveItemPO> pos);
List<Long> listArchiveIdByEffectiveTimeAndArchiveIds(@Param("salaryCycle")LocalDateRange salaryCycle, @Param("archiveIds") List<Long> salaryArchiveIds);
}

View File

@ -1071,6 +1071,25 @@
ORDER BY t.effective_time DESC
</select>
<select id="listArchiveIdByEffectiveTimeAndArchiveIds" resultType="java.lang.Long">
SELECT
distinct salary_archive_Id
FROM hrsa_salary_archive_item t
WHERE delete_type = 0
<if test="archiveIds != null and archiveIds.size()>0">
AND salary_archive_id IN
<foreach collection="archiveIds" open="(" item="archiveId" separator="," close=")">
#{archiveId}
</foreach>
</if>
<if test="salaryCycle.fromDate != null">
AND effective_time &gt;= #{salaryCycle.fromDate}
</if>
<if test="salaryCycle.endDate != null">
AND effective_time &lt;= #{salaryCycle.endDate}
</if>
</select>
<update id="deleteBatchIds">
UPDATE hrsa_salary_archive_item

View File

@ -503,6 +503,7 @@
or (param.departmentIds != null and param.departmentIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.statuses != null and param.statuses.size()>0)
or (param.employeeIds != null and param.employeeIds.size()>0)
or (param.status != null and param.status.toString != 'ALL')">
AND t.employee_id IN
(
@ -540,6 +541,12 @@
#{userStatus}
</foreach>
</if>
<if test="param.employeeIds != null and param.employeeIds.size()>0">
AND em.id IN
<foreach collection="param.employeeIds" open="(" item="employeeId" separator="," close=")">
#{employeeId}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND em.status in (0,1,2,3)
@ -612,6 +619,12 @@
#{userStatus}
</foreach>
</if>
<if test="param.employeeIds != null and param.employeeIds.size()>0">
AND extem.id IN
<foreach collection="param.employeeIds" open="(" item="employeeId" separator="," close=")">
#{employeeId}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND extem.status in (0,1,2,3)
@ -667,6 +680,7 @@
or (param.departmentIds != null and param.departmentIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.statuses != null and param.statuses.size()>0)
or (param.employeeIds != null and param.employeeIds.size()>0)
or (param.status != null and param.status.toString != 'ALL')">
AND t.employee_id IN
(
@ -702,6 +716,12 @@
#{userStatus}
</foreach>
</if>
<if test="param.employeeIds != null and param.employeeIds.size()>0">
AND em.id IN
<foreach collection="param.employeeIds" open="(" item="employeeId" separator="," close=")">
#{employeeId}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND em.status in (0,1,2,3)
@ -772,6 +792,12 @@
#{userStatus}
</foreach>
</if>
<if test="param.employeeIds != null and param.employeeIds.size()>0">
AND extem.id IN
<foreach collection="param.employeeIds" open="(" item="employeeId" separator="," close=")">
#{employeeId}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND extem.status in (0,1,2,3)
@ -827,6 +853,7 @@
or (param.departmentIds != null and param.departmentIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.statuses != null and param.statuses.size()>0)
or (param.employeeIds != null and param.employeeIds.size()>0)
or (param.status != null and param.status.toString != 'ALL')">
AND t.employee_id IN
(
@ -862,6 +889,12 @@
#{userStatus}
</foreach>
</if>
<if test="param.employeeIds != null and param.employeeIds.size()>0">
AND em.id IN
<foreach collection="param.employeeIds" open="(" item="employeeId" separator="," close=")">
#{employeeId}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND em.status in (0,1,2,3)
@ -933,6 +966,12 @@
#{userStatus}
</foreach>
</if>
<if test="param.employeeIds != null and param.employeeIds.size()>0">
AND extem.id IN
<foreach collection="param.employeeIds" open="(" item="employeeId" separator="," close=")">
#{employeeId}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND extem.status in (0,1,2,3)

View File

@ -7,10 +7,7 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.report.entity.param.SalaryStatisticsReportDataQueryParam;
import com.engine.salary.util.page.PageInfo;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
* 薪资核算人员
@ -258,4 +255,5 @@ public interface SalaryAcctEmployeeService {
*/
List<SalaryAcctEmployeePO> listByTaxAgentAndSalaryMonth(List<Long> taxAgentIds, Set<Date> salaryMonths);
PageInfo<Map<String, Object>> adjustSalaryList(SalaryAcctEmployeeQueryParam queryParam);
}

View File

@ -27,6 +27,15 @@ public interface SalaryAcctExcelService {
*/
XSSFWorkbook exportSalaryAcctEmployee(SalaryAcctEmployeeQueryParam queryParam);
/**
* 薪资核算人员导出
*
* @param queryParam
* @return
*/
XSSFWorkbook exportAdjustSalaryList(SalaryAcctEmployeeQueryParam queryParam);
/**
* 薪资核算环比减少人员导出
*
@ -51,12 +60,20 @@ public interface SalaryAcctExcelService {
*/
XSSFWorkbook exportSalaryAcctResult(SalaryAcctResultQueryParam queryParam);
/**
* 核算差异对比导出
*
* @param queryParam
* @return
*/
XSSFWorkbook exportSalaryAcctResultDiffer(SalaryAcctResultQueryParam queryParam);
/**
* 表头
* @param salaryAcctRecordPO
* @return
*/
List<WeaTableColumnGroup> listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO);
List<WeaTableColumnGroup> listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO, Long onlySalaryItemId);
List<WeaTableColumnGroup> listWeaTableColumnForWorkflow(SalaryAcctRecordPO salaryAcctRecordPO);

View File

@ -5,6 +5,7 @@ import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
import com.engine.salary.entity.salaryacct.param.*;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.util.page.PageInfo;
@ -210,4 +211,12 @@ public interface SalaryAcctResultService {
* @param param
*/
void batchUpdate(SalaryAcctResultBatchUpdateParam param);
/**
* 昂立 - 薪资核算结果差异对比
* @param param
*/
Map<String, Object> listSalaryAcctResultDiffer(SalaryAcctResultQueryParam param);
List<Long> differEmpList(SalaryAcctResultQueryParam param, SalaryAcctRecordPO salaryAcctRecordPO);
}

View File

@ -1,5 +1,6 @@
package com.engine.salary.service;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO;
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveItemSaveParam;
import com.engine.salary.entity.salaryarchive.param.SalaryItemAdjustBeforeParam;
@ -156,4 +157,11 @@ public interface SalaryArchiveItemService {
* @date 2022/11/14 13:38
*/
String editSingleSalaryItem(SalaryArchiveItemSaveParam salaryArchiveItemSaveParam);
/**
* 根据生效时间获取
* @param salaryCycle
* @return
*/
List<Long> listArchiveIdByEffectiveTimeAndArchiveIds(LocalDateRange salaryCycle, List<Long> salaryArchiveIds);
}

View File

@ -5,9 +5,10 @@ import cn.hutool.core.date.DateUtil;
import com.api.formmode.mybatis.util.SqlProxyHandle;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.hrmelog.entity.dto.LoggerContext;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.config.SalaryElogConfig;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.hrmelog.entity.dto.LoggerContext;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctEmployeeBO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctEmployeeCountDTO;
@ -15,10 +16,15 @@ import com.engine.salary.entity.salaryacct.param.*;
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveDataDTO;
import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO;
import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.OperateTypeEnum;
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper;
import com.engine.salary.mapper.sys.SalarySysConfMapper;
@ -31,6 +37,7 @@ import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.page.Column;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.engine.salary.util.valid.ValidUtil;
@ -100,6 +107,10 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
}
private SalaryArchiveItemService getSalaryArchiveItemService(User user) {
return ServiceUtil.getService(SalaryArchiveItemServiceImpl.class, user);
}
@Override
public List<SalaryAcctEmployeeCountDTO> countBySalaryAcctRecordId(Collection<Long> salaryAcctRecordIds) {
@ -228,7 +239,7 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
BeanUtils.copyProperties(queryParam, salaryAcctEmployeeQueryParam);
// 查询薪资核算人员分页
// 如果需要筛选是否合并计税
if (StringUtils.isNotEmpty(queryParam.getConsolidatedTaxation())) {
if (StringUtils.isNotEmpty(queryParam.getConsolidatedTaxation()) && queryParam.getConsolidatedTaxation().equals("1")) {
return listPageByParam4ConsolidatedTax(salaryAcctEmployeeQueryParam);
} else {
return listPageByParam(salaryAcctEmployeeQueryParam);
@ -759,4 +770,81 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
return getSalaryAcctEmployeeMapper().listSome(SalaryAcctEmployeePO.builder().taxAgentIds(taxAgentIds).salaryMonths(salaryMonths).build());
}
@Override
public PageInfo<Map<String, Object>> adjustSalaryList(SalaryAcctEmployeeQueryParam queryParam) {
PageInfo<Map<String, Object>> resultPageInfo = new PageInfo<>();
// 获取薪资核算数据
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
if (salaryAcctRecordPO == null) {
throw new SalaryRunTimeException("薪资核算记录不存在或已被删除");
}
SalarySobCycleDTO salarySobCycleById = getSalaryAcctRecordService(user).getSalarySobCycleById(queryParam.getSalaryAcctRecordId());
LocalDateRange salaryCycle = salarySobCycleById.getSalaryCycle();
// 获取薪资周期内发生过调薪的人
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeMapper().listPage(queryParam);
List<Long> employeeIds = salaryAcctEmployeePOS.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList());
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySobPO.getTaxAgentId());
List<SalaryArchivePO> salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().taxAgentId(salarySobPO.getTaxAgentId()).employeeIds(employeeIds).build());
List<Long> salaryArchiveIds = salaryArchivePOList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
List<Long> adjustSalaryArchiveIds = getSalaryArchiveItemService(user).listArchiveIdByEffectiveTimeAndArchiveIds(salaryCycle, salaryArchiveIds);
List<Map<String, Object>> resultList = new ArrayList<>();
PageInfo<Long> archiveIdPageInfo = new PageInfo<>();
// 获取所有可被引用的薪资项目
List<SalaryItemPO> salaryItems = getSalaryArchiveItemService(user).getCanAdjustSalaryItems();
if (CollectionUtils.isNotEmpty(adjustSalaryArchiveIds)) {
// 分页
archiveIdPageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), adjustSalaryArchiveIds);
// 获取薪资档案信息
salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().ids(archiveIdPageInfo.getList()).build());
// 获取人员信息
Map<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(employeeIds), DataCollectionEmployee::getEmployeeId);
List<Long> salaryItemIds = salaryItems.stream().map(SalaryItemPO::getId).collect(Collectors.toList());
// 获取当前生效的薪资项目
List<SalaryArchiveItemPO> salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getCurrentEffectiveItemList(archiveIdPageInfo.getList(), salaryItemIds);
Map<Long, List<SalaryArchiveItemPO>> groupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, SalaryArchiveItemPO::getSalaryArchiveId);
for (SalaryArchivePO po : salaryArchivePOList) {
DataCollectionEmployee employee = employeeMap.get(po.getEmployeeId());
HashMap<String, Object> valueMap = new HashMap<>();
valueMap.put("userName", employee == null ? "" : employee.getUsername());
valueMap.put("taxAgentName", taxAgentPO.getName());
valueMap.put("departmentName", employee == null ? "" : employee.getDepartmentName());
valueMap.put("mobile", employee == null ? "" : employee.getMobile());
valueMap.put("workCode", employee == null ? "" : employee.getWorkcode());
valueMap.put("status", employee == null ? "" : SalaryEmployeeStatusEnum.parseByValue(Integer.valueOf(employee.getStatus())).getDefaultLabel());
List<SalaryArchiveItemPO> archiveItemList = groupByArchiveId.getOrDefault(po.getId(), Collections.emptyList());
List<Date> dateList = archiveItemList.stream().map(SalaryArchiveItemPO::getEffectiveTime).sorted().collect(Collectors.toList());
Collections.reverse(dateList);
valueMap.put("effectiveTime",CollectionUtils.isEmpty(dateList) ? "" : SalaryDateUtil.getFormatDate(dateList.get(0)));
for (SalaryArchiveItemPO salaryArchiveItem : archiveItemList) {
valueMap.put(salaryArchiveItem.getSalaryItemId().toString(), salaryArchiveItem.getItemValue());
}
resultList.add(valueMap);
}
}
// 表格表头
List<Column> columns = new ArrayList<>();
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "姓名"), "userName", "userName"));
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "个税扣缴义务人"), "taxAgentName", "taxAgentName"));
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "部门"), "departmentName", "departmentName"));
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "手机号"), "mobile", "mobile"));
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "工号"), "workCode", "workCode"));
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "员工状态"), "status", "status"));
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, "调薪生效日期"), "effectiveTime", "effectiveTime"));
for (SalaryItemPO salaryItem : salaryItems) {
columns.add(new Column(SalaryI18nUtil.getI18nLabel(0, salaryItem.getName()), salaryItem.getId().toString(), salaryItem.getId().toString()));
}
resultPageInfo.setList(resultList);
resultPageInfo.setTotal(archiveIdPageInfo.getTotal());
resultPageInfo.setPageSize(queryParam.getPageSize());
resultPageInfo.setPageNum(queryParam.getCurrent());
resultPageInfo.setColumns(columns);
return resultPageInfo;
}
}

View File

@ -47,6 +47,7 @@ import com.engine.salary.util.db.IdGenerator;
import com.engine.salary.util.excel.ExcelParseHelper;
import com.engine.salary.util.excel.ExcelSupport;
import com.engine.salary.util.excel.ExcelUtilPlus;
import com.engine.salary.util.page.Column;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil;
import com.engine.salary.util.valid.ValidUtil;
@ -205,6 +206,51 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
return ExcelUtilPlus.genWorkbookV2(rows, sheetName);
}
@Override
public XSSFWorkbook exportAdjustSalaryList(SalaryAcctEmployeeQueryParam queryParam) {
ValidUtil.doValidator(queryParam);
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
if (salaryAcctRecordPO == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0,"薪资核算记录不存在或已被删除"));
}
// 1.工作簿名称
String sheetName = SalaryI18nUtil.getI18nLabel(85368, "薪酬调整人员");
queryParam.setCurrent(1);
queryParam.setPageSize(1000000000);
PageInfo<Map<String, Object>> pageInfo = getSalaryAcctEmployeeService(user).adjustSalaryList(queryParam);
List<Column> columns = pageInfo.getColumns();
List<Map<String, Object>> list = pageInfo.getList();
// 2.表头
List<Object> headerList = columns.stream().map(Column::getTitle).collect(Collectors.toList());
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
// 3.表数据
for (Map<String, Object> map : list) {
List<Object> row = new ArrayList<>();
for (Column column : columns) {
row.add(map.getOrDefault(column.getKey(), ""));
}
rows.add(row);
}
// 记录日志
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth());
SalaryLoggerUtil.recordExportSingleLog(SalaryElogConfig.salaryAcctRecordLoggerTemplate,
queryParam.getSalaryAcctRecordId(),
targetName,
SalaryI18nUtil.getI18nLabel(0, "导出薪酬调整人员"),
SalaryI18nUtil.getI18nLabel(0, "导出薪酬调整人员") + ":" + targetName,
user
);
return ExcelUtilPlus.genWorkbookV2(rows, sheetName);
}
@Override
public XSSFWorkbook exportReducedEmployee(SalaryAcctEmployeeQueryParam queryParam) {
@ -343,7 +389,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
// excel导出的表头
List<WeaTableColumnGroup> headerColumnGroup = Lists.newArrayList();
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null);
//判断是否按照自定义字段导出表头
List<WeaTableColumnGroup> finalWeaTableColumns = new ArrayList<>();
@ -438,6 +484,68 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
return ExcelUtilPlus.genWorkbookWithChildTitleColumnWithExcelFormat(rows, sheetName, total);
}
@Override
public XSSFWorkbook exportSalaryAcctResultDiffer(SalaryAcctResultQueryParam queryParam) {
ValidUtil.doValidator(queryParam);
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// excel导出的表头
List<WeaTableColumnGroup> headerColumnGroup = Lists.newArrayList();
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null);
//判断是否按照自定义字段导出表头
List<WeaTableColumnGroup> finalWeaTableColumns = weaTableColumns;
parseHeader(headerColumnGroup, finalWeaTableColumns);
List<Object> headerList = new ArrayList<>(finalWeaTableColumns);
// 查询薪资核算结果
List<Long> differEmpList = getSalaryAcctResultService(user).differEmpList(queryParam, salaryAcctRecordPO);
queryParam.setEmployeeIds(differEmpList);
List<Map<String, Object>> resultMapList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(differEmpList)) {
resultMapList = getSalaryAcctResultService(user).listByParam(queryParam);
}
// excel导出的数据
String DATA_TYPE_SUFFIX = "_type";
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
for (Map<String, Object> map : resultMapList) {
List<Object> row = Lists.newArrayListWithExpectedSize(headerColumnGroup.size());
for (WeaTableColumnGroup weaTableColumn : headerColumnGroup) {
String fieldType = (String) map.getOrDefault(weaTableColumn.getColumn().toString() + DATA_TYPE_SUFFIX, StringUtils.EMPTY);
if (StringUtils.equals("number", fieldType)) {
row.add(new BigDecimal(StringUtils.isBlank(map.get(weaTableColumn.getColumn()).toString()) ? "0" : map.get(weaTableColumn.getColumn()).toString()));
} else {
row.add(map.getOrDefault(weaTableColumn.getColumn(), StringUtils.EMPTY));
}
}
rows.add(row);
}
// 记录日志
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth());
SalaryLoggerUtil.recordExportSingleLog(SalaryElogConfig.salaryAcctRecordLoggerTemplate,
queryParam.getSalaryAcctRecordId(),
targetName,
SalaryI18nUtil.getI18nLabel(0, "导出核算差异对比"),
SalaryI18nUtil.getI18nLabel(0, "导出核算差异对比") + ":" + targetName,
user
);
String sheetName = "导出核算差异对比";
// return ExcelUtil.genWorkbookV2(rows, sheetName, total);
return ExcelUtilPlus.genWorkbookWithChildTitleColumnWithExcelFormat(rows, sheetName, false);
}
/**
* 构建薪资核算结果列表的表头
@ -445,14 +553,14 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
* @param salaryAcctRecordPO 薪资核算记录
* @return
*/
public List<WeaTableColumnGroup> listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO) {
public List<WeaTableColumnGroup> listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO, Long onlySalaryItemId) {
// 是否是回算
SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctRecordPO.getId());
boolean isBackCalc = Objects.equals(byId.getBackCalcStatus(), 1);
// 查询薪资账套下的薪资项目+员工信息字段
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateWithItemHideBySalarySobId(salaryAcctRecordPO.getSalarySobId(), isBackCalc);
// 构建薪资核算结果列表表头
List<WeaTableColumnGroup> columnList = SalaryAcctResultBO.buildTableColumns(salarySobItemAggregateDTO, ListUtils.emptyIfNull(salaryAcctRecordPO.getLockSalaryItemIds()));
List<WeaTableColumnGroup> columnList = SalaryAcctResultBO.buildTableColumns(salarySobItemAggregateDTO, ListUtils.emptyIfNull(salaryAcctRecordPO.getLockSalaryItemIds()), onlySalaryItemId);
// 获取固定列头数
SalarySysConfPO salaryAcctFixedColumns = getSalarySysConfMapper().getOneByCode(SALARY_ACCT_FIXED_COLUMNS);
if (salaryAcctFixedColumns != null) {
@ -460,7 +568,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
if (fixedNum == 0) {
fixedNum = 3;
}
for (int i = 0; i < fixedNum; i++) {
for (int i = 0; i < fixedNum && i < columnList.size(); i++) {
columnList.get(i).setFixed("left");
}
}
@ -729,7 +837,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
headerRangeList.add("taxAgentName");
headerRangeList.add("departmentName");
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null);
List<WeaTableColumnGroup> finalWeaTableColumns = new ArrayList<>();
for (WeaTableColumnGroup tableColumn : weaTableColumns) {
WeaTableColumnGroup columnGroupItem = (WeaTableColumnGroup) tableColumn;
@ -912,7 +1020,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc
// 无分类薪资项目id
List<String> noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList());
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null);
List<Object> finalWeaTableColumns = new ArrayList<>();
// 查询薪资核算所用的薪资账套的员工信息字段
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());

View File

@ -5,6 +5,7 @@ import com.engine.core.impl.Service;
import com.engine.hrmelog.entity.dto.LoggerContext;
import com.engine.salary.cache.SalaryCacheKey;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.component.WeaTableColumnGroup;
import com.engine.salary.config.SalaryElogConfig;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.encrypt.EncryptUtil;
@ -69,6 +70,8 @@ import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.StopWatch;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.User;
import java.math.BigDecimal;
@ -195,6 +198,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
return ServiceUtil.getService(TaxAgentAdminServiceImpl.class, user);
}
private SalaryAcctExcelService getSalaryAcctExcelService(User user) {
return ServiceUtil.getService(SalaryAcctExcelServiceImpl.class, user);
}
private SalaryCheckResultService salaryCheckResultService;
@ -1248,4 +1254,84 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
}
}
@Override
public Map<String, Object> listSalaryAcctResultDiffer(SalaryAcctResultQueryParam param) {
ValidUtil.doValidator(param);
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
if (salaryAcctRecordPO == null) {
throw new SalaryRunTimeException("薪资核算记录不存在或已被删除");
}
List<Long> diffEmpIds = differEmpList(param, salaryAcctRecordPO);
Map<String, Object> datas = new HashMap<>();
List<WeaTableColumnGroup> columns = null;
PageInfo<Map<String, Object>> page = new PageInfo<>();
// 构建薪资核算结果列表的表头
columns = getSalaryAcctExcelService(user).listWeaTableColumn(salaryAcctRecordPO, null);
if (CollectionUtils.isNotEmpty(diffEmpIds)) {
// 获取这些有差异的人的薪资核算结果
SalaryAcctResultQueryParam resultQueryParam = SalaryAcctResultQueryParam.builder().salaryAcctRecordId(salaryAcctRecordPO.getId()).employeeIds(diffEmpIds).build();
resultQueryParam.setCurrent(param.getCurrent());
resultQueryParam.setPageSize(param.getPageSize());
page = getSalaryAcctResultService(user).listPageByParam(resultQueryParam);
datas.put("pageInfo", page);
}
datas.put("columns", columns);
datas.put("pageInfo", page);
return datas;
}
public List<Long> differEmpList(SalaryAcctResultQueryParam param, SalaryAcctRecordPO salaryAcctRecordPO) {
BaseBean baseBean = new BaseBean();
List<Long> needSumItemIds = Arrays.stream(baseBean.getPropValue("alSalary3012551", "approvalWorkflowItemIds").split(",")).filter(org.apache.commons.lang.math.NumberUtils::isNumber).map(Long::valueOf).collect(Collectors.toList());
// 获取本次的核算结果
List<SalaryAcctResultPO> resultPOList = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(salaryAcctRecordPO.getId()), needSumItemIds);
Map<Long, List<SalaryAcctResultPO>> resultGroupByEmpId = SalaryEntityUtil.group2Map(resultPOList, SalaryAcctResultPO::getEmployeeId);
List<Long> diffEmpIds = new ArrayList<>();
// 获取上月的薪资核算结果
Date lastMonth = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryAcctRecordPO.getSalaryMonth()).minusMonths(1));
LocalDateRange dateRange = new LocalDateRange(lastMonth, lastMonth);
List<SalaryAcctRecordPO> lastMonthSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(Collections.singletonList(salaryAcctRecordPO.getSalarySobId()), dateRange);
if (CollectionUtils.isEmpty(lastMonthSalaryAcctRecordPOS)) {
// 所有人均有差异
diffEmpIds = resultPOList.stream().map(SalaryAcctResultPO::getEmployeeId).collect(Collectors.toList());
} else {
SalaryAcctRecordPO lastMonthSalaryAcctRecord = lastMonthSalaryAcctRecordPOS.get(0);
List<SalaryAcctResultPO> lastMonthResultPOList = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(lastMonthSalaryAcctRecord.getId()), needSumItemIds);
Map<Long, List<SalaryAcctResultPO>> lastMonthResultGroupByEmpId = SalaryEntityUtil.group2Map(lastMonthResultPOList, SalaryAcctResultPO::getEmployeeId);
for (Map.Entry<Long, List<SalaryAcctResultPO>> entrySet : resultGroupByEmpId.entrySet()) {
boolean flag = false;
List<SalaryAcctResultPO> lastMonthResultList = lastMonthResultGroupByEmpId.get(entrySet.getKey());
if (CollectionUtils.isEmpty(lastMonthResultList)) {
// 上月该账套中该员工没有核算数据
flag = true;
diffEmpIds.add(entrySet.getKey());
} else {
Map<Long, SalaryAcctResultPO> reslultMap = SalaryEntityUtil.convert2Map(entrySet.getValue(), SalaryAcctResultPO::getSalaryItemId);
Map<Long, SalaryAcctResultPO> lastMonthReslultMap = SalaryEntityUtil.convert2Map(lastMonthResultList, SalaryAcctResultPO::getSalaryItemId);
for (int i = 0; i < needSumItemIds.size() && flag == false; i++) {
Long salaryItemId = needSumItemIds.get(i);
SalaryAcctResultPO result = reslultMap.get(salaryItemId);
SalaryAcctResultPO lastMonthResult = lastMonthReslultMap.get(salaryItemId);
if ((result == null && lastMonthResult != null) || (result != null && lastMonthResult == null)) {
// 一个为null 一个不为null
flag = true;
diffEmpIds.add(entrySet.getKey());
} else if (result != null && lastMonthResult != null
&& !Util.null2String(result.getResultValue()).equals(Util.null2String(lastMonthResult.getResultValue()))) {
// 结果不等
flag = true;
diffEmpIds.add(entrySet.getKey());
}
}
}
}
}
return diffEmpIds;
}
}

View File

@ -5,6 +5,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.common.LocalDateRange;
import com.engine.salary.config.SalaryElogConfig;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
@ -725,5 +726,14 @@ public class SalaryArchiveItemServiceImpl extends Service implements SalaryArchi
return ExcelUtil.genWorkbookV2(rows, sheetName);
}
@Override
public List<Long> listArchiveIdByEffectiveTimeAndArchiveIds(LocalDateRange salaryCycle, List<Long> salaryArchiveIds) {
if (salaryCycle == null || CollectionUtils.isEmpty(salaryArchiveIds)) {
return Collections.emptyList();
}
List<Long> resultList = new ArrayList<>();
List<List<Long>> partition = Lists.partition(salaryArchiveIds, 800);
partition.forEach(part -> resultList.addAll(salaryArchiveItemMapper.listArchiveIdByEffectiveTimeAndArchiveIds(salaryCycle, part)));
return resultList;
}
}

View File

@ -173,6 +173,17 @@ public class SalaryAcctController {
/**********************************薪资核算人员相关 start*********************************/
//昂立 - 薪酬调整人员列表
@POST
@Path("/acctemployee/adjustSalaryList")
@Produces(MediaType.APPLICATION_JSON)
public String adjustSalaryList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctEmployeeQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalaryAcctEmployeeQueryParam, PageInfo<Map<String, Object>>>(user).run(getSalaryAcctEmployeeWrapper(user)::adjustSalaryList, param);
}
//薪资核算人员确认列表
@POST
@Path("/acctemployee/list")
@ -320,6 +331,36 @@ public class SalaryAcctController {
return param;
}
/**
* 导出薪酬调整人员
*/
@GET
@Path("/adjustSalaryList/export")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportAdjustSalaryList(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
SalaryAcctEmployeeQueryParam param = buildSalaryAcctEmployeeQueryParam(request);
User user = HrmUserVarify.getUser(request, response);
XSSFWorkbook workbook = getSalaryAcctExcelWrapper(user).exportAdjustSalaryList(param);
String time = LocalDate.now().toString();
String fileName = "薪酬调整人员" + time;
try {
fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StreamingOutput output = outputStream -> {
workbook.write(outputStream);
outputStream.flush();
};
response.setContentType("application/octet-stream");
return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build();
} catch (Exception e) {
log.error("薪酬调整人员导出异常", e);
throw e;
}
}
/**
* 导出环比减少人员
*/
@ -402,6 +443,15 @@ public class SalaryAcctController {
return new ResponseResult<SalaryAcctResultQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::listPage, param);
}
// 昂立 - 薪资核算结果差异对比
@POST
@Path("/acctresult/differList")
@Produces(MediaType.APPLICATION_JSON)
public String listSalaryAcctResultDiffer(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalaryAcctResultQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::listSalaryAcctResultDiffer, param);
}
//薪资核算结果列表
@POST
@Path("/acctresult/listForWorkflow")
@ -411,6 +461,20 @@ public class SalaryAcctController {
return new ResponseResult<SalaryAcctResultQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::listForWorkflow, param);
}
/**
* @description listForWorkflowV2 昂立 240603 审批流程版本2
* @return null
* @author Harryxzy
* @date 2024/6/3 10:12
*/
@POST
@Path("/acctresult/listForWorkflowV2")
@Produces(MediaType.APPLICATION_JSON)
public String listForWorkflowV2(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalaryAcctResultQueryParam, List<AlWorkflowInfoDTO>>(user).run(getSalaryAcctResultWrapper(user)::listForWorkflowV2, param);
}
//合计行
@POST
@Path("/acctresult/sum")
@ -513,6 +577,34 @@ public class SalaryAcctController {
}
}
//导出核算差异对比
@GET
@Path("/acctresultDiffer/export")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportSalaryAcctResultDiffer(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
SalaryAcctResultQueryParam param = new SalaryAcctResultQueryParam();
setSalaryAcctResultQueryParam(request, param);
User user = HrmUserVarify.getUser(request, response);
XSSFWorkbook workbook = getSalaryAcctExcelWrapper(user).exportSalaryAcctResultDiffer(param);
String fileName = "核算差异对比" + LocalDate.now();
try {
fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StreamingOutput output = outputStream -> {
workbook.write(outputStream);
outputStream.flush();
};
response.setContentType("application/octet-stream");
return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build();
} catch (Exception e) {
log.error("核算差异对比导出异常", e);
throw e;
}
}
//导出核算结果(自定义导出字段)
@GET
@Path("/acctresult/exportWithCustomFields")

View File

@ -25,6 +25,7 @@ import org.apache.commons.lang3.math.NumberUtils;
import weaver.hrm.User;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -49,6 +50,16 @@ public class SalaryAcctEmployeeWrapper extends Service {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
/**
* 昂立 - 薪酬调整人员列表
*
* @param queryParam 列表查询参数
* @return
*/
public PageInfo<Map<String, Object>> adjustSalaryList(SalaryAcctEmployeeQueryParam queryParam) {
return getSalaryAcctEmployeeService(user).adjustSalaryList(queryParam);
}
/**
* 薪资核算人员列表
*

View File

@ -30,6 +30,17 @@ public class SalaryAcctExcelWrapper extends Service {
return getSalaryAcctExcelService(user).exportSalaryAcctEmployee(queryParam);
}
/**
* 昂立 - 导出薪酬调整人员
*
* @param queryParam
* @return
*/
public XSSFWorkbook exportAdjustSalaryList(SalaryAcctEmployeeQueryParam queryParam) {
return getSalaryAcctExcelService(user).exportAdjustSalaryList(queryParam);
}
/**
* 薪资核算环比减少人员导出
*
@ -62,6 +73,16 @@ public class SalaryAcctExcelWrapper extends Service {
return getSalaryAcctExcelService(user).exportSalaryAcctResult(queryParam);
}
/**
* 核算差异对比导出
*
* @param queryParam
* @return
*/
public XSSFWorkbook exportSalaryAcctResultDiffer(SalaryAcctResultQueryParam queryParam) {
return getSalaryAcctExcelService(user).exportSalaryAcctResultDiffer(queryParam);
}
/**
* 下载薪资核算导入模板
*

View File

@ -3,14 +3,19 @@ package com.engine.salary.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.cache.SalaryCacheKey;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.component.WeaTableColumnGroup;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.progress.ProgressDTO;
import com.engine.salary.entity.salaryacct.dto.AlWorkflowInfoDTO;
import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO;
import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO;
import com.engine.salary.entity.salaryacct.param.*;
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.WorkflowItemHidePO;
import com.engine.salary.enums.salaryaccounting.LockStatusEnum;
import com.engine.salary.exception.SalaryRunTimeException;
@ -18,6 +23,7 @@ import com.engine.salary.service.*;
import com.engine.salary.service.impl.*;
import com.engine.salary.sys.service.SalarySysConfService;
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.page.PageInfo;
@ -27,6 +33,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.general.BaseBean;
import weaver.hrm.User;
import java.math.BigDecimal;
@ -83,6 +90,14 @@ public class SalaryAcctResultWrapper extends Service {
return ServiceUtil.getService(WorkflowItemHideServiceImpl.class, user);
}
private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) {
return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user);
}
private SalaryItemService getSalaryItemService(User user) {
return ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
/**
* 薪资核算列表
*
@ -101,7 +116,13 @@ public class SalaryAcctResultWrapper extends Service {
PageInfo<Map<String, Object>> page = getSalaryAcctResultService(user).listPageByParam(queryParam);
// 构建薪资核算结果列表的表头
List<WeaTableColumnGroup> columns = getSalaryAcctExcelService(user).listWeaTableColumn(salaryAcctRecordPO);
List<WeaTableColumnGroup> columns = null;
if (queryParam.isWorkflow()) {
Long itemId = queryParam.getOtherConditions().get(0).getItemId();
columns = getSalaryAcctExcelService(user).listWeaTableColumn(salaryAcctRecordPO, itemId);
} else {
columns = getSalaryAcctExcelService(user).listWeaTableColumn(salaryAcctRecordPO, null);
}
Map<String, Object> datas = new HashMap<>();
datas.put("pageInfo", page);
@ -160,6 +181,89 @@ public class SalaryAcctResultWrapper extends Service {
return datas;
}
/**
* 薪资核算列表 - 审批流程使用
*
* @param queryParam 列表查询条件
* @return
*/
public List<AlWorkflowInfoDTO> listForWorkflowV2(SalaryAcctResultQueryParam queryParam) {
ValidUtil.doValidator(queryParam);
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId());
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// 获取本月薪资核算人员
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(queryParam.getSalaryAcctRecordId());
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "无薪资核算人员"));
}
List<AlWorkflowInfoDTO> reslutList = new ArrayList<>();
// 获取审批流程需要展示的薪资项目
BaseBean baseBean = new BaseBean();
List<Long> needSumItemIds = Arrays.stream(baseBean.getPropValue("alSalary3012551", "approvalWorkflowItemIds").split(",")).filter(NumberUtils::isNumber).map(Long::valueOf).collect(Collectors.toList());
List<SalaryItemPO> salaryItemPOList = getSalaryItemService(user).listByIds(needSumItemIds);
Map<Long, String> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItemPOList, SalaryItemPO::getId, SalaryItemPO::getName);
// 获取这些薪资项目的核算结果
List<SalaryAcctResultPO> resultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(queryParam.getSalaryAcctRecordId()), needSumItemIds);
Map<Long, List<SalaryAcctResultPO>> resultGroupByItemId = SalaryEntityUtil.group2Map(resultPOS, SalaryAcctResultPO::getSalaryItemId);
AlWorkflowInfoDTO thisMonthDTO = AlWorkflowInfoDTO.builder().empNum(salaryAcctEmployeePOS.size()).salaryAcctRecordId(queryParam.getSalaryAcctRecordId()).build();
List<Map<String, Object>> itemList = new ArrayList<>();
for (Long itemId : needSumItemIds) {
String itemName = salaryItemMap.get(itemId);
if (StringUtils.isNotBlank(itemName)) {
List<SalaryAcctResultPO> resultPOList = resultGroupByItemId.get(itemId);
BigDecimal sumValue = resultPOList.stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtils::isNumber).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
Map<String, Object> resultItemMap = new HashMap<>();
resultItemMap.put("name", itemName);
resultItemMap.put("id", itemId);
resultItemMap.put("resultValue", sumValue);
itemList.add(resultItemMap);
}
}
thisMonthDTO.setResultList(itemList);
reslutList.add(thisMonthDTO);
// 查询上月薪资核算记录
// StringBuilder lastRecordStr = new StringBuilder();
Date lastMonth = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryAcctRecordPO.getSalaryMonth()).minusMonths(1));
LocalDateRange dateRange = new LocalDateRange(lastMonth, lastMonth);
List<SalaryAcctRecordPO> lastMonthSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(Collections.singletonList(salaryAcctRecordPO.getSalarySobId()), dateRange);
Long lastMonthSalaryAcctRecordId = null;
if (CollectionUtils.isNotEmpty(lastMonthSalaryAcctRecordPOS)) {
lastMonthSalaryAcctRecordId = lastMonthSalaryAcctRecordPOS.get(0).getId();
List<SalaryAcctEmployeePO> lastMonthSalaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(lastMonthSalaryAcctRecordId);
if (CollectionUtils.isNotEmpty(lastMonthSalaryAcctEmployeePOS)) {
// lastRecordStr.append("上月发薪员工数:").append(lastMonthSalaryAcctEmployeePOS.size()).append("");
// 获取这些薪资项目的核算结果
List<SalaryAcctResultPO> lastMonthResultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(lastMonthSalaryAcctRecordId), needSumItemIds);
Map<Long, List<SalaryAcctResultPO>> lastMonthResultGroupByItemId = SalaryEntityUtil.group2Map(lastMonthResultPOS, SalaryAcctResultPO::getSalaryItemId);
AlWorkflowInfoDTO lastMonthDTO = AlWorkflowInfoDTO.builder().empNum(lastMonthSalaryAcctEmployeePOS.size()).salaryAcctRecordId(lastMonthSalaryAcctRecordId).build();
List<Map<String, Object>> lastMonthItemList = new ArrayList<>();
for (Long itemId : needSumItemIds) {
String itemName = salaryItemMap.get(itemId);
if (StringUtils.isNotBlank(itemName)) {
List<SalaryAcctResultPO> resultPOList = lastMonthResultGroupByItemId.get(itemId);
BigDecimal sumValue = resultPOList.stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtils::isNumber).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add);
// lastRecordStr.append(" ").append(itemName).append(":").append(sumValue.toString());
Map<String, Object> resultItemMap = new HashMap<>();
resultItemMap.put("name", itemName);
resultItemMap.put("id", itemId);
resultItemMap.put("resultValue", sumValue);
lastMonthItemList.add(resultItemMap);
}
}
lastMonthDTO.setResultList(lastMonthItemList);
reslutList.add(lastMonthDTO);
}
}
return reslutList;
}
/**
* 合计行
*
@ -324,6 +428,14 @@ public class SalaryAcctResultWrapper extends Service {
getSalaryAcctResultService(user).batchUpdate(param);
}
/**
* 昂立 - 薪资核算结果差异对比
* @param param
*/
public Map<String, Object> listSalaryAcctResultDiffer(SalaryAcctResultQueryParam param) {
return getSalaryAcctResultService(user).listSalaryAcctResultDiffer(param);
}
/**
* 薪资核算-校验