package com.engine.salary.entity.salaryarchive.bo; import com.cloudstore.eccom.constant.WeaBoolAttr; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.salary.common.LocalDateRange; import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveDataDTO; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveItemDataDTO; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveTaxAgentDataDTO; 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.util.SalaryI18nUtil; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * @Description: 薪资档案 * @Author: wangxiangzhong * @Date: 2021-11-03 10:51 */ public class SalaryArchiveBO { @Override public String toString() { return "SalaryArchiveBO{}"; } /** * 添加日期范围 * @param weaSearchCondition * @param employeeId * @param tenantKey */ // public static void addDatePickerRangeOtherParams(WeaSearchCondition weaSearchCondition, String datePickerKey, Long employeeId, String tenantKey) { // WeaSearchConditionItem datePickerItem = weaSearchCondition.getItems().get(datePickerKey); // Map otherParams = Maps.newHashMap(); // otherParams.put("isRange", true); // otherParams.put("type", "day"); // otherParams.put("startPlaceholder", SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 90648, "开始日期")); // otherParams.put("endPlaceholder", SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 90649, "结束日期")); // datePickerItem.setOtherParams(otherParams); // weaSearchCondition.getItems().put(datePickerKey, datePickerItem); // } /** * 构建表格动态列 * * @param salaryItems */ public static List buildSalaryArchiveTable(List salaryItems) { // 表格表头 List columns = new ArrayList<>(); WeaTableColumn idColumn = new WeaTableColumn("100px", "id", "id"); idColumn.setIsPrimarykey(WeaBoolAttr.TRUE); idColumn.setDisplay(WeaBoolAttr.FALSE); columns.add(idColumn); WeaTableColumn employeeIdColumn = new WeaTableColumn("100px", "人员信息表的主键id", "employeeId"); employeeIdColumn.setDisplay(WeaBoolAttr.FALSE); columns.add(employeeIdColumn); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(85429, "姓名"), "username")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "taxAgentName")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "分部"), "subcompanyName")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86185, "部门"), "departmentName")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86186, "手机号"), "mobile")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "员工状态"), "employeeStatus")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "起始发薪日期"), "payStartDate")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "最后发薪日期"), "payEndDate")); for (SalaryItemPO salaryItem : salaryItems) { columns.add(new WeaTableColumn("100px", salaryItem.getName(), salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)); } columns.add(new WeaTableColumn("100px", "操作", "operate")); return columns; } /** * 构建薪资档案数据 * * @param salaryArchiveList * @param salaryArchiveItemDataList * @param localDateRange * @param allEmployeeIds * @param isOnlyTaxAgent * @return */ public static List buildSalaryArchiveData(List salaryArchiveList, List salaryArchiveItemDataList, LocalDateRange localDateRange, List allEmployeeIds, boolean isOnlyTaxAgent) { // 开始日期 Date start = localDateRange.getFromDate(); // 结束日期 Date end = localDateRange.getEndDate(); List list = new ArrayList<>(); allEmployeeIds.forEach(e -> { // 同一个人的档案数据 List salaryArchives = salaryArchiveList.stream().filter(f -> f.getEmployeeId().equals(e)).collect(Collectors.toList()); List salaryArchiveIds = salaryArchives.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); // 同一个人的薪资项目调整历史数据 List salaryArchiveItems = salaryArchiveItemDataList.stream().filter(d -> salaryArchiveIds.contains(d.getSalaryArchiveId())).collect(Collectors.toList()); List salaryArchiveItemIds = salaryArchiveItems.stream().map(SalaryArchiveItemPO::getSalaryItemId).distinct().collect(Collectors.toList()); SalaryArchiveDataDTO salaryArchiveData = new SalaryArchiveDataDTO(); salaryArchiveData.setEmployeeId(e); List taxAgents = new ArrayList<>(); // 按个税扣缴义务人生效日期时间段切割 for (SalaryArchivePO salaryArchive : salaryArchives) { Date fromDate = salaryArchive.getPayStartDate(); Date endDate = salaryArchive.getPayEndDate(); // 起始发薪日不为空,且不能比结束日期晚,最后发薪日可空可不空,但是如果不为空,就不能比开始日期早,且起始发薪日不能晚于最后发薪日 boolean isEnable = fromDate != null && !fromDate.after(end) && (endDate == null || (!fromDate.after(endDate) && !endDate.before(start))); if (isEnable) { SalaryArchiveTaxAgentDataDTO taxAgent = new SalaryArchiveTaxAgentDataDTO(); taxAgent.setTaxAgentId(salaryArchive.getTaxAgentId()); // taxAgent.setIncomeCategory(salaryArchive.getIncomeCategory()); taxAgent.setEffectiveDateRange(LocalDateRange.builder().fromDate((fromDate.before(start) ? start : fromDate)).endDate(endDate == null || endDate.after(end) ? end : endDate).build()); // 薪资项目数据按个税扣缴义务人切割 if (!isOnlyTaxAgent) { // 开始日期 Date startItem = taxAgent.getEffectiveDateRange().getFromDate(); // 结束日期 Date endItem = taxAgent.getEffectiveDateRange().getEndDate(); Date endTempItem = endItem; List salaryItemValues = new ArrayList<>(); for (Long salaryArchiveItemId : salaryArchiveItemIds) { for (SalaryArchiveItemPO salaryArchiveItem : salaryArchiveItems) { if (!salaryArchiveItemId.equals(salaryArchiveItem.getSalaryItemId()) || !salaryArchiveItem.getSalaryArchiveId().equals(salaryArchive.getId())) { continue; } Date fromDateItem = salaryArchiveItem.getEffectiveTime(); if (fromDateItem.after(endTempItem) || (!endTempItem.after(startItem) && !endTempItem.equals(startItem))) { continue; } SalaryArchiveItemDataDTO salaryArchiveItemData = new SalaryArchiveItemDataDTO(); salaryArchiveItemData.setEffectiveDateRange(LocalDateRange.builder().fromDate((fromDateItem.before(startItem) ? startItem : fromDateItem)).endDate(endTempItem).build()); //排除1号调薪,之前的历史周期为2022-01-01-2022-01-01这种情况 if (!salaryArchiveItemData.getEffectiveDateRange().getFromDate().before(salaryArchiveItemData.getEffectiveDateRange().getEndDate())) { continue; } salaryArchiveItemData.setSalaryItemId(salaryArchiveItem.getSalaryItemId()); salaryArchiveItemData.setValue(salaryArchiveItem.getItemValue()); salaryItemValues.add(salaryArchiveItemData); endTempItem = fromDateItem; } endTempItem = endItem; } taxAgent.setSalaryItemValues(salaryItemValues); } taxAgents.add(taxAgent); } } salaryArchiveData.setTaxAgents(taxAgents); list.add(salaryArchiveData); }); return list; } }