package com.engine.salary.service.impl; import com.alibaba.fastjson.JSON; import com.api.browser.bean.SearchConditionGroup; import com.api.browser.bean.SearchConditionItem; import com.api.browser.bean.SearchConditionOption; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.cloudstore.eccom.pc.table.*; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.*; import com.engine.salary.component.SalaryWeaTable; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.siaccount.bo.InsuranceAccountBO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountBatchListDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountTabDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.param.*; import com.engine.salary.entity.siaccount.po.ExcelInsuranceDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountInspectPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesBaseInfoPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO; import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.entity.sischeme.po.InsuranceSchemePO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.siaccount.*; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.enums.sicategory.WelfareTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.siaccount.ExcelInsuranceDetailMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountBatchMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountInspectMapper; import com.engine.salary.mapper.siarchives.FundSchemeMapper; import com.engine.salary.mapper.siarchives.InsuranceBaseInfoMapper; import com.engine.salary.mapper.siarchives.SocialSchemeMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.mapper.sischeme.InsuranceSchemeMapper; import com.engine.salary.mapper.sys.SalarySysConfMapper; import com.engine.salary.mapper.taxagent.TaxAgentMapper; import com.engine.salary.service.*; import com.engine.salary.sys.entity.po.SalarySysConfPO; import com.engine.salary.sys.entity.vo.OrderRuleVO; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryFormItemUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.excel.ExcelParseHelper; import com.engine.salary.util.excel.ExcelSupport; import com.engine.salary.util.excel.ExcelUtil; 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; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import dm.jdbc.util.IdGenerator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; import java.io.InputStream; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; /** * @Author weaver_cl * @Description: * @Date 2022/4/11 * @Version V1.0 **/ public class SIAccountServiceImpl extends Service implements SIAccountService { // private SIAccountBiz siAccountBiz = new SIAccountBiz(); private SIArchivesBiz siArchivesBiz = new SIArchivesBiz(); private EncryptUtil encryptUtil = new EncryptUtil(); public RecordsBuildService getService(User user) { return ServiceUtil.getService(RecordsBuildServiceImpl.class, user); } public SIAccountBiz getSiAccountBiz(User user) { return ServiceUtil.getService(SIAccountBiz.class, user); } public ColumnBuildService getColumnBuildService(User user) { return ServiceUtil.getService(ColumnBuildServiceImpl.class, user); } public SICategoryService getSICategoryService(User user) { return ServiceUtil.getService(SICategoryServiceImpl.class, user); } private TaxAgentService getTaxAgentService(User user) { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } private InsuranceAccountBatchMapper getInsuranceAccountBatchMapper() { return MapperProxyFactory.getProxy(InsuranceAccountBatchMapper.class); } private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() { return MapperProxyFactory.getProxy(InsuranceAccountDetailMapper.class); } private ExcelInsuranceDetailMapper getExcelInsuranceDetailMapper() { return MapperProxyFactory.getProxy(ExcelInsuranceDetailMapper.class); } private SalaryItemService getSalaryItemService(User user) { return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user); } private TaxAgentMapper getTaxAgentMapper() { return MapperProxyFactory.getProxy(TaxAgentMapper.class); } SICategoryBiz siCategoryBiz = new SICategoryBiz(); private SalarySysConfMapper getSalarySysConfMapper() { return SqlProxyHandle.getProxy(SalarySysConfMapper.class); } private SalaryEmployeeService getSalaryEmployeeService(User user) { return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } private SalarySysConfService getSalarySysConfService(User user) { return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } private InsuranceSchemeMapper getInsuranceSchemeMapper() { return MapperProxyFactory.getProxy(InsuranceSchemeMapper.class); } private InsuranceBaseInfoMapper getInsuranceBaseInfoMapper() { return MapperProxyFactory.getProxy(InsuranceBaseInfoMapper.class); } private SocialSchemeMapper getSocialSchemeMapper() { return MapperProxyFactory.getProxy(SocialSchemeMapper.class); } private FundSchemeMapper getFundSchemeMapper() { return MapperProxyFactory.getProxy(FundSchemeMapper.class); } private TaxAgentBiz taxAgentBiz = new TaxAgentBiz(); private ICategoryMapper getICategoryMapper() { return MapperProxyFactory.getProxy(ICategoryMapper.class); } private InsuranceAccountInspectMapper getInsuranceAccountInspectMapper() { return MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class); } @Override public Map listPage(InsuranceAccountBatchParam queryParam) { Long employeeId = (long) user.getUID(); Map datas = new HashMap<>(); // 分权逻辑 Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID()); if (needAuth) { Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgents((long) user.getUID()); List taxAgents = taxAgentPOS.stream().map(TaxAgentPO::getId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(taxAgents)) { //防止普通用户查询 queryParam.setTaxAgents(Collections.singletonList(-1L)); } else { queryParam.setTaxAgents(taxAgents); } } //福利台账列表 PageInfo pageInfo = getSiAccountBiz(user).listPage(queryParam); Collection insuranceAccountBatchPOS = pageInfo.getList(); List insuranceAccountBatchListDTOS = InsuranceAccountBO.buildAccountBatchDTOList(insuranceAccountBatchPOS); PageInfo pageInfos = new PageInfo<>(insuranceAccountBatchListDTOS, InsuranceAccountBatchListDTO.class); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(queryParam.getCurrent()); pageInfos.setPageSize(queryParam.getPageSize()); List>> operatesPermission = new ArrayList<>(); SalaryWeaTable table = new SalaryWeaTable<>(user, InsuranceAccountBatchListDTO.class); List columns = pageInfos.getColumns(); List weaTableColumn = columns.stream().map(v -> new WeaTableColumn("100", v.getTitle(), v.getKey())).collect(Collectors.toList()); table.setColumns(weaTableColumn); //table.getColumns().get(0).setFixed("left"); // for (int i = 0; i < insuranceAccountBatchListDTOS.size(); i++) { // InsuranceAccountBatchListDTO insuranceAccountBatchListDTO = insuranceAccountBatchListDTOS.get(i); // if (Objects.equals(insuranceAccountBatchListDTO.getBillStatus(), BillStatusEnum.ARCHIVED.getDefaultLabel())) { // table.getOperates().getOperate().get(i).getIndex(); // // resultTable.getOperatesPermission().get(i).get(0).setVisible(false); // resultTable.getOperatesPermission().get(i).get(1).setVisible(false); // resultTable.getOperatesPermission().get(i).get(2).setVisible(false); // resultTable.getOperatesPermission().get(i).get(3).setVisible(false); // resultTable.getOperates().get(4).setOuter(true); // } // if (Objects.equals(insuranceAccountBatchListDTO.getBillStatus(), BillStatusEnum.NOT_ARCHIVED.getDefaultLabel())) { // resultTable.getOperatesPermission().get(i).get(4).setVisible(false); // List insuranceAccountInspectPOS = siAccountInspectService.listByBillMonth(insuranceAccountBatchListDTO.getBillMonth(), tenantKey); // if (CollectionUtils.isEmpty(insuranceAccountInspectPOS)) { // resultTable.getOperatesPermission().get(i).get(2).setVisible(false); // } // } // } WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("pageInfo", pageInfos); datas.put("operatesPermission", operatesPermission); datas.put("dataKey", result.getResultMap()); return datas; // WeaTable resultTable = FormatManager.getInstance() // .genTable(InsuranceAccountBatchListDTO.class, insuranceAccountBatchListDTOPage); // // resultTable.getOperates().forEach(e -> { // if (e.getIndex() == 0) { // e.setOuter(true); // } // }); // resultTable.setModule("hrmsalary"); // resultTable.getColumns().get(0).setFixed("left"); // return WeaResult.success(resultTable); } @Override public Map listCommonPage(InsuranceAccountDetailParam queryParam) { Long employeeId = (long) user.getUID(); Map datas = new HashMap<>(); //正常缴纳列表 PageInfo pageInfo = getSiAccountBiz(user).listCommonPage(queryParam); List insuranceAccountDetailPOS = pageInfo.getList(); //数据组装 List> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId); PageInfo> pageInfos = new PageInfo<>(records); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(queryParam.getCurrent()); pageInfos.setPageSize(queryParam.getPageSize()); //动态列组装 List weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(insuranceAccountDetailPOS, employeeId, SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, queryParam.getPaymentStatus()); WeaTable table = new WeaTable(); table.setPageUID(UUID.randomUUID().toString()); table.setColumns(weaTableColumn); List columns = weaTableColumn.stream().map(v -> new Column(v.getText(), v.getColumn(), v.getColumn())).collect(Collectors.toList()); pageInfos.setColumns(columns); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("pageInfo", pageInfos); //datas.put("dataKey",result.getResultMap()); return datas; } @Override public Map listCommonPageByName(InsuranceAccountDetailParam queryParam) { //增加查询参数userName if (StringUtils.isNotBlank(queryParam.getUserName())) { queryParam.setUserName(queryParam.getUserName()); } return listCommonPage(queryParam); } @Override public Map listSupplementaryPage(InsuranceAccountDetailParam queryParam) { Long employeeId = (long) user.getUID(); Map datas = new HashMap<>(); //过滤出福利档案基础信息表中runStatus为正在缴纳和待减员的人员 List baseInfoPOList = getInsuranceBaseInfoMapper().listAll(); List canAccountIds = baseInfoPOList.stream() .filter(f->f.getPaymentOrganization().toString().equals(queryParam.getPaymentOrganization()) && (f.getRunStatus().equals(EmployeeStatusEnum.PAYING.getValue()) || f.getRunStatus().equals(EmployeeStatusEnum.STAY_DEL.getValue()))) .map(InsuranceArchivesBaseInfoPO::getEmployeeId) .collect(Collectors.toList()); queryParam.setEmployeeIds(canAccountIds); //补缴缴纳列表 queryParam.setPaymentStatus(PaymentStatusEnum.REPAIR.getValue()); //排序配置 OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); List list = getInsuranceAccountDetailMapper().list(queryParam); PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(),queryParam.getPageSize(), list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //数据组装 List> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId); PageInfo> pageInfos = new PageInfo<>(records); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(queryParam.getCurrent()); pageInfos.setPageSize(queryParam.getPageSize()); //动态列组装 List weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(insuranceAccountDetailPOS, employeeId, SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, queryParam.getPaymentStatus()); SalaryWeaTable table = new SalaryWeaTable<>(user, InsuranceAccountDetailPO.class); table.setColumns(weaTableColumn); List columns = weaTableColumn.stream().map(v -> new Column(v.getText(), v.getColumn(), v.getColumn())).collect(Collectors.toList()); pageInfos.setColumns(columns); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("pageInfo", pageInfos); //datas.put("dataKey",result.getResultMap()); return datas; } @Override public Map supplementaryByNameList(InsuranceAccountDetailParam queryParam) { //增加查询参数userName if (StringUtils.isNotBlank(queryParam.getUserName())) { queryParam.setUserName(queryParam.getUserName()); } return listSupplementaryPage(queryParam); } @Override public Map listRecessionPage(InsuranceAccountDetailParam queryParam) { Long employeeId = (long) user.getUID(); Map datas = new HashMap<>(); // 分权逻辑 Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID()); if (needAuth) { Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgents((long) user.getUID()); List taxAgents = taxAgentPOS.stream().map(TaxAgentPO::getId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(taxAgents)) { //防止普通用户查询 queryParam.setTaxAgents(Collections.singletonList(-1L)); } else { queryParam.setTaxAgents(taxAgents); } } //退差列表 queryParam.setPaymentStatus(PaymentStatusEnum.RECESSION.getValue()); //排序配置 OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); List list = getInsuranceAccountDetailMapper().list(queryParam); PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(),queryParam.getPageSize(), list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //数据组装 List> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId); PageInfo> pageInfos = new PageInfo<>(records); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(queryParam.getCurrent()); pageInfos.setPageSize(queryParam.getPageSize()); //动态列组装 List weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(insuranceAccountDetailPOS, employeeId, SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, queryParam.getPaymentStatus()); SalaryWeaTable table = new SalaryWeaTable<>(user, InsuranceAccountDetailPO.class); table.setColumns(weaTableColumn); List columns = weaTableColumn.stream().map(v -> new Column(v.getText(), v.getColumn(), v.getColumn())).collect(Collectors.toList()); pageInfos.setColumns(columns); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("pageInfo", pageInfos); //datas.put("dataKey",result.getResultMap()); return datas; } @Override public Map listBalancePage(InsuranceAccountDetailParam queryParam) { Long employeeId = (long) user.getUID(); Map datas = new HashMap<>(); // 分权逻辑 Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID()); if (needAuth) { Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgents((long) user.getUID()); List taxAgents = taxAgentPOS.stream().map(TaxAgentPO::getId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(taxAgents)) { //防止普通用户查询 queryParam.setTaxAgents(Collections.singletonList(-1L)); } else { queryParam.setTaxAgents(taxAgents); } } //补差列表 queryParam.setPaymentStatus(PaymentStatusEnum.BALANCE.getValue()); //排序配置 OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountDetailMapper().list(queryParam); PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //数据组装 List> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId); PageInfo> pageInfos = new PageInfo<>(records); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(queryParam.getCurrent()); pageInfos.setPageSize(queryParam.getPageSize()); //动态列组装 List weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(insuranceAccountDetailPOS, employeeId, SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, queryParam.getPaymentStatus()); SalaryWeaTable table = new SalaryWeaTable<>(user, InsuranceAccountDetailPO.class); table.setColumns(weaTableColumn); List columns = weaTableColumn.stream().map(v -> new Column(v.getText(), v.getColumn(), v.getColumn())).collect(Collectors.toList()); pageInfos.setColumns(columns); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("pageInfo", pageInfos); //datas.put("dataKey",result.getResultMap()); return datas; } @Override public Map getForm(Map params) { Map apidatas = new HashMap<>(); //条件组 List addGroups = new ArrayList<>(); List conditionItems = new ArrayList<>(); SearchConditionItem datePickerItem = SalaryFormItemUtil.datePickerItem(user, 2, 16, true, 2, "账单月份", "billMonth"); String minDate = SalaryDateUtil.getYearMonth(-1, 0); String maxDate = SalaryDateUtil.getYearMonth(0, 6); datePickerItem.setOtherParams(new HashMap<>()); datePickerItem.getOtherParams().put("minDate", minDate); datePickerItem.getOtherParams().put("maxDate", maxDate); List billMonthList = getInsuranceAccountBatchMapper().listByTimeRange(minDate, maxDate); encryptUtil.decryptList(billMonthList, InsuranceAccountBatchPO.class); if (CollectionUtils.isEmpty(billMonthList)) { datePickerItem.getOtherParams().put("disabledData", Collections.emptyList()); } else { datePickerItem.getOtherParams().put("disabledData", billMonthList.stream().map(InsuranceAccountBatchPO::getBillMonth).collect(Collectors.toList())); } datePickerItem.getOtherParams().put("type", "month"); datePickerItem.getOtherParams().put("format", "YYYY-MM"); datePickerItem.getOtherParams().put("showFormat", "YYYY-MM"); conditionItems.add(datePickerItem); SearchConditionItem textareaItem = SalaryFormItemUtil.textareaItem(user, 2, 16, true, 2, 60, "备注", "remarks"); conditionItems.add(textareaItem); addGroups.add(new SearchConditionGroup("常用条件", true, conditionItems)); apidatas.put("billMonth", SalaryDateUtil.getYearMonth(0, 0)); apidatas.put("condition", addGroups); return apidatas; } @Override public String save(AccountParam param) { ValidUtil.doValidator(param); Long employeeId = (long) user.getUID(); String lastName = user.getLastname(); return getSiAccountBiz(user).save(param.isFlag(), param, employeeId, lastName); } @Override public void commonAccount(SaveCommonAccountParam param) { ValidUtil.doValidator(param); Long employeeId = (long) user.getUID(); String currentUserName = user.getLastname(); getSiAccountBiz(user).saveCommonAccount(param, employeeId, currentUserName); } @Override public void delete(AccountParam accountParam) { Long employeeId = (long) user.getUID(); getSiAccountBiz(user).delete(accountParam, employeeId); } @Override public void saveCommonAccount(SaveCommonAccountParam accountParam) { Long employeeId = (long) user.getUID(); String currentUserName = user.getLastname(); getSiAccountBiz(user).saveCommonAccount(accountParam, employeeId, currentUserName); } @Override public void saveSupplementaryAccount(SaveSupplementaryAccountParam saveSupplementaryAccountParam) { ValidUtil.doValidator(saveSupplementaryAccountParam); Long employeeId = (long) user.getUID(); String currentUserName = user.getLastname(); getSiAccountBiz(user).saveSupplementaryAccount(saveSupplementaryAccountParam, employeeId, currentUserName); } @Override public void deleteCommonAccount(SaveCommonAccountParam param) { ValidUtil.doValidator(param); Long employeeId = (long) user.getUID(); String currentUserName = user.getLastname(); getSiAccountBiz(user).deleteCommonAccount(param, employeeId, currentUserName); } @Override public void deleteSummplementaryAccount(List supplementAccountBaseParams) { Long employeeId = (long) user.getUID(); String currentUserName = user.getLastname(); getSiAccountBiz(user).deleteSupplementaryAccount(supplementAccountBaseParams, employeeId, currentUserName); } @Override public void file(AccountParam accountParam) { Long employeeId = (long) user.getUID(); String billMonth = accountParam.getBillMonth(); getSiAccountBiz(user).file(billMonth, employeeId, accountParam.getPaymentOrganization()); } @Override public void unconfirmed(Collection ids) { List insuranceAccountInspectPOS = getInsuranceAccountInspectMapper().getByInspectStatusAndIds(InspectStatusEnum.COMFORED.getValue(), ids); if (CollectionUtils.isNotEmpty(insuranceAccountInspectPOS)) { getInsuranceAccountDetailMapper().batchUnConfirmedInspectDetails(insuranceAccountInspectPOS.stream().map(InsuranceAccountInspectPO::getId).collect(Collectors.toList())); } } @Override public Map buttonCheck(String billMonth) { Map result = new HashMap<>(); List list = getInsuranceAccountInspectMapper().getByInspectStatusAndBillMonth(InspectStatusEnum.IGNORE.getValue(), billMonth); if (CollectionUtils.isEmpty(list)) { result.put("displayFlag", false); return result; } result.put("displayFlag", true); return result; } @Override public void ignore(Collection ids) { List insuranceAccountInspectPOS = getInsuranceAccountInspectMapper().getByInspectStatusAndIds(InspectStatusEnum.IGNORE.getValue(), ids); if (CollectionUtils.isNotEmpty(insuranceAccountInspectPOS)) { getInsuranceAccountDetailMapper().batchIgnoreInspectDetails(insuranceAccountInspectPOS.stream().map(InsuranceAccountInspectPO::getId).collect(Collectors.toList())); } } @Override public InsuranceAccountTabDTO tabList(AccountParam build) { InsuranceAccountTabDTO insuranceAccountTabDTO = InsuranceAccountTabDTO.builder().build(); InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(build.getBillMonth(), build.getPaymentOrganization()); insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); boolean isShow = false; if (insuranceAccountBatchPO == null || insuranceAccountBatchPO.getBillStatus() == BillStatusEnum.NOT_ARCHIVED.getValue()) { isShow = true; } if (insuranceAccountBatchPO != null) { insuranceAccountTabDTO.setRemarks(insuranceAccountBatchPO.getRemarks()); } List> tabList = new ArrayList<>(); Map common = new HashMap<>(); common.put("id", "1"); common.put("content", SalaryI18nUtil.getI18nLabel(92265, "正常缴纳")); tabList.add(common); if (isShow) { Map change = new HashMap<>(); change.put("id", "2"); change.put("content", SalaryI18nUtil.getI18nLabel(100509, "异动清单")); tabList.add(change); } Map repair = new HashMap<>(); repair.put("id", "3"); repair.put("content", SalaryI18nUtil.getI18nLabel(92267, "补缴")); tabList.add(repair); Map overView = new HashMap<>(); overView.put("id", "4"); overView.put("content", SalaryI18nUtil.getI18nLabel(99927, "总览")); tabList.add(overView); Map recession = new HashMap<>(); recession.put("id", "5"); recession.put("content", SalaryI18nUtil.getI18nLabel(92270, "退差")); tabList.add(recession); Map balance = new HashMap<>(); balance.put("id", "6"); balance.put("content", SalaryI18nUtil.getI18nLabel(92271, "补差")); tabList.add(balance); insuranceAccountTabDTO.setTabList(tabList); insuranceAccountTabDTO.setShow(isShow); insuranceAccountTabDTO.setBillMonth(build.getBillMonth()); return insuranceAccountTabDTO; } @Override public Map changeList(InsuranceAccountDetailParam param) { Map datas = new HashMap<>(); Long employeeId = (long) user.getUID(); List insuranceArchivesEmployeePOS = getInsuranceAccountDetailMapper().changeList(param.getUserName()); PageInfo pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), insuranceArchivesEmployeePOS, InsuranceArchivesEmployeePO.class); List> records = siArchivesBiz.buildTableData(insuranceArchivesEmployeePOS); PageInfo> pageInfos = new PageInfo<>(records); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(param.getCurrent()); pageInfos.setPageSize(param.getPageSize()); List weaTableColumns = siArchivesBiz.buildWeaTableColumns(insuranceArchivesEmployeePOS, employeeId); WeaTable table = new WeaTable(); table.setPageUID(UUID.randomUUID().toString()); table.setColumns(weaTableColumns); table.setTableType(WeaTableType.CHECKBOX); WeaTableOperates weaTableOperates = new WeaTableOperates(); WeaTableOperate weaTableOperate = new WeaTableOperate(); weaTableOperate.setIndex("0"); weaTableOperate.setText("移除"); WeaTableOperate weaTableOperate1 = new WeaTableOperate(); weaTableOperate1.setIndex("1"); weaTableOperate1.setText("添加"); table.setOperates(weaTableOperates); List> permissions = new ArrayList<>(); for (int i = 0; i < records.size(); i++) { List permission = new ArrayList<>(); if (UserStatusEnum.DEPARTURE.getDefaultLabel().equals(records.get(i).get("status"))) { permission.add(new Permission(true, false)); permission.add(new Permission(false, false)); permissions.add(permission); } if (UserStatusEnum.DEPARTURE.getDefaultLabel().equals(records.get(i).get("status"))) { permission.add(new Permission(false, false)); permission.add(new Permission(true, false)); permissions.add(permission); } } WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("permissions", permissions); datas.put("pageInfo", pageInfos); datas.put("dataKey", result.getResultMap()); return datas; } @Override public void accountInspect(InspectAccountParam param) { Long employeeId = (long) user.getUID(); ValidUtil.doValidator(param); String currentUserName = user.getLastname(); getSiAccountBiz(user).accountInspect(param.getIds(), param.getBillMonth(), employeeId, currentUserName, param.getPaymentOrganization()); } @Override public Map getInspectTable(InsuranceAccountDetailParam param) { Map datas = new HashMap<>(); List insuranceAccountInspectPOS = getInsuranceAccountInspectMapper().getByBillMonth(param.getBillMonth()); List> records = getService(user).buildInspectRecords(insuranceAccountInspectPOS, Long.valueOf(param.getPaymentOrganization())); List> paged = SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), records); PageInfo> pageInfos = new PageInfo<>(paged); pageInfos.setTotal(records.size()); pageInfos.setPageNum(param.getCurrent()); pageInfos.setPageSize(param.getPageSize()); List weaTableColumns = getColumnBuildService(user).buildInspectColumns(insuranceAccountInspectPOS, Long.valueOf(param.getPaymentOrganization())); WeaTable table = new WeaTable(); table.setPageUID(UUID.randomUUID().toString()); table.setColumns(weaTableColumns); table.setTableType(WeaTableType.CHECKBOX); WeaTableOperates weaTableOperates = new WeaTableOperates(); WeaTableOperate weaTableOperate = new WeaTableOperate(); weaTableOperate.setIndex("0"); weaTableOperate.setText("忽略"); WeaTableOperate weaTableOperate1 = new WeaTableOperate(); weaTableOperate1.setIndex("1"); weaTableOperate1.setText("重置"); table.setOperates(weaTableOperates); List> permissions = new ArrayList<>(); for (int i = 0; i < records.size(); i++) { List permission = new ArrayList<>(); Permission permissionCheckBox = new Permission(); if (InspectStatusEnum.IGNORE.getValue() == records.get(i).get("inspectStatus")) { permissionCheckBox.setVisible(true); permissionCheckBox.setDisabled(false); permission.add(new Permission(true, false)); permission.add(new Permission(false, true)); permissions.add(permission); } if (InspectStatusEnum.COMFORED.getValue() == records.get(i).get("inspectStatus")) { permissionCheckBox.setVisible(true); permissionCheckBox.setDisabled(true); permission.add(new Permission(false, true)); permission.add(new Permission(true, false)); permissions.add(permission); } } WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("permissions", permissions); datas.put("pageInfo", pageInfos); datas.put("dataKey", result.getResultMap()); return datas; } @Override public Map getCommonForm(Map params) { Map apidatas = new HashMap<>(); //条件组 List addGroups = new ArrayList<>(); List conditionItems = new ArrayList<>(); List conditionItem = new ArrayList<>(); SearchConditionItem includes = SalaryFormItemUtil.browserItem(user, 18, 12, 2, true, "对象", "required", "17", "includes"); conditionItems.add(includes); SearchConditionItem excludes = SalaryFormItemUtil.browserItem(user, 18, 12, 2, true, "选择人员", "required", "17", "excludes"); conditionItem.add(excludes); addGroups.add(new SearchConditionGroup("人员范围", true, conditionItems)); addGroups.add(new SearchConditionGroup("人员范围排除", true, conditionItem)); apidatas.put("condition", addGroups); return apidatas; } @Override public Map getSupplementaryForm(Map params) { Map apidatas = new HashMap<>(); //条件组 List addGroups = new ArrayList<>(); List condition = new ArrayList<>(); List conditionItems = new ArrayList<>(); List conditionItem = new ArrayList<>(); SearchConditionItem billMonthList = SalaryFormItemUtil.datePickerItem(user, 2, 16, true, 2, "补缴月份", "billMonth"); billMonthList.setMultiple(true); billMonthList.setOtherParams(new HashMap<>()); billMonthList.getOtherParams().put("type", "months"); billMonthList.getOtherParams().put("format", "YYYY-MM"); billMonthList.getOtherParams().put("showFormat", "YYYY-MM"); billMonthList.setMultiple(true); billMonthList.setViewAttr(3); billMonthList.setRules("required"); condition.add(billMonthList); SearchConditionItem billProjects = SalaryFormItemUtil.selectItem(user, buildBillProjectsOptions(), 2, 16, 6, true, "补缴项目", "projects"); billProjects.setViewAttr(3); billProjects.setDetailtype(2); billProjects.setRules("required"); condition.add(billProjects); SearchConditionItem includes = SalaryFormItemUtil.browserItem(user, 18, 6, 3, true, "对象", "required", "17", "includes"); conditionItems.add(includes); // SearchConditionItem excludes = SalaryFormItemUtil.browserItem(user, 18, 6, 2, true, "选择人员", "required", "17", "excludes"); // excludes.setViewAttr(2); // conditionItem.add(excludes); addGroups.add(new SearchConditionGroup("基础信息", true, condition)); addGroups.add(new SearchConditionGroup("人员范围", true, conditionItems)); // addGroups.add(new SearchConditionGroup("人员范围排除",true,conditionItem)); apidatas.put("condition", addGroups); return apidatas; } @Override public PageInfo overView(InsuranceAccountDetailParam queryParam) { PageInfo pageInfos = getSiAccountBiz(user).overView(queryParam); return pageInfos; } @Override public List> welfareData(String billMonth, List employeeIds, Long taxAgentId) { InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, taxAgentId); insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); if (insuranceAccountBatchPO == null || Objects.equals(BillStatusEnum.NOT_ARCHIVED.getValue(), insuranceAccountBatchPO.getBillStatus())) { return Lists.newArrayList(); } List list = queryList(billMonth, taxAgentId, employeeIds); List> result = new ArrayList<>(); list.stream().forEach(item -> { Map record = new HashMap<>(); record.put("employeeId", item.getEmployeeId()); if (StringUtils.isNotEmpty(item.getSocialPerJson())) { Map socialJson = JSON.parseObject(item.getSocialPerJson(), new HashMap().getClass()); socialJson.forEach((k, v) -> { record.put(k + "socialPer", v); }); } if (StringUtils.isNotEmpty(item.getSocialComJson())) { Map socialJson = JSON.parseObject(item.getSocialComJson(), new HashMap().getClass()); socialJson.forEach((k, v) -> { record.put(k + "socialCom", v); }); } record.put("socialPerSum", item.getSocialPerSum()); record.put("socialComSum", item.getSocialComSum()); if (StringUtils.isNotEmpty(item.getFundPerJson())) { Map fundPerJson = JSON.parseObject(item.getFundPerJson(), new HashMap().getClass()); fundPerJson.forEach((k, v) -> { record.put(k + "fundPer", v); }); } if (StringUtils.isNotEmpty(item.getFundComJson())) { Map fundPerJson = JSON.parseObject(item.getFundComJson(), new HashMap().getClass()); fundPerJson.forEach((k, v) -> { record.put(k + "fundCom", v); }); } record.put("fundPerSum", item.getFundPerSum()); record.put("fundComSum", item.getFundComSum()); if (StringUtils.isNotEmpty(item.getOtherPerJson())) { Map fundPerJson = JSON.parseObject(item.getOtherPerJson(), new HashMap().getClass()); fundPerJson.forEach((k, v) -> { record.put(k + "otherPer", v); }); } if (StringUtils.isNotEmpty(item.getOtherComJson())) { Map fundComJson = JSON.parseObject(item.getOtherComJson(), new HashMap().getClass()); if (fundComJson != null) { } fundComJson.forEach((k, v) -> { record.put(k + "otherCom", v); }); } record.put("otherPerSum", item.getOtherPerSum()); record.put("otherComSum", item.getOtherComSum()); record.put("perSum", item.getPerSum()); record.put("comSum", item.getComSum()); result.add(record); }); return result; } @Override public Map welfareColumns() { List listAll = getICategoryMapper().listAll(); List list = new ArrayList<>(); if (CollectionUtils.isNotEmpty(listAll)) { list.addAll(listAll); } Map result = new LinkedHashMap<>(); result.put(SalaryI18nUtil.getI18nLabel(100393, "个人合计"), "perSum"); result.put(SalaryI18nUtil.getI18nLabel(100388, "社保个人合计"), "socialPerSum"); result.put(SalaryI18nUtil.getI18nLabel(100390, "公积金个人合计"), "fundPerSum"); result.put(SalaryI18nUtil.getI18nLabel(100392, "其他福利个人合计"), "otherPerSum"); Map categoryIdNameMap = getSICategoryService(user).categoryIdNameMap(); list.stream().forEach(item -> { if (Objects.equals(WelfareTypeEnum.SOCIAL_SECURITY.getValue(), item.getWelfareType())) { result.put(categoryIdNameMap.get(String.valueOf(item.getId())) + SalaryI18nUtil.getI18nLabel(87159, "个人"), item.getId() + "socialPer"); } if (Objects.equals(WelfareTypeEnum.ACCUMULATION_FUND.getValue(), item.getWelfareType())) { result.put(categoryIdNameMap.get(String.valueOf(item.getId())) + SalaryI18nUtil.getI18nLabel(87159, "个人"), item.getId() + "fundPer"); } if (Objects.equals(WelfareTypeEnum.OTHER.getValue(), item.getWelfareType())) { result.put(categoryIdNameMap.get(String.valueOf(item.getId())) + SalaryI18nUtil.getI18nLabel(87159, "个人"), item.getId() + "otherPer"); } }); result.put(SalaryI18nUtil.getI18nLabel(100397, "单位合计"), "comSum"); result.put(SalaryI18nUtil.getI18nLabel(100394, "社保单位合计"), "socialComSum"); result.put(SalaryI18nUtil.getI18nLabel(100395, "公积金单位合计"), "fundComSum"); result.put(SalaryI18nUtil.getI18nLabel(100396, "其他福利单位合计"), "otherComSum"); list.stream().forEach(item -> { if (Objects.equals(WelfareTypeEnum.SOCIAL_SECURITY.getValue(), item.getWelfareType())) { result.put(categoryIdNameMap.get(String.valueOf(item.getId())) + SalaryI18nUtil.getI18nLabel(100289, "单位"), item.getId() + "socialCom"); } if (Objects.equals(WelfareTypeEnum.ACCUMULATION_FUND.getValue(), item.getWelfareType())) { result.put(categoryIdNameMap.get(String.valueOf(item.getId())) + SalaryI18nUtil.getI18nLabel(100289, "单位"), item.getId() + "fundCom"); } if (Objects.equals(WelfareTypeEnum.OTHER.getValue(), item.getWelfareType())) { result.put(categoryIdNameMap.get(String.valueOf(item.getId())) + SalaryI18nUtil.getI18nLabel(100289, "单位"), item.getId() + "otherCom"); } }); return result; } public List buildBillProjectsOptions() { List options = new ArrayList<>(); options.add(new SearchConditionOption(String.valueOf(ProjectTypeEnum.ALL.getValue()), SalaryI18nUtil.getI18nLabel(ProjectTypeEnum.ALL.getLabelId(), ProjectTypeEnum.ALL.getDefaultLabel()))); options.add(new SearchConditionOption(String.valueOf(ProjectTypeEnum.SOCIAL.getValue()), SalaryI18nUtil.getI18nLabel(ProjectTypeEnum.SOCIAL.getLabelId(), ProjectTypeEnum.SOCIAL.getDefaultLabel()))); options.add(new SearchConditionOption(String.valueOf(ProjectTypeEnum.FUND.getValue()), SalaryI18nUtil.getI18nLabel(ProjectTypeEnum.FUND.getLabelId(), ProjectTypeEnum.FUND.getDefaultLabel()))); options.add(new SearchConditionOption(String.valueOf(ProjectTypeEnum.OTHER.getValue()), SalaryI18nUtil.getI18nLabel(ProjectTypeEnum.OTHER.getLabelId(), ProjectTypeEnum.OTHER.getDefaultLabel()))); options.add(new SearchConditionOption(String.valueOf(ProjectTypeEnum.ENDOWMENT_INSURANCE.getValue()), SalaryI18nUtil.getI18nLabel(ProjectTypeEnum.ENDOWMENT_INSURANCE.getLabelId(), ProjectTypeEnum.ENDOWMENT_INSURANCE.getDefaultLabel()))); options.add(new SearchConditionOption(String.valueOf(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()), SalaryI18nUtil.getI18nLabel(ProjectTypeEnum.MEDICAL_INSURANCE.getLabelId(), ProjectTypeEnum.MEDICAL_INSURANCE.getDefaultLabel()))); return options; } public List queryList(String billMonth, Long taxAgentId, List employeeIds) { List insuranceAccountDetailPOS = getInsuranceAccountDetailMapper().queryList(billMonth, taxAgentId, employeeIds); //退差数据不参与薪资核算 insuranceAccountDetailPOS = insuranceAccountDetailPOS.stream() .filter(f -> f.getPaymentStatus().equals(PaymentStatusEnum.COMMON.getValue()) || f.getPaymentStatus().equals(PaymentStatusEnum.REPAIR.getValue()) || f.getPaymentStatus().equals(PaymentStatusEnum.BALANCE.getValue()) ) .collect(Collectors.toList()); List list = buildNewInsuranceDetailPOS(insuranceAccountDetailPOS); // InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); return list; } public List buildNewInsuranceDetailPOS(List list) { List newList = new ArrayList<>(); if (CollectionUtils.isEmpty(list)) { return newList; } Map> employeeMap = list.stream().filter(item -> item.getEmployeeId() != null) .collect(Collectors.groupingBy(InsuranceAccountDetailPO::getEmployeeId)); for (Map.Entry> entry : employeeMap.entrySet()) { Long k = entry.getKey(); List v = entry.getValue(); InsuranceAccountDetailPO insuranceAccountDetailPO = new InsuranceAccountDetailPO(); insuranceAccountDetailPO.setEmployeeId(k); Map socialPerMap = new HashMap<>(); Map fundPerMap = new HashMap<>(); Map otherPerMap = new HashMap<>(); Map socialComMap = new HashMap<>(); Map fundComMap = new HashMap<>(); Map otherComMap = new HashMap<>(); BigDecimal socialPer = new BigDecimal("0"); BigDecimal socialCom = new BigDecimal("0"); BigDecimal fundPer = new BigDecimal("0"); BigDecimal fundCom = new BigDecimal("0"); BigDecimal otherPer = new BigDecimal("0"); BigDecimal otherCom = new BigDecimal("0"); BigDecimal perSum = new BigDecimal("0"); BigDecimal comSum = new BigDecimal("0"); for (InsuranceAccountDetailPO item : v) { encryptUtil.decrypt(item, InsuranceAccountDetailPO.class); insuranceAccountDetailPO.setId(item.getId()); BigDecimal socialPerSum = StringUtils.isBlank(item.getSocialPerSum()) ? new BigDecimal("0") : new BigDecimal(item.getSocialPerSum()); BigDecimal socialComSum = StringUtils.isBlank(item.getSocialComSum()) ? new BigDecimal("0") : new BigDecimal(item.getSocialComSum()); BigDecimal fundPerSum = StringUtils.isBlank(item.getFundPerSum()) ? new BigDecimal("0") : new BigDecimal(item.getFundPerSum()); BigDecimal fundComSum = StringUtils.isBlank(item.getFundComSum()) ? new BigDecimal("0") : new BigDecimal(item.getFundComSum()); BigDecimal otherPerSum = StringUtils.isBlank(item.getOtherPerSum()) ? new BigDecimal("0") : new BigDecimal(item.getOtherPerSum()); BigDecimal otherComSum = StringUtils.isBlank(item.getOtherComSum()) ? new BigDecimal("0") : new BigDecimal(item.getOtherComSum()); BigDecimal perSumItem = StringUtils.isBlank(item.getPerSum()) ? new BigDecimal("0") : new BigDecimal(item.getPerSum()); BigDecimal comSumItem = StringUtils.isBlank(item.getComSum()) ? new BigDecimal("0") : new BigDecimal(item.getComSum()); socialPer = socialPer.add(socialPerSum); socialCom = socialCom.add(socialComSum); fundPer = fundPer.add(fundPerSum); fundCom = fundCom.add(fundComSum); otherPer = otherPer.add(otherPerSum); otherCom = otherCom.add(otherComSum); perSum = perSum.add(perSumItem); comSum = comSum.add(comSumItem); if (StringUtils.isNotBlank(item.getSocialPerJson())) { Map socialJson = JSON.parseObject(item.getSocialPerJson(), new HashMap().getClass()); if (socialJson != null) { socialJson.forEach((insuranceId, num) -> { if (socialPerMap.get(insuranceId) == null) { socialPerMap.put(insuranceId, num); } else { String oldNum = socialPerMap.get(insuranceId); 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); socialPerMap.put(insuranceId, insuanceNum.toPlainString()); } }); } } if (StringUtils.isNotBlank(item.getSocialComJson())) { Map socialJson = JSON.parseObject(item.getSocialComJson(), new HashMap().getClass()); if (socialJson != null) { socialJson.forEach((insuranceId, num) -> { if (socialComMap.get(insuranceId) == null) { socialComMap.put(insuranceId, num); } else { String oldNum = socialComMap.get(insuranceId); 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(insuranceId, insuanceNum.toPlainString()); } }); } } if (StringUtils.isNotBlank(item.getFundPerJson())) { Map fundJson = JSON.parseObject(item.getFundPerJson(), new HashMap().getClass()); if (fundJson != null) { fundJson.forEach((insuranceId, num) -> { if (fundPerMap.get(insuranceId) == null) { fundPerMap.put(insuranceId, num); } else { String oldNum = fundPerMap.get(insuranceId); 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); fundPerMap.put(insuranceId, insuanceNum.toPlainString()); } }); } } if (StringUtils.isNotBlank(item.getFundComJson())) { Map fundJson = JSON.parseObject(item.getFundComJson(), new HashMap().getClass()); if (fundJson != null) { fundJson.forEach((insuranceId, num) -> { if (fundComMap.get(insuranceId) == null) { fundComMap.put(insuranceId, num); } else { String oldNum = fundComMap.get(insuranceId); 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); fundComMap.put(insuranceId, insuanceNum.toPlainString()); } }); } } if (StringUtils.isNotBlank(item.getOtherPerJson())) { Map otherJson = JSON.parseObject(item.getOtherPerJson(), new HashMap().getClass()); if (otherJson != null) { otherJson.forEach((insuranceId, num) -> { if (otherPerMap.get(insuranceId) == null) { otherPerMap.put(insuranceId, num); } else { String oldNum = otherPerMap.get(insuranceId); 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); otherPerMap.put(insuranceId, insuanceNum.toPlainString()); } }); } } if (StringUtils.isNotBlank(item.getOtherComJson())) { Map otherJson = JSON.parseObject(item.getOtherComJson(), new HashMap().getClass()); if (otherJson != null) { otherJson.forEach((insuranceId, num) -> { if (otherComMap.get(insuranceId) == null) { otherComMap.put(insuranceId, num); } else { String oldNum = otherComMap.get(insuranceId); 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); otherComMap.put(insuranceId, insuanceNum.toPlainString()); } }); } } } insuranceAccountDetailPO.setSocialPerJson(JSON.toJSONString(socialPerMap)); insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialComMap)); insuranceAccountDetailPO.setFundPerJson(JSON.toJSONString(fundPerMap)); insuranceAccountDetailPO.setFundComJson(JSON.toJSONString(fundComMap)); insuranceAccountDetailPO.setOtherPerJson(JSON.toJSONString(otherPerMap)); insuranceAccountDetailPO.setOtherComJson(JSON.toJSONString(otherComMap)); insuranceAccountDetailPO.setSocialPerSum(socialPer.toPlainString()); insuranceAccountDetailPO.setSocialComSum(socialCom.toPlainString()); insuranceAccountDetailPO.setFundPerSum(fundPer.toPlainString()); insuranceAccountDetailPO.setFundComSum(fundCom.toPlainString()); insuranceAccountDetailPO.setOtherPerSum(otherPer.toPlainString()); insuranceAccountDetailPO.setOtherComSum(otherCom.toPlainString()); insuranceAccountDetailPO.setPerSum(perSum.toPlainString()); insuranceAccountDetailPO.setComSum(comSum.toPlainString()); newList.add(insuranceAccountDetailPO); } return newList; } @Override public List allInspects(Collection ids, String billMonth) { // InsuranceAccountInspectMapper siAccountInspectMapper = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class); List list = getInsuranceAccountInspectMapper().getList(billMonth, InspectStatusEnum.IGNORE.getValue(), ids); if (CollectionUtils.isNotEmpty(list)) { return list; } return Collections.emptyList(); } @Override public Collection getAdminTaxAgentList() { return getTaxAgentService(user).listAllTaxAgentsAsAdmin((long) user.getUID()); } @Override public void socialSecurityBenefitsRecalculate(InsuranceAccountBatchPO param) { //fixme 重新核算的校验逻辑 1、先取台账对应扣缴义务人下的所有账套 2、取账套下所有核算记录 3、判断核算记录有没有使用对应月份的福利台账 // int num = getSiAccountBiz(user).checkIfBusinessaccounting(param); // //表示已经被核算过不能重新核算 // if (num > 0) { // throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98831, "已被薪酬核算给核算过,无法重新核算!")); // } param.setBillStatus(0); getSiAccountBiz(user).updateById(param); } /** * 导出“福利核算导入模板” */ @Override public XSSFWorkbook exportImportTemplate(InsuranceAcctDetailImportTemplateParam param) { ValidUtil.doValidator(param); // 必须选择导入模板所需的薪资项目(福利项) if (CollectionUtils.isEmpty(param.getWelfareNames())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目核算项")); } // 模板表头(默认必带"个税扣缴义务人"、"姓名") List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), "部门", SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86317, "工号"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "账单月份"); List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName", "billMonth"); // 查询福利核算项目 List welfareNames = (List) param.getWelfareNames(); headerList.addAll(welfareNames); // excel导出的数据 //查询当前已有的正常缴纳数据 List> resultMapList = getNormalDataByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); // excel导出的数据 List> rows = Lists.newArrayListWithExpectedSize(resultMapList.size()); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayListWithExpectedSize(headerList.size()); for (String dataIndex : dataIndexList) { row.add(map.getOrDefault(dataIndex, StringUtils.EMPTY)); } rows.add(row); } String sheetName = "福利核算导入模板"; return ExcelUtil.genWorkbookV2(rows, sheetName); } /** * 将福利核算模板导入的数据更新到数据库 */ @Override public Map importInsuranceAcctDetail(InsuranceAcctImportParam importParam) { // long currentEmployeeId = user.getUID(); // Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); Map apidatas = new HashMap(); //查询对于人员信息导入筛选的全局配置 SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; //检验参数 //excel文件id String imageId = Util.null2String(importParam.getImageId()); if (StringUtils.isBlank(imageId)) { throw new SalaryRunTimeException("文件不存在"); } // // 获取所有个税扣缴义务人 // List taxAgents = getTaxAgentService(user).listAll(); // Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); // 获取租户下所有的人员 List salaryEmployees = getSalaryEmployeeService(user).listAll(); // 失败的数量 int failCount = 0; // 成功的数量 int successCount = 0; InputStream fileInputStream = null; try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(importParam.getImageId())); Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); // 错误提示信息 List excelComments = Lists.newArrayList(); // 存在错误的那行数据 List> errorDatas = Lists.newArrayList(); // 表头 List headers = ExcelSupport.getSheetHeader(sheet, 0); // 处理数值 List> data = ExcelParseHelper.parse2Map(sheet, 1); if (CollectionUtils.isEmpty(headers)) { throw new SalaryRunTimeException("表头为空"); } if (CollectionUtils.isEmpty(data)) { throw new SalaryRunTimeException("无数据"); } //存储待更新的InsuranceAccountDetailPO数据 List updateInsuranceAccountDetailList = new ArrayList<>(); //遍历excel表具体数据 for (int i = 0; i < data.size(); i++) { String row = "第" + (i + 2) + "行"; boolean isError = false; Map map = data.get(i); Long employeeId = 0L; // Long taxAgentId = 0L; List list = new ArrayList<>(); String billMonth = (String) map.getOrDefault("账单月份", ""); String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", ""); String supplementaryMonth = (String) map.getOrDefault("补缴月份", ""); Long paymentOrganization = 0L; List taxAgentPoList = getTaxAgentMapper().listByName(taxAgentName); if (taxAgentPoList.size() == 1) { paymentOrganization = taxAgentPoList.get(0).getId(); } else { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"))); excelComments.add(errorMessageMap); } if (!checkBillMonth(billMonth)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "账单月份输入有误,请参照“2022-09”这种格式进行检查")); excelComments.add(errorMessageMap); } //遍历表头 for (int j = 0; j < headers.size(); j++) { String header = headers.get(j); String dataKey = header; if (dataKey == null) { continue; } String dataValue = (String) map.getOrDefault(dataKey.toString(), ""); String deparmentName = (String) map.getOrDefault("部门", ""); String mobile = (String) map.getOrDefault("手机号", ""); String workcode = (String) map.getOrDefault("工号", ""); if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { //当人员信息导入筛选的全局配置为"0"时,姓名才是必填项 if (StringUtils.isEmpty(dataValue) && "0".equals(confValue)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); excelComments.add(errorMessageMap); } else { //筛选导入人员信息可以在人力资源池中匹配到的人员信息 List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, dataValue, deparmentName, mobile, workcode, null); if (CollectionUtils.isEmpty(employeeSameIds)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); excelComments.add(errorMessageMap); } else if (employeeSameIds.size() > 1) { //存在离职和在职状态取在职状态 employeeSameIds = employeeSameIds.stream() .filter(e -> UserStatusEnum.getNormalStatus().contains(e.getStatus())) .collect(Collectors.toList()); if (employeeSameIds.size() != 1) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + "员工信息不存在或者存在多个员工"); excelComments.add(errorMessageMap); } else { employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 ? employeeSameIds.get(0).getEmployeeId() : null; } } else { employeeId = employeeSameIds.get(0).getEmployeeId(); } } } } if (!isError){ List employeeIds = new ArrayList<>(); employeeIds.add(employeeId); //如果福利核算信息查询不到唯一匹配数据,不支持导入 //根据员工id、个税扣缴义务人id、账单月份查询 //根据表头字段来区分正常缴纳和补缴两类数据 if (!headers.contains("补缴月份")) { list = getInsuranceAccountDetailMapper().queryNormalList(billMonth, paymentOrganization, employeeIds.get(0)); } else { list = getInsuranceAccountDetailMapper().querySupplementList(billMonth, paymentOrganization, employeeIds.get(0), supplementaryMonth); } if (list.isEmpty()) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "本次福利核算不包含该人员")); excelComments.add(errorMessageMap); } else if (list.size() > 1) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员本次核算出现多组数据,请删除数据库中多余核算项")); excelComments.add(errorMessageMap); } else { //拼装待更新数据 encryptUtil.decryptList(list, InsuranceAccountDetailPO.class); updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map)); } } if (isError) { failCount++; errorDatas.add(map); } else { successCount++; } } //将待更新列表加密 encryptUtil.encryptList(updateInsuranceAccountDetailList, InsuranceAccountDetailPO.class); //更新 for(InsuranceAccountDetailPO po : updateInsuranceAccountDetailList) { getSiAccountBiz(user).updateByEmployeeIdAndBillMonth(po); } //刷新hrsa_bill_batch中数据统计信息 if (updateInsuranceAccountDetailList.size() > 0) { refreshBillBatch(updateInsuranceAccountDetailList.get(0).getPaymentOrganization(), updateInsuranceAccountDetailList.get(0).getBillMonth()); } apidatas.put("successCount", successCount); apidatas.put("errorCount", failCount); apidatas.put("errorData", excelComments); } finally { IOUtils.closeQuietly(fileInputStream); } return apidatas; } /** * 预览“福利核算导入”模板导入的数据 */ @Override public Map preview(InsuranceAcctImportParam param) { //1、参数校验 String imageId = param.getImageId(); if (StringUtils.isBlank(imageId)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100593, "文件id为空")); } Map map = new HashMap<>(); InputStream fileInputStream = null; try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId)); Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); List headers = ExcelSupport.getSheetHeader(sheet, 0); map.put("headers", headers); map.put("list", ExcelParseHelper.parse2List(sheet, 1)); return map; } finally { IOUtils.closeQuietly(fileInputStream); } } /** * 导出“福利核算-补缴导入”模板 */ @Override public XSSFWorkbook exportSupplyImportTemplate(InsuranceAcctDetailImportTemplateParam param) { ValidUtil.doValidator(param); // 必须选择导入模板所需的薪资项目(福利项) if (CollectionUtils.isEmpty(param.getWelfareNames())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目核算项")); } // 模板表头(默认必带"个税扣缴义务人"、"姓名") List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), "部门", SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86317, "工号"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "账单月份", "补缴月份"); List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName", "billMonth", "supplementaryMonth"); // 查询福利核算项目 List welfareNames = (List) param.getWelfareNames(); headerList.addAll(welfareNames); //查询当前已有的补缴数据 List> resultMapList = getSupplyDataByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); // excel导出的数据 List> rows = Lists.newArrayListWithExpectedSize(resultMapList.size()); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayListWithExpectedSize(headerList.size()); for (String dataIndex : dataIndexList) { row.add(map.getOrDefault(dataIndex, StringUtils.EMPTY)); } rows.add(row); } String sheetName = "福利核算-补缴导入模板"; return ExcelUtil.genWorkbookV2(rows, sheetName); } /** * 获取福利台账中的补缴数据 * @param billMonth 账单月份 * @param paymentOrganization 个税扣缴义务人id * @return */ private List> getSupplyDataByBillMonth(String billMonth, Long paymentOrganization) { List> resultList = new ArrayList<>(); DataCollectionEmployee employee = new DataCollectionEmployee(); TaxAgentPO taxAgentPO = taxAgentBiz.getById(paymentOrganization); List supplyDataList = getInsuranceAccountDetailMapper().querySupplementListByBillMonth(billMonth, paymentOrganization); //过滤出福利档案基础信息表中runStatus为正在缴纳和待减员的人员 List baseInfoPOList = getInsuranceBaseInfoMapper().listAll(); List canAccountIds = baseInfoPOList.stream() .filter(f->f.getPaymentOrganization().equals(paymentOrganization) && (f.getRunStatus().equals(EmployeeStatusEnum.PAYING.getValue()) || f.getRunStatus().equals(EmployeeStatusEnum.STAY_DEL.getValue()))) .map(InsuranceArchivesBaseInfoPO::getEmployeeId) .collect(Collectors.toList()); supplyDataList = supplyDataList.stream().filter(f -> canAccountIds.contains(f.getEmployeeId())).collect(Collectors.toList()); for(InsuranceAccountDetailPO po : supplyDataList) { Map resultMap = new HashMap<>(); employee = getSalaryEmployeeService(user).getEmployeeById(po.getEmployeeId()); resultMap.put("username", employee.getUsername()); resultMap.put("departmentName", employee.getDepartmentName()); resultMap.put("mobile", employee.getMobile()); resultMap.put("workcode", employee.getWorkcode()); resultMap.put("taxAgentName", taxAgentPO.getName()); resultMap.put("billMonth", billMonth); resultMap.put("supplementaryMonth", po.getSupplementaryMonth()); resultList.add(resultMap); } return resultList; } /** * 获取福利台账中的正常缴纳数据 * @param billMonth 账单月份 * @param paymentOrganization 个税扣缴义务人id * @return */ private List> getNormalDataByBillMonth(String billMonth, Long paymentOrganization) { List> resultList = new ArrayList<>(); DataCollectionEmployee employee = new DataCollectionEmployee(); TaxAgentPO taxAgentPO = taxAgentBiz.getById(paymentOrganization); List normalDataList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(billMonth, paymentOrganization); //过滤出福利档案基础信息表中runStatus为正在缴纳和待减员的人员 List baseInfoPOList = getInsuranceBaseInfoMapper().listAll(); List canAccountIds = baseInfoPOList.stream() .filter(f->f.getPaymentOrganization().equals(paymentOrganization) && (f.getRunStatus().equals(EmployeeStatusEnum.PAYING.getValue()) || f.getRunStatus().equals(EmployeeStatusEnum.STAY_DEL.getValue()))) .map(InsuranceArchivesBaseInfoPO::getEmployeeId) .collect(Collectors.toList()); normalDataList = normalDataList.stream().filter(f -> canAccountIds.contains(f.getEmployeeId())).collect(Collectors.toList()); for(InsuranceAccountDetailPO po : normalDataList) { Map resultMap = new HashMap<>(); employee = getSalaryEmployeeService(user).getEmployeeById(po.getEmployeeId()); resultMap.put("username", employee.getUsername()); resultMap.put("departmentName", employee.getDepartmentName()); resultMap.put("mobile", employee.getMobile()); resultMap.put("workcode", employee.getWorkcode()); resultMap.put("taxAgentName", taxAgentPO.getName()); resultMap.put("billMonth", billMonth); resultList.add(resultMap); } return resultList; } /** * 将更新的数据设置到老的insuranceAccountDetailPO对象中 */ private InsuranceAccountDetailPO handleInsuranceAccountDetail(InsuranceAccountDetailPO insuranceAccountDetailPO, Map baseMap) { //组装json数据,格式Map Map socialPerMap = new HashMap<>(); Map fundPerMap = new HashMap<>(); Map otherPerMap = new HashMap<>(); Map socialComMap = new HashMap<>(); Map fundComMap = new HashMap<>(); Map otherComMap = new HashMap<>(); //筛选出福利核算项 Map toDealMap = baseMap.entrySet().stream() .filter(map -> !"姓名".equals(map.getKey()) && !"部门".equals(map.getKey()) && !"手机号".equals(map.getKey()) && !"个税扣缴义务人".equals(map.getKey()) && !"账单月份".equals(map.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); for(Map.Entry entry : toDealMap.entrySet()) { //判断元素是否属于福利类 String keyName = entry.getKey(); //获取元素名后缀,方便之后判断“个人”或“单位” String payScope = keyName.substring(keyName.length() - 2); //获取福利类型 Integer welfareType; List categoryPOList = siCategoryBiz.listByName(entry.getKey().substring(0, keyName.length() - 2)); if (categoryPOList.size() == 1) { ICategoryPO iCategoryPO = categoryPOList.get(0); welfareType = iCategoryPO.getWelfareType(); if ("个人".equals(payScope)) { switch (welfareType) { case 1: socialPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: fundPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: otherPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; default: throw new SalaryRunTimeException("福利类型不存在"); } } else if ("单位".equals(payScope)) { switch (welfareType) { case 1: socialComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: fundComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: otherComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; default: throw new SalaryRunTimeException("福利类型不存在"); } } } } //组装新的insuranceAccountDetailPO对象数据 if (!socialPerMap.isEmpty()) { //对比新旧json中数据,并输出最终json checkJsonMap(socialPerMap, insuranceAccountDetailPO.getSocialPerJson()); insuranceAccountDetailPO.setSocialPerJson(JSON.toJSONString(socialPerMap)); } if (!socialComMap.isEmpty()) { checkJsonMap(socialComMap, insuranceAccountDetailPO.getSocialComJson()); insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialComMap)); } if (!fundPerMap.isEmpty()) { checkJsonMap(fundPerMap, insuranceAccountDetailPO.getFundPerJson()); insuranceAccountDetailPO.setFundPerJson(JSON.toJSONString(fundPerMap)); } if (!fundComMap.isEmpty()) { checkJsonMap(fundComMap, insuranceAccountDetailPO.getFundComJson()); insuranceAccountDetailPO.setFundComJson(JSON.toJSONString(fundComMap)); } if (!otherPerMap.isEmpty()) { checkJsonMap(otherPerMap, insuranceAccountDetailPO.getOtherPerJson()); insuranceAccountDetailPO.setOtherPerJson(JSON.toJSONString(otherPerMap)); } if (!otherComMap.isEmpty()) { checkJsonMap(otherComMap, insuranceAccountDetailPO.getOtherComJson()); insuranceAccountDetailPO.setOtherComJson(JSON.toJSONString(otherComMap)); } if (!StringUtils.isEmpty(baseMap.getOrDefault("个人合计", "").toString())) { insuranceAccountDetailPO.setPerSum(baseMap.get("个人合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("社保个人合计", "").toString())) { insuranceAccountDetailPO.setSocialPerSum(baseMap.get("社保个人合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("公积金个人合计", "").toString())) { insuranceAccountDetailPO.setFundPerSum(baseMap.get("公积金个人合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("其他福利个人合计", "").toString())) { insuranceAccountDetailPO.setOtherPerSum(baseMap.get("其他福利个人合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("单位合计", "").toString())) { insuranceAccountDetailPO.setComSum(baseMap.get("单位合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("社保单位合计", "").toString())) { insuranceAccountDetailPO.setSocialComSum(baseMap.get("社保单位合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("公积金单位合计", "").toString())) { insuranceAccountDetailPO.setFundComSum(baseMap.get("公积金单位合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("其他福利单位合计", "").toString())) { insuranceAccountDetailPO.setOtherComSum(baseMap.get("其他福利单位合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("账单月份", "").toString())) { insuranceAccountDetailPO.setBillMonth(baseMap.get("账单月份").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("社保合计", "").toString())) { insuranceAccountDetailPO.setSocialSum(baseMap.get("社保合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("公积金合计", "").toString())) { insuranceAccountDetailPO.setFundSum(baseMap.get("公积金合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("其他福利合计", "").toString())) { insuranceAccountDetailPO.setOtherSum(baseMap.get("其他福利合计").toString()); } if (!StringUtils.isEmpty(baseMap.getOrDefault("合计", "").toString())) { insuranceAccountDetailPO.setTotal(baseMap.get("合计").toString()); } //如果导入的时补缴数据,还会包含补缴月份 if (!StringUtils.isEmpty(baseMap.getOrDefault("补缴月份", "").toString())) { insuranceAccountDetailPO.setSupplementaryMonth(baseMap.get("补缴月份").toString()); } insuranceAccountDetailPO.setUpdateTime(new Date()); return insuranceAccountDetailPO; } /** * 对比新旧两份数据,并更新数据 */ private Map checkJsonMap(Map newMap, String oldJson) { Map oldMap = JSON.parseObject(oldJson, HashMap.class); Map toDelMap = new HashMap<>(); //校验newMap中的value值是否为整数或者小数 for(Map.Entry newEntry : newMap.entrySet()) { String newValue = newEntry.getValue(); int l = newValue.length(); if (newValue.length() > 0 && !isNumeric(newValue)) { throw new SalaryRunTimeException("请检查导入Excel中个人或单位对应的福利项数值是否为整数或小数!"); } if ("".equals(newEntry.getValue())) { toDelMap.put(newEntry.getKey(), newEntry.getValue()); } } if (toDelMap.size() > 0) { for (Map.Entry delEntry : toDelMap.entrySet()) { newMap.remove(delEntry.getKey()); } } if (oldMap == null) { return newMap; } //保留oldMap无变动数据,更新newMap已变动数据 for (Map.Entry oldEntry : oldMap.entrySet()) { if (!newMap.containsKey(oldEntry.getKey())) { newMap.put(oldEntry.getKey(), oldEntry.getValue()); } else if (newMap.containsKey(oldEntry.getKey()) && "".equals(newMap.get(oldEntry.getKey()))) { newMap.put(oldEntry.getKey(), oldEntry.getValue()); } } return newMap; } /** * 判断字符串是否为整数或者小数或者负数 */ public static boolean isNumeric(String str){ // Pattern pattern = Pattern.compile("[0-9]*\\.?[0-9]+"); Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$"); Matcher isNum = pattern.matcher(str); if (!isNum.matches()) { return false; } return true; } /** * 校验福利核算的账单月份输入格式是否正确 */ public boolean checkBillMonth(String billMonth) { //校验内容:billMonth的长度是否为7、年月连接符是否为“-” String connector; if(billMonth.length() == 7){ connector = billMonth.substring(4,5); return "-".equals(connector); } else { return false; } } /** * 导出“福利核算-线下对比导入模板” */ @Override public XSSFWorkbook exportComparisonWelfareTemplate(InsuranceAcctDetailImportTemplateParam param) { List listAll = getICategoryMapper().listAll(); List socialWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 1).collect(Collectors.toList()); List fundWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 2).collect(Collectors.toList()); List otherWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 3).collect(Collectors.toList()); List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), SalaryI18nUtil.getI18nLabel(86185, "部门"), SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86317, "工号"), SalaryI18nUtil.getI18nLabel(86187, "员工状态"), SalaryI18nUtil.getI18nLabel(100377, "数据来源"), SalaryI18nUtil.getI18nLabel(91325, "个税扣缴义务人")); headerList.add(SalaryI18nUtil.getI18nLabel(91324, "社保账号")); headerList.add(SalaryI18nUtil.getI18nLabel(91323, "社保方案名称")); // "失业保险申报基数" // "生育保险申报基数" // "养老保险申报基数" // "医疗保险申报基数" // "工伤保险申报基数" for (ICategoryPO po : socialWelfareList) { headerList.add(po.getInsuranceName() + "申报基数"); } headerList.add(SalaryI18nUtil.getI18nLabel(91486, "公积金账号")); headerList.add(SalaryI18nUtil.getI18nLabel(91485, "公积金方案名称")); //组装公积金基数 for (ICategoryPO po : fundWelfareList) { headerList.add(po.getInsuranceName() + "申报基数"); } headerList.add(SalaryI18nUtil.getI18nLabel(91487, "补充公积金账号")); headerList.add(SalaryI18nUtil.getI18nLabel(91496, "其他福利方案名称")); //组装其他福利基数 for (ICategoryPO po : otherWelfareList) { headerList.add(po.getInsuranceName() + "申报基数"); } //社保个人(生育保险个人、工伤保险个人、失业保险个人、养老保险个人、医疗保险个人) for (ICategoryPO po : socialWelfareList) { headerList.add(po.getInsuranceName() + "个人"); } headerList.add(SalaryI18nUtil.getI18nLabel(100388, "社保个人合计")); //住房公积金个人、补充住房公积金个人 for (ICategoryPO po : fundWelfareList) { headerList.add(po.getInsuranceName() + "个人"); } headerList.add(SalaryI18nUtil.getI18nLabel(100390, "公积金个人合计")); //其他个人(比如企业年金个人) for (ICategoryPO po : otherWelfareList) { headerList.add(po.getInsuranceName() + "个人"); } headerList.add(SalaryI18nUtil.getI18nLabel(100392, "其他福利个人合计")); headerList.add(SalaryI18nUtil.getI18nLabel(100393, "个人合计")); //社保单位(生育保险单位、工伤保险单位、失业保险单位、养老保险单位、医疗保险单位) for (ICategoryPO po : socialWelfareList) { headerList.add(po.getInsuranceName() + "单位"); } headerList.add(SalaryI18nUtil.getI18nLabel(100394, "社保单位合计")); //住房公积金单位、补充住房公积金单位 for (ICategoryPO po : fundWelfareList) { headerList.add(po.getInsuranceName() + "单位"); } headerList.add(SalaryI18nUtil.getI18nLabel(100395, "公积金单位合计")); //其他单位(比如企业年金单位) for (ICategoryPO po : otherWelfareList) { headerList.add(po.getInsuranceName() + "单位"); } headerList.add(SalaryI18nUtil.getI18nLabel(100396, "其他福利单位合计")); headerList.add(SalaryI18nUtil.getI18nLabel(100397, "单位合计")); headerList.add(SalaryI18nUtil.getI18nLabel(100398, "社保合计")); headerList.add(SalaryI18nUtil.getI18nLabel(100399, "公积金合计")); headerList.add(SalaryI18nUtil.getI18nLabel(100400, "其他福利合计")); headerList.add(SalaryI18nUtil.getI18nLabel(93278, "合计")); List> rows = new ArrayList<>(); rows.add(headerList); String sheetName = "福利核算-线下对比导入模板"; return ExcelUtil.genWorkbookV2(rows, sheetName); } /** * 将通过“福利核算-线下对比导入”模板导入的数据更新到hrsa_excel_bill_detail表中 */ @Override public Map importExcelInsuranceDetail(ExcelInsuranceImportParam importParam) { Map apidatas = new HashMap(); //查询对于人员信息导入筛选的全局配置 SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; //检验参数 //excel文件id String imageId = Util.null2String(importParam.getImageId()); if (StringUtils.isBlank(imageId)) { throw new SalaryRunTimeException("文件不存在"); } // 获取租户下所有的人员 List salaryEmployees = getSalaryEmployeeService(user).listAll(); // 失败的数量 int failCount = 0; // 成功的数量 int successCount = 0; InputStream fileInputStream = null; try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(importParam.getImageId())); Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); // 错误提示信息 List excelComments = Lists.newArrayList(); // 存在错误的那行数据 List> errorDatas = Lists.newArrayList(); // 表头 List headers = ExcelSupport.getSheetHeader(sheet, 0); // 处理数值 List> data = ExcelParseHelper.parse2Map(sheet, 1); if (CollectionUtils.isEmpty(headers)) { throw new SalaryRunTimeException("表头为空"); } if (CollectionUtils.isEmpty(data)) { throw new SalaryRunTimeException("无数据"); } String billMonth = importParam.getBillMonth(); //存储待更新的InsuranceAccountDetailPO数据 List addCompareList = new ArrayList<>(); //记录待删除hrsa_excel_bill_detail.id List idList = new ArrayList<>(); //遍历excel表具体数据 for (int i = 0; i < data.size(); i++) { String row = "第" + (i + 2) + "行"; boolean isError = false; Map map = data.get(i); Long employeeId = 0L; List list = new ArrayList<>(); String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", ""); Long paymentOrganization = 0L; List taxAgentPoList = getTaxAgentMapper().listByName(taxAgentName); if (taxAgentPoList.size() == 1) { paymentOrganization = taxAgentPoList.get(0).getId(); } else { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"))); excelComments.add(errorMessageMap); } //遍历表头 for (int j = 0; j < headers.size(); j++) { String header = headers.get(j); String dataKey = header; if (dataKey == null) { continue; } String dataValue = (String) map.getOrDefault(dataKey.toString(), ""); String deparmentName = (String) map.getOrDefault("部门", ""); String mobile = (String) map.getOrDefault("手机号", ""); String workcode = (String) map.getOrDefault("工号", ""); if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { //当人员信息导入筛选的全局配置为"0"时,姓名才是必填项 if (StringUtils.isEmpty(dataValue) && "0".equals(confValue)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); excelComments.add(errorMessageMap); } else { //筛选导入人员信息可以在人力资源池中匹配到的人员信息 List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, dataValue, deparmentName, mobile, workcode, null); if (CollectionUtils.isEmpty(employeeSameIds)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); excelComments.add(errorMessageMap); } else if (employeeSameIds.size() > 1) { //存在离职和在职状态取在职状态 employeeSameIds = employeeSameIds.stream() .filter(e -> UserStatusEnum.getNormalStatus().contains(e.getStatus())) .collect(Collectors.toList()); if (employeeSameIds.size() != 1) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + "员工信息不存在或者存在多个员工"); excelComments.add(errorMessageMap); } else { employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 ? employeeSameIds.get(0).getEmployeeId() : null; } } else { employeeId = employeeSameIds.get(0).getEmployeeId(); } } } } if (!isError){ List employeeIds = new ArrayList<>(); employeeIds.add(employeeId); //根据员工id、个税扣缴义务人id、账单月份查询,如果当前对比表中存在数据,则记录为待删除数据 list = getExcelInsuranceDetailMapper().queryCompareList(billMonth, paymentOrganization, employeeIds.get(0)); if (!list.isEmpty()) { List ids = list.stream().map(ExcelInsuranceDetailPO::getId) .collect(Collectors.toList()); idList.addAll(ids); } //拼装待更新数据 addCompareList.add(handleExcelInsuranceDetail(billMonth, employeeId, paymentOrganization, map)); } if (isError) { failCount++; errorDatas.add(map); } else { successCount++; } } //将待更新列表加密 encryptUtil.encryptList(addCompareList, ExcelInsuranceDetailPO.class); //删除 if (idList.size() > 0) { getExcelInsuranceDetailMapper().batchDelByIds(idList); } //新增 getExcelInsuranceDetailMapper().batchSave(addCompareList); apidatas.put("successCount", successCount); apidatas.put("errorCount", failCount); apidatas.put("errorData", excelComments); } finally { IOUtils.closeQuietly(fileInputStream); } return apidatas; } /** * 将excel导入的数据行组装成ExcelInsuranceDetailPO对象 * @param billMonth 对比的账单月份 * @param baseMap excel导入的对比数据 */ private ExcelInsuranceDetailPO handleExcelInsuranceDetail(String billMonth, Long employeeId, Long paymentOrganization, Map baseMap) { ExcelInsuranceDetailPO excelInsuranceDetailPO = new ExcelInsuranceDetailPO(); excelInsuranceDetailPO.setId(IdGenerator.generate()); //组装json数据,格式Map Map socialPerMap = new HashMap<>(); Map fundPerMap = new HashMap<>(); Map otherPerMap = new HashMap<>(); Map socialComMap = new HashMap<>(); Map fundComMap = new HashMap<>(); Map otherComMap = new HashMap<>(); //组装福利基数 Map socialPaymentBaseMap = new HashMap<>(); Map fundPaymentBaseMap = new HashMap<>(); Map otherPaymentBaseMap = new HashMap<>(); //筛选出福利核算项 Map toDealMap = baseMap.entrySet().stream() .filter(map -> !"姓名".equals(map.getKey()) && !"部门".equals(map.getKey()) && !"手机号".equals(map.getKey()) && !"个税扣缴义务人".equals(map.getKey()) && !"员工状态".equals(map.getKey()) && !"数据来源".equals(map.getKey()) && !"工号".equals(map.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); for(Map.Entry entry : toDealMap.entrySet()) { //判断元素是否属于福利类 String keyName = entry.getKey(); //获取元素名后缀,方便之后判断“个人”或“单位”或者“基数” String payScope = keyName.substring(keyName.length() - 2); //获取福利类型 Integer welfareType; //根据元素名后缀,区分截取内容 String targetWelfareName; if ("基数".equals(payScope)) { targetWelfareName = entry.getKey().substring(0, keyName.length() - 4); } else { targetWelfareName = entry.getKey().substring(0, keyName.length() - 2); } List categoryPOList = siCategoryBiz.listByName(targetWelfareName); if (categoryPOList.size() == 1) { ICategoryPO iCategoryPO = categoryPOList.get(0); welfareType = iCategoryPO.getWelfareType(); switch (payScope) { case "个人": switch (welfareType) { case 1: socialPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: fundPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: otherPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; default: throw new SalaryRunTimeException("福利类型不存在"); } break; case "单位": switch (welfareType) { case 1: socialComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: fundComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: otherComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; default: throw new SalaryRunTimeException("福利类型不存在"); } break; case "基数": switch (welfareType) { case 1: socialPaymentBaseMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: fundPaymentBaseMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: otherPaymentBaseMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; default: throw new SalaryRunTimeException("福利类型不存在"); } break; } } } //设置社保个人和公司缴纳明细 excelInsuranceDetailPO.setSocialPerJson(JSON.toJSONString(socialPerMap)); excelInsuranceDetailPO.setSocialComJson(JSON.toJSONString(socialComMap)); //设置公积金个人和公司缴纳明细 excelInsuranceDetailPO.setFundPerJson(JSON.toJSONString(fundPerMap)); excelInsuranceDetailPO.setFundComJson(JSON.toJSONString(fundComMap)); //设置其他福利个人和公司缴纳明细 excelInsuranceDetailPO.setOtherPerJson(JSON.toJSONString(otherPerMap)); excelInsuranceDetailPO.setOtherComJson(JSON.toJSONString(otherComMap)); //设置社保、公积金、其他福利缴纳基数 excelInsuranceDetailPO.setSocialPaymentBaseString(JSON.toJSONString(socialPaymentBaseMap)); excelInsuranceDetailPO.setFundPaymentBaseString(JSON.toJSONString(fundPaymentBaseMap)); excelInsuranceDetailPO.setOtherPaymentBaseString(JSON.toJSONString(otherPaymentBaseMap)); //组装新的insuranceAccountDetailPO对象数据 excelInsuranceDetailPO.setEmployeeId(employeeId); excelInsuranceDetailPO.setBillMonth(billMonth); excelInsuranceDetailPO.setBillStatus(1); excelInsuranceDetailPO.setPaymentStatus(0); excelInsuranceDetailPO.setResourceFrom(1); excelInsuranceDetailPO.setSocialAccount(baseMap.getOrDefault("社保账号", "").toString()); if (baseMap.getOrDefault("社保方案名称", "") != null) { List socialSchemeList = getInsuranceSchemeMapper().listByName(baseMap.get("社保方案名称").toString()); if (socialSchemeList.size() == 1) { //设置社保方案id excelInsuranceDetailPO.setSocialSchemeId(socialSchemeList.get(0).getId()); } } excelInsuranceDetailPO.setFundAccount(baseMap.getOrDefault("公积金账号", "").toString()); excelInsuranceDetailPO.setSupplementFundAccount(baseMap.getOrDefault("补充公积金账号", "").toString()); if (baseMap.getOrDefault("公积金方案名称", "") != null) { List fundSchemeList = getInsuranceSchemeMapper().listByName(baseMap.get("公积金方案名称").toString()); if (fundSchemeList.size() == 1) { //设置公积金方案id excelInsuranceDetailPO.setFundSchemeId(fundSchemeList.get(0).getId()); } } if (baseMap.getOrDefault("其他福利方案名称", "") != null) { List otherSchemeList = getInsuranceSchemeMapper().listByName(baseMap.get("其他福利方案名称").toString()); if (otherSchemeList.size() == 1) { //其他福利方案id excelInsuranceDetailPO.setOtherSchemeId(otherSchemeList.get(0).getId()); } } excelInsuranceDetailPO.setSocialPerSum(baseMap.getOrDefault("社保个人合计", "").toString()); excelInsuranceDetailPO.setFundPerSum(baseMap.getOrDefault("公积金个人合计", "").toString()); excelInsuranceDetailPO.setOtherPerSum(baseMap.getOrDefault("其他福利个人合计", "").toString()); excelInsuranceDetailPO.setPerSum(baseMap.getOrDefault("个人合计", "").toString()); excelInsuranceDetailPO.setSocialComSum(baseMap.getOrDefault("社保单位合计", "").toString()); excelInsuranceDetailPO.setFundComSum(baseMap.getOrDefault("公积金单位合计", "").toString()); excelInsuranceDetailPO.setOtherComSum(baseMap.getOrDefault("其他福利单位合计", "").toString()); excelInsuranceDetailPO.setComSum(baseMap.getOrDefault("单位合计", "").toString()); excelInsuranceDetailPO.setSocialSum(baseMap.getOrDefault("社保合计", "").toString()); excelInsuranceDetailPO.setFundSum(baseMap.getOrDefault("公积金合计", "").toString()); excelInsuranceDetailPO.setOtherSum(baseMap.getOrDefault("其他福利合计", "").toString()); excelInsuranceDetailPO.setTotal(baseMap.getOrDefault("合计", "").toString()); excelInsuranceDetailPO.setCreator((long) user.getUID()); excelInsuranceDetailPO.setCreateTime(new Date()); excelInsuranceDetailPO.setUpdateTime(new Date()); excelInsuranceDetailPO.setDeleteType(0); excelInsuranceDetailPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); excelInsuranceDetailPO.setPaymentOrganization(paymentOrganization); return excelInsuranceDetailPO; } /** * 刷新_bill_batch表中的统计信息 */ @Override public void refreshBillBatch(Long paymentOrganization, String billMonth) { ExecutorService taskExecutor = Executors.newCachedThreadPool(); taskExecutor.execute(() -> { if (paymentOrganization != null && billMonth != null) { InsuranceAccountDetailParam refreshParam =new InsuranceAccountDetailParam(); refreshParam.setBillMonth(billMonth); refreshParam.setPaymentOrganization(paymentOrganization.toString()); PageInfo pageInfos = overView(refreshParam); TaxAgentPO taxAgentPo = getTaxAgentMapper().getById(paymentOrganization); if (taxAgentPo != null) { List viewListDTOList = pageInfos.getList(); viewListDTOList.stream().filter(f -> f.getPayOrg().equals(taxAgentPo.getName())).collect(Collectors.toList()); InsuranceAccountBatchPO batchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, paymentOrganization); batchPO = encryptUtil.decrypt(batchPO, InsuranceAccountBatchPO.class); //更新 if (viewListDTOList.size() > 0 && batchPO != null) { InsuranceAccountViewListDTO viewListDTO = viewListDTOList.get(0); batchPO.setSocialNum(viewListDTO.getSocialNum()); batchPO.setFundNum(viewListDTO.getFundNum()); batchPO.setOtherNum(viewListDTO.getOtherNum()); batchPO.setSocialPay(viewListDTO.getSocialPaySum().replace(",", "")); batchPO.setFundPay(viewListDTO.getFundPaySum().replace(",", "")); batchPO.setOtherPay(viewListDTO.getOtherPaySum().replace(",", "")); batchPO.setUpdateTime(new Date()); batchPO = encryptUtil.encrypt(batchPO, InsuranceAccountBatchPO.class); getInsuranceAccountBatchMapper().updateById(batchPO); } } } }); } /** * 将通过id获取InsuranceAccountDetailPO中的社保、公积金、其他福利个人和公司缴纳数据 */ @Override public Map getPaymentById(Long id) { InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(id); if (insuranceAccountDetailPO == null) { throw new SalaryRunTimeException("该条核算数据不存在!"); } encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); String socialPerJson = insuranceAccountDetailPO.getSocialPerJson(); String socialComJson = insuranceAccountDetailPO.getSocialComJson(); String fundPerJson = insuranceAccountDetailPO.getFundPerJson(); String fundComJson = insuranceAccountDetailPO.getFundComJson(); String otherPerJson = insuranceAccountDetailPO.getOtherPerJson(); String otherComJson = insuranceAccountDetailPO.getOtherComJson(); Map dataMap = new HashMap<>(); List addGroups = new ArrayList<>(); getPaymentGroup(socialPerJson, "个人", "社保", dataMap, addGroups); getPaymentGroup(socialComJson, "公司", "社保", dataMap, addGroups); getPaymentGroup(fundPerJson, "个人", "公积金", dataMap, addGroups); getPaymentGroup(fundComJson, "公司", "公积金", dataMap, addGroups); getPaymentGroup(otherPerJson, "个人", "其他福利", dataMap, addGroups); getPaymentGroup(otherComJson, "公司", "其他福利", dataMap, addGroups); Map resultMap = new HashMap<>(); // resultMap.put("data", dataMap); // resultMap.put("items", addGroups); List> perList = new ArrayList<>(); List> comList = new ArrayList<>(); for (SearchConditionGroup group : addGroups) { if (group.getItems() != null && group.getItems().size() > 0) { for (SearchConditionItem item : group.getItems()) { Map map = new HashMap<>(); String[] domkey = item.getDomkey(); String insuranceId = domkey[0].substring(3); if (group.getTitle().contains("个人")) { map.put("title", group.getTitle()); map.put("paymentScope", "个人"); map.put("insuranceName", item.getLabel()); map.put("insuranceId", insuranceId); map.put("insuranceValue", dataMap.get(domkey[0])); if (map.get("insuranceValue") != null && !"".equals(map.get("insuranceValue"))) { perList.add(map); } } else if (group.getTitle().contains("公司")) { map.put("title", group.getTitle()); map.put("paymentScope", "公司"); map.put("insuranceName", item.getLabel()); map.put("insuranceId", insuranceId); map.put("insuranceValue", dataMap.get(domkey[0])); if (map.get("insuranceValue") != null && !"".equals(map.get("insuranceValue"))) { comList.add(map); } } } } } List> resultList = new ArrayList<>(); resultList.addAll(perList); resultList.addAll(comList); resultMap.put("data", resultList); return resultMap; } public void getPaymentGroup(String baseJson, String groupType, String welfareType, Map dataMap, List addGroups) { if (StringUtils.isBlank(baseJson)) { addGroups.add(new SearchConditionGroup(welfareType + groupType +"缴纳", true, null)); return; } String groupPrefix = "个人".equals(groupType) ? "per" : "com"; Map toDealMap = JSON.parseObject(baseJson, new HashMap().getClass()); Map baseJsonMap = new HashMap<>(); List inputItems = new ArrayList<>(); for (Map.Entry entry : toDealMap.entrySet()) { //获取福利项信息 ICategoryPO iCategoryPO = siCategoryBiz.getByID(Long.valueOf(entry.getKey())); if (iCategoryPO != null) { String name = groupPrefix + iCategoryPO.getId().toString(); String label = iCategoryPO.getInsuranceName(); inputItems.add(SalaryFormItemUtil.inputNumberItem(user, "precision:2", 2, 12, 2, label, name)); } baseJsonMap.put(groupPrefix + entry.getKey(), entry.getValue()); } dataMap.putAll(baseJsonMap); addGroups.add(new SearchConditionGroup(welfareType + groupType +"缴纳", true, inputItems)); } /** * 编辑InsuranceAccountDetailPO中的社保、公积金、其他福利个人和公司缴纳数据 */ @Override public void editAccount(EditAccountDetailParam param) { InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(param.getId()); if (insuranceAccountDetailPO == null) { throw new SalaryRunTimeException("该条核算数据不存在!"); } encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); accountSocialByData(insuranceAccountDetailPO, param); accountFundByData(insuranceAccountDetailPO, param); accountOtherByData(insuranceAccountDetailPO, param); account(insuranceAccountDetailPO); encryptUtil.encrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //刷新_bill_batch表中的统计信息 refreshBillBatch(insuranceAccountDetailPO.getPaymentOrganization(), insuranceAccountDetailPO.getBillMonth()); } public void accountFundByData(InsuranceAccountDetailPO insuranceAccountDetailPO, EditAccountDetailParam baseParam) { //公积金个人 if (StringUtils.isNotBlank(baseParam.getFundPerJson())) { List fundPer = new ArrayList<>(); HashMap fundPerson = JSON.parseObject(baseParam.getFundPerJson(), new HashMap().getClass()); fundPerson.forEach((k, v) -> { BigDecimal result = new BigDecimal(v); fundPer.add(result); }); insuranceAccountDetailPO.setFundPerJson(baseParam.getFundPerJson()); BigDecimal fundPerSum = new BigDecimal("0"); for (BigDecimal bigDecimal : fundPer) { fundPerSum = fundPerSum.add(bigDecimal); } insuranceAccountDetailPO.setFundPerSum(fundPerSum.toPlainString()); } //公积金单位 if (StringUtils.isNotBlank(baseParam.getFundComJson())) { List fundCom = new ArrayList<>(); HashMap fundComMap = JSON.parseObject(baseParam.getFundComJson(), new HashMap().getClass()); fundComMap.forEach((k, v) -> { BigDecimal result = new BigDecimal(v); fundCom.add(result); }); insuranceAccountDetailPO.setFundComJson(baseParam.getFundComJson()); BigDecimal fundComSum = new BigDecimal("0"); for (BigDecimal bigDecimal : fundCom) { fundComSum = fundComSum.add(bigDecimal); } insuranceAccountDetailPO.setFundComSum(fundComSum.toPlainString()); } } public void accountOtherByData(InsuranceAccountDetailPO insuranceAccountDetailPO, EditAccountDetailParam baseParam) { //其他福利个人 if (StringUtils.isNotBlank(baseParam.getOtherPerJson())) { List otherPer = new ArrayList<>(); HashMap otherPerMap = JSON.parseObject(baseParam.getOtherPerJson(), new HashMap().getClass()); otherPerMap.forEach((k, v) -> { BigDecimal result = new BigDecimal(v); otherPer.add(result); }); insuranceAccountDetailPO.setOtherPerJson(baseParam.getOtherPerJson()); BigDecimal otherPerSum = new BigDecimal("0"); for (BigDecimal bigDecimal : otherPer) { otherPerSum = otherPerSum.add(bigDecimal); } insuranceAccountDetailPO.setOtherPerSum(otherPerSum.toPlainString()); } //其他福利单位 if (StringUtils.isNotBlank(baseParam.getOtherComJson())) { List otherCom = new ArrayList<>(); HashMap otherComMap = JSON.parseObject(baseParam.getOtherComJson(), new HashMap().getClass()); otherComMap.forEach((k, v) -> { BigDecimal result = new BigDecimal(v); otherCom.add(result); }); insuranceAccountDetailPO.setOtherComJson(baseParam.getOtherComJson()); BigDecimal otherComSum = new BigDecimal("0"); for (BigDecimal bigDecimal : otherCom) { otherComSum = otherComSum.add(bigDecimal); } insuranceAccountDetailPO.setOtherComSum(otherComSum.toPlainString()); } } public void accountSocialByData(InsuranceAccountDetailPO insuranceAccountDetailPO, EditAccountDetailParam baseParam) { //社保个人 if (StringUtils.isNotBlank(baseParam.getSocialPerJson())) { List socialPer = new ArrayList<>(); HashMap archivesPerson = JSON.parseObject(baseParam.getSocialPerJson(), new HashMap().getClass()); archivesPerson.forEach((k, v) -> { BigDecimal result = new BigDecimal(v); socialPer.add(result); }); insuranceAccountDetailPO.setSocialPerJson(baseParam.getSocialPerJson()); BigDecimal socialPerSum = new BigDecimal("0"); for (BigDecimal bigDecimal : socialPer) { socialPerSum = socialPerSum.add(bigDecimal); } insuranceAccountDetailPO.setSocialPerSum(socialPerSum.toPlainString()); } //社保单位 if (StringUtils.isNotBlank(baseParam.getSocialComJson())) { List socialCom = new ArrayList<>(); HashMap archivesCom = JSON.parseObject(baseParam.getSocialComJson(), new HashMap().getClass()); archivesCom.forEach((k, v) -> { BigDecimal result = new BigDecimal(v); socialCom.add(result); }); insuranceAccountDetailPO.setSocialComJson(baseParam.getSocialComJson()); BigDecimal socialComSum = new BigDecimal("0"); for (BigDecimal bigDecimal : socialCom) { socialComSum = socialComSum.add(bigDecimal); } insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); } } public InsuranceAccountDetailPO 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()); return insuranceAccountDetailPO; } /** * 导出“福利核算-补差导入”模板 */ @Override public XSSFWorkbook exportBalanceImportTemplate(InsuranceAcctDetailImportTemplateParam param) { ValidUtil.doValidator(param); // 必须选择导入模板所需的薪资项目(福利项) if (CollectionUtils.isEmpty(param.getWelfareNames())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目核算项")); } // 模板表头(默认必带"个税扣缴义务人"、"姓名") List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), "部门", SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86317, "工号"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人") ); List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName"); // 查询福利核算项目 List welfareNames = (List) param.getWelfareNames(); headerList.addAll(welfareNames); // //查询当前已有的补缴数据 // List> resultMapList = getSupplyDataByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); // // excel导出的数据 // List> rows = Lists.newArrayListWithExpectedSize(resultMapList.size()); // rows.add(headerList); // for (Map map : resultMapList) { // List row = Lists.newArrayListWithExpectedSize(headerList.size()); // for (String dataIndex : dataIndexList) { // row.add(map.getOrDefault(dataIndex, StringUtils.EMPTY)); // } // rows.add(row); // } List> rows = new ArrayList<>(); rows.add(headerList); String sheetName = "福利核算-补差导入模板"; return ExcelUtil.genWorkbookV2(rows, sheetName); } /** * 将福利台账-补差模板导入的数据更新到数据库 */ @Override public Map importBalanceInsuranceDetail(InsuranceAcctImportParam importParam) { long currentEmployeeId = user.getUID(); // Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); Map apidatas = new HashMap(); //查询对于人员信息导入筛选的全局配置 SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; //检验参数 //excel文件id String imageId = Util.null2String(importParam.getImageId()); if (StringUtils.isBlank(imageId)) { throw new SalaryRunTimeException("文件不存在"); } // // 获取所有个税扣缴义务人 // List taxAgents = getTaxAgentService(user).listAll(); // Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); // 获取租户下所有的人员 List salaryEmployees = getSalaryEmployeeService(user).listEmployee(); List insuranceCategoryPOS = getICategoryMapper().listAll(); // 失败的数量 int failCount = 0; // 成功的数量 int successCount = 0; InputStream fileInputStream = null; try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(importParam.getImageId())); Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); // 错误提示信息 List excelComments = Lists.newArrayList(); // 存在错误的那行数据 List> errorDatas = Lists.newArrayList(); // 表头 List headers = ExcelSupport.getSheetHeader(sheet, 0); // 处理数值 List> data = ExcelParseHelper.parse2Map(sheet, 1); if (CollectionUtils.isEmpty(headers)) { throw new SalaryRunTimeException("表头为空"); } if (CollectionUtils.isEmpty(data)) { throw new SalaryRunTimeException("无数据"); } //存储待更新的InsuranceAccountDetailPO数据 List updateInsuranceAccountDetailList = new ArrayList<>(); //存储待新增的InsuranceAccountDetailPO数据 List createInsuranceAccountDetailList = new ArrayList<>(); String billMonth = importParam.getBillMonth(); //遍历excel表具体数据 for (int i = 0; i < data.size(); i++) { String row = "第" + (i + 2) + "行"; boolean isError = false; Map map = data.get(i); Long employeeId = 0L; // Long taxAgentId = 0L; List list = new ArrayList<>(); String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", ""); Long paymentOrganization = 0L; List taxAgentPoList = getTaxAgentMapper().listByName(taxAgentName); if (taxAgentPoList.size() == 1) { paymentOrganization = taxAgentPoList.get(0).getId(); } else { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"))); excelComments.add(errorMessageMap); } if (!checkBillMonth(billMonth)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "账单月份输入有误,请参照“2022-09”这种格式进行检查")); excelComments.add(errorMessageMap); } List> singleAccount = new ArrayList<>(); //遍历表头 for (int j = 0; j < headers.size(); j++) { String header = headers.get(j); String dataKey = header; if (dataKey == null) { continue; } //组装单条数据基础数据 Map cellData = new HashMap<>(); cellData.put(dataKey, Optional.ofNullable(map.get(dataKey)).orElse("").toString()); cellData.put("index", j); singleAccount.add(cellData); //抽取人员信息进行校验 String name = (String) map.getOrDefault("姓名", ""); String departmentName = (String) map.getOrDefault("部门", ""); String mobile = (String) map.getOrDefault("手机号", ""); String workcode = (String) map.getOrDefault("工号", ""); if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { //当人员信息导入筛选的全局配置为"0"时,姓名才是必填项 if (StringUtils.isEmpty(name) && "0".equals(confValue)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); excelComments.add(errorMessageMap); } else { //筛选导入人员信息可以在人力资源池中匹配到的人员信息 List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, name, departmentName, mobile, workcode, null); if (CollectionUtils.isEmpty(employeeSameIds)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); excelComments.add(errorMessageMap); } else if (employeeSameIds.size() > 1) { //存在离职和在职状态取在职状态 employeeSameIds = employeeSameIds.stream() .filter(e -> UserStatusEnum.getNormalStatus().contains(e.getStatus())) .collect(Collectors.toList()); if (employeeSameIds.size() != 1) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + "员工信息不存在或者存在多个员工"); excelComments.add(errorMessageMap); } else { employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 ? employeeSameIds.get(0).getEmployeeId() : null; } } else { employeeId = employeeSameIds.get(0).getEmployeeId(); } } } } if (!isError){ //如果福利核算信息查询不到唯一匹配数据,不支持导入 //根据员工id、个税扣缴义务人id、账单月份查询补差数据 list = getInsuranceAccountDetailMapper().queryBalanceList(InsuranceAccountDetailPO.builder() .employeeId(employeeId) .paymentOrganization(paymentOrganization) .billMonth(billMonth) .build()); if (list.isEmpty()) { //新增数据情况 InsuranceAccountDetailPO createPO = buildBalanceAccountDetail(paymentOrganization, insuranceCategoryPOS, singleAccount, billMonth, employeeId, currentEmployeeId); if(checkBalance(createPO)) { createInsuranceAccountDetailList.add(createPO); } else { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员在当前账单月不存在补差数据中的福利类,请检查补差缴纳信息!")); excelComments.add(errorMessageMap); } } else if (list.size() > 1) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员在当前账单月已存在多组补差数据,请删除数据库中多余项")); excelComments.add(errorMessageMap); } else { //更新数据情况 //拼装待更新数据 encryptUtil.decryptList(list, InsuranceAccountDetailPO.class); InsuranceAccountDetailPO updatePO = handleInsuranceAccountDetail(list.get(0), map); if(checkBalance(updatePO)) { updateInsuranceAccountDetailList.add(updatePO); } else { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员在当前账单月不存在补差数据中的福利类,请检查补差缴纳信息!")); excelComments.add(errorMessageMap); } } } if (isError) { failCount++; errorDatas.add(map); } else { successCount++; } } Long paymentOrganization = null; if (updateInsuranceAccountDetailList.size() > 0) { paymentOrganization = updateInsuranceAccountDetailList.get(0).getPaymentOrganization(); //将待更新列表加密 encryptUtil.encryptList(updateInsuranceAccountDetailList, InsuranceAccountDetailPO.class); //更新 for(InsuranceAccountDetailPO po : updateInsuranceAccountDetailList) { getSiAccountBiz(user).updateByEmployeeIdAndBillMonth(po); } } if (createInsuranceAccountDetailList.size() > 0) { paymentOrganization = createInsuranceAccountDetailList.get(0).getPaymentOrganization(); //去除员工id+个税扣缴义务人下重复的数据 createInsuranceAccountDetailList = createInsuranceAccountDetailList.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); //将待新增列表加密 encryptUtil.encryptList(createInsuranceAccountDetailList, InsuranceAccountDetailPO.class); //新增 List> createPartition = Lists.partition((List) createInsuranceAccountDetailList, 20); createPartition.forEach(getInsuranceAccountDetailMapper()::batchSaveAccountDetails); } //刷新bill_batch表中统计信息 refreshBillBatch(paymentOrganization, importParam.getBillMonth()); apidatas.put("successCount", successCount); apidatas.put("errorCount", failCount); apidatas.put("errorData", excelComments); } finally { IOUtils.closeQuietly(fileInputStream); } return apidatas; } /** * 检查补差数据中的福利缴纳费用相关福利类别,是否在正常缴纳中有设置缴纳 * @param po * @return */ private boolean checkBalance(InsuranceAccountDetailPO po) { InsuranceAccountDetailPO commonAccountPO = getInsuranceAccountDetailMapper().getOneByBpep(InsuranceAccountDetailPO.builder() .billMonth(po.getBillMonth()) .paymentStatus(PaymentStatusEnum.COMMON.getValue()) .employeeId(po.getEmployeeId()) .paymentOrganization(po.getPaymentOrganization()) .build()); if (commonAccountPO != null) { encryptUtil.decrypt(commonAccountPO, InsuranceAccountDetailPO.class); boolean commonSocialNullFlag = (StringUtils.isBlank(commonAccountPO.getSocialSum()) || SalaryEntityUtil.StringEqZERO(commonAccountPO.getSocialSum())); boolean commonFundNullFlag = (StringUtils.isBlank(commonAccountPO.getFundSum()) || SalaryEntityUtil.StringEqZERO(commonAccountPO.getFundSum())); boolean commonOtherNullFlag = (StringUtils.isBlank(commonAccountPO.getOtherSum()) || SalaryEntityUtil.StringEqZERO(commonAccountPO.getOtherSum())); boolean balanceSocialNullFlag = (StringUtils.isBlank(po.getSocialSum()) || SalaryEntityUtil.StringEqZERO(po.getSocialSum())); boolean balanceFundNullFlag = (StringUtils.isBlank(po.getFundSum()) || SalaryEntityUtil.StringEqZERO(po.getFundSum())); boolean balanceOtherNullFlag = (StringUtils.isBlank(po.getOtherSum()) || SalaryEntityUtil.StringEqZERO(po.getOtherSum())); //在正常缴纳数据中未设置的福利类别(社保、公积金、其他福利),不允许在补差数据中缴纳 if ((commonSocialNullFlag && !balanceSocialNullFlag) || (commonFundNullFlag && !balanceFundNullFlag) || (commonOtherNullFlag && !balanceOtherNullFlag)) { return false; } else { return true; } } else { return false; } } public InsuranceAccountDetailPO buildBalanceAccountDetail(Long paymentOrganization, List insuranceCategoryPOS, List> singleAccount, String billMonth, Long employeeId, Long creator) { InsuranceAccountDetailPO insuranceAccountDetailPO = new InsuranceAccountDetailPO(); insuranceAccountDetailPO.setId(IdGenerator.generate()); insuranceAccountDetailPO.setEmployeeId(employeeId); insuranceAccountDetailPO.setBillMonth(billMonth); insuranceAccountDetailPO.setBillStatus(BillStatusEnum.NOT_ARCHIVED.getValue()); insuranceAccountDetailPO.setPaymentStatus(PaymentStatusEnum.BALANCE.getValue()); insuranceAccountDetailPO.setResourceFrom(ResourceFromEnum.IMPORT.getValue()); insuranceAccountDetailPO.setCreator(creator); insuranceAccountDetailPO.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue()); insuranceAccountDetailPO.setCreateTime(new Date()); insuranceAccountDetailPO.setUpdateTime(new Date()); insuranceAccountDetailPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); insuranceAccountDetailPO.setPaymentOrganization(paymentOrganization); insuranceAccountDetailPO.setSocialPayOrg(paymentOrganization); insuranceAccountDetailPO.setFundPayOrg(paymentOrganization); insuranceAccountDetailPO.setOtherPayOrg(paymentOrganization); InsuranceArchivesBaseInfoPO baseInfoPO = getInsuranceBaseInfoMapper().getOneByEmployeeIdAndPayOrg(employeeId, paymentOrganization); if (baseInfoPO != null) { InsuranceArchivesSocialSchemePO socialSchemePO = getSocialSchemeMapper().getOneById(baseInfoPO.getSocialArchivesId()); InsuranceArchivesFundSchemePO fundSchemePO = getFundSchemeMapper().getOneById(baseInfoPO.getFundArchivesId()); if (socialSchemePO != null) { insuranceAccountDetailPO.setSocialAccount(socialSchemePO.getSocialAccount()); } if (fundSchemePO != null) { insuranceAccountDetailPO.setFundAccount(fundSchemePO.getFundAccount()); insuranceAccountDetailPO.setSupplementFundAccount(fundSchemePO.getSupplementFundAccount()); } } //获取改员工社保档案 accountBalanceSocial(singleAccount, insuranceAccountDetailPO, insuranceCategoryPOS, creator); accountBalanceFund(singleAccount, insuranceAccountDetailPO, insuranceCategoryPOS, creator); // 其他福利档案 accountBalanceOther(singleAccount, insuranceAccountDetailPO, insuranceCategoryPOS, creator); account((insuranceAccountDetailPO)); if (insuranceAccountDetailPO.getOtherSchemeId() == null) { insuranceAccountDetailPO.setOtherSchemeId(0L); } if (insuranceAccountDetailPO.getSocialSchemeId() == null) { insuranceAccountDetailPO.setSocialSchemeId(0L); } if (insuranceAccountDetailPO.getFundSchemeId() == null) { insuranceAccountDetailPO.setFundSchemeId(0L); } return insuranceAccountDetailPO; } public InsuranceAccountDetailPO accountBalanceSocial(List> singleAccount, InsuranceAccountDetailPO insuranceAccountDetailPO, List insuranceCategoryPOS, Long employeeId) { //社保-个人 List socialCategory = insuranceCategoryPOS.stream().filter(po -> po.getWelfareType().equals(WelfareTypeEnum.SOCIAL_SECURITY.getValue())) .collect(Collectors.toList()); List socialPer = new ArrayList<>(); Map socialPerJsonMap = new HashMap<>(); for (int i = 0; i < singleAccount.size(); i++) { Map stringObjectMap = singleAccount.get(i); Optional personalOptional = socialCategory.stream() .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人"))).findFirst(); if (personalOptional.isPresent() && StringUtils .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")))) { String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")); if (perNumString.length() > 0 && !isNumeric(perNumString)) { continue; } perNumString = perNumString.replace(",", ""); BigDecimal result = new BigDecimal(perNumString); socialPerJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); socialPer.add(result); } } insuranceAccountDetailPO.setSocialPerJson(JSON.toJSONString(socialPerJsonMap)); BigDecimal socialPerSum = new BigDecimal("0"); for (BigDecimal bigDecimal : socialPer) { socialPerSum = socialPerSum.add(bigDecimal); } insuranceAccountDetailPO.setSocialPerSum(socialPerSum.toPlainString()); //社保-单位 List socialCom = new ArrayList<>(); Map sociaComJsonMap = new HashMap<>(); for (int i = 0; i < singleAccount.size(); i++) { Map stringObjectMap = singleAccount.get(i); Optional personalOptional = socialCategory.stream() .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位"))).findFirst(); if (personalOptional.isPresent() && StringUtils .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")))) { String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")); if (perNumString.length() > 0 && !isNumeric(perNumString)) { continue; } perNumString = perNumString.replace(",", ""); BigDecimal result = new BigDecimal(perNumString); sociaComJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); socialCom.add(result); } } insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(sociaComJsonMap)); BigDecimal socialComSum = new BigDecimal("0"); for (BigDecimal decimal : socialCom) { socialComSum = socialComSum.add(decimal); } insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); return insuranceAccountDetailPO; } public InsuranceAccountDetailPO accountBalanceFund(List> singleAccount, InsuranceAccountDetailPO insuranceAccountDetailPO, List insuranceCategoryPOS, Long employeeId) { //公积金-个人 List fundCategory = insuranceCategoryPOS.stream().filter(po -> po.getWelfareType().equals(WelfareTypeEnum.ACCUMULATION_FUND.getValue())) .collect(Collectors.toList()); List fundPer = new ArrayList<>(); Map fundPerJsonMap = new HashMap<>(); for (int i = 0; i < singleAccount.size(); i++) { Map stringObjectMap = singleAccount.get(i); Optional personalOptional = fundCategory.stream() .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人"))).findFirst(); if (personalOptional.isPresent() && StringUtils .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")))) { String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")); if (perNumString.length() > 0 && !isNumeric(perNumString)) { continue; } perNumString = perNumString.replace(",", ""); BigDecimal result = new BigDecimal(perNumString); fundPerJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); fundPer.add(result); } } insuranceAccountDetailPO.setFundPerJson(JSON.toJSONString(fundPerJsonMap)); BigDecimal funPerSum = new BigDecimal("0"); for (BigDecimal bigDecimal : fundPer) { funPerSum = funPerSum.add(bigDecimal); } insuranceAccountDetailPO.setFundPerSum(funPerSum.toPlainString()); //公积金-单位 List fundComList = new ArrayList<>(); Map fundComJsonMap = new HashMap<>(); for (int i = 0; i < singleAccount.size(); i++) { Map stringObjectMap = singleAccount.get(i); Optional personalOptional = fundCategory.stream() .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位"))).findFirst(); if (personalOptional.isPresent() && StringUtils .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")))) { String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")); if (perNumString.length() > 0 && !isNumeric(perNumString)) { continue; } perNumString = perNumString.replace(",", ""); BigDecimal result = new BigDecimal(perNumString); fundComJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); fundComList.add(result); } } insuranceAccountDetailPO.setFundComJson(JSON.toJSONString(fundComJsonMap)); BigDecimal fundComSum = new BigDecimal("0"); for (BigDecimal bigDecimal : fundComList) { fundComSum = fundComSum.add(bigDecimal); } insuranceAccountDetailPO.setFundComSum(fundComSum.toPlainString()); return insuranceAccountDetailPO; } public InsuranceAccountDetailPO accountBalanceOther(List> singleAccount, InsuranceAccountDetailPO insuranceAccountDetailPO, List insuranceCategoryPOS, Long employeeId) { List otherCategory = insuranceCategoryPOS.stream().filter(po -> po.getWelfareType().equals(WelfareTypeEnum.OTHER.getValue())) .collect(Collectors.toList()); // 其他福利-个人 List otherPer = new ArrayList<>(); Map otherPerJsonMap = new HashMap<>(); for (int i = 0; i < singleAccount.size(); i++) { Map stringObjectMap = singleAccount.get(i); Optional personalOptional = otherCategory.stream() .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人"))).findFirst(); if (personalOptional.isPresent() && StringUtils .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")))) { String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")); if (perNumString.length() > 0 && !isNumeric(perNumString)) { continue; } perNumString = perNumString.replace(",", ""); BigDecimal result = new BigDecimal(perNumString); otherPerJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); otherPer.add(result); } } insuranceAccountDetailPO.setOtherPerJson(JSON.toJSONString(otherPerJsonMap)); BigDecimal otherPerSum = new BigDecimal("0"); for (BigDecimal bigDecimal : otherPer) { otherPerSum = otherPerSum.add(bigDecimal); } insuranceAccountDetailPO.setOtherPerSum(otherPerSum.toPlainString()); // 其他福利-单位 List otherComList = new ArrayList<>(); Map otherComJsonMap = new HashMap<>(); for (int i = 0; i < singleAccount.size(); i++) { Map stringObjectMap = singleAccount.get(i); Optional personalOptional = otherCategory.stream() .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位"))).findFirst(); if (personalOptional.isPresent() && StringUtils .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")))) { String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")); if (perNumString.length() > 0 && !isNumeric(perNumString)) { continue; } perNumString = perNumString.replace(",", ""); BigDecimal result = new BigDecimal(perNumString); otherComJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); otherComList.add(result); } } insuranceAccountDetailPO.setOtherComJson(JSON.toJSONString(otherComJsonMap)); BigDecimal otherComSum = new BigDecimal("0"); for (BigDecimal bigDecimal : otherComList) { otherComSum = otherComSum.add(bigDecimal); } insuranceAccountDetailPO.setOtherComSum(otherComSum.toPlainString()); return insuranceAccountDetailPO; } }