五院二开-部门汇总表

This commit is contained in:
钱涛 2025-10-20 09:48:47 +08:00
parent b4f0acf4ce
commit 7b9a8eac9b
4 changed files with 94 additions and 16 deletions

View File

@ -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+"";
}

View File

@ -454,6 +454,14 @@ public class SalaryAcctController {
return new ResponseResult<SalaryAcctResultQueryParam, Map<String, Object>>(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<SalaryAcctResultQueryParam, Map<String, Object>>(user).run(getSalaryAcctResultWrapper(user)::departmentListPage, param);
}
//合计行
@POST
@Path("/acctresult/sum")

View File

@ -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<String, Object> 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<Long> salaryItemIds = Arrays.stream(salaryItemIdsStr.split(",")).map(Long::valueOf).collect(Collectors.toList());
List<SalaryItemPO> salaryItemPOList = getSalaryItemService(user).listByIds(salaryItemIds);
Map<Long, String> itemNameMap = SalaryEntityUtil.convert2LinkedMap(salaryItemPOList, SalaryItemPO::getId, SalaryItemPO::getName);
// 表格表头
List<WeaTableColumn> 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<SalaryAcctEmployeePO> employeePOS = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordId);
List<Long> salaryAcctEmpIds = SalaryEntityUtil.properties(employeePOS, SalaryAcctEmployeePO::getId, Collectors.toList());
//核算数据结果
List<SalaryAcctResultPO> list = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
Map<Long, List<SalaryAcctResultPO>> acctEmpIdMap = SalaryEntityUtil.group2Map(list, SalaryAcctResultPO::getSalaryAcctEmpId);
//按部门分组
List<Map<String, String>> result = new ArrayList<>();
Map<Long, List<SalaryAcctEmployeePO>> departmentEmpMap = SalaryEntityUtil.group2Map(employeePOS, SalaryAcctEmployeePO::getDepartmentId);
for (Long departmentId : departmentEmpMap.keySet()) {
List<SalaryAcctEmployeePO> departmentEmps = departmentEmpMap.get(departmentId);
List<Long> departmentEmpIds = SalaryEntityUtil.properties(departmentEmps, SalaryAcctEmployeePO::getId, Collectors.toList());
Map<Long, List<SalaryAcctResultPO>> resultMap = acctEmpIdMap.keySet().stream().filter(departmentEmpIds::contains).map(acctEmpIdMap::get).flatMap(Collection::stream).collect(Collectors.groupingBy(SalaryAcctResultPO::getSalaryItemId));
Map<String, String> 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<String, Object> 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) {

View File

@ -537,7 +537,7 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy
List<WeaTableColumn> 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<WeaTableColumn> 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;
}