From 7b9a8eac9b40dc39823970aba9f5c9dbca9422dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 20 Oct 2025 09:48:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=94=E9=99=A2=E4=BA=8C=E5=BC=80-=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E6=B1=87=E6=80=BB=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/util/page/SalaryPageUtil.java | 3 +- .../salary/web/SalaryAcctController.java | 8 ++ .../wrapper/SalaryAcctResultWrapper.java | 87 +++++++++++++++++-- .../salary/wrapper/SalarySendWrapper.java | 12 +-- 4 files changed, 94 insertions(+), 16 deletions(-) diff --git a/src/com/engine/salary/util/page/SalaryPageUtil.java b/src/com/engine/salary/util/page/SalaryPageUtil.java index bf118b462..8493a1278 100644 --- a/src/com/engine/salary/util/page/SalaryPageUtil.java +++ b/src/com/engine/salary/util/page/SalaryPageUtil.java @@ -102,7 +102,8 @@ public class SalaryPageUtil { if (width != null && width != 0) { return width + ""; } - Rectangle2D bounds = font.getStringBounds(chars, frc); + //五院二开,默认6个字符 + Rectangle2D bounds = font.getStringBounds("只用占六字符", frc); int pxLength = (int) Math.ceil(bounds.getWidth()) + 55; return pxLength < 90 ? 90+"" : pxLength+""; } diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 57483fd40..75a5338de 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -454,6 +454,14 @@ public class SalaryAcctController { return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::listPage, param); } + @POST + @Path("/acctresult/department/list") + @Produces(MediaType.APPLICATION_JSON) + public String departmentResult(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::departmentListPage, param); + } + //合计行 @POST @Path("/acctresult/sum") diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 097092b2e..34ca6a59d 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -1,5 +1,7 @@ package com.engine.salary.wrapper; +import cn.hutool.core.util.NumberUtil; +import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.cache.SalaryCacheKey; @@ -10,12 +12,16 @@ 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.exception.SalaryRunTimeException; 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.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.valid.ValidUtil; @@ -23,10 +29,12 @@ import com.engine.salary.wrapper.proxy.SalaryAcctResultWrapperProxy; import lombok.extern.slf4j.Slf4j; 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; import java.util.*; +import java.util.stream.Collectors; /** * 薪资核算结果 @@ -78,6 +86,14 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult return ServiceUtil.getService(SalaryApprovalRuleServiceImpl.class, user); } + private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { + return ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); + } + + private SalaryItemService getSalaryItemService(User user) { + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + /** * 薪资核算列表 * @@ -105,6 +121,64 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult return datas; } + + public Map departmentListPage(SalaryAcctResultQueryParam queryParam) { + + // 查询薪资核算记录 + Long salaryAcctRecordId = queryParam.getSalaryAcctRecordId(); + SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); + if (Objects.isNull(salaryAcctRecordPO)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); + } + + //查询配置的薪资项目 + String salaryItemIdsStr = new BaseBean().getPropValue("hrmSalaryWuYuan", "salaryItemIds"); + if (StringUtils.isBlank(salaryItemIdsStr)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资项ID不能为空")); + } + List salaryItemIds = Arrays.stream(salaryItemIdsStr.split(",")).map(Long::valueOf).collect(Collectors.toList()); + List salaryItemPOList = getSalaryItemService(user).listByIds(salaryItemIds); + Map itemNameMap = SalaryEntityUtil.convert2LinkedMap(salaryItemPOList, SalaryItemPO::getId, SalaryItemPO::getName); + + // 表格表头 + List columns = itemNameMap.keySet().stream().map(itemId -> new WeaTableColumn("100px", itemNameMap.get(itemId), itemId.toString())).collect(Collectors.toList()); + columns.add(0, new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "部门"), "departmentName")); + + + //核算内的人员 + List employeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordId); + List salaryAcctEmpIds = SalaryEntityUtil.properties(employeePOS, SalaryAcctEmployeePO::getId, Collectors.toList()); + + //核算数据结果 + List list = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); + Map> acctEmpIdMap = SalaryEntityUtil.group2Map(list, SalaryAcctResultPO::getSalaryAcctEmpId); + + //按部门分组 + List> result = new ArrayList<>(); + Map> departmentEmpMap = SalaryEntityUtil.group2Map(employeePOS, SalaryAcctEmployeePO::getDepartmentId); + for (Long departmentId : departmentEmpMap.keySet()) { + List departmentEmps = departmentEmpMap.get(departmentId); + List departmentEmpIds = SalaryEntityUtil.properties(departmentEmps, SalaryAcctEmployeePO::getId, Collectors.toList()); + Map> resultMap = acctEmpIdMap.keySet().stream().filter(departmentEmpIds::contains).map(acctEmpIdMap::get).flatMap(Collection::stream).collect(Collectors.groupingBy(SalaryAcctResultPO::getSalaryItemId)); + + Map row = new HashMap<>(); + row.put("departmentName", departmentEmps.get(0).getDepartmentName()); + + resultMap.keySet().forEach(itemId -> { + BigDecimal sum = resultMap.getOrDefault(itemId, new ArrayList<>()).stream().map(SalaryAcctResultPO::getResultValue).filter(NumberUtil::isNumber).map(BigDecimal::new).reduce(BigDecimal.ZERO, BigDecimal::add); + row.put(itemId.toString(), sum.toPlainString()); + }); + + result.add(row); + } + + Map datas = new HashMap<>(); + datas.put("columns", columns); + datas.put("list", result); + + return datas; + } + /** * 合计行 * @@ -230,18 +304,11 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult // 检查是否正在核算中 ProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId()); if (Objects.nonNull(salaryAcctProgressDTO) && salaryAcctProgressDTO.isStatus() && Optional.ofNullable(salaryAcctProgressDTO.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) { - log.warn("正在核算中,无法再次执行"+calculateParam.getSalaryAcctRecordId()); + log.warn("正在核算中,无法再次执行" + calculateParam.getSalaryAcctRecordId()); return; } // 初始化进度 - ProgressDTO initProgress = new ProgressDTO() - .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) - .setTitleLabelId(97515L) - .setTotalQuantity(NumberUtils.INTEGER_ONE) - .setCalculatedQuantity(NumberUtils.INTEGER_ZERO) - .setProgress(BigDecimal.ZERO) - .setStatus(true) - .setMessage(StringUtils.EMPTY); + ProgressDTO initProgress = new ProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(NumberUtils.INTEGER_ONE).setCalculatedQuantity(NumberUtils.INTEGER_ZERO).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY); getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + calculateParam.getSalaryAcctRecordId(), initProgress); // 异步执行薪资核算 // LocalRunnable localRunnable = new LocalRunnable() { @@ -261,6 +328,7 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult /** * 检查是否有薪资核算结果的查看权限 + * * @param salaryAcctRecordId */ public Boolean checkAuth(Long salaryAcctRecordId) { @@ -273,6 +341,7 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult /** * 薪资核算结果批量更新 + * * @param param */ public void batchUpdate(SalaryAcctResultBatchUpdateParam param) { diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index cf263db9d..e8cc45803 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -537,7 +537,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy List columns = buildDetailListWeaTableColumns(); for (SalaryTemplateSalaryItemListDTO salaryItem : salaryItems) { - columns.add(new WeaTableColumn("100px", salaryItem.getName(), salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)); + columns.add(new WeaTableColumn(SalaryPageUtil.selfAdaption(salaryItem.getName(), 0), salaryItem.getName(), salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)); } @@ -569,11 +569,11 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy List list = new ArrayList<>(); WeaTableColumn idColumn = new WeaTableColumn("0px", "id", "id"); idColumn.setDisplay(WeaBoolAttr.TRUE); - list.add(new WeaTableColumn("100px", "姓名", "username")); - list.add(new WeaTableColumn("100px", "个税扣缴义务人", "taxAgent")); - list.add(new WeaTableColumn("100px", "部门", "department")); - list.add(new WeaTableColumn("100px", "手机号", "mobile")); - list.add(new WeaTableColumn("100px", "工号", "jobNum")); + list.add(new WeaTableColumn(SalaryPageUtil.selfAdaption("姓名", 0), "姓名", "username")); + list.add(new WeaTableColumn(SalaryPageUtil.selfAdaption("个税扣缴义务人", 0), "个税扣缴义务人", "taxAgent")); + list.add(new WeaTableColumn(SalaryPageUtil.selfAdaption("部门", 0), "部门", "department")); + list.add(new WeaTableColumn(SalaryPageUtil.selfAdaption("手机号", 0), "手机号", "mobile")); + list.add(new WeaTableColumn(SalaryPageUtil.selfAdaption("工号", 0), "工号", "jobNum")); return list; }