package com.engine.salary.service.impl; import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.jdbc.StringUtils; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.enums.siaccount.PaymentStatusEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.mapper.siaccount.InsuranceCompensationConfigMapper; import com.engine.salary.mapper.siaccount.InsuranceCompensationMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.service.ColumnBuildService; import com.engine.salary.service.SIAccountService; import com.engine.salary.service.SICategoryService; import com.engine.salary.service.SICompensationService; import com.engine.salary.util.SalaryAssert; 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 dm.jdbc.util.IdGenerator; import org.springframework.beans.BeanUtils; import weaver.hrm.User; import java.math.BigDecimal; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @Author: sy * @Description: 福利台账-调差实现类 * @Date: 2022/11/23 **/ public class SICompensationServiceImpl extends Service implements SICompensationService { private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() { return MapperProxyFactory.getProxy(InsuranceAccountDetailMapper.class); } private EmployMapper getEmployMapper() { return MapperProxyFactory.getProxy(EmployMapper.class); } public SICategoryService getSICategoryService(User user) { return ServiceUtil.getService(SICategoryServiceImpl.class, user); } private SIAccountService getSIAccountService(User user) { return ServiceUtil.getService(SIAccountServiceImpl.class, user); } private InsuranceCompensationMapper getInsuranceCompensationMapper() { return MapperProxyFactory.getProxy(InsuranceCompensationMapper.class); } private InsuranceCompensationConfigMapper getInsuranceCompensationConfigMapper() { return MapperProxyFactory.getProxy(InsuranceCompensationConfigMapper.class); } public ColumnBuildService getColumnBuildService(User user) { return ServiceUtil.getService(ColumnBuildServiceImpl.class, user); } /** * 可调差人员 */ @Override public PageInfo getEmployeeListToCompensation(HrmQueryParam param) { // 当前登录人员 Long currentEmployeeId = (long) user.getUID(); //查询账单月份+个税扣缴义务人下的社保福利正常缴纳人员列表 List normalDataList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); List empIds = normalDataList.stream().map(InsuranceAccountDetailPO::getEmployeeId).collect(Collectors.toList()); List resultData = new ArrayList<>(); if (empIds.size() > 0) { List> partition = Lists.partition(empIds, 1000); partition.forEach(p -> { param.setIds(p); resultData.addAll(getEmployMapper().listHrmInfoByIdAndName(param)); }); } // 分页 PageInfo page = new PageInfo<>(); if (resultData.size() == 0) { return page; } page.setTotal(resultData.size()); page.setList(SalaryPageUtil.subList(param.getPageNum(), param.getPageSize(), resultData)); page.setPageSize(param.getPageSize()); page.setPageNum(param.getPageNum()); return page; } /** * 调差福利项 * @param id InsuranceAccountDetailPO.id */ @Override public List> compensationCategoryType(Long id) { SalaryAssert.notNull(id, SalaryI18nUtil.getI18nLabel(120999, "调差对象必选")); InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(id); if (insuranceAccountDetailPO == null) { return Lists.newArrayList(); } InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); List> result = new ArrayList<>(); String socialComJson = insuranceAccountDetailPO.getSocialComJson(); if (StringUtils.isNotBlank(socialComJson)) { Map categoryIdNameMap = getSICategoryService(user).categoryIdNameMap(); Map socialJson = JSON.parseObject(socialComJson, new HashMap().getClass()); for (Map.Entry entry : socialJson.entrySet()) { Map temp = new HashMap<>(); String insuranceId = entry.getKey(); if (StringUtils.isNotBlank(categoryIdNameMap.get(insuranceId))) { temp.put("id", insuranceId); temp.put("content", categoryIdNameMap.get(insuranceId)); result.add(temp); } } } return result; } /** * 获取当前调差福利类型-公司方支出总计 */ @Override public List> compensationComTotal(List paramList) { List> resultList = new ArrayList<>(); paramList.forEach(compensation -> { Map temp = new HashMap<>(); temp.put("employeeId", compensation.getEmployeeId()); if (StringUtils.isBlank(compensation.getCategoryType()) || compensation.getTarget() == null) { temp.put("error", SalaryI18nUtil.getI18nLabel(84026, "参数错误")); temp.put("totalNum", "0"); } else { InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); if (insuranceAccountDetailPO == null) { temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); temp.put("totalNum", "0"); } else { InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); //判断是否已有调差数据(个税扣缴义务人+账单月份+人员id) InsuranceCompensationPO nowCompensation = getInsuranceCompensationMapper().getOneByBillMonthPayOrgEmpId(InsuranceCompensationPO.builder() .billMonth(insuranceAccountDetailPO.getBillMonth()) .paymentOrganization(insuranceAccountDetailPO.getPaymentOrganization()) .employeeId(insuranceAccountDetailPO.getEmployeeId()) .build()); if (nowCompensation != null) { temp.put("error", SalaryI18nUtil.getI18nLabel(121039, "当前月在该缴纳组织下已存在调差数据")); } //处理调差数据 BigDecimal total = new BigDecimal("0"); List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); if (nowCompensation == null && StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); for (Map.Entry entry : socialJson.entrySet()) { String insuranceId = entry.getKey(); String num = entry.getValue(); if (categoryTypeList.contains(insuranceId)) { total = total.add(new BigDecimal(num)); } } } temp.put("totalNum", total.toPlainString()); } } resultList.add(temp); }); // paramList.forEach((paymentOrganization, compensationList) -> { // List> paymentList = new ArrayList<>(); // compensationList.forEach(compensation -> { // Map temp = new HashMap<>(); // temp.put("employeeId", compensation.getEmployeeId()); // if (StringUtils.isBlank(compensation.getCategoryType()) || compensation.getTarget() == null) { // temp.put("error", SalaryI18nUtil.getI18nLabel(84026, "参数错误")); // temp.put("totalNum", "0"); // } else { // // InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); // if (insuranceAccountDetailPO == null) { // temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); // } // InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); // BigDecimal total = new BigDecimal("0"); // List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); // // if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { // Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); // for (Map.Entry entry : socialJson.entrySet()) { // String insuranceId = entry.getKey(); // String num = entry.getValue(); // if (categoryTypeList.contains(insuranceId)) { // total = total.add(new BigDecimal(num)); // } // } // } // // temp.put("totalNum", total.toPlainString()); // } // paymentList.add(temp); // }); // result.put(paymentOrganization, paymentList); // }); return resultList; } @Override public Map compensationAccount(List list) { long currentEmployeeId = user.getUID(); List allEmployees = getEmployMapper().listAll(); Map usernameMap = SalaryEntityUtil.convert2Map(allEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); Map result = new HashMap<>(); List errorList = new ArrayList<>(); for (InsuranceCompensationDTO param : list) { if (StringUtils.isBlank(param.getAdjustmentTotal()) || "0".equals(param.getAdjustmentTotal())) { errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:调差数额不正确!"); continue; } InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(param.getTarget()); if (insuranceAccountDetailPO == null) { errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:调差对象不存在!"); continue; } InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); for (Map.Entry entry : socialJson.entrySet()) { String insuranceId = entry.getKey(); String num = entry.getValue(); if (Objects.equals(String.valueOf(param.getAdjustTo()), insuranceId)) { BigDecimal adjustmentTo = new BigDecimal(param.getAdjustmentTotal()); // 调差单位缴纳明细 BigDecimal insuranceNum = new BigDecimal(num); insuranceNum = insuranceNum.add(adjustmentTo); socialJson.replace(insuranceId, insuranceNum.toPlainString()); insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialJson)); // 调差单位合计 BigDecimal comSum = new BigDecimal(insuranceAccountDetailPO.getComSum()); comSum = comSum.add(adjustmentTo); insuranceAccountDetailPO.setComSum(comSum.toPlainString()); // 调差社保单位合计 BigDecimal socialComSum = new BigDecimal(insuranceAccountDetailPO.getSocialComSum()); socialComSum = socialComSum.add(adjustmentTo); insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); // 调差社保合计 BigDecimal socialSum = new BigDecimal(insuranceAccountDetailPO.getSocialSum()); socialSum = socialSum.add(adjustmentTo); insuranceAccountDetailPO.setSocialSum(socialSum.toPlainString()); // 调差合计 BigDecimal totalSum = new BigDecimal(insuranceAccountDetailPO.getTotal()); totalSum = totalSum.add(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); //更新社保调差后的明细 InsuranceAccountDetailPOEncrypt.encryptItem(insuranceAccountDetailPO); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //新建调差记录 InsuranceCompensationPO insuranceCompensationPO = new InsuranceCompensationPO(); insuranceCompensationPO.setId(IdGenerator.generate()); insuranceCompensationPO.setAdjustmentTotal(param.getAdjustmentTotal()); insuranceCompensationPO.setAdjustTo(param.getAdjustTo()); insuranceCompensationPO.setBillMonth(param.getBillMonth()); insuranceCompensationPO.setCompanyTotal(param.getCompanyTotal()); insuranceCompensationPO.setCreator(currentEmployeeId); insuranceCompensationPO.setCategoryType(param.getCategoryType()); insuranceCompensationPO.setCreateTime(new Date()); insuranceCompensationPO.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue()); insuranceCompensationPO.setCountryTotal(param.getCountryTotal()); insuranceCompensationPO.setEmployeeId(insuranceAccountDetailPO.getEmployeeId()); insuranceCompensationPO.setPaymentOrganization(insuranceAccountDetailPO.getPaymentOrganization()); insuranceCompensationPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); insuranceCompensationPO.setWelfareType(Integer.valueOf(param.getWelfareType())); insuranceCompensationPO.setUpdateTime(new Date()); getInsuranceCompensationMapper().insert(insuranceCompensationPO); // result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); } } } } //刷新bill_detail统计数据 getSIAccountService(user).refreshBillBatch(list.get(0).getPaymentOrganization(), list.get(0).getBillMonth()); if (errorList.size() == 0) { result.put("data", "全部调差成功!"); } else { result.put("data", "存在调差失败项!"); } result.put("errorMessage", errorList); return result; } @Override public String compensationConfigSave(List param) { long currentEmployeeId = user.getUID(); SalaryAssert.notEmpty(param, SalaryI18nUtil.getI18nLabel(143746, "默认调差配置数据为空")); // 清除历史默认配置 getInsuranceCompensationConfigMapper().deleteByPayOrg(param.get(0).getPaymentOrganization()); // 保存历史默认配置 List configList = param.stream().map(config -> { InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(config.getTarget()); SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(138849, "调差对象不存在")); return InsuranceCompensationConfigPO.builder() .id(IdGenerator.generate()) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .employeeId(insuranceAccountDetailPO.getEmployeeId()) .adjustTo(config.getAdjustTo()) .createTime(new Date()) .updateTime(new Date()) .categoryType(config.getCategoryType()) .paymentOrganization(config.getPaymentOrganization()) .welfareType(Integer.valueOf(config.getWelfareType())) .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) .creator(currentEmployeeId).build(); }).collect(Collectors.toList()); configList.forEach(config -> getInsuranceCompensationConfigMapper().insert(config)); return "配置成功"; } /** * 社保调差撤回 */ @Override public String compensationRevert(InsuranceCompensationDTO param) { InsuranceCompensationPO insuranceCompensationPO = getInsuranceCompensationMapper().getById(param.getId()); SalaryAssert.notNull(insuranceCompensationPO, SalaryI18nUtil.getI18nLabel(121112, "当前补差记录不存在")); InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getOneByBpep(InsuranceAccountDetailPO.builder() .billMonth(insuranceCompensationPO.getBillMonth()) .paymentStatus(PaymentStatusEnum.COMMON.getValue()) .employeeId(insuranceCompensationPO.getEmployeeId()) .paymentOrganization(insuranceCompensationPO.getPaymentOrganization()) .build()); SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(121108, "补差对象不存在")); InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); for (Map.Entry entry : socialJson.entrySet()) { String insuranceId = entry.getKey(); String num = entry.getValue(); if (Objects.equals(String.valueOf(insuranceCompensationPO.getAdjustTo()), insuranceId)) { BigDecimal adjustmentTo = new BigDecimal(insuranceCompensationPO.getAdjustmentTotal()); //回退调差单位缴纳明细 BigDecimal insuranceNum = new BigDecimal(num); insuranceNum = insuranceNum.subtract(adjustmentTo); socialJson.replace(insuranceId, insuranceNum.toPlainString()); insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialJson)); //回退调差单位合计 BigDecimal comSum = new BigDecimal(insuranceAccountDetailPO.getComSum()); comSum = comSum.subtract(adjustmentTo); insuranceAccountDetailPO.setComSum(comSum.toPlainString()); //回退调差社保单位合计 BigDecimal socialComSum = new BigDecimal(insuranceAccountDetailPO.getSocialComSum()); socialComSum = socialComSum.subtract(adjustmentTo); insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); //回退调差社保合计 BigDecimal socialSum = new BigDecimal(insuranceAccountDetailPO.getSocialSum()); socialSum = socialSum.subtract(adjustmentTo); insuranceAccountDetailPO.setSocialSum(socialSum.toPlainString()); //回退调差合计 BigDecimal totalSum = new BigDecimal(insuranceAccountDetailPO.getTotal()); totalSum = totalSum.subtract(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); //更新社保调差后的明细 getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //删除调差记录 getInsuranceCompensationMapper().deleteById(param.getId()); } } //刷新bill_detail统计数据 getSIAccountService(user).refreshBillBatch(param.getPaymentOrganization(), param.getBillMonth()); } return "撤回成功"; } @Override public Map compensationList(String billMonth, Long paymentOrganization) { Map datas = new HashMap<>(); //入参判断 if (paymentOrganization == null || StringUtils.isBlank(billMonth)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); } //设置调差详情列表头 List weaTableColumn = getColumnBuildService(user).buildCompensationColumns(); //处理调差数据 List compensationDTOList = dealCompensationData(billMonth, paymentOrganization); datas.put("columns", weaTableColumn); datas.put("data", compensationDTOList); return datas; } private List dealCompensationData(String billMonth, Long paymentOrganization) { //获取调差历史记录数据 List compensationPOList = getInsuranceCompensationMapper().queryByBillMonthAndPayOrg(billMonth, paymentOrganization); //获取调差配置数据 List compensationConfigPOList = getInsuranceCompensationConfigMapper().queryByBillMonthAndPayOrg(billMonth, paymentOrganization); List compensationDTOList = new ArrayList<>(); List detailPOList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(billMonth, paymentOrganization); Map detailPOMap = detailPOList.stream().collect(Collectors.toMap(InsuranceAccountDetailPO::getEmployeeId, Function.identity())); List allEmployees = getEmployMapper().listAll(); Map usernameMap = SalaryEntityUtil.convert2Map(allEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); List allCategoryList = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll(); Map categoryNameMap = SalaryEntityUtil.convert2Map(allCategoryList, ICategoryPO::getId, ICategoryPO::getInsuranceName); boolean haveCompensation = compensationPOList != null && compensationPOList.size() > 0; //存在调差历史记录时,输出记录数据 if (haveCompensation) { for (InsuranceCompensationPO po : compensationPOList) { InsuranceCompensationDTO dto = new InsuranceCompensationDTO(); BeanUtils.copyProperties(po, dto); dto.setStatus(true); //设置targetOptions Map targetOptions = new HashMap<>(); targetOptions.put("name", usernameMap.get(po.getEmployeeId())); targetOptions.put("id", detailPOMap.get(po.getEmployeeId()).getId().toString()); dto.setTargetOptions(targetOptions); //设置categoryTypeOptions List> categoryTypeOptions = new ArrayList<>(); List categoryTypeList = Arrays.asList(po.getCategoryType().split(",")); Map categoryTypeMap = new HashMap<>(); for (String categoryType : categoryTypeList) { categoryTypeMap.put("id", categoryType); categoryTypeMap.put("content", categoryNameMap.get(Long.valueOf(categoryType))); categoryTypeOptions.add(categoryTypeMap); } dto.setCategoryTypeOptions(categoryTypeOptions); } } //不存在调差历史记录时,输出调差配置数据 if (!haveCompensation && compensationConfigPOList.size() > 0) { for (InsuranceCompensationConfigPO configPO : compensationConfigPOList) { InsuranceCompensationDTO dto = new InsuranceCompensationDTO(); BeanUtils.copyProperties(configPO, dto); dto.setStatus(false); //设置targetOptions Map targetOptions = new HashMap<>(); targetOptions.put("name", usernameMap.get(configPO.getEmployeeId())); targetOptions.put("id", detailPOMap.get(configPO.getEmployeeId()).getId().toString()); dto.setTargetOptions(targetOptions); //设置categoryTypeOptions List> categoryTypeOptions = new ArrayList<>(); List categoryTypeList = Arrays.asList(configPO.getCategoryType().split(",")); Map categoryTypeMap = new HashMap<>(); for (String categoryType : categoryTypeList) { categoryTypeMap.put("id", categoryType); categoryTypeMap.put("content", categoryNameMap.get(Long.valueOf(categoryType))); categoryTypeOptions.add(categoryTypeMap); } dto.setCategoryTypeOptions(categoryTypeOptions); } } return compensationDTOList; } }