From d24f9bf0a6d3a7764c25e0a01bc38afc43924115 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Mon, 14 Jul 2025 11:17:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B1=87=E9=80=9A=E4=BA=8C=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/action/batchEditSalaryAction.java | 164 +++++++++++ .../salaryacct/dto/HtSbqsChangeListDTO.java | 43 +++ .../salaryacct/param/HtjsApprovalParam.java | 4 + .../salaryacct/param/HtjsSIChangeParam.java | 32 ++ .../salaryarchive/bo/SalaryArchiveBO.java | 7 +- .../InsuranceAccountDetailMapper.xml | 4 +- .../salary/service/SIAccountService.java | 6 + .../service/SalaryAcctResultService.java | 9 +- .../service/impl/SIAccountServiceImpl.java | 274 ++++++++++++++++++ .../impl/SalaryAcctResultServiceImpl.java | 35 +++ .../impl/SalaryArchiveServiceImpl.java | 23 ++ .../salary/web/SalaryAcctController.java | 32 +- .../wrapper/SalaryAcctResultWrapper.java | 8 + .../salary/wrapper/SalaryArchiveWrapper.java | 4 +- 14 files changed, 635 insertions(+), 10 deletions(-) create mode 100644 src/com/engine/salary/action/batchEditSalaryAction.java create mode 100644 src/com/engine/salary/entity/salaryacct/dto/HtSbqsChangeListDTO.java create mode 100644 src/com/engine/salary/entity/salaryacct/param/HtjsSIChangeParam.java diff --git a/src/com/engine/salary/action/batchEditSalaryAction.java b/src/com/engine/salary/action/batchEditSalaryAction.java new file mode 100644 index 000000000..9aefc1723 --- /dev/null +++ b/src/com/engine/salary/action/batchEditSalaryAction.java @@ -0,0 +1,164 @@ +package com.engine.salary.action; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionParam; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; +import com.engine.salary.service.SalaryItemService; +import com.engine.salary.service.impl.SalaryItemServiceImpl; +import com.engine.salary.wrapper.SalaryArchiveWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.Cell; +import weaver.soa.workflow.request.Property; +import weaver.soa.workflow.request.RequestInfo; +import weaver.soa.workflow.request.Row; + +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +public class batchEditSalaryAction implements Action { + + + private SalaryArchiveWrapper getSalaryArchiveWrapper(User user) { + return ServiceUtil.getService(SalaryArchiveWrapper.class, user); + } + + private SalaryItemService getSalaryItemService(User user) { + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + + // private String tableName; + + private String ygid; + + private String gskjywr; + + private String sxrq; + + private String tzyy; + + private String salaryValue; + + private String salaryItemId; + + + // 是否执行action的字段, 0代表不执行,其余代表执行 + private String enableField; + + public String getEnableField() { + return enableField; + } + + public void setEnableField(String enableField) { + this.enableField = enableField; + } + + @Override + public String execute(RequestInfo requestInfo) { + try { + + Property[] properties = requestInfo.getMainTableInfo().getProperty(); + Map mainFieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, + property -> Util.null2String(property.getValue()))); + + // 明细表数据 + Row[] rows = requestInfo.getDetailTableInfo().getDetailTable(0).getRow(); + if (rows == null || rows.length == 0) { + log.error("汇通批量调薪,明细表为空"); + // 不执行action + return SUCCESS; + } + List> detailFieldMapList = new ArrayList<>(); + for (Row r : rows) { + Cell[] c = r.getCell();// 每行数据再按列存储 + // 指定列 + HashMap rowMap = new HashMap<>(); + for (Cell c1 : c) { + String name = c1.getName();// 明细字段名称 + String value = c1.getValue();// 明细字段的值 + rowMap.put(name, value); + } + detailFieldMapList.add(rowMap); + } + + String enable = mainFieldMap.get(enableField); + if (StringUtils.isNotBlank(enable) && enable.equals("0")) { + // 不执行action + return SUCCESS; + } + + User user = requestInfo.getRequestManager().getUser(); + if (!NumberUtils.isCreatable(salaryItemId)) { + requestInfo.getRequestManager().setMessage("薪资项目id未正确设置"); + return FAILURE_AND_CONTINUE; + } + SalaryItemPO salaryItem = getSalaryItemService(user).getById(Long.valueOf(salaryItemId)); + if (salaryItem == null) { + requestInfo.getRequestManager().setMessage("薪资项目不存在"); + return FAILURE_AND_CONTINUE; + } + // 封装参数 + List> importData = new ArrayList<>(); + for (Map singleDetailMap : detailFieldMapList) { + String employeeId = singleDetailMap.get(ygid); + String value = singleDetailMap.get(salaryValue); + String gskjywrName = ""; + if (StringUtils.isNotBlank(gskjywr) && gskjywr.startsWith("detail_")) { + gskjywrName = singleDetailMap.get(gskjywr.replace("detail_", "")); + } else { + gskjywrName = mainFieldMap.get(gskjywr); + } + String sxrqValue = ""; + if (StringUtils.isNotBlank(sxrq) && sxrq.startsWith("detail_")) { + sxrqValue = singleDetailMap.get(sxrq.replace("detail_", "")); + } else { + sxrqValue = mainFieldMap.get(sxrq); + } + String tzyyValue = ""; + if (StringUtils.isNotBlank(tzyy) && tzyy.startsWith("detail_")) { + tzyyValue = singleDetailMap.get(tzyy.replace("detail_", "")); + } else { + tzyyValue = mainFieldMap.get(tzyy); + } + HashMap singleMap = new HashMap<>(); + singleMap.put("员工id", employeeId); + singleMap.put("个税扣缴义务人", gskjywrName); + singleMap.put("生效日期", sxrqValue); + singleMap.put("调整原因", StringUtils.isBlank(tzyyValue) ? "调薪" : tzyyValue); + singleMap.put(salaryItem.getName(),value); + importData.add(singleMap); + } + + SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder() + .importDatas(importData) + .build(); + + //操作人 + Map map = getSalaryArchiveWrapper(user).adjustmentSalaryArchive(build); + + List errorNotice = (List) map.get("errorNotice"); + if (CollectionUtils.isNotEmpty(errorNotice)) { + log.error("调薪存在异常 requestId:{} map:{}", requestInfo.getRequestid(), map); + List> excelComments = (List>) map.get("errorNotice"); + StringBuilder message = new StringBuilder(""); + for (Map comments : excelComments) { + message.append(comments.get("message")).append("\n"); + } + requestInfo.getRequestManager().setMessage(message.toString()); + return FAILURE_AND_CONTINUE; + } + } catch (Exception e) { + log.error("调薪异常", e); + requestInfo.getRequestManager().setMessage(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + return SUCCESS; + } + +} diff --git a/src/com/engine/salary/entity/salaryacct/dto/HtSbqsChangeListDTO.java b/src/com/engine/salary/entity/salaryacct/dto/HtSbqsChangeListDTO.java new file mode 100644 index 000000000..7e0969f74 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/dto/HtSbqsChangeListDTO.java @@ -0,0 +1,43 @@ +package com.engine.salary.entity.salaryacct.dto; + +import com.engine.salary.annotation.TableTitle; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName HtSbqsListDTO + * @date 2024/10/29 15:45 + * @description 汇通社保请示流程 增减人员类别 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HtSbqsChangeListDTO { + + // 员工id + private Long employeeId; + + // 姓名 + @TableTitle(title = "姓名",dataIndex = "userName",key = "userName") + private String userName; + + // 身份证号 + @TableTitle(title = "身份证号",dataIndex = "idNo",key = "idNo") + private String idNo; + + // 变动月份 + @TableTitle(title = "变动月份",dataIndex = "changeDate",key = "changeDate") + private String changeDate; + + // 个人缴纳值 + @TableTitle(title = "个人缴纳值",dataIndex = "perValue",key = "perValue") + private String perValue; + + // 单位缴纳值 + @TableTitle(title = "单位缴纳值",dataIndex = "comValue",key = "comValue") + private String comValue; +} diff --git a/src/com/engine/salary/entity/salaryacct/param/HtjsApprovalParam.java b/src/com/engine/salary/entity/salaryacct/param/HtjsApprovalParam.java index 78e59ea7f..f02d6a755 100644 --- a/src/com/engine/salary/entity/salaryacct/param/HtjsApprovalParam.java +++ b/src/com/engine/salary/entity/salaryacct/param/HtjsApprovalParam.java @@ -45,5 +45,9 @@ public class HtjsApprovalParam extends BaseQueryParam { boolean sum; + private Long insuranceId; + + private boolean isIncrease; + } diff --git a/src/com/engine/salary/entity/salaryacct/param/HtjsSIChangeParam.java b/src/com/engine/salary/entity/salaryacct/param/HtjsSIChangeParam.java new file mode 100644 index 000000000..8ea0a21ad --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/HtjsSIChangeParam.java @@ -0,0 +1,32 @@ +package com.engine.salary.entity.salaryacct.param; + +import com.engine.salary.common.BaseQueryParam; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @ClassName HtjsApprovalParam + * @author Harryxzy + * @date 2024/10/22 14:38 + * @description 汇通建设 社保变动台账 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HtjsSIChangeParam extends BaseQueryParam { + + // 薪资所属月 + String salaryMonth; + + // 薪资所属月 + Date salaryMonthDate; + + // 姓名 + String userName; + +} diff --git a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java index 4261d8da2..be6872849 100644 --- a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java +++ b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java @@ -22,6 +22,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.math.NumberUtils; import java.util.*; @@ -61,7 +62,7 @@ public class SalaryArchiveBO { * * @param salaryItems */ - public static List buildSalaryArchiveTable(List salaryItems, boolean openSecondaryAccount) { + public static List buildSalaryArchiveTable(List salaryItems, boolean openSecondaryAccount, List runStatusList) { // 表格表头 List columns = new ArrayList<>(); WeaTableColumn idColumn = new WeaTableColumn("100px", "id", "id"); @@ -85,7 +86,9 @@ public class SalaryArchiveBO { columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "起始发薪日期"), "payStartDate")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "最后发薪日期"), "payEndDate")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "入职日期"), "companystartdate").setDisplay(WeaBoolAttr.FALSE)); -// columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "离职日期"), "dismissdate").setDisplay(WeaBoolAttr.FALSE)); + if (CollectionUtils.isNotEmpty(runStatusList) && (runStatusList.contains(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) || runStatusList.contains(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()))) { + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "离职日期"), "lzrq").setDisplay(WeaBoolAttr.FALSE)); + } for (SalaryItemPO salaryItem : salaryItems) { columns.add(new WeaTableColumn("100px", salaryItem.getName(), salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index cda35be75..a9da2f5e8 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -571,7 +571,9 @@ t.other_com_json,t.social_per_sum,t.social_com_sum, t.fund_per_sum,t.fund_com_sum,t.other_per_sum, t.other_com_sum,t.per_sum,t.com_sum,t.payment_status, - t.social_payment_base_string,t.fund_payment_base_string,t.other_payment_base_string, t.payment_organization + t.social_payment_base_string,t.fund_payment_base_string,t.other_payment_base_string, t.payment_organization, + t.social_payment_com_base_string, t.fund_payment_com_base_string, t.other_payment_com_base_string, + t.social_scheme_id,t.fund_scheme_id,t.other_scheme_id,t.bill_status,t.resource_from FROM hrsa_bill_detail t WHERE t.delete_type = 0 diff --git a/src/com/engine/salary/service/SIAccountService.java b/src/com/engine/salary/service/SIAccountService.java index a8248d0af..d2499e62a 100644 --- a/src/com/engine/salary/service/SIAccountService.java +++ b/src/com/engine/salary/service/SIAccountService.java @@ -1,6 +1,8 @@ package com.engine.salary.service; +import com.engine.salary.entity.salaryacct.dto.HtSbqsChangeListDTO; import com.engine.salary.entity.salaryacct.dto.HtSbqsListDTO; +import com.engine.salary.entity.salaryacct.param.HtjsSIChangeParam; import com.engine.salary.entity.siaccount.dto.InsuranceAccountTabDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.param.*; @@ -212,6 +214,8 @@ public interface SIAccountService { List welfareData4Htjs(String billMonth, Long socialSchemeId, Long fundSchemeId, Long otherSchemeId); + List htjsSbqsChangeDataList(String billMonth, Long socialSchemeId, Long fundSchemeId, Long otherSchemeId, Long insuranceId, Boolean isIncrease); + /** * 给套账提供字段名对应字段释义 * @@ -337,5 +341,7 @@ public interface SIAccountService { void batFile(AccountBatParam param); void batSocialSecurityBenefitsRecalculate(AccountBatParam batParam); + + PageInfo> htjsSIChangeList(HtjsSIChangeParam param); } diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index 986d6fc6d..9fa838d59 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -1,10 +1,7 @@ package com.engine.salary.service; import com.engine.salary.entity.datacollection.DataCollectionEmployee; -import com.engine.salary.entity.salaryacct.dto.ConsolidatedTaxDetailDTO; -import com.engine.salary.entity.salaryacct.dto.HtSbqsListDTO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultDetailDTO; -import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; +import com.engine.salary.entity.salaryacct.dto.*; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.util.page.PageInfo; @@ -226,4 +223,8 @@ public interface SalaryAcctResultService { Map htjsXczfsqList(HtjsApprovalParam param); List htjsSbqsList(HtjsApprovalParam param); + + PageInfo htjsSbqsChangeDataList(HtjsApprovalParam param); + + PageInfo> htjsSIChangeList(HtjsSIChangeParam param); } diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index d011de5f4..6b350adf0 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -22,7 +22,9 @@ import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.progress.ProgressDTO; +import com.engine.salary.entity.salaryacct.dto.HtSbqsChangeListDTO; import com.engine.salary.entity.salaryacct.dto.HtSbqsListDTO; +import com.engine.salary.entity.salaryacct.param.HtjsSIChangeParam; import com.engine.salary.entity.siaccount.bo.InsuranceAccountBO; import com.engine.salary.entity.siaccount.dto.*; import com.engine.salary.entity.siaccount.param.*; @@ -86,6 +88,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; +import weaver.wechat.util.Utils; import java.io.InputStream; import java.math.BigDecimal; @@ -1393,6 +1396,109 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { return htSbqsListDTOS; } + @Override + public List htjsSbqsChangeDataList(String billMonth, Long socialSchemeId, Long fundSchemeId, Long otherSchemeId, Long insuranceId, Boolean isIncrease) { + // 获取所有个税扣缴义务人 + List taxAgentList = getTaxAgentService(user).listAll(); + List insuranceAccountDetailPOS = new ArrayList<>(); + List commonStatusList = Arrays.asList(PaymentStatusEnum.COMMON.getValue()); + List statusList = Arrays.asList(PaymentStatusEnum.REPAIR.getValue(), PaymentStatusEnum.BALANCE.getValue()); + for (TaxAgentPO taxAgent : taxAgentList) { + InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, taxAgent.getId()); + insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); + if (insuranceAccountBatchPO == null || Objects.equals(BillStatusEnum.NOT_ARCHIVED.getValue(), insuranceAccountBatchPO.getBillStatus())) { + continue; + } + List insuranceAccountDetailList = getInsuranceAccountDetailMapper().queryList4Ht(billMonth, taxAgent.getId(), socialSchemeId, null, null, null, commonStatusList); + insuranceAccountDetailPOS.addAll(insuranceAccountDetailList); + // 获取这些人对应的补缴、补差数据 + List empList = insuranceAccountDetailList.stream().map(InsuranceAccountDetailPO::getEmployeeId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(empList)) { + insuranceAccountDetailPOS.addAll(getInsuranceAccountDetailMapper().queryList4Ht(billMonth, taxAgent.getId(), null, null, null, empList, statusList)); + } + } + + // 正常缴纳 + List commonInsuranceAccountDetailPOS = insuranceAccountDetailPOS.stream() + .filter(f -> f.getPaymentStatus().equals(PaymentStatusEnum.COMMON.getValue())) + .collect(Collectors.toList()); + // 获取各福利项的缴纳人数 + Map empInfoMap = getInsuranceApproEmpInfo4HtChangeData(commonInsuranceAccountDetailPOS, insuranceId); + List payedEmpList = (List)empInfoMap.get("payedEmpList"); + payedEmpList = payedEmpList == null ? Collections.emptyList() : payedEmpList; + Map socialPerMap = (Map)empInfoMap.get("socialPerMap"); + socialPerMap = socialPerMap == null ? new HashMap<>() : socialPerMap; + Map socialComMap = (Map)empInfoMap.get("socialComMap"); + socialComMap = socialComMap == null ? new HashMap<>() : socialComMap; + + // 获取上期社保数据 + List lastInsuranceAccountDetailPOS = new ArrayList<>(); + for (TaxAgentPO taxAgent : taxAgentList) { + + LocalDate localDate = SalaryDateUtil.dateToLocalDate(SalaryDateUtil.dateStrToLocalYearMonth(billMonth)); + String lastMonth = SalaryDateUtil.getFormatYearMonth(localDate.minusMonths(1)); + InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(lastMonth, taxAgent.getId()); + insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); + if (insuranceAccountBatchPO == null || Objects.equals(BillStatusEnum.NOT_ARCHIVED.getValue(), insuranceAccountBatchPO.getBillStatus())) { + continue; + } + lastInsuranceAccountDetailPOS.addAll(getInsuranceAccountDetailMapper().queryList4Ht(lastMonth, taxAgent.getId(), socialSchemeId, null, null, null,commonStatusList)); + } + + //退差数据不参与薪资核算 + lastInsuranceAccountDetailPOS = lastInsuranceAccountDetailPOS.stream() + .filter(f -> f.getPaymentStatus().equals(PaymentStatusEnum.COMMON.getValue()) + || f.getPaymentStatus().equals(PaymentStatusEnum.REPAIR.getValue()) + || f.getPaymentStatus().equals(PaymentStatusEnum.BALANCE.getValue()) ) + .collect(Collectors.toList()); + Map lastEmpInfoMap = getInsuranceApproEmpInfo4HtChangeData(lastInsuranceAccountDetailPOS, insuranceId); + + List lastPayedEmpList = (List)lastEmpInfoMap.get("payedEmpList"); + lastPayedEmpList = lastPayedEmpList == null ? new ArrayList<>() : lastPayedEmpList; + Map lastSocialPerMap = (Map)lastEmpInfoMap.get("socialPerMap"); + lastSocialPerMap = lastSocialPerMap == null ? new HashMap<>() : lastSocialPerMap; + Map lastSocialComMap = (Map)lastEmpInfoMap.get("socialComMap"); + lastSocialComMap = lastSocialComMap == null ? new HashMap<>() : lastSocialComMap; + + List resultList = new ArrayList<>(); + if (isIncrease) { + // 本月新增人员id + List finalLastPayedEmpList = lastPayedEmpList; + List increaseEmpIds = payedEmpList.stream().distinct().filter(empId -> !finalLastPayedEmpList.contains(empId)).collect(Collectors.toList()); + List employeeList = getSalaryEmployeeService(user).listByIds(increaseEmpIds); + for (DataCollectionEmployee emp : employeeList) { + HtSbqsChangeListDTO dto = HtSbqsChangeListDTO.builder() + .employeeId(emp.getEmployeeId()) + .userName(emp.getUsername()) + .idNo(emp.getIdNo()) + .changeDate(billMonth) + .build(); + dto.setPerValue(Utils.null2String(socialPerMap.get(emp.getEmployeeId()))); + dto.setComValue(Utils.null2String(socialComMap.get(emp.getEmployeeId()))); + resultList.add(dto); + } + } else { + // 本月减少人员id + List finalPayedEmpList = payedEmpList; + List decreaseEmpIds = lastPayedEmpList.stream().filter(empId -> !finalPayedEmpList.contains(empId)).collect(Collectors.toList()); + List employeeList = getSalaryEmployeeService(user).listByIds(decreaseEmpIds); + for (DataCollectionEmployee emp : employeeList) { + HtSbqsChangeListDTO dto = HtSbqsChangeListDTO.builder() + .employeeId(emp.getEmployeeId()) + .userName(emp.getUsername()) + .idNo(emp.getIdNo()) + .changeDate(billMonth) + .build(); + dto.setPerValue(Utils.null2String(lastSocialPerMap.get(emp.getEmployeeId()))); + dto.setComValue(Utils.null2String(lastSocialComMap.get(emp.getEmployeeId()))); + resultList.add(dto); + } + } + + // 获取这些员工的社保缴纳数据 + return resultList; + } + @Override public Map welfareColumns() { List listAll = getICategoryMapper().listAll().stream().filter(f -> f.getIsUse().equals(IsUseEnum.START.getValue())).collect(Collectors.toList()); @@ -2005,6 +2111,77 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { return resultMap; } + + public Map getInsuranceApproEmpInfo4HtChangeData(List list, Long singleInsuranceId) { + Map resultMap = new HashMap<>(); + if (CollectionUtils.isEmpty(list) || singleInsuranceId == null) { + return resultMap; + } + + String singleInsuranceIdStr = singleInsuranceId.toString(); + Map> employeeMap = list.stream().filter(item -> item.getEmployeeId() != null) + .collect(Collectors.groupingBy(InsuranceAccountDetailPO::getEmployeeId)); + List payedEmpList = new ArrayList<>(); + + Map socialPerMap = new HashMap<>(); + Map socialComMap = new HashMap<>(); + for (Map.Entry> entry : employeeMap.entrySet()) { + Long k = entry.getKey(); + List v = entry.getValue(); + for (InsuranceAccountDetailPO item : v) { + encryptUtil.decrypt(item, InsuranceAccountDetailPO.class); + if (StringUtils.isNotBlank(item.getSocialPerJson())) { + Map socialJson = JSON.parseObject(item.getSocialPerJson(), new HashMap().getClass()); + if (socialJson != null) { + socialJson.forEach((insuranceId, num) -> { + if (singleInsuranceIdStr.equals(insuranceId)) { + if (socialPerMap.get(k) == null) { + socialPerMap.put(k, num); + } else { + String oldNum = socialPerMap.get(k); + BigDecimal oldDecimal = new BigDecimal(oldNum); + BigDecimal numDecimal = num == null ? new BigDecimal("0") : new BigDecimal(num); + BigDecimal insuanceNum = numDecimal.add(oldDecimal); + socialPerMap.put(k, insuanceNum.toPlainString()); + } + + if (StringUtils.isNotBlank(num) && NumberUtils.isNumber(num) && new BigDecimal(num).compareTo(BigDecimal.ZERO) != 0) { + payedEmpList.add(item.getEmployeeId()); + } + } + }); + } + } + if (StringUtils.isNotBlank(item.getSocialComJson())) { + Map socialJson = JSON.parseObject(item.getSocialComJson(), new HashMap().getClass()); + if (socialJson != null) { + socialJson.forEach((insuranceId, num) -> { + if (singleInsuranceIdStr.equals(insuranceId)) { + if (socialComMap.get(k) == null) { + socialComMap.put(k, num); + } else { + String oldNum = socialComMap.get(k); + BigDecimal insuanceNum = new BigDecimal("0"); + BigDecimal oldDecimal = new BigDecimal(oldNum); + BigDecimal numDecimal = num == null ? new BigDecimal("0") : new BigDecimal(num); + insuanceNum = insuanceNum.add(numDecimal).add(oldDecimal); + socialComMap.put(k, insuanceNum.toPlainString()); + } + if (StringUtils.isNotBlank(num) && NumberUtils.isNumber(num) && new BigDecimal(num).compareTo(BigDecimal.ZERO) != 0) { + payedEmpList.add(item.getEmployeeId()); + } + } + }); + } + } + } + } + resultMap.put("payedEmpList", payedEmpList); + resultMap.put("socialPerMap", socialPerMap); + resultMap.put("socialComMap", socialComMap); + return resultMap; + } + @Override public List allInspects(Collection ids, String billMonth) { // InsuranceAccountInspectMapper siAccountInspectMapper = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class); @@ -7537,5 +7714,102 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { } /*****以上代码为SIAccountBiz中方法逻辑迁移,旨在减少Biz类的使用*****/ + @Override + public PageInfo> htjsSIChangeList(HtjsSIChangeParam param) { + // 获取本月社保福利台账数据 + List insuranceAccountBatchPOS = getInsuranceAccountBatchMapper().listByBillMonth(SalaryDateUtil.getFormatYearMonth(param.getSalaryMonthDate()), null); + if (CollectionUtils.isEmpty(insuranceAccountBatchPOS)) { + return SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize()); + } + // 没有归档的义务人 + List notFiledTaxAgentIds = insuranceAccountBatchPOS.stream().filter(po -> po.getBillStatus().equals(BillStatusEnum.NOT_ARCHIVED.getValue())).map(InsuranceAccountBatchPO::getPaymentOrganization).collect(Collectors.toList()); + OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); + InsuranceAccountDetailParam detailQueryParam = InsuranceAccountDetailParam.builder().paymentStatus(PaymentStatusEnum.COMMON.getValue()).billMonth(param.getSalaryMonth()).build(); + detailQueryParam.setOrderRule(orderRule); + //系统人员福利台账明细 + List insuranceAccountDetailPOS = getInsuranceAccountDetailMapper().list(detailQueryParam); + insuranceAccountDetailPOS = insuranceAccountDetailPOS.stream() + .filter(f -> f.getPaymentStatus().equals(PaymentStatusEnum.COMMON.getValue())) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notFiledTaxAgentIds)) { + // 过滤未归档的 + insuranceAccountDetailPOS = insuranceAccountDetailPOS.stream() + .filter(f -> !notFiledTaxAgentIds.contains(f.getPaymentOrganization())) + .collect(Collectors.toList()); + } + + // 获取上月的社保福利台账数据 + Date lastMonthDate = SalaryDateUtil.localDateToDate(SalaryDateUtil.dateToLocalDate(param.getSalaryMonthDate()).minusMonths(1)); + List lastInsuranceAccountBatchPOS = getInsuranceAccountBatchMapper().listByBillMonth(SalaryDateUtil.getFormatLocalDate(lastMonthDate), null); + // 没有归档的义务人 + List lastNotFiledTaxAgentIds = lastInsuranceAccountBatchPOS.stream().filter(po -> po.getBillStatus().equals(BillStatusEnum.NOT_ARCHIVED.getValue())).map(InsuranceAccountBatchPO::getPaymentOrganization).collect(Collectors.toList()); + + detailQueryParam.setBillMonth(SalaryDateUtil.getFormatYearMonth(lastMonthDate)); + //系统人员福利台账明细 + List lastInsuranceAccountDetailPOS = getInsuranceAccountDetailMapper().list(detailQueryParam); + lastInsuranceAccountDetailPOS = lastInsuranceAccountDetailPOS.stream() + .filter(f -> f.getPaymentStatus().equals(PaymentStatusEnum.COMMON.getValue())) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(notFiledTaxAgentIds)) { + // 过滤未归档的 + lastInsuranceAccountDetailPOS = lastInsuranceAccountDetailPOS.stream() + .filter(f -> !notFiledTaxAgentIds.contains(f.getPaymentOrganization()) && !lastNotFiledTaxAgentIds.contains(f.getPaymentOrganization())) + .collect(Collectors.toList()); + } + + // 过滤出本月社保、公积金、其他方案发生变化的台账明细 + Map lastMonthDetailMap = SalaryEntityUtil.convert2Map(lastInsuranceAccountDetailPOS, po -> po.getPaymentOrganization() + "_split" + po.getEmployeeId()); + List changeDetail = new ArrayList<>(); + for (InsuranceAccountDetailPO thisMonthPO : insuranceAccountDetailPOS) { + InsuranceAccountDetailPO lastMonthPO = lastMonthDetailMap.get(thisMonthPO.getPaymentOrganization() + "_split" + thisMonthPO.getEmployeeId()); + if (lastMonthPO == null) { + changeDetail.add(thisMonthPO); + } else { + boolean socialEqual,fundEqual,otherEqual; + try { + socialEqual = (thisMonthPO.getSocialSchemeId() == null && lastMonthPO.getSocialSchemeId() == null) ? true : + thisMonthPO.getSocialSchemeId().equals(lastMonthPO.getSocialSchemeId()); + fundEqual = (thisMonthPO.getFundSchemeId() == null && lastMonthPO.getFundSchemeId() == null) ? true : + thisMonthPO.getFundSchemeId().equals(lastMonthPO.getFundSchemeId()); + otherEqual = (thisMonthPO.getOtherSchemeId() == null && lastMonthPO.getOtherSchemeId() == null) ? true : + thisMonthPO.getOtherSchemeId().equals(lastMonthPO.getOtherSchemeId()); + } catch (Exception e) { + socialEqual = false; + fundEqual = false; + otherEqual = false; + } + if (socialEqual && fundEqual && otherEqual) { + // 方案全相等不处理 + } else { + changeDetail.add(thisMonthPO); + } + } + } + if (CollectionUtils.isEmpty(changeDetail)) { + return SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize()); + } + + if (StringUtils.isNotEmpty(param.getUserName())) { + List employeeIds = changeDetail.stream().map(f -> f.getEmployeeId()).distinct().collect(Collectors.toList()); + List employeeList = getSalaryEmployeeService(user).listByIds(employeeIds); + List empIds = employeeList.stream().filter(f -> param.getUserName().contains(f.getUsername())).map(DataCollectionEmployee::getEmployeeId).collect(Collectors.toList()); + changeDetail = changeDetail.stream().filter(f -> empIds.contains(f.getEmployeeId())).collect(Collectors.toList()); + } + PageInfo pageInfo = new PageInfo<>(changeDetail, InsuranceAccountDetailPO.class); + List changeDetailList = pageInfo.getList(); + encryptUtil.decryptList(changeDetailList, InsuranceAccountDetailPO.class); + //数据组装 + List> records = getService(user).buildCommonRecords(changeDetailList, Long.valueOf(user.getUID()), false); + PageInfo> pageInfos = new PageInfo<>(records); + pageInfos.setTotal(pageInfo.getTotal()); + pageInfos.setPageNum(param.getCurrent()); + pageInfos.setPageSize(param.getPageSize()); + + //动态列组装 + List weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(changeDetailList, Long.valueOf(user.getUID()), SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, PaymentStatusEnum.COMMON.getValue()); + List columns = weaTableColumn.stream().map(v -> new Column(v.getText(), v.getColumn(), v.getColumn())).collect(Collectors.toList()); + pageInfos.setColumns(columns); + return pageInfos; + } } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index e6f5e9355..9ffa4e8e7 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -52,6 +52,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; @@ -1535,4 +1536,38 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe // return getSIAccountService(user).welfareData4Htjs(param.getSalaryMonth(), null, null, param.getSchemeId()); // } } + + @Override + public PageInfo htjsSbqsChangeDataList(HtjsApprovalParam param) { + if (param.getSchemeId() == null || StringUtils.isBlank(param.getSalaryMonth())) { + return SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize()); + } + InsuranceSchemePO insuranceSchemePO = getInsuranceSchemeMapper().getById(param.getSchemeId()); + if (insuranceSchemePO == null) { + throw new SalaryRunTimeException("社保福利方案不存在或已被删除"); + } + List changeList = getSIAccountService(user).htjsSbqsChangeDataList(param.getSalaryMonth(), param.getSchemeId(), param.getFundSchemeId(), param.getOtherSchemeId(), param.getInsuranceId(), param.isIncrease()); + + PageInfo pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), changeList, HtSbqsChangeListDTO.class); + + if (!param.isIncrease()) { + List cols = pageInfo.getColumns().stream().filter(col -> !col.getKey().equals("perValue") && !col.getKey().equals("comValue")).collect(Collectors.toList()); + pageInfo.clearAndSetColumns(cols); + } + return pageInfo; + } + + /** + * 汇通社保异动列表 + * @param param + */ + @Override + public PageInfo> htjsSIChangeList(HtjsSIChangeParam param) { + if (!SalaryDateUtil.checkYearMonth(param.getSalaryMonth())) { + return SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize()); + } + Date salaryMonthDate = SalaryDateUtil.dateStrToLocalYearMonth(param.getSalaryMonth()); + param.setSalaryMonthDate(salaryMonthDate); + return getSIAccountService(user).htjsSIChangeList(param); + } } \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java index ceab506eb..6ed8c33df 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java @@ -65,9 +65,12 @@ import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.transaction.annotation.Transactional; +import weaver.conn.RecordSet; import weaver.file.ImageFileManager; +import weaver.general.BaseBean; import weaver.general.Util; import weaver.hrm.User; +import weaver.wechat.util.Utils; import java.io.InputStream; import java.math.BigDecimal; @@ -497,6 +500,19 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe // return map; // }).collect(Collectors.toList()); Map longTaxAgentPOMap = SalaryEntityUtil.convert2Map(taxAgentLists, TaxAgentPO::getId); + // 获取汇通离职日 + BaseBean baseBean = new BaseBean(); + List empIds = salaryArchives.stream().map(SalaryArchiveListDTO::getEmployeeId).distinct().collect(Collectors.toList()); + String lzrqField = baseBean.getPropValue("htjsSalaryApproval", "lzrq_field_id"); + RecordSet rs = new RecordSet(); + Map lzrqMap = new HashMap<>(); + List> partition = Lists.partition(empIds, 800); + partition.forEach(part -> { + rs.execute("select id," + lzrqField +" from cus_fielddata where scopeid=3 and id in (" + StringUtils.join(part, ",") + ")"); + while (rs.next()) { + lzrqMap.put(Long.valueOf(rs.getInt("id")), rs.getString(lzrqField)); + } + }); // 3.组装数据 List> listMaps = new ArrayList<>(); salaryArchives.forEach(e -> { @@ -526,6 +542,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe map.put("payEndDate", SalaryDateUtil.getFormatLocalDate(e.getPayEndDate())); map.put("companystartdate", e.getCompanystartdate()); map.put("dismissdate", e.getDismissdate()); + map.put("lzrq", Utils.null2String(lzrqMap.get(e.getEmployeeId()))); // 薪资项目动态 Optional> optionalItem = salaryArchiveItemData.stream().filter(f -> f.get("salaryArchiveId").toString().equals(e.getId().toString())).findFirst(); @@ -557,6 +574,9 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe }; // 2.表头 List headerList = new ArrayList<>(Arrays.asList(header)); + if (queryParam.getRunStatusList().contains(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()) || queryParam.getRunStatusList().contains(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) ) { + headerList.add(new WeaTableColumnGroup("150px", SalaryI18nUtil.getI18nLabel(0, "离职日期"), "", "", 0)); + } for (SalaryItemPO salaryItem : salaryItems) { headerList.add(new WeaTableColumnGroup("150px", salaryItem.getName(), "", "", salaryItem.getPattern())); } @@ -611,6 +631,9 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe row.add(Util.null2String(e.get("employeeStatus"))); row.add(Util.null2String(e.get("payStartDate"))); row.add(Util.null2String(e.get("payEndDate"))); + if (queryParam.getRunStatusList().contains(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()) || queryParam.getRunStatusList().contains(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) ) { + row.add(Util.null2String(e.get("lzrq"))); + } // 薪资项目数据 for (SalaryItemPO salaryItem : salaryItems) { try { diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index d243cdfca..ab71509ac 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -1109,7 +1109,7 @@ public class SalaryAcctController { } /** - * 薪酬支付申请list + * 保险请示list * @param request * @param response * @param param @@ -1122,5 +1122,35 @@ public class SalaryAcctController { User user = HrmUserVarify.getUser(request, response); return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::htjsSbqsList, param); } + + /** + * 保险请示增减数据穿透 + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/htjs/sbqsDataPerspective") + @Produces(MediaType.APPLICATION_JSON) + public String htjsSbqsChangeDataList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody HtjsApprovalParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::htjsSbqsChangeDataList, param); + } + + /** + * 社保变动台账 + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/htjs/SIChangeList") + @Produces(MediaType.APPLICATION_JSON) + public String htjsSIChangeList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody HtjsSIChangeParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>>(user).run(getSalaryAcctResultWrapper(user)::htjsSIChangeList, param); + } /**********************************汇通建设送薪审批 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 209fa6144..2cc5e8e48 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -402,6 +402,14 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult return getSalaryAcctResultService(user).htjsSbqsList(param); } + public PageInfo htjsSbqsChangeDataList(HtjsApprovalParam param) { + return getSalaryAcctResultService(user).htjsSbqsChangeDataList(param); + } + + public PageInfo> htjsSIChangeList(HtjsSIChangeParam param) { + return getSalaryAcctResultService(user).htjsSIChangeList(param); + } + /** * 薪资核算-校验 * diff --git a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java index 85977afe1..61aab6978 100644 --- a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java @@ -111,7 +111,7 @@ public class SalaryArchiveWrapper extends Service { //动态列组装 - List columns = SalaryArchiveBO.buildSalaryArchiveTable(salaryItems, openSecondaryAccount); + List columns = SalaryArchiveBO.buildSalaryArchiveTable(salaryItems, openSecondaryAccount, queryParam.getRunStatusList()); SalaryWeaTable table = new SalaryWeaTable(user, SalaryArchiveListDTO.class); table.setColumns(columns); @@ -163,7 +163,7 @@ public class SalaryArchiveWrapper extends Service { //动态列组装 - List columns = SalaryArchiveBO.buildSalaryArchiveTable(salaryItems, openSecondaryAccount); + List columns = SalaryArchiveBO.buildSalaryArchiveTable(salaryItems, openSecondaryAccount, queryParam.getRunStatusList()); SalaryWeaTable table = new SalaryWeaTable(user, SalaryArchiveListDTO.class); table.setColumns(columns);