From 797d5095ebf250d7601bb3789f42a79887906d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 9 May 2023 10:43:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8Dif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SalaryStatisticsEmployeeController.java | 8 + .../entity/bo/SalaryStatisticsEmployeeBO.java | 26 +- .../dto/SalaryStatisticsEmployeeListDTO.java | 8 + .../param/SalaryAcctEmployeeQueryParam.java | 4 +- ...aryStatisticsEmployeeDetailQueryParam.java | 4 +- .../SalaryStatisticsEmployeeQueryParam.java | 4 +- .../SalaryStatisticsEmployeeService.java | 54 +++ .../SalaryStatisticsEmployeeServiceImpl.java | 348 ++++++++++++++++++ .../SalaryStatisticsEmployeeController.java | 77 ++++ .../SalaryStatisticsEmployeeWrapper.java | 129 +++++++ .../engine/salary/util/SalaryDateUtil.java | 5 + 11 files changed, 646 insertions(+), 21 deletions(-) create mode 100644 src/com/api/salary/web/SalaryStatisticsEmployeeController.java create mode 100644 src/com/engine/salary/report/service/SalaryStatisticsEmployeeService.java create mode 100644 src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java create mode 100644 src/com/engine/salary/report/web/SalaryStatisticsEmployeeController.java create mode 100644 src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java diff --git a/src/com/api/salary/web/SalaryStatisticsEmployeeController.java b/src/com/api/salary/web/SalaryStatisticsEmployeeController.java new file mode 100644 index 000000000..92902b46f --- /dev/null +++ b/src/com/api/salary/web/SalaryStatisticsEmployeeController.java @@ -0,0 +1,8 @@ +package com.api.salary.web; + +import javax.ws.rs.Path; + +@Path("/bs/hrmsalary/report/statistics/employee") +public class SalaryStatisticsEmployeeController extends com.engine.salary.report.web.SalaryStatisticsEmployeeController{ + +} diff --git a/src/com/engine/salary/report/entity/bo/SalaryStatisticsEmployeeBO.java b/src/com/engine/salary/report/entity/bo/SalaryStatisticsEmployeeBO.java index 0067e1cff..470c0690e 100644 --- a/src/com/engine/salary/report/entity/bo/SalaryStatisticsEmployeeBO.java +++ b/src/com/engine/salary/report/entity/bo/SalaryStatisticsEmployeeBO.java @@ -1,14 +1,10 @@ package com.engine.salary.report.entity.bo; +import com.engine.salary.util.SalaryDateUtil; import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; -import java.time.YearMonth; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -23,12 +19,12 @@ public class SalaryStatisticsEmployeeBO { * @param salaryMonth * @return */ - public static Set getSalaryMonths(Integer year, List salaryMonth) { + public static Set getSalaryMonths(Integer year, List salaryMonth) { Set salaryMonths = Sets.newHashSet(); // 年份参数 if (Objects.nonNull(year)) { List months = Arrays.asList("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"); - for (int i=0;i 2 ? salaryMonth.subList(0, 1) : salaryMonth); if (salaryMonth.size() == 2) { - if (salaryMonth.get(0).isAfter(salaryMonth.get(1))) { + if (salaryMonth.get(0).after(salaryMonth.get(1))) { salaryMonths.clear(); salaryMonths.add("2000-01"); } else { - YearMonth startYearMonth = salaryMonth.get(0); - YearMonth endYearMonth = salaryMonth.get(1); + Date startYearMonth = salaryMonth.get(0); + Date endYearMonth = salaryMonth.get(1); Set yearMonths = Sets.newHashSet(); - while (!startYearMonth.isAfter(endYearMonth)) { - yearMonths.add(startYearMonth.format(DateTimeFormatter.ofPattern("yyyy-MM"))); - startYearMonth = startYearMonth.plusMonths(1); + while (!startYearMonth.after(endYearMonth)) { + yearMonths.add(SalaryDateUtil.getFormatYearMonth(startYearMonth)); + startYearMonth = SalaryDateUtil.plusMonths(startYearMonth, 1); } if (CollectionUtils.isNotEmpty(salaryMonths)) { Set finalSalaryMonths = salaryMonths; @@ -56,7 +52,7 @@ public class SalaryStatisticsEmployeeBO { } } } else { - String singMonth = salaryMonth.get(0).format(DateTimeFormatter.ofPattern("yyyy-MM")); + String singMonth = SalaryDateUtil.getFormatYearMonth(salaryMonth.get(0)); salaryMonths.add(CollectionUtils.isNotEmpty(salaryMonths) ? (salaryMonths.contains(singMonth) ? singMonth : "2000-01") : singMonth); } } diff --git a/src/com/engine/salary/report/entity/dto/SalaryStatisticsEmployeeListDTO.java b/src/com/engine/salary/report/entity/dto/SalaryStatisticsEmployeeListDTO.java index 6c7e5ca80..791c01c30 100644 --- a/src/com/engine/salary/report/entity/dto/SalaryStatisticsEmployeeListDTO.java +++ b/src/com/engine/salary/report/entity/dto/SalaryStatisticsEmployeeListDTO.java @@ -1,5 +1,6 @@ package com.engine.salary.report.entity.dto; +import com.engine.salary.annotation.TableTitle; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.AllArgsConstructor; @@ -21,24 +22,31 @@ public class SalaryStatisticsEmployeeListDTO { private Long id; //姓名 + @TableTitle(title = "姓名", dataIndex = "name", key = "name") private String name; //分部 + @TableTitle(title = "分部", dataIndex = "subCompany", key = "subCompany") private String subCompany; //部门 + @TableTitle(title = "部门", dataIndex = "department", key = "department") private String department; //岗位 + @TableTitle(title = "岗位", dataIndex = "position", key = "position") private String position; // 员工状态 + @TableTitle(title = "员工状态", dataIndex = "status", key = "status") private String status; //工号 + @TableTitle(title = "工号", dataIndex = "jobNum", key = "jobNum") private String jobNum; //证件号码 + @TableTitle(title = "证件号码", dataIndex = "idNo", key = "idNo") private String idNo; //人员类型 diff --git a/src/com/engine/salary/report/entity/param/SalaryAcctEmployeeQueryParam.java b/src/com/engine/salary/report/entity/param/SalaryAcctEmployeeQueryParam.java index e3f721b2c..fb4131bb4 100644 --- a/src/com/engine/salary/report/entity/param/SalaryAcctEmployeeQueryParam.java +++ b/src/com/engine/salary/report/entity/param/SalaryAcctEmployeeQueryParam.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.YearMonth; +import java.util.Date; import java.util.List; /** @@ -30,5 +30,5 @@ public class SalaryAcctEmployeeQueryParam { private Integer year; //薪资所属月") - private List salaryMonth; + private List salaryMonth; } \ No newline at end of file diff --git a/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeDetailQueryParam.java b/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeDetailQueryParam.java index 6d8937669..6bb78d7d3 100644 --- a/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeDetailQueryParam.java +++ b/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeDetailQueryParam.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.YearMonth; +import java.util.Date; import java.util.List; /** @@ -39,5 +39,5 @@ public class SalaryStatisticsEmployeeDetailQueryParam extends BaseQueryParam { private Integer year; //薪资所属月 - private List salaryMonth; + private List salaryMonth; } \ No newline at end of file diff --git a/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeQueryParam.java b/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeQueryParam.java index ff1afbdb2..98e3900e5 100644 --- a/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeQueryParam.java +++ b/src/com/engine/salary/report/entity/param/SalaryStatisticsEmployeeQueryParam.java @@ -6,7 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.YearMonth; +import java.util.Date; import java.util.List; /** @@ -31,7 +31,7 @@ public class SalaryStatisticsEmployeeQueryParam extends BaseQueryParam { private Integer year; //薪资所属月") - private List salaryMonth; + private List salaryMonth; //人员类型,ORGANIZATION:内部人员 |EXT_EMPLOYEE:外部人员") private EmployeeTypeEnum employeeType; diff --git a/src/com/engine/salary/report/service/SalaryStatisticsEmployeeService.java b/src/com/engine/salary/report/service/SalaryStatisticsEmployeeService.java new file mode 100644 index 000000000..23b52f4b3 --- /dev/null +++ b/src/com/engine/salary/report/service/SalaryStatisticsEmployeeService.java @@ -0,0 +1,54 @@ +package com.engine.salary.report.service; + +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeDetailResultDTO; +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeListDTO; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeDetailQueryParam; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeQueryParam; +import com.engine.salary.util.page.PageInfo; + +import java.util.List; +import java.util.Map; + +/** + * 薪酬统计员工明细 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public interface SalaryStatisticsEmployeeService { + + /** + * 获取员工统计分页列表 + * + * @param queryParam + * @return + */ + PageInfo listPage(SalaryStatisticsEmployeeQueryParam queryParam); + + /** + * 获取员工明细结果数据 + * + * @param queryParam + * @return + */ + SalaryStatisticsEmployeeDetailResultDTO getDetailSalaryAcctResult(SalaryStatisticsEmployeeDetailQueryParam queryParam); + + /** + * 获取员工核算详情数据分页列表 + * + * @param salaryStatisticsEmployeeDetailResult + * @param queryParam + * @return + */ + List> listDetailPage(SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult, SalaryStatisticsEmployeeDetailQueryParam queryParam); + + /** + * 导出员工详情列表 + * + * @param map + * @param queryParam + */ +// void exportDetailList(Map map, SalaryStatisticsEmployeeDetailQueryParam queryParam); +} diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java new file mode 100644 index 000000000..11760702b --- /dev/null +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsEmployeeServiceImpl.java @@ -0,0 +1,348 @@ +package com.engine.salary.report.service.impl; + +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper; +import com.engine.salary.report.common.constant.SalaryConstant; +import com.engine.salary.report.entity.bo.SalaryStatisticsEmployeeBO; +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeDetailResultDTO; +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeListDTO; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeDetailQueryParam; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeQueryParam; +import com.engine.salary.report.service.SalaryStatisticsEmployeeService; +import com.engine.salary.service.*; +import com.engine.salary.service.impl.*; +import com.engine.salary.util.SalaryAssert; +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.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import weaver.hrm.User; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 薪酬统计员工明细 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Slf4j +public class SalaryStatisticsEmployeeServiceImpl extends Service implements SalaryStatisticsEmployeeService { + + private SalaryAcctEmployeeMapper getSalaryAcctEmployeeMapper() { + return MapperProxyFactory.getProxy(SalaryAcctEmployeeMapper.class); + } + + private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { + return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); + } + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); + } + + private SalaryItemService getSalaryItemService(User user) { + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + + +// private ExtEmployeeMapper extEmployeeMapper; + + private TaxAgentService getTaxAgentService(User user) { + return ServiceUtil.getService(TaxAgentServiceImpl.class, user); + } + + private SalaryEmployeeService getSalaryEmployeeService(User user) { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } + + @Override + public PageInfo listPage(SalaryStatisticsEmployeeQueryParam queryParam) { + List list = Collections.emptyList(); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list); + + // 1.分权处理, 首先获取个税扣缴义务人参数 + Collection taxAgentViews = getTaxAgentService(user).listAllTaxAgents((long) user.getUID()); + List taxAgentIds = Objects.isNull(taxAgentViews) ? Lists.newArrayList() : taxAgentViews.stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(taxAgentIds)) { + return page; + } + + // 2.年月参数处理,注意:薪资所属月居然是用字符串存储的,无法通过sql between处理 + Set salaryMonths = SalaryStatisticsEmployeeBO.getSalaryMonths(queryParam.getYear(), queryParam.getSalaryMonth()) + .stream() + .map(SalaryDateUtil::dateStrToLocalYearMonth) + .collect(Collectors.toSet()); + + // 查询薪资核算人员 + List salaryAcctEmployeeList = getSalaryAcctEmployeeService(user).listByTaxAgentAndSalaryMonth(taxAgentIds, salaryMonths); + if (CollectionUtils.isEmpty(salaryAcctEmployeeList)) { + return page; + } +// if (queryParam.getEmployeeType() != null) { +// salaryAcctEmployeeList = salaryAcctEmployeeList.stream().filter(s -> queryParam.getEmployeeType().getValue().equals(s.getEmployeeType())).collect(Collectors.toList()); +// } + +// // 外部人员id +// Set extEmployeeIds = Sets.newHashSet(); + // 内部人员id + Set innerEmployeeIds = Sets.newHashSet(); + for (SalaryAcctEmployeePO sae : salaryAcctEmployeeList) { +// if (EmployeeTypeEnum.EXT_EMPLOYEE.getValue().equals(sae.getEmployeeType())) { +// extEmployeeIds.add(sae.getEmployeeId()); +// } else if (EmployeeTypeEnum.ORGANIZATION.getValue().equals(sae.getEmployeeType())) { +// innerEmployeeIds.add(sae.getEmployeeId()); +// } + innerEmployeeIds.add(sae.getEmployeeId()); + } + // 3.关键字搜索参数 + if (StringUtils.isNotEmpty(queryParam.getKeyword())) { +// if (CollectionUtils.isNotEmpty(extEmployeeIds)) { +// // 查询外部人员 +// List extEmployeeList = new LambdaQueryChainWrapper<>(extEmployeeMapper) +// .eq(ExtEmployeePO::getTenantKey, tenantKey) +// .eq(ExtEmployeePO::getDeleteType, 0) +// .list(); +// Set finalExtEmployeeIds = extEmployeeIds; +// extEmployeeIds = extEmployeeList.stream() +// .filter(e -> finalExtEmployeeIds.contains(e.getId()) && (e.getUsername().contains(queryParam.getKeyword()) || (StringUtils.isNotEmpty(e.getCardNum()) && e.getCardNum().contains(queryParam.getKeyword())))) +// .map(ExtEmployeePO::getId) +// .collect(Collectors.toSet()); +// } + if (CollectionUtils.isNotEmpty(innerEmployeeIds)) { + List salaryEmployees = getSalaryEmployeeService(user).listAll(); + Set finalInnerEmployeeIds = innerEmployeeIds; + innerEmployeeIds = salaryEmployees.stream() + .filter(e -> finalInnerEmployeeIds.contains(e.getEmployeeId()) && (e.getUsername().contains(queryParam.getKeyword()) || (StringUtils.isNotEmpty(e.getWorkcode()) && e.getWorkcode().contains(queryParam.getKeyword())))) + .map(DataCollectionEmployee::getEmployeeId) + .collect(Collectors.toSet()); +// Map idNoMap = idNoMapByEmployeeIds(finalInnerEmployeeIds); +// for (Long k : idNoMap.keySet()) { +// if (idNoMap.get(k) != null && idNoMap.get(k).contains(queryParam.getKeyword())) { +// innerEmployeeIds.addAll(idNoMap.keySet()); +// } +// } + } + } + + List innerEmployeeIdList = innerEmployeeIds.stream().sorted(Comparator.comparing(e -> e)).collect(Collectors.toList()); +// List extEmployeeIdList = extEmployeeIds.stream().sorted(Comparator.comparing(e -> e)).collect(Collectors.toList()); + // 排序,内部员工优先 + list = innerEmployeeIdList.stream().map(e -> SalaryStatisticsEmployeeListDTO.builder() + .id(e) +// .employeeType(EmployeeTypeEnum.ORGANIZATION.getValue()) + .build()).collect(Collectors.toList()); +// list.addAll(extEmployeeIdList.stream().map(e -> SalaryStatisticsEmployeeListDTO.builder() +// .id(e) +// .employeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue()) +// .build()).collect(Collectors.toList())); + + // 第一页数据显示处理 + page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, SalaryStatisticsEmployeeListDTO.class); + List salaryStatisticsEmployeeListDTOs = page.getList(); + List employeeIds = salaryStatisticsEmployeeListDTOs.stream().map(SalaryStatisticsEmployeeListDTO::getId).collect(Collectors.toList()); + // 查询外部人员 +// List extEmployeeList = CollectionUtils.isEmpty(extEmployeeIdList) ? Lists.newArrayList() : new LambdaQueryChainWrapper<>(extEmployeeMapper) +// .eq(ExtEmployeePO::getTenantKey, tenantKey) +// .eq(ExtEmployeePO::getDeleteType, 0) +// .in(ExtEmployeePO::getId, extEmployeeIdList) +// .list(); +// Map extEmployeeMap = extEmployeeList.stream().collect(Collectors.toMap(ExtEmployeePO::getId, v -> v)); + List simpleEmployeeList = getSalaryEmployeeService(user).getEmployeeByIds(employeeIds); + Map innerEmployeeMap = simpleEmployeeList.stream().collect(Collectors.toMap(DataCollectionEmployee::getEmployeeId, v -> v)); + salaryStatisticsEmployeeListDTOs.forEach(e -> { + DataCollectionEmployee simpleEmployee = innerEmployeeMap.get(e.getId()); + e.setName(Objects.isNull(simpleEmployee) ? "" : simpleEmployee.getUsername()); + e.setSubCompany(simpleEmployee.getSubcompanyName()); + e.setDepartment(simpleEmployee.getDepartmentName()); + e.setPosition(simpleEmployee.getJobtitleName()); + e.setStatus(simpleEmployee.getStatus()); + e.setJobNum(simpleEmployee.getWorkcode()); + e.setIdNo(simpleEmployee.getIdNo()); + }); + page.setList(salaryStatisticsEmployeeListDTOs); + return page; + } + + + @Override + public SalaryStatisticsEmployeeDetailResultDTO getDetailSalaryAcctResult(SalaryStatisticsEmployeeDetailQueryParam queryParam) { + SalaryAssert.notNull(queryParam.getEmployeeId(), SalaryI18nUtil.getI18nLabel(163974, "人员id不能为空")); + + // 薪资所属月参数,如果已经有年的就取交集 + Set salaryMonths = SalaryStatisticsEmployeeBO.getSalaryMonths(queryParam.getYear(), queryParam.getSalaryMonth()).stream().map(SalaryDateUtil::dateStrToLocalYearMonth).collect(Collectors.toSet()); + + // 1.获取该员工所有核算人员数据 + SalaryAcctEmployeePO build = SalaryAcctEmployeePO.builder().employeeId(queryParam.getEmployeeId()).build(); + if (CollectionUtils.isNotEmpty(queryParam.getIds())) { + build.setIds(queryParam.getIds()); + } + if (CollectionUtils.isNotEmpty(salaryMonths)) { + build.setSalaryMonths(salaryMonths); + } + if (Objects.nonNull(queryParam.getTaxAgentId())) { + build.setTaxAgentId(queryParam.getTaxAgentId()); + } + List salaryAcctEmployees = getSalaryAcctEmployeeMapper().listSome(build); + salaryAcctEmployees = salaryAcctEmployees.stream().sorted(Comparator.comparing(SalaryAcctEmployeePO::getSalaryMonth)).collect(Collectors.toList()); + Collections.reverse(salaryAcctEmployees); + + // 2.获取核算结果数据 + Set salaryAcctEmployeeIds = salaryAcctEmployees.stream().map(SalaryAcctEmployeePO::getId).collect(Collectors.toSet()); + List salaryAcctResultValues = getSalaryAcctResultService(user).listBySalaryAcctEmployeeIds(salaryAcctEmployeeIds); + + // 3.获取薪资项目 + Map resultMap = Maps.newHashMap(); + salaryAcctResultValues.forEach(sv -> { + resultMap.put(sv.getSalaryItemId() + "", sv.getResultValue()); + }); + List salaryItemIds = resultMap.keySet().stream().map(Long::valueOf).collect(Collectors.toList()); + List salaryItemList = CollectionUtils.isEmpty(salaryItemIds) ? Lists.newArrayList() : getSalaryItemService(user).listByIds(salaryItemIds); + + return SalaryStatisticsEmployeeDetailResultDTO.builder() + .salaryAcctEmployeeList(salaryAcctEmployees) + .salaryAcctResultValueList(salaryAcctResultValues) + .salaryItemList(salaryItemList) + .build(); + } + + @Override + public List> listDetailPage(SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult, SalaryStatisticsEmployeeDetailQueryParam queryParam) { + + List taxAgentList = getTaxAgentService(user).listAll(); + Map taxAgentMap = SalaryEntityUtil.convert2Map(taxAgentList, TaxAgentPO::getId, TaxAgentPO::getName); + + Map> acctResultValueList = SalaryEntityUtil.group2Map(salaryStatisticsEmployeeDetailResult.getSalaryAcctResultValueList(), SalaryAcctResultPO::getSalaryAcctEmpId); + Map> acctResultValueMap = new HashMap<>(); + acctResultValueList.forEach((k, v) -> { + Map map = new HashMap(); + v.forEach(l -> { + map.put(l.getSalaryItemId() + "", l.getResultValue()); + }); + acctResultValueMap.put(k, map); + }); + + + List> list = Lists.newArrayList(); + Map map; + for (SalaryAcctEmployeePO se : salaryStatisticsEmployeeDetailResult.getSalaryAcctEmployeeList()) { + map = Maps.newHashMap(); + Map resultValueMap = Optional.ofNullable(acctResultValueMap.get(se.getId())).orElse(Maps.newHashMap()); + Map finalMap = map; + resultValueMap.forEach((k, v) -> { + finalMap.put(k + SalaryConstant.DYNAMIC_SUFFIX, v); + }); + map.put("id", se.getId().toString()); + map.put("salaryMonth", se.getSalaryMonth()); + map.put("taxAgent", taxAgentMap.get(se.getTaxAgentId())); +// IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(Integer.parseInt(se.getIncomeCategory())); +// map.put("incomeCategory", Objects.isNull(incomeCategoryEnum) ? "" : SalaryI18nUtil.getI18nLabel(incomeCategoryEnum.getLabelId(), incomeCategoryEnum.getDefaultLabel())); + list.add(map); + } + return list; + } + +// @Override +// public void exportDetailList(Map map, SalaryStatisticsEmployeeDetailQueryParam queryParam) { +// DataCollectionEmployee employee = getSalaryEmployeeService(user).getEmployeeById(queryParam.getEmployeeId()); +// // 获取核算数据 +// SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult; +// if (Objects.isNull(employee)) { +// salaryStatisticsEmployeeDetailResult = SalaryStatisticsEmployeeDetailResultDTO.builder() +// .salaryAcctEmployeeList(Lists.newArrayList()) +// .salaryAcctResultValueList(Lists.newArrayList()) +// .salaryItemList(Lists.newArrayList()) +// .build(); +// } else { +// salaryStatisticsEmployeeDetailResult = this.getDetailSalaryAcctResult(queryParam); +// } +// +// String nameI18n = (StringUtils.isEmpty(employee.getUsername()) ? "" : "[" + employee.getUsername() + "]") + SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 177855, "薪资明细表"); +// +// List sheetList = new ArrayList<>(); +// ExcelSheetData excelSheetData = new ExcelSheetData(); +// // 1.工作簿名称 +// excelSheetData.setSheetName(nameI18n); +// List headerList = Lists.newArrayList(); +// headerList.add(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 87614, "薪资所属月")); +// headerList.add(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 86184, "个税扣缴义务人")); +// headerList.add(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 121908, "收入所得项目")); +// salaryStatisticsEmployeeDetailResult.getSalaryItemList().forEach(item -> headerList.add(item.getName())); +// // 2.表头 +// excelSheetData.setHeaders(Collections.singletonList(headerList.toArray(new String[]{}))); +// +// List taxAgentList = getTaxAgentService(user).listAll(tenantKey); +// Map taxAgentMap = SalaryEntityUtil.convert2Map(taxAgentList, TaxAgentPO::getId, TaxAgentPO::getName); +// +// Map> acctResultValueMap = SalaryEntityUtil.convert2Map(salaryStatisticsEmployeeDetailResult.getSalaryAcctResultValueList(), SalaryAcctResultPO::getSalaryAcctEmployeeId, SalaryAcctResultPO::getResultValue); +// +// // 组装数据 +// List> rows = new ArrayList<>(); +// for (SalaryAcctEmployeePO se : salaryStatisticsEmployeeDetailResult.getSalaryAcctEmployeeList()) { +// if (CollectionUtils.isNotEmpty(queryParam.getIds()) && !queryParam.getIds().contains(se.getId())) { +// continue; +// } +// List row = new ArrayList<>(); +// row.add(se.getSalaryMonth()); +// row.add(taxAgentMap.get(se.getTaxAgentId())); +// IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(Integer.parseInt(se.getIncomeCategory())); +// row.add(Objects.isNull(incomeCategoryEnum) ? "" : SalaryI18nUtil.getI18nLabel(incomeCategoryEnum.getLabelId(), incomeCategoryEnum.getDefaultLabel())); +// // 薪资项目 +// Map resultValueMap = Optional.ofNullable(acctResultValueMap.get(se.getId())).orElse(Maps.newHashMap()); +// salaryStatisticsEmployeeDetailResult.getSalaryItemList().forEach(item -> row.add(Optional.ofNullable(resultValueMap.get(item.getId().toString())).orElse(""))); +// +// rows.add(row); +// } +// if (CollectionUtils.isNotEmpty(rows)) { +// List countRow = new ArrayList<>(); +// countRow.add(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 93278, "合计")); +// countRow.add("-"); +// countRow.add("-"); +// +// for (int i = 3; i < headerList.size(); i++) { +// BigDecimal sumBigDecimal = new BigDecimal(SalaryStatisticsReportBO.D_ZERO); +// for (List row : rows) { +// sumBigDecimal = sumBigDecimal.add(new BigDecimal(StringUtils.isEmpty(row.get(i).toString()) ? SalaryStatisticsReportBO.ZERO : row.get(i).toString())); +// } +// countRow.add(sumBigDecimal.toString()); +// } +// rows.add(countRow); +// } +// +// // 3.表数据 +// excelSheetData.setRows(rows); +// +// sheetList.add(excelSheetData); +// +// salaryBatchService.simpleExportExcel(ExportExcelInfo.builder() +//// .sharePassword(queryParam.getSharePassword()) +// .bizId(map.get("biz").toString()) +// .flag(true) +// .userId(employeeId) +// .eteamsId(map.get("eteamsId").toString()) +// .tenantKey(tenantKey) +// .operator(map.get("username").toString()) +// .module(map.get("module").toString()) +// .fileName(nameI18n + ReportTimeUtil.getFormatLocalDateTime(LocalDateTime.now())) +// .handlerName("exportSalaryStatisticsEmployeeDetailList") +// .dataType(nameI18n) +// .function("exportSalaryStatisticsEmployeeDetailList").build(), sheetList); +// } +} diff --git a/src/com/engine/salary/report/web/SalaryStatisticsEmployeeController.java b/src/com/engine/salary/report/web/SalaryStatisticsEmployeeController.java new file mode 100644 index 000000000..23571d9e8 --- /dev/null +++ b/src/com/engine/salary/report/web/SalaryStatisticsEmployeeController.java @@ -0,0 +1,77 @@ +package com.engine.salary.report.web; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeListDTO; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeDetailQueryParam; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeQueryParam; +import com.engine.salary.report.wrapper.SalaryStatisticsEmployeeWrapper; +import com.engine.salary.util.ResponseResult; +import com.engine.salary.util.page.PageInfo; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +/** + * 薪酬统计员工明细 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public class SalaryStatisticsEmployeeController { + + private SalaryStatisticsEmployeeWrapper getSalaryStatisticsEmployeeWrapper(User user) { + return ServiceUtil.getService(SalaryStatisticsEmployeeWrapper.class, user); + } + + /** + * 员工列表 + * + * @param queryParam + * @return + */ + @POST + @Path("/list") + @Produces(MediaType.APPLICATION_JSON) + public String list(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryStatisticsEmployeeQueryParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryStatisticsEmployeeWrapper(user)::list, queryParam); + } + + /** + * 员工详情列表 + * + * @param queryParam + * @return + */ + @POST + @Path("/detailList") + @Produces(MediaType.APPLICATION_JSON) + public String detailList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryStatisticsEmployeeDetailQueryParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryStatisticsEmployeeWrapper(user)::detailList, queryParam); + } + +// /** +// * 导出员工详情列表 +// * +// * @param queryParam +// * @return +// */ +// @PostMapping("/exportDetailList") +// @ApiOperation("导出员工详情列表") +// @WeaPermission(publicPermission = true) +// public WeaResult> exportDetailList(@RequestBody SalaryStatisticsEmployeeDetailQueryParam queryParam) { +// return WeaResult.success(getSalaryStatisticsEmployeeWrapper(user).exportDetailList(queryParam, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey())); +// } +} diff --git a/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java b/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java new file mode 100644 index 000000000..31fc2d0e5 --- /dev/null +++ b/src/com/engine/salary/report/wrapper/SalaryStatisticsEmployeeWrapper.java @@ -0,0 +1,129 @@ +package com.engine.salary.report.wrapper; + +import com.cloudstore.eccom.pc.table.WeaTableColumn; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; +import com.engine.salary.report.common.constant.SalaryConstant; +import com.engine.salary.report.entity.bo.SalaryStatisticsReportBO; +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeDetailResultDTO; +import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeListDTO; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeDetailQueryParam; +import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeQueryParam; +import com.engine.salary.report.service.SalaryStatisticsEmployeeService; +import com.engine.salary.report.service.impl.SalaryStatisticsEmployeeServiceImpl; +import com.engine.salary.report.util.ReportDataUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import com.google.common.collect.Maps; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import weaver.hrm.User; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 薪酬统计员工明细 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public class SalaryStatisticsEmployeeWrapper extends Service { + + private SalaryStatisticsEmployeeService getSalaryStatisticsEmployeeService(User user) { + return ServiceUtil.getService(SalaryStatisticsEmployeeServiceImpl.class, user); + } + /** + * 员工列表 + * + * @param queryParam + * @return + */ + public PageInfo list(SalaryStatisticsEmployeeQueryParam queryParam) { + PageInfo page = getSalaryStatisticsEmployeeService(user).listPage(queryParam); + return page; + } + + /** + * 员工详情列表 + * + * @param queryParam + * @return + */ + public Map detailList(SalaryStatisticsEmployeeDetailQueryParam queryParam) { + // 获取核算数据 + SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult = getSalaryStatisticsEmployeeService(user).getDetailSalaryAcctResult(queryParam); + List> records = getSalaryStatisticsEmployeeService(user).listDetailPage(salaryStatisticsEmployeeDetailResult, queryParam); + + Map countResultMap = Maps.newHashMap(); + countResultMap.put("id", "1000000"); + countResultMap.put("salaryMonth", "-"); + countResultMap.put("taxAgent", "-"); + countResultMap.put("incomeCategory", "-"); + if (CollectionUtils.isNotEmpty(records)) { + List salaryItems = salaryStatisticsEmployeeDetailResult.getSalaryItemList(); + for (SalaryItemPO item : salaryItems) { + BigDecimal sumBigDecimal = new BigDecimal(SalaryStatisticsReportBO.ZERO); + String itemKey = item.getId() + SalaryConstant.DYNAMIC_SUFFIX; + for (Map record : records) { + if (record.containsKey(itemKey)) { + if (Objects.nonNull(record.get(itemKey)) && StringUtils.isNotEmpty(record.get(itemKey).toString())) { + sumBigDecimal = sumBigDecimal.add(new BigDecimal(record.get(itemKey).toString())); + record.put(itemKey, ReportDataUtil.thousandthConvert(record.get(itemKey).toString())); + } + } + } + countResultMap.put(itemKey, ReportDataUtil.thousandthConvert(sumBigDecimal.toString())); + } + } + PageInfo> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), records); + + // 列表columns + List weaTableColumns = buildDetailTableColumns(salaryStatisticsEmployeeDetailResult); + + // 结果 + Map resultMap = Maps.newHashMap(); + resultMap.put("columns", weaTableColumns); + resultMap.put("pageInfo", pageInfo); + return resultMap; + } + + private List buildDetailTableColumns(SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult) { + // 表格表头 + List columns = new ArrayList<>(); + columns.add(new WeaTableColumn(SalaryI18nUtil.getI18nLabel( 87614, "薪资所属月"), "salaryMonth", "100")); + columns.add(new WeaTableColumn(SalaryI18nUtil.getI18nLabel( 86184, "个税扣缴义务人"), "taxAgent", "150")); + columns.add(new WeaTableColumn(SalaryI18nUtil.getI18nLabel( 121908, "收入所得项目"), "incomeCategory", "150")); + salaryStatisticsEmployeeDetailResult.getSalaryItemList().forEach(item -> { + columns.add(new WeaTableColumn(item.getName(), item.getId() + SalaryConstant.DYNAMIC_SUFFIX, "100")); + }); + return columns; + } + +// public Map exportDetailList(SalaryStatisticsEmployeeDetailQueryParam queryParam) { +// SalaryAssert.notNull(queryParam.getEmployeeId(), SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 163974, "人员id不能为空")); +// // 构建异步导出参数 +// Map map = salaryBatchService.buildeExportParam("exportSalaryStatisticsEmployeeDetailList"); +// LocalRunnable localRunnable = new LocalRunnable() { +// @Override +// public void execute() { +// try { +// DSTenantKeyThreadVar.tenantKey.set(currentTenantKey); +// getSalaryStatisticsEmployeeService(user).exportDetailList(map, queryParam); +// } finally { +// DSTenantKeyThreadVar.tenantKey.remove(); +// } +// } +// }; +// ThreadPoolUtil.execute(localRunnable); +// +// return map; +// } +} diff --git a/src/com/engine/salary/util/SalaryDateUtil.java b/src/com/engine/salary/util/SalaryDateUtil.java index 729bbd25c..af3eb35e2 100644 --- a/src/com/engine/salary/util/SalaryDateUtil.java +++ b/src/com/engine/salary/util/SalaryDateUtil.java @@ -585,6 +585,11 @@ public class SalaryDateUtil { ZoneId zoneOffset = StrUtil.isNotEmpty(offset) ? ZoneOffset.of(offset) : ZoneOffset.systemDefault(); return Date.from(dateTime.atZone(zoneOffset).toInstant()); } + + public static Date plusMonths(Date date, int i) { + LocalDate localDate = SalaryDateUtil.dateToLocalDate(date).plusMonths(i); + return SalaryDateUtil.localDateToDate(localDate); + } }