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

2097 lines
105 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.siaccount.ExcelInsuranceDetailPOEncrypt;
import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt;
import com.engine.salary.encrypt.siaccount.SiAccountEncrypt;
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.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.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.InsuranceBaseInfoMapper;
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.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.util.*;
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();
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 EmployBiz employeeBiz = new EmployBiz();
private TaxAgentBiz taxAgentBiz = new TaxAgentBiz();
@Override
public Map<String, Object> listPage(InsuranceAccountBatchParam queryParam) {
Long employeeId = (long) user.getUID();
Map<String, Object> datas = new HashMap<>();
// 分权逻辑
Boolean needAuth = getTaxAgentService(user).isNeedAuth((long) user.getUID());
if (needAuth) {
Collection<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAllTaxAgents((long) user.getUID());
List<Long> taxAgents = taxAgentPOS.stream().map(TaxAgentPO::getId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(taxAgents)) {
//防止普通用户查询
queryParam.setTaxAgents(Collections.singletonList(-1L));
} else {
queryParam.setTaxAgents(taxAgents);
}
}
//福利台账列表
PageInfo<InsuranceAccountBatchPO> pageInfo = getSiAccountBiz(user).listPage(queryParam);
Collection<InsuranceAccountBatchPO> insuranceAccountBatchPOS = pageInfo.getList();
List<InsuranceAccountBatchListDTO> insuranceAccountBatchListDTOS = InsuranceAccountBO.buildAccountBatchDTOList(insuranceAccountBatchPOS);
PageInfo<InsuranceAccountBatchListDTO> pageInfos = new PageInfo<>(insuranceAccountBatchListDTOS, InsuranceAccountBatchListDTO.class);
pageInfos.setTotal(pageInfo.getTotal());
pageInfos.setPageNum(queryParam.getCurrent());
pageInfos.setPageSize(queryParam.getPageSize());
List<Map<Integer, List<Permission>>> operatesPermission = new ArrayList<>();
SalaryWeaTable<InsuranceAccountBatchListDTO> table = new SalaryWeaTable<>(user, InsuranceAccountBatchListDTO.class);
List<Column> columns = pageInfos.getColumns();
List<WeaTableColumn> 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<InsuranceAccountInspectPO> 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<InsuranceAccountBatchListDTO> resultTable = FormatManager.<InsuranceAccountBatchListDTO>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<String, Object> listCommonPage(InsuranceAccountDetailParam queryParam) {
Long employeeId = (long) user.getUID();
Map<String, Object> datas = new HashMap<>();
//正常缴纳列表
PageInfo<InsuranceAccountDetailPO> pageInfo = getSiAccountBiz(user).listCommonPage(queryParam);
List<InsuranceAccountDetailPO> insuranceAccountDetailPOS = pageInfo.getList();
//数据组装
List<Map<String, Object>> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId);
PageInfo<Map<String, Object>> pageInfos = new PageInfo<>(records);
pageInfos.setTotal(pageInfo.getTotal());
pageInfos.setPageNum(queryParam.getCurrent());
pageInfos.setPageSize(queryParam.getPageSize());
//动态列组装
List<WeaTableColumn> weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(insuranceAccountDetailPOS, employeeId, SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, false);
WeaTable table = new WeaTable();
table.setPageUID(UUID.randomUUID().toString());
table.setColumns(weaTableColumn);
List<Column> 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<String, Object> listCommonPageByName(InsuranceAccountDetailParam queryParam) {
//增加查询参数userName
if (StringUtils.isNotBlank(queryParam.getUserName())) {
queryParam.setUserName(queryParam.getUserName());
}
return listCommonPage(queryParam);
}
@Override
public Map<String, Object> listSupplementaryPage(InsuranceAccountDetailParam queryParam) {
Long employeeId = (long) user.getUID();
Map<String, Object> datas = new HashMap<>();
//过滤出福利档案基础信息表中runStatus为正在缴纳和待减员的人员
List<InsuranceArchivesBaseInfoPO> baseInfoPOList = getInsuranceBaseInfoMapper().listAll();
List<Long> 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);
SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize());
List<InsuranceAccountDetailPO> list = getInsuranceAccountDetailMapper().list(queryParam);
PageInfo<InsuranceAccountDetailPO> pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class);
List<InsuranceAccountDetailPO> insuranceAccountDetailPOS = pageInfo.getList();
InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS);
//数据组装
List<Map<String, Object>> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId);
PageInfo<Map<String, Object>> pageInfos = new PageInfo<>(records);
pageInfos.setTotal(pageInfo.getTotal());
pageInfos.setPageNum(queryParam.getCurrent());
pageInfos.setPageSize(queryParam.getPageSize());
//动态列组装
List<WeaTableColumn> weaTableColumn = getColumnBuildService(user).buildCommonColumnsWithStyle(insuranceAccountDetailPOS, employeeId, SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY, true);
SalaryWeaTable<InsuranceAccountDetailPO> table = new SalaryWeaTable<>(user, InsuranceAccountDetailPO.class);
table.setColumns(weaTableColumn);
List<Column> 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<String, Object> supplementaryByNameList(InsuranceAccountDetailParam queryParam) {
//增加查询参数userName
if (StringUtils.isNotBlank(queryParam.getUserName())) {
queryParam.setUserName(queryParam.getUserName());
}
return listSupplementaryPage(queryParam);
}
@Override
public Map<String, Object> getForm(Map<String, Object> params) {
Map<String, Object> apidatas = new HashMap<>();
//条件组
List<SearchConditionGroup> addGroups = new ArrayList<>();
List<SearchConditionItem> 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<InsuranceAccountBatchPO> billMonthList = getInsuranceAccountBatchMapper().listByTimeRange(minDate, maxDate);
SiAccountEncrypt.decryptInsuranceAccountBatchList(billMonthList);
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 void save(AccountParam param) {
ValidUtil.doValidator(param);
Long employeeId = (long) user.getUID();
String lastName = user.getLastname();
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<SupplementAccountBaseParam> 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<Long> ids) {
List<InsuranceAccountInspectPO> insuranceAccountInspectPOS = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class).getByInspectStatusAndIds(InspectStatusEnum.COMFORED.getValue(), ids);
if (CollectionUtils.isNotEmpty(insuranceAccountInspectPOS)) {
getInsuranceAccountDetailMapper().batchUnConfirmedInspectDetails(insuranceAccountInspectPOS.stream().map(InsuranceAccountInspectPO::getId).collect(Collectors.toList()));
}
}
@Override
public Map<String, Boolean> buttonCheck(String billMonth) {
Map<String, Boolean> result = new HashMap<>();
List<InsuranceAccountInspectPO> list = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class).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<Long> ids) {
List<InsuranceAccountInspectPO> insuranceAccountInspectPOS = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class).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 = SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO);
boolean isShow = false;
if (insuranceAccountBatchPO == null || insuranceAccountBatchPO.getBillStatus() == BillStatusEnum.NOT_ARCHIVED.getValue()) {
isShow = true;
}
if (insuranceAccountBatchPO != null) {
insuranceAccountTabDTO.setRemarks(insuranceAccountBatchPO.getRemarks());
}
List<Map<String, Object>> tabList = new ArrayList<>();
Map<String, Object> common = new HashMap<>();
common.put("id", "1");
common.put("content", SalaryI18nUtil.getI18nLabel(92265, "正常缴纳"));
tabList.add(common);
if (isShow) {
Map<String, Object> change = new HashMap<>();
change.put("id", "2");
change.put("content", SalaryI18nUtil.getI18nLabel(100509, "异动清单"));
tabList.add(change);
}
Map<String, Object> repair = new HashMap<>();
repair.put("id", "3");
repair.put("content", SalaryI18nUtil.getI18nLabel(92267, "补缴"));
tabList.add(repair);
Map<String, Object> overView = new HashMap<>();
overView.put("id", "4");
overView.put("content", SalaryI18nUtil.getI18nLabel(99927, "总览"));
tabList.add(overView);
insuranceAccountTabDTO.setTabList(tabList);
insuranceAccountTabDTO.setShow(isShow);
insuranceAccountTabDTO.setBillMonth(build.getBillMonth());
return insuranceAccountTabDTO;
}
@Override
public Map<String, Object> changeList(InsuranceAccountDetailParam param) {
Map<String, Object> datas = new HashMap<>();
Long employeeId = (long) user.getUID();
SalaryPageUtil.start(param.getCurrent(), param.getPageSize());
List<InsuranceArchivesEmployeePO> insuranceArchivesEmployeePOS = getInsuranceAccountDetailMapper().changeList(param.getUserName());
PageInfo<InsuranceArchivesEmployeePO> pageInfo = new PageInfo<>(insuranceArchivesEmployeePOS);
List<Map<String, Object>> records = siArchivesBiz.buildTableData(insuranceArchivesEmployeePOS);
PageInfo<Map<String, Object>> pageInfos = new PageInfo<>(records);
pageInfos.setTotal(pageInfo.getTotal());
pageInfos.setPageNum(param.getCurrent());
pageInfos.setPageSize(param.getPageSize());
List<WeaTableColumn> 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<List<Permission>> permissions = new ArrayList<>();
for (int i = 0; i < records.size(); i++) {
List<Permission> 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<String, Object> getInspectTable(InsuranceAccountDetailParam param) {
Map<String, Object> datas = new HashMap<>();
SalaryPageUtil.start(param.getCurrent(), param.getPageSize());
List<InsuranceAccountInspectPO> insuranceAccountInspectPOS = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class).getByBillMonth(param.getBillMonth());
List<Map<String, Object>> records = getService(user).buildInspectRecords(insuranceAccountInspectPOS, Long.valueOf(param.getPaymentOrganization()));
PageInfo<Map<String, Object>> pageInfos = new PageInfo<>(records);
pageInfos.setTotal(records.size());
pageInfos.setPageNum(param.getCurrent());
pageInfos.setPageSize(param.getPageSize());
List<WeaTableColumn> 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<List<Permission>> permissions = new ArrayList<>();
for (int i = 0; i < records.size(); i++) {
List<Permission> 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<String, Object> getCommonForm(Map<String, Object> params) {
Map<String, Object> apidatas = new HashMap<>();
//条件组
List<SearchConditionGroup> addGroups = new ArrayList<>();
List<SearchConditionItem> conditionItems = new ArrayList<>();
List<SearchConditionItem> 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<String, Object> getSupplementaryForm(Map<String, Object> params) {
Map<String, Object> apidatas = new HashMap<>();
//条件组
List<SearchConditionGroup> addGroups = new ArrayList<>();
List<SearchConditionItem> condition = new ArrayList<>();
List<SearchConditionItem> conditionItems = new ArrayList<>();
List<SearchConditionItem> 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<InsuranceAccountViewListDTO> overView(InsuranceAccountDetailParam queryParam) {
PageInfo<InsuranceAccountViewListDTO> pageInfos = getSiAccountBiz(user).overView(queryParam);
return pageInfos;
}
@Override
public List<Map<String, Object>> welfareData(String billMonth, List<Long> employeeIds, Long taxAgentId) {
InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, taxAgentId);
insuranceAccountBatchPO = SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO);
if (insuranceAccountBatchPO == null || Objects.equals(BillStatusEnum.NOT_ARCHIVED.getValue(), insuranceAccountBatchPO.getBillStatus())) {
return Lists.newArrayList();
}
List<InsuranceAccountDetailPO> list = queryList(billMonth, taxAgentId, employeeIds);
List<Map<String, Object>> result = new ArrayList<>();
list.stream().forEach(item -> {
Map<String, Object> record = new HashMap<>();
record.put("employeeId", item.getEmployeeId());
if (StringUtils.isNotEmpty(item.getSocialPerJson())) {
Map<String, Object> socialJson = JSON.parseObject(item.getSocialPerJson(), new HashMap<String, Object>().getClass());
socialJson.forEach((k, v) -> {
record.put(k + "socialPer", v);
});
}
if (StringUtils.isNotEmpty(item.getSocialComJson())) {
Map<String, Object> socialJson = JSON.parseObject(item.getSocialComJson(), new HashMap<String, Object>().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<String, Object> fundPerJson = JSON.parseObject(item.getFundPerJson(), new HashMap<String, Object>().getClass());
fundPerJson.forEach((k, v) -> {
record.put(k + "fundPer", v);
});
}
if (StringUtils.isNotEmpty(item.getFundComJson())) {
Map<String, Object> fundPerJson = JSON.parseObject(item.getFundComJson(), new HashMap<String, Object>().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<String, Object> fundPerJson = JSON.parseObject(item.getOtherPerJson(), new HashMap<String, Object>().getClass());
fundPerJson.forEach((k, v) -> {
record.put(k + "otherPer", v);
});
}
if (StringUtils.isNotEmpty(item.getOtherComJson())) {
Map<String, Object> fundComJson = JSON.parseObject(item.getOtherComJson(), new HashMap<String, Object>().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<String, String> welfareColumns() {
List<ICategoryPO> listAll = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll();
List<ICategoryPO> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(listAll)) {
list.addAll(listAll);
}
Map<String, String> 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<String, String> 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<SearchConditionOption> buildBillProjectsOptions() {
List<SearchConditionOption> 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<InsuranceAccountDetailPO> queryList(String billMonth, Long taxAgentId, List<Long> employeeIds) {
List<InsuranceAccountDetailPO> insuranceAccountDetailPOS = getInsuranceAccountDetailMapper().queryList(billMonth, taxAgentId, employeeIds);
List<InsuranceAccountDetailPO> list = buildNewInsuranceDetailPOS(insuranceAccountDetailPOS);
// InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list);
return list;
}
public List<InsuranceAccountDetailPO> buildNewInsuranceDetailPOS(List<InsuranceAccountDetailPO> list) {
List<InsuranceAccountDetailPO> newList = new ArrayList<>();
if (CollectionUtils.isEmpty(list)) {
return newList;
}
Map<Long, List<InsuranceAccountDetailPO>> employeeMap = list.stream().filter(item -> item.getEmployeeId() != null)
.collect(Collectors.groupingBy(InsuranceAccountDetailPO::getEmployeeId));
for (Map.Entry<Long, List<InsuranceAccountDetailPO>> entry : employeeMap.entrySet()) {
Long k = entry.getKey();
List<InsuranceAccountDetailPO> v = entry.getValue();
InsuranceAccountDetailPO insuranceAccountDetailPO = new InsuranceAccountDetailPO();
insuranceAccountDetailPO.setEmployeeId(k);
Map<String, String> socialPerMap = new HashMap<>();
Map<String, String> fundPerMap = new HashMap<>();
Map<String, String> otherPerMap = new HashMap<>();
Map<String, String> socialComMap = new HashMap<>();
Map<String, String> fundComMap = new HashMap<>();
Map<String, String> 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) {
InsuranceAccountDetailPOEncrypt.decryptItem(item);
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<String, String> socialJson = JSON.parseObject(item.getSocialPerJson(), new HashMap<String, String>().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<String, String> socialJson = JSON.parseObject(item.getSocialComJson(), new HashMap<String, String>().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<String, String> fundJson = JSON.parseObject(item.getFundPerJson(), new HashMap<String, String>().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<String, String> fundJson = JSON.parseObject(item.getFundComJson(), new HashMap<String, String>().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<String, String> otherJson = JSON.parseObject(item.getOtherPerJson(), new HashMap<String, String>().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<String, String> otherJson = JSON.parseObject(item.getOtherComJson(), new HashMap<String, String>().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<InsuranceAccountInspectPO> allInspects(Collection<Long> ids, String billMonth) {
InsuranceAccountInspectMapper siAccountInspectMapper = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class);
List<InsuranceAccountInspectPO> list = siAccountInspectMapper.getList(billMonth, InspectStatusEnum.IGNORE.getValue(), ids);
if (CollectionUtils.isNotEmpty(list)) {
return list;
}
return Collections.emptyList();
}
@Override
public Collection<TaxAgentPO> 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<Object> headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"),
"部门",
SalaryI18nUtil.getI18nLabel(86186, "手机号"),
SalaryI18nUtil.getI18nLabel(86317, "工号"),
SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"),
"账单月份");
List<String> dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName", "billMonth");
// 查询福利核算项目
List<String> welfareNames = (List<String>) param.getWelfareNames();
headerList.addAll(welfareNames);
// excel导出的数据
//查询当前已有的正常缴纳数据
List<Map<String, Object>> resultMapList = getNormalDataByBillMonth(param.getBillMonth(), param.getPaymentOrganization());
// excel导出的数据
List<List<Object>> rows = Lists.newArrayListWithExpectedSize(resultMapList.size());
rows.add(headerList);
for (Map<String, Object> map : resultMapList) {
List<Object> 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<String, Object> importInsuranceAcctDetail(InsuranceAcctImportParam importParam) {
// long currentEmployeeId = user.getUID();
// Boolean openDevolution = getTaxAgentService(user).isOpenDevolution();
Map<String, Object> apidatas = new HashMap<String, Object>();
EmployBiz employBiz = new EmployBiz();
//查询对于人员信息导入筛选的全局配置
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<TaxAgentPO> taxAgents = getTaxAgentService(user).listAll();
// Map<String, Long> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId);
// 获取租户下所有的人员
List<DataCollectionEmployee> salaryEmployees = employBiz.listEmployee();
// 失败的数量
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<Map> excelComments = Lists.newArrayList();
// 存在错误的那行数据
List<Map<String, Object>> errorDatas = Lists.newArrayList();
// 表头
List<String> headers = ExcelSupport.getSheetHeader(sheet, 0);
// 处理数值
List<Map<String, Object>> data = ExcelParseHelper.parse2Map(sheet, 1);
if (CollectionUtils.isEmpty(headers)) {
throw new RuntimeException("表头为空");
}
if (CollectionUtils.isEmpty(data)) {
throw new RuntimeException("无数据");
}
//存储待更新的InsuranceAccountDetailPO数据
List<InsuranceAccountDetailPO> updateInsuranceAccountDetailList = new ArrayList<>();
//遍历excel表具体数据
for (int i = 0; i < data.size(); i++) {
String row = "" + (i + 2) + "";
boolean isError = false;
Map<String, Object> map = data.get(i);
Long employeeId = 0L;
// Long taxAgentId = 0L;
List<InsuranceAccountDetailPO> list = new ArrayList<>();
String billMonth = (String) map.getOrDefault("账单月份", "");
String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", "");
String supplementaryMonth = (String) map.getOrDefault("补缴月份", "");
Long paymentOrganization = 0L;
List<TaxAgentPO> taxAgentPoList = getTaxAgentMapper().listByName(taxAgentName);
if (taxAgentPoList.size() == 1) {
paymentOrganization = taxAgentPoList.get(0).getId();
} else {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人")));
excelComments.add(errorMessageMap);
}
if (!checkBillMonth(billMonth)) {
isError = true;
Map<String, String> 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<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空"));
excelComments.add(errorMessageMap);
} else {
//筛选导入人员信息可以在人力资源池中匹配到的人员信息
List<DataCollectionEmployee> employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, dataValue, deparmentName, mobile, workcode, null);
if (CollectionUtils.isEmpty(employeeSameIds)) {
isError = true;
Map<String, String> 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<String, String> 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<Long> 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<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "本次福利核算不包含该人员"));
excelComments.add(errorMessageMap);
} else if (list.size() > 1) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员本次核算出现多组数据,请删除数据库中多余核算项"));
excelComments.add(errorMessageMap);
} else {
//拼装待更新数据
InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list);
updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map));
}
}
if (isError) {
failCount++;
errorDatas.add(map);
} else {
successCount++;
}
}
//将待更新列表加密
InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(updateInsuranceAccountDetailList);
//更新
for(InsuranceAccountDetailPO po : updateInsuranceAccountDetailList) {
getSiAccountBiz(user).updateByEmployeeIdAndBillMonth(po);
}
//刷新hrsa_bill_batch中数据统计信息
if (updateInsuranceAccountDetailList.size() > 0) {
InsuranceAccountDetailParam refreshParam =new InsuranceAccountDetailParam();
refreshParam.setBillMonth(updateInsuranceAccountDetailList.get(0).getBillMonth());
refreshParam.setPaymentOrganization(updateInsuranceAccountDetailList.get(0).getPaymentOrganization().toString());
PageInfo<InsuranceAccountViewListDTO> pageInfos = overView(refreshParam);
}
apidatas.put("successCount", successCount);
apidatas.put("errorCount", failCount);
apidatas.put("errorData", excelComments);
} finally {
IOUtils.closeQuietly(fileInputStream);
}
return apidatas;
}
/**
* 预览“福利核算导入”模板导入的数据
*/
@Override
public Map<String, Object> preview(InsuranceAcctImportParam param) {
//1、参数校验
String imageId = param.getImageId();
if (StringUtils.isBlank(imageId)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100593, "文件id为空"));
}
Map<String, Object> map = new HashMap<>();
InputStream fileInputStream = null;
try {
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId));
Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
List<String> 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<Object> headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"),
"部门",
SalaryI18nUtil.getI18nLabel(86186, "手机号"),
SalaryI18nUtil.getI18nLabel(86317, "工号"),
SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"),
"账单月份",
"补缴月份");
List<String> dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName", "billMonth", "supplementaryMonth");
// 查询福利核算项目
List<String> welfareNames = (List<String>) param.getWelfareNames();
headerList.addAll(welfareNames);
//查询当前已有的补缴数据
List<Map<String, Object>> resultMapList = getSupplyDataByBillMonth(param.getBillMonth(), param.getPaymentOrganization());
// excel导出的数据
List<List<Object>> rows = Lists.newArrayListWithExpectedSize(resultMapList.size());
rows.add(headerList);
for (Map<String, Object> map : resultMapList) {
List<Object> 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<Map<String, Object>> getSupplyDataByBillMonth(String billMonth, Long paymentOrganization) {
List<Map<String, Object>> resultList = new ArrayList<>();
DataCollectionEmployee employee = new DataCollectionEmployee();
TaxAgentPO taxAgentPO = taxAgentBiz.getById(paymentOrganization);
List<InsuranceAccountDetailPO> supplyDataList = getInsuranceAccountDetailMapper().querySupplementListByBillMonth(billMonth, paymentOrganization);
//过滤出福利档案基础信息表中runStatus为正在缴纳和待减员的人员
List<InsuranceArchivesBaseInfoPO> baseInfoPOList = getInsuranceBaseInfoMapper().listAll();
List<Long> 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<String, Object> resultMap = new HashMap<>();
employee = employeeBiz.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<Map<String, Object>> getNormalDataByBillMonth(String billMonth, Long paymentOrganization) {
List<Map<String, Object>> resultList = new ArrayList<>();
DataCollectionEmployee employee = new DataCollectionEmployee();
TaxAgentPO taxAgentPO = taxAgentBiz.getById(paymentOrganization);
List<InsuranceAccountDetailPO> normalDataList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(billMonth, paymentOrganization);
//过滤出福利档案基础信息表中runStatus为正在缴纳和待减员的人员
List<InsuranceArchivesBaseInfoPO> baseInfoPOList = getInsuranceBaseInfoMapper().listAll();
List<Long> 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<String, Object> resultMap = new HashMap<>();
employee = employeeBiz.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<String, Object> baseMap) {
//组装json数据,格式Map<String, Object>
Map<String, String> socialPerMap = new HashMap<>();
Map<String, String> fundPerMap = new HashMap<>();
Map<String, String> otherPerMap = new HashMap<>();
Map<String, String> socialComMap = new HashMap<>();
Map<String, String> fundComMap = new HashMap<>();
Map<String, String> otherComMap = new HashMap<>();
//筛选出福利核算项
Map<String, Object> 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<String, Object> entry : toDealMap.entrySet()) {
//判断元素是否属于福利类
String keyName = entry.getKey();
//获取元素名后缀,方便之后判断“个人”或“单位”
String payScope = keyName.substring(keyName.length() - 2);
//获取福利类型
Integer welfareType;
List<ICategoryPO> 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<String, String> checkJsonMap(Map<String, String> newMap, String oldJson) {
Map<String, String> oldMap = JSON.parseObject(oldJson, HashMap.class);
//校验newMap中的value值是否为整数或者小数
for(Map.Entry<String, String> newEntry : newMap.entrySet()) {
String newValue = newEntry.getValue();
int l = newValue.length();
if (newValue.length() > 0 && !isNumeric(newValue)) {
throw new SalaryRunTimeException("请检查导入Excel中个人或单位对应的福利项数值是否为整数或小数");
}
}
if (oldMap == null) {
return newMap;
}
//保留oldMap无变动数据更新newMap已变动数据
for (Map.Entry<String, String> 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<ICategoryPO> listAll = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll();
List<ICategoryPO> socialWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 1).collect(Collectors.toList());
List<ICategoryPO> fundWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 2).collect(Collectors.toList());
List<ICategoryPO> otherWelfareList = listAll.stream().filter(e -> e.getWelfareType() == 3).collect(Collectors.toList());
List<Object> 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<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
String sheetName = "福利核算-线下对比导入模板";
return ExcelUtil.genWorkbookV2(rows, sheetName);
}
/**
* 将通过“福利核算-线下对比导入”模板导入的数据更新到hrsa_excel_bill_detail表中
*/
@Override
public Map<String, Object> importExcelInsuranceDetail(ExcelInsuranceImportParam importParam) {
Map<String, Object> apidatas = new HashMap<String, Object>();
EmployBiz employBiz = new EmployBiz();
//查询对于人员信息导入筛选的全局配置
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<DataCollectionEmployee> salaryEmployees = employBiz.listEmployee();
// 失败的数量
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<Map> excelComments = Lists.newArrayList();
// 存在错误的那行数据
List<Map<String, Object>> errorDatas = Lists.newArrayList();
// 表头
List<String> headers = ExcelSupport.getSheetHeader(sheet, 0);
// 处理数值
List<Map<String, Object>> data = ExcelParseHelper.parse2Map(sheet, 1);
if (CollectionUtils.isEmpty(headers)) {
throw new RuntimeException("表头为空");
}
if (CollectionUtils.isEmpty(data)) {
throw new RuntimeException("无数据");
}
String billMonth = importParam.getBillMonth();
//存储待更新的InsuranceAccountDetailPO数据
List<ExcelInsuranceDetailPO> addCompareList = new ArrayList<>();
//记录待删除hrsa_excel_bill_detail.id
List<Long> idList = new ArrayList<>();
//遍历excel表具体数据
for (int i = 0; i < data.size(); i++) {
String row = "" + (i + 2) + "";
boolean isError = false;
Map<String, Object> map = data.get(i);
Long employeeId = 0L;
List<ExcelInsuranceDetailPO> list = new ArrayList<>();
String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", "");
Long paymentOrganization = 0L;
List<TaxAgentPO> taxAgentPoList = getTaxAgentMapper().listByName(taxAgentName);
if (taxAgentPoList.size() == 1) {
paymentOrganization = taxAgentPoList.get(0).getId();
} else {
isError = true;
Map<String, String> 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<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空"));
excelComments.add(errorMessageMap);
} else {
//筛选导入人员信息可以在人力资源池中匹配到的人员信息
List<DataCollectionEmployee> employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, dataValue, deparmentName, mobile, workcode, null);
if (CollectionUtils.isEmpty(employeeSameIds)) {
isError = true;
Map<String, String> 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<String, String> 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<Long> employeeIds = new ArrayList<>();
employeeIds.add(employeeId);
//根据员工id、个税扣缴义务人id、账单月份查询如果当前对比表中存在数据则记录为待删除数据
list = getExcelInsuranceDetailMapper().queryCompareList(billMonth, paymentOrganization, employeeIds.get(0));
if (!list.isEmpty()) {
List<Long> 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++;
}
}
//将待更新列表加密
ExcelInsuranceDetailPOEncrypt.encryptInsuranceAccountDetailPOList(addCompareList);
//删除
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<String, Object> baseMap) {
ExcelInsuranceDetailPO excelInsuranceDetailPO = new ExcelInsuranceDetailPO();
excelInsuranceDetailPO.setId(IdGenerator.generate());
//组装json数据,格式Map<String, Object>
Map<String, String> socialPerMap = new HashMap<>();
Map<String, String> fundPerMap = new HashMap<>();
Map<String, String> otherPerMap = new HashMap<>();
Map<String, String> socialComMap = new HashMap<>();
Map<String, String> fundComMap = new HashMap<>();
Map<String, String> otherComMap = new HashMap<>();
//组装福利基数
Map<String, String> socialPaymentBaseMap = new HashMap<>();
Map<String, String> fundPaymentBaseMap = new HashMap<>();
Map<String, String> otherPaymentBaseMap = new HashMap<>();
//筛选出福利核算项
Map<String, Object> 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<String, Object> 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<ICategoryPO> 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<InsuranceSchemePO> 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<InsuranceSchemePO> fundSchemeList = getInsuranceSchemeMapper().listByName(baseMap.get("公积金方案名称").toString());
if (fundSchemeList.size() == 1) {
//设置公积金方案id
excelInsuranceDetailPO.setFundSchemeId(fundSchemeList.get(0).getId());
}
}
if (baseMap.getOrDefault("其他福利方案名称", "") != null) {
List<InsuranceSchemePO> 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;
}
}