weaver-hrm-salary/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java

342 lines
17 KiB
Java
Raw Normal View History

package com.engine.salary.service.impl;
import com.alibaba.fastjson.JSON;
import com.api.formmode.mybatis.util.SqlProxyHandle;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt;
import com.engine.salary.entity.hrm.dto.HrmInfoDTO;
import com.engine.salary.entity.hrm.param.HrmQueryParam;
import com.engine.salary.entity.siaccount.param.InsuranceAccountDetailParam;
import com.engine.salary.entity.siaccount.param.RecessionParam;
import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO;
import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO;
import com.engine.salary.enums.siaccount.BillStatusEnum;
import com.engine.salary.enums.siaccount.PaymentStatusEnum;
import com.engine.salary.enums.siaccount.ProjectTypeEnum;
import com.engine.salary.enums.sicategory.DeleteTypeEnum;
import com.engine.salary.mapper.datacollection.EmployMapper;
import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper;
import com.engine.salary.service.SIRecessionService;
import com.engine.salary.service.TaxAgentService;
import com.engine.salary.util.SalaryEntityUtil;
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 org.apache.commons.lang3.StringUtils;
import org.apache.commons.collections4.CollectionUtils;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.SalaryAssert;
import weaver.hrm.User;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author: sy
* @Description: 社保福利台账-退差实现类
* @Date: 2022/11/15
**/
public class SIRecessionServiceImpl extends Service implements SIRecessionService {
private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() {
return SqlProxyHandle.getProxy(InsuranceAccountDetailMapper.class);
}
private TaxAgentService getTaxAgentService(User user) {
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private EmployMapper getEmployMapper() {
return MapperProxyFactory.getProxy(EmployMapper.class);
}
@Override
public void save(RecessionParam param, Long employeeId) {
//入参判断
if (StringUtils.isBlank(param.getPaymentOrganization()) || StringUtils.isBlank(param.getBillMonth()) || CollectionUtils.isEmpty(param.getRecessionMonthList())
|| CollectionUtils.isEmpty(param.getIncludes()) || CollectionUtils.isEmpty(param.getProjects())) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误"));
}
//需要退差的员工
List<Long> employeeIds = param.getIncludes();
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(param.getExcludes())) {
employeeIds = employeeIds.stream().filter(item -> !param.getExcludes().contains(item)).collect(Collectors.toList());
}
SalaryAssert.notEmpty(employeeIds, SalaryI18nUtil.getI18nLabel(133967, "无退差人员"));
//查询退差员工对应的退差月份的正常缴纳的福利台账数据
List<InsuranceAccountDetailPO> detailPOS= getInsuranceAccountDetailMapper().list(InsuranceAccountDetailParam.builder()
.paymentStatus(PaymentStatusEnum.COMMON.getValue())
.recessionMonthList(param.getRecessionMonthList())
.employeeIds(employeeIds)
.paymentOrganization(param.getPaymentOrganization())
.build());
InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(detailPOS);
//处理数据
List<InsuranceAccountDetailPO> finalDetailPOS = detailPOS;
List<InsuranceAccountDetailPO> finalRecessionDetails = new ArrayList<>();
employeeIds.forEach(id -> {
param.getRecessionMonthList().forEach(billMonth -> {
Optional<InsuranceAccountDetailPO> detailPOOptional = finalDetailPOS.stream().filter(
detail -> Objects.equals(billMonth, detail.getBillMonth())
&& Objects.equals(id, detail.getEmployeeId())).findFirst();
detailPOOptional.ifPresent(insuranceAccountDetailPO -> recessionAccount(param, insuranceAccountDetailPO, finalRecessionDetails));
});
});
//退差数据入库
if (CollectionUtils.isNotEmpty(finalRecessionDetails)) {
InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(finalRecessionDetails);
List<List<InsuranceAccountDetailPO>> partition = Lists.partition((List<InsuranceAccountDetailPO>) finalRecessionDetails, 20);
partition.forEach(getInsuranceAccountDetailMapper()::batchSaveAccountDetails);
}
}
@Override
public void del(Collection<Long> ids, Long employeeId) {
//入参判断
if (CollectionUtils.isEmpty(ids)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误"));
}
//根据id删除
List<List<Long>> partition = Lists.partition((List<Long>) ids, 100);
partition.forEach(getInsuranceAccountDetailMapper()::batchDelAccountDetailsByIds);
}
private void recessionAccount(RecessionParam param, InsuranceAccountDetailPO insuranceAccountDetailPO, List<InsuranceAccountDetailPO> recessionDetails) {
List<Integer> projects = param.getProjects();
InsuranceAccountDetailPO temp = new InsuranceAccountDetailPO();
recessionBaseBuild(param, temp, insuranceAccountDetailPO);
if (projects.contains(ProjectTypeEnum.ALL.getValue())) {
recessionSocial(param, temp, insuranceAccountDetailPO);
recessionFund(param, temp, insuranceAccountDetailPO);
recessionOther(param, temp, insuranceAccountDetailPO);
}
if (projects.contains(ProjectTypeEnum.SOCIAL.getValue())) {
recessionSocial(param, temp, insuranceAccountDetailPO);
}
if (projects.contains(ProjectTypeEnum.FUND.getValue())) {
recessionFund(param, temp, insuranceAccountDetailPO);
}
if (projects.contains(ProjectTypeEnum.OTHER.getValue())) {
recessionOther(param, temp, insuranceAccountDetailPO);
}
account(temp);
recessionDetails.add(temp);
}
private void recessionBaseBuild(RecessionParam param, InsuranceAccountDetailPO temp, InsuranceAccountDetailPO insuranceAccountDetailPO) {
temp.setPaymentStatus(PaymentStatusEnum.RECESSION.getValue());
// temp.setId(IdGenerator.generate());
temp.setCreateTime(new Date());
temp.setUpdateTime(new Date());
temp.setCreator(insuranceAccountDetailPO.getCreator());
temp.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue());
temp.setTenantKey(insuranceAccountDetailPO.getTenantKey());
temp.setEmployeeId(insuranceAccountDetailPO.getEmployeeId());
temp.setBillMonth(param.getBillMonth());
temp.setBillStatus(BillStatusEnum.NOT_ARCHIVED.getValue());
temp.setSupplementaryMonth(insuranceAccountDetailPO.getBillMonth());
temp.setSupplementaryProjects(String.join(",",
param.getProjects() == null ? new ArrayList<>() : param.getProjects().stream().map(String::valueOf).collect(Collectors.toList())));
temp.setResourceFrom(insuranceAccountDetailPO.getResourceFrom());
temp.setSocialAccount(insuranceAccountDetailPO.getSocialAccount());
temp.setSocialSchemeId(insuranceAccountDetailPO.getSocialSchemeId());
temp.setSocialPaymentBaseString(insuranceAccountDetailPO.getSocialPaymentBaseString());
temp.setFundAccount(insuranceAccountDetailPO.getFundAccount());
temp.setSupplementFundAccount(insuranceAccountDetailPO.getSupplementFundAccount());
temp.setFundSchemeId(insuranceAccountDetailPO.getFundSchemeId());
temp.setFundPaymentBaseString(insuranceAccountDetailPO.getFundPaymentBaseString());
temp.setOtherSchemeId(insuranceAccountDetailPO.getOtherSchemeId());
temp.setOtherPaymentBaseString(insuranceAccountDetailPO.getOtherPaymentBaseString());
// temp.setExternalFlag(insuranceAccountDetailPO.getExternalFlag());
temp.setPaymentOrganization(insuranceAccountDetailPO.getPaymentOrganization());
// temp.setPaymentAgency(insuranceAccountDetailPO.getPaymentAgency());
}
private void recessionSocial(RecessionParam param, InsuranceAccountDetailPO temp, InsuranceAccountDetailPO insuranceAccountDetailPO) {
//退差社保个人缴费
String socialPerJson = insuranceAccountDetailPO.getSocialPerJson();
if (StringUtils.isNotBlank(socialPerJson)) {
HashMap<String, String> jsonMap = new HashMap<>();
HashMap<String, String> hashMap = JSON.parseObject(socialPerJson, new HashMap<String, String>().getClass());
hashMap.forEach((k, v) -> {
if (StringUtils.isNotBlank(v)) {
v = new BigDecimal(v).negate().toPlainString();
jsonMap.put(k, v);
}
});
temp.setSocialPerJson(JSON.toJSONString(jsonMap));
}
if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialPerSum())) {
temp.setSocialPerSum(new BigDecimal(insuranceAccountDetailPO.getSocialPerSum()).negate().toPlainString());
}
//退差社保单位缴费
String socialComJson = insuranceAccountDetailPO.getSocialComJson();
if (StringUtils.isNotBlank(socialComJson)) {
HashMap<String, String> jsonMap = new HashMap<>();
HashMap<String, String> hashMap = JSON.parseObject(socialPerJson, new HashMap<String, String>().getClass());
hashMap.forEach((k, v) -> {
if (StringUtils.isNotBlank(v)) {
v = new BigDecimal(v).negate().toPlainString();
jsonMap.put(k, v);
}
});
temp.setSocialComJson(JSON.toJSONString(jsonMap));
}
if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComSum())) {
temp.setSocialComSum(new BigDecimal(insuranceAccountDetailPO.getSocialComSum()).negate().toPlainString());
}
}
private void recessionFund(RecessionParam param, InsuranceAccountDetailPO temp, InsuranceAccountDetailPO insuranceAccountDetailPO) {
//退差公积金个人缴费
String fundPerJson = insuranceAccountDetailPO.getFundPerJson();
if (StringUtils.isNotBlank(fundPerJson)) {
HashMap<String, String> jsonMap = new HashMap<>();
HashMap<String, String> hashMap = JSON.parseObject(fundPerJson, new HashMap<String, String>().getClass());
hashMap.forEach((k, v) -> {
if (StringUtils.isNotBlank(v)) {
v = new BigDecimal(v).negate().toPlainString();
jsonMap.put(k, v);
}
});
temp.setFundPerJson(JSON.toJSONString(jsonMap));
}
if (StringUtils.isNotBlank(insuranceAccountDetailPO.getFundPerSum())) {
temp.setFundPerSum(new BigDecimal(insuranceAccountDetailPO.getFundPerSum()).negate().toPlainString());
}
//退差公积金单位缴费
String fundComJson = insuranceAccountDetailPO.getFundComJson();
if (StringUtils.isNotBlank(fundComJson)) {
HashMap<String, String> jsonMap = new HashMap<>();
HashMap<String, String> hashMap = JSON.parseObject(fundPerJson, new HashMap<String, String>().getClass());
hashMap.forEach((k, v) -> {
if (StringUtils.isNotBlank(v)) {
v = new BigDecimal(v).negate().toPlainString();
jsonMap.put(k, v);
}
});
temp.setFundComJson(JSON.toJSONString(jsonMap));
}
if (StringUtils.isNotBlank(insuranceAccountDetailPO.getFundComSum())) {
temp.setFundComSum(new BigDecimal(insuranceAccountDetailPO.getFundComSum()).negate().toPlainString());
}
}
private void recessionOther(RecessionParam param, InsuranceAccountDetailPO temp, InsuranceAccountDetailPO insuranceAccountDetailPO) {
//退差其他福利个人缴费
String otherPerJson = insuranceAccountDetailPO.getOtherPerJson();
if (StringUtils.isNotBlank(otherPerJson)) {
HashMap<String, String> jsonMap = new HashMap<>();
HashMap<String, String> hashMap = JSON.parseObject(otherPerJson, new HashMap<String, String>().getClass());
hashMap.forEach((k, v) -> {
if (StringUtils.isNotBlank(v)) {
v = new BigDecimal(v).negate().toPlainString();
jsonMap.put(k, v);
}
});
temp.setOtherPerJson(JSON.toJSONString(jsonMap));
}
if (StringUtils.isNotBlank(insuranceAccountDetailPO.getOtherPerSum())) {
temp.setOtherPerSum(new BigDecimal(insuranceAccountDetailPO.getOtherPerSum()).negate().toPlainString());
}
//退差其他福利单位缴费
String otherComJson = insuranceAccountDetailPO.getOtherComJson();
if (StringUtils.isNotBlank(otherComJson)) {
HashMap<String, String> jsonMap = new HashMap<>();
HashMap<String, String> hashMap = JSON.parseObject(otherPerJson, new HashMap<String, String>().getClass());
hashMap.forEach((k, v) -> {
if (StringUtils.isNotBlank(v)) {
v = new BigDecimal(v).negate().toPlainString();
jsonMap.put(k, v);
}
});
temp.setOtherComJson(JSON.toJSONString(jsonMap));
}
if (StringUtils.isNotBlank(insuranceAccountDetailPO.getOtherComSum())) {
temp.setOtherComSum(new BigDecimal(insuranceAccountDetailPO.getOtherComSum()).negate().toPlainString());
}
}
private void account(InsuranceAccountDetailPO insuranceAccountDetailPO) {
//个人合计
BigDecimal socialPerson =
StringUtils.isBlank(insuranceAccountDetailPO.getSocialPerSum()) ? new BigDecimal("0") : new BigDecimal(insuranceAccountDetailPO.getSocialPerSum());
BigDecimal fundPerson =
StringUtils.isBlank(insuranceAccountDetailPO.getFundPerSum()) ? new BigDecimal("0") : new BigDecimal(insuranceAccountDetailPO.getFundPerSum());
BigDecimal otherPerson =
StringUtils.isBlank(insuranceAccountDetailPO.getOtherPerSum()) ? new BigDecimal("0") : new BigDecimal(insuranceAccountDetailPO.getOtherPerSum());
BigDecimal perSum = socialPerson.add(fundPerson).add(otherPerson);
insuranceAccountDetailPO.setPerSum(perSum.toPlainString());
//单位合计
BigDecimal socialCom =
StringUtils.isBlank(insuranceAccountDetailPO.getSocialComSum()) ? new BigDecimal("0") : new BigDecimal(insuranceAccountDetailPO.getSocialComSum());
BigDecimal fundCom = StringUtils.isBlank(insuranceAccountDetailPO.getFundComSum()) ? new BigDecimal("0") : new BigDecimal(insuranceAccountDetailPO.getFundComSum());
BigDecimal otherCom =
StringUtils.isBlank(insuranceAccountDetailPO.getOtherComSum()) ? new BigDecimal("0") : new BigDecimal(insuranceAccountDetailPO.getOtherComSum());
BigDecimal comSum = socialCom.add(fundCom).add(otherCom);
insuranceAccountDetailPO.setComSum(comSum.toPlainString());
//社保合计
insuranceAccountDetailPO.setSocialSum(socialPerson.add(socialCom).toPlainString());
//公积金合计
insuranceAccountDetailPO.setFundSum(fundPerson.add(fundCom).toPlainString());
//其他福利合计
insuranceAccountDetailPO.setOtherSum(otherPerson.add(otherCom).toPlainString());
//合计
insuranceAccountDetailPO.setTotal(perSum.add(comSum).toPlainString());
}
/**
* 获取当前登录人所控制的个税扣缴义务人的人员范围
*/
@Override
public PageInfo<HrmInfoDTO> getEmployeeListByTaxAgent(HrmQueryParam param) {
// 当前登录人员
Long currentEmployeeId = (long) user.getUID();
List<TaxAgentEmployeeDTO> taxAgentEmployeeDTOS = getTaxAgentService(user).listTaxAgentAndEmployee(currentEmployeeId);
Set<Long> employeeIds = SalaryEntityUtil.properties(taxAgentEmployeeDTOS, TaxAgentEmployeeDTO::getEmployeeId);
List<Long> empIds = new ArrayList<Long>(employeeIds);
List<HrmInfoDTO> resultData = new ArrayList<>();
if (employeeIds.size() > 0) {
List<List<Long>> partition = Lists.partition(empIds, 1000);
partition.forEach(p -> {
param.setIds(p);
resultData.addAll(getEmployMapper().listHrmInfoByIdAndName(param));
});
}
// 分页
PageInfo<HrmInfoDTO> page = new PageInfo<>();
if (null == resultData) {
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;
}
}