From 137006b6bde2ec3ec0e63818cab1d283b96b1843 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 4 Jun 2024 16:13:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=82=E7=AB=8B=E8=96=AA=E9=85=AC=E4=BA=8C?= =?UTF-8?q?=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/biz/SalaryArchiveItemBiz.java | 13 ++ .../salaryacct/bo/SalaryAcctResultBO.java | 15 ++- .../salaryacct/dto/AlWorkflowInfoDTO.java | 30 +++++ .../param/SalaryAcctEmployeeQueryParam.java | 3 + .../param/SalaryAcctResultQueryParam.java | 9 ++ .../salary/enums/common/FilterEnum.java | 2 +- .../archive/SalaryArchiveItemMapper.java | 4 +- .../archive/SalaryArchiveItemMapper.xml | 19 +++ .../salaryacct/SalaryAcctEmployeeMapper.xml | 39 ++++++ .../service/SalaryAcctEmployeeService.java | 6 +- .../service/SalaryAcctExcelService.java | 19 ++- .../service/SalaryAcctResultService.java | 9 ++ .../service/SalaryArchiveItemService.java | 8 ++ .../impl/SalaryAcctEmployeeServiceImpl.java | 92 +++++++++++++- .../impl/SalaryAcctExcelServiceImpl.java | 120 +++++++++++++++++- .../impl/SalaryAcctResultServiceImpl.java | 86 +++++++++++++ .../impl/SalaryArchiveItemServiceImpl.java | 12 +- .../salary/web/SalaryAcctController.java | 92 ++++++++++++++ .../wrapper/SalaryAcctEmployeeWrapper.java | 11 ++ .../wrapper/SalaryAcctExcelWrapper.java | 21 +++ .../wrapper/SalaryAcctResultWrapper.java | 114 ++++++++++++++++- 21 files changed, 706 insertions(+), 18 deletions(-) create mode 100644 src/com/engine/salary/entity/salaryacct/dto/AlWorkflowInfoDTO.java diff --git a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java index 527b6b3b2..4b26390ed 100644 --- a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java +++ b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java @@ -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 listArchiveIdByEffectiveTimeAndArchiveIds(LocalDateRange salaryCycle, List salaryArchiveIds) { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); + List salaryArchiveItemPOS = mapper.listArchiveIdByEffectiveTimeAndArchiveIds(salaryCycle, salaryArchiveIds); + sqlSession.commit(); + return salaryArchiveItemPOS; + } finally { + sqlSession.close(); + } + } } diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java index fe5a61558..e686254d5 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java @@ -167,7 +167,7 @@ public class SalaryAcctResultBO { * @param salarySobItemAggregateDTO * @return */ - public static List buildTableColumns(SalarySobItemAggregateDTO salarySobItemAggregateDTO, List lockSalaryItemIds) { + public static List buildTableColumns(SalarySobItemAggregateDTO salarySobItemAggregateDTO, List lockSalaryItemIds, Long onlySalaryItemId) { List columns = Lists.newArrayList(); // 员工信息字段 for (SalarySobEmpFieldDTO salarySobEmpFieldDTO : salarySobItemAggregateDTO.getEmpFields()) { @@ -180,17 +180,30 @@ public class SalaryAcctResultBO { } List 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 { diff --git a/src/com/engine/salary/entity/salaryacct/dto/AlWorkflowInfoDTO.java b/src/com/engine/salary/entity/salaryacct/dto/AlWorkflowInfoDTO.java new file mode 100644 index 000000000..95a41333e --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/AlWorkflowInfoDTO.java @@ -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> resultList; +} diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java index 0d7ec5288..fb4b62cf1 100644 --- a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java @@ -67,4 +67,7 @@ public class SalaryAcctEmployeeQueryParam extends BaseQueryParam { private List ids; private String workcode; + + // 人员id + private List employeeIds; } diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java index 8ebe19131..591c01e92 100644 --- a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java @@ -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 otherConditions; + // 员工id + private Collection employeeIds; + + @Data @NoArgsConstructor @AllArgsConstructor diff --git a/src/com/engine/salary/enums/common/FilterEnum.java b/src/com/engine/salary/enums/common/FilterEnum.java index c3d1ea2a5..ae7de1221 100644 --- a/src/com/engine/salary/enums/common/FilterEnum.java +++ b/src/com/engine/salary/enums/common/FilterEnum.java @@ -90,7 +90,7 @@ public enum FilterEnum implements BaseEnum { return StringUtils::isEmpty; } }, - ISNOTEMPTY("ISNOTEMPTY", "包含", 1) { + ISNOTEMPTY("ISNOTEMPTY", "不为空", 1) { @Override public Predicate filter(List params) { return StringUtils::isNotEmpty; diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.java b/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.java index 9f4ef0cd6..29e2e460f 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.java +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.java @@ -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 pos); + + List listArchiveIdByEffectiveTimeAndArchiveIds(@Param("salaryCycle")LocalDateRange salaryCycle, @Param("archiveIds") List salaryArchiveIds); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml b/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml index 57a607f2c..3d3834eae 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveItemMapper.xml @@ -1071,6 +1071,25 @@ ORDER BY t.effective_time DESC + + UPDATE hrsa_salary_archive_item diff --git a/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml b/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml index a5a87e205..86c3bfb5f 100644 --- a/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml +++ b/src/com/engine/salary/mapper/salaryacct/SalaryAcctEmployeeMapper.xml @@ -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} + + AND em.id IN + + #{employeeId} + + -- 在职 AND em.status in (0,1,2,3) @@ -612,6 +619,12 @@ #{userStatus} + + AND extem.id IN + + #{employeeId} + + -- 在职 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} + + AND em.id IN + + #{employeeId} + + -- 在职 AND em.status in (0,1,2,3) @@ -772,6 +792,12 @@ #{userStatus} + + AND extem.id IN + + #{employeeId} + + -- 在职 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} + + AND em.id IN + + #{employeeId} + + -- 在职 AND em.status in (0,1,2,3) @@ -933,6 +966,12 @@ #{userStatus} + + AND extem.id IN + + #{employeeId} + + -- 在职 AND extem.status in (0,1,2,3) diff --git a/src/com/engine/salary/service/SalaryAcctEmployeeService.java b/src/com/engine/salary/service/SalaryAcctEmployeeService.java index b3882c68c..9f8eeb62e 100644 --- a/src/com/engine/salary/service/SalaryAcctEmployeeService.java +++ b/src/com/engine/salary/service/SalaryAcctEmployeeService.java @@ -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 listByTaxAgentAndSalaryMonth(List taxAgentIds, Set salaryMonths); + PageInfo> adjustSalaryList(SalaryAcctEmployeeQueryParam queryParam); } diff --git a/src/com/engine/salary/service/SalaryAcctExcelService.java b/src/com/engine/salary/service/SalaryAcctExcelService.java index fba7a07b0..5cd963738 100644 --- a/src/com/engine/salary/service/SalaryAcctExcelService.java +++ b/src/com/engine/salary/service/SalaryAcctExcelService.java @@ -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 listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO); + List listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO, Long onlySalaryItemId); List listWeaTableColumnForWorkflow(SalaryAcctRecordPO salaryAcctRecordPO); diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index 0090f8330..faf220068 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -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 listSalaryAcctResultDiffer(SalaryAcctResultQueryParam param); + + List differEmpList(SalaryAcctResultQueryParam param, SalaryAcctRecordPO salaryAcctRecordPO); } diff --git a/src/com/engine/salary/service/SalaryArchiveItemService.java b/src/com/engine/salary/service/SalaryArchiveItemService.java index 70f53e9d9..a1a9217c6 100644 --- a/src/com/engine/salary/service/SalaryArchiveItemService.java +++ b/src/com/engine/salary/service/SalaryArchiveItemService.java @@ -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 listArchiveIdByEffectiveTimeAndArchiveIds(LocalDateRange salaryCycle, List salaryArchiveIds); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java index 6e6f2e20c..ec3194673 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java @@ -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 countBySalaryAcctRecordId(Collection 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> adjustSalaryList(SalaryAcctEmployeeQueryParam queryParam) { + PageInfo> 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 salaryAcctEmployeePOS = getSalaryAcctEmployeeMapper().listPage(queryParam); + List employeeIds = salaryAcctEmployeePOS.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); + SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); + TaxAgentPO taxAgentPO = getTaxAgentService(user).getById(salarySobPO.getTaxAgentId()); + List salaryArchivePOList = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().taxAgentId(salarySobPO.getTaxAgentId()).employeeIds(employeeIds).build()); + List salaryArchiveIds = salaryArchivePOList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + List adjustSalaryArchiveIds = getSalaryArchiveItemService(user).listArchiveIdByEffectiveTimeAndArchiveIds(salaryCycle, salaryArchiveIds); + + List> resultList = new ArrayList<>(); + PageInfo archiveIdPageInfo = new PageInfo<>(); + // 获取所有可被引用的薪资项目 + List 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 employeeMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listByIds(employeeIds), DataCollectionEmployee::getEmployeeId); + List salaryItemIds = salaryItems.stream().map(SalaryItemPO::getId).collect(Collectors.toList()); + // 获取当前生效的薪资项目 + List salaryArchiveItemCurrentList = getSalaryArchiveItemService(user).getCurrentEffectiveItemList(archiveIdPageInfo.getList(), salaryItemIds); + Map> groupByArchiveId = SalaryEntityUtil.group2Map(salaryArchiveItemCurrentList, SalaryArchiveItemPO::getSalaryArchiveId); + + for (SalaryArchivePO po : salaryArchivePOList) { + DataCollectionEmployee employee = employeeMap.get(po.getEmployeeId()); + HashMap 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 archiveItemList = groupByArchiveId.getOrDefault(po.getId(), Collections.emptyList()); + List 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 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; + } } diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index c5f853df5..6564e4860 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -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> pageInfo = getSalaryAcctEmployeeService(user).adjustSalaryList(queryParam); + List columns = pageInfo.getColumns(); + List> list = pageInfo.getList(); + + // 2.表头 + List headerList = columns.stream().map(Column::getTitle).collect(Collectors.toList()); + + List> rows = new ArrayList<>(); + rows.add(headerList); + + // 3.表数据 + for (Map map : list) { + List 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 headerColumnGroup = Lists.newArrayList(); // 查询列表的表头 - List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); + List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null); //判断是否按照自定义字段导出表头 List 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 headerColumnGroup = Lists.newArrayList(); + // 查询列表的表头 + List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null); + + //判断是否按照自定义字段导出表头 + List finalWeaTableColumns = weaTableColumns; + + parseHeader(headerColumnGroup, finalWeaTableColumns); + List headerList = new ArrayList<>(finalWeaTableColumns); + // 查询薪资核算结果 + List differEmpList = getSalaryAcctResultService(user).differEmpList(queryParam, salaryAcctRecordPO); + queryParam.setEmployeeIds(differEmpList); + List> resultMapList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(differEmpList)) { + resultMapList = getSalaryAcctResultService(user).listByParam(queryParam); + } + + + // excel导出的数据 + String DATA_TYPE_SUFFIX = "_type"; + List> rows = new ArrayList<>(); + rows.add(headerList); + for (Map map : resultMapList) { + List 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 listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO) { + public List 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 columnList = SalaryAcctResultBO.buildTableColumns(salarySobItemAggregateDTO, ListUtils.emptyIfNull(salaryAcctRecordPO.getLockSalaryItemIds())); + List 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 weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); + List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null); List finalWeaTableColumns = new ArrayList<>(); for (WeaTableColumnGroup tableColumn : weaTableColumns) { WeaTableColumnGroup columnGroupItem = (WeaTableColumnGroup) tableColumn; @@ -912,7 +1020,7 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc // 无分类薪资项目id List noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList()); // 查询列表的表头 - List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); + List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO, null); List finalWeaTableColumns = new ArrayList<>(); // 查询薪资核算所用的薪资账套的员工信息字段 List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index a400000ef..b852e4d5e 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -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 listSalaryAcctResultDiffer(SalaryAcctResultQueryParam param) { + ValidUtil.doValidator(param); + SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId()); + if (salaryAcctRecordPO == null) { + throw new SalaryRunTimeException("薪资核算记录不存在或已被删除"); + } + List diffEmpIds = differEmpList(param, salaryAcctRecordPO); + + Map datas = new HashMap<>(); + List columns = null; + PageInfo> 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 differEmpList(SalaryAcctResultQueryParam param, SalaryAcctRecordPO salaryAcctRecordPO) { + + BaseBean baseBean = new BaseBean(); + List needSumItemIds = Arrays.stream(baseBean.getPropValue("alSalary3012551", "approvalWorkflowItemIds").split(",")).filter(org.apache.commons.lang.math.NumberUtils::isNumber).map(Long::valueOf).collect(Collectors.toList()); + // 获取本次的核算结果 + List resultPOList = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(salaryAcctRecordPO.getId()), needSumItemIds); + Map> resultGroupByEmpId = SalaryEntityUtil.group2Map(resultPOList, SalaryAcctResultPO::getEmployeeId); + List diffEmpIds = new ArrayList<>(); + + // 获取上月的薪资核算结果 + Date lastMonth = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(salaryAcctRecordPO.getSalaryMonth()).minusMonths(1)); + LocalDateRange dateRange = new LocalDateRange(lastMonth, lastMonth); + List 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 lastMonthResultPOList = listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(lastMonthSalaryAcctRecord.getId()), needSumItemIds); + Map> lastMonthResultGroupByEmpId = SalaryEntityUtil.group2Map(lastMonthResultPOList, SalaryAcctResultPO::getEmployeeId); + for (Map.Entry> entrySet : resultGroupByEmpId.entrySet()) { + boolean flag = false; + List lastMonthResultList = lastMonthResultGroupByEmpId.get(entrySet.getKey()); + if (CollectionUtils.isEmpty(lastMonthResultList)) { + // 上月该账套中该员工没有核算数据 + flag = true; + diffEmpIds.add(entrySet.getKey()); + } else { + Map reslultMap = SalaryEntityUtil.convert2Map(entrySet.getValue(), SalaryAcctResultPO::getSalaryItemId); + Map 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; + } } \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java index 19c39e199..01372319a 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveItemServiceImpl.java @@ -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 listArchiveIdByEffectiveTimeAndArchiveIds(LocalDateRange salaryCycle, List salaryArchiveIds) { + if (salaryCycle == null || CollectionUtils.isEmpty(salaryArchiveIds)) { + return Collections.emptyList(); + } + List resultList = new ArrayList<>(); + List> partition = Lists.partition(salaryArchiveIds, 800); + partition.forEach(part -> resultList.addAll(salaryArchiveItemMapper.listArchiveIdByEffectiveTimeAndArchiveIds(salaryCycle, part))); + return resultList; + } } diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 5b6943f8d..2e0b35519 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -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>>(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>(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>(user).run(getSalaryAcctResultWrapper(user)::listSalaryAcctResultDiffer, param); + } + //薪资核算结果列表 @POST @Path("/acctresult/listForWorkflow") @@ -411,6 +461,20 @@ public class SalaryAcctController { return new ResponseResult>(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>(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") diff --git a/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java index 526fbfcb5..04fd10324 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctEmployeeWrapper.java @@ -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> adjustSalaryList(SalaryAcctEmployeeQueryParam queryParam) { + return getSalaryAcctEmployeeService(user).adjustSalaryList(queryParam); + } + /** * 薪资核算人员列表 * diff --git a/src/com/engine/salary/wrapper/SalaryAcctExcelWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctExcelWrapper.java index 6c2db9bd7..67b6520d0 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctExcelWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctExcelWrapper.java @@ -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); + } + /** * 下载薪资核算导入模板 * diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index bfd0e6784..b221da080 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -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> page = getSalaryAcctResultService(user).listPageByParam(queryParam); // 构建薪资核算结果列表的表头 - List columns = getSalaryAcctExcelService(user).listWeaTableColumn(salaryAcctRecordPO); + List 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 datas = new HashMap<>(); datas.put("pageInfo", page); @@ -160,6 +181,89 @@ public class SalaryAcctResultWrapper extends Service { return datas; } + /** + * 薪资核算列表 - 审批流程使用 + * + * @param queryParam 列表查询条件 + * @return + */ + public List listForWorkflowV2(SalaryAcctResultQueryParam queryParam) { + ValidUtil.doValidator(queryParam); + // 查询薪资核算记录 + SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); + if (Objects.isNull(salaryAcctRecordPO)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); + } + + // 获取本月薪资核算人员 + List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(queryParam.getSalaryAcctRecordId()); + if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "无薪资核算人员")); + } + List reslutList = new ArrayList<>(); + // 获取审批流程需要展示的薪资项目 + BaseBean baseBean = new BaseBean(); + List needSumItemIds = Arrays.stream(baseBean.getPropValue("alSalary3012551", "approvalWorkflowItemIds").split(",")).filter(NumberUtils::isNumber).map(Long::valueOf).collect(Collectors.toList()); + List salaryItemPOList = getSalaryItemService(user).listByIds(needSumItemIds); + Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItemPOList, SalaryItemPO::getId, SalaryItemPO::getName); + // 获取这些薪资项目的核算结果 + List resultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(queryParam.getSalaryAcctRecordId()), needSumItemIds); + Map> resultGroupByItemId = SalaryEntityUtil.group2Map(resultPOS, SalaryAcctResultPO::getSalaryItemId); + AlWorkflowInfoDTO thisMonthDTO = AlWorkflowInfoDTO.builder().empNum(salaryAcctEmployeePOS.size()).salaryAcctRecordId(queryParam.getSalaryAcctRecordId()).build(); + List> itemList = new ArrayList<>(); + for (Long itemId : needSumItemIds) { + String itemName = salaryItemMap.get(itemId); + if (StringUtils.isNotBlank(itemName)) { + List resultPOList = resultGroupByItemId.get(itemId); + BigDecimal sumValue = resultPOList.stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtils::isNumber).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add); + Map 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 lastMonthSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(Collections.singletonList(salaryAcctRecordPO.getSalarySobId()), dateRange); + Long lastMonthSalaryAcctRecordId = null; + if (CollectionUtils.isNotEmpty(lastMonthSalaryAcctRecordPOS)) { + lastMonthSalaryAcctRecordId = lastMonthSalaryAcctRecordPOS.get(0).getId(); + List lastMonthSalaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(lastMonthSalaryAcctRecordId); + if (CollectionUtils.isNotEmpty(lastMonthSalaryAcctEmployeePOS)) { + // lastRecordStr.append("上月发薪员工数:").append(lastMonthSalaryAcctEmployeePOS.size()).append("人"); + // 获取这些薪资项目的核算结果 + List lastMonthResultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIdsAndSalaryItemIds(Collections.singletonList(lastMonthSalaryAcctRecordId), needSumItemIds); + Map> lastMonthResultGroupByItemId = SalaryEntityUtil.group2Map(lastMonthResultPOS, SalaryAcctResultPO::getSalaryItemId); + AlWorkflowInfoDTO lastMonthDTO = AlWorkflowInfoDTO.builder().empNum(lastMonthSalaryAcctEmployeePOS.size()).salaryAcctRecordId(lastMonthSalaryAcctRecordId).build(); + List> lastMonthItemList = new ArrayList<>(); + for (Long itemId : needSumItemIds) { + String itemName = salaryItemMap.get(itemId); + if (StringUtils.isNotBlank(itemName)) { + List 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 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 listSalaryAcctResultDiffer(SalaryAcctResultQueryParam param) { + return getSalaryAcctResultService(user).listSalaryAcctResultDiffer(param); + } + /** * 薪资核算-校验