Merge branch 'release/个税版本' into feature/个税2312版本功能

This commit is contained in:
钱涛 2023-12-28 09:51:34 +08:00
commit 8b78ccd43b
12 changed files with 664 additions and 8 deletions

View File

@ -0,0 +1,47 @@
package com.engine.salary.entity.employeedeclare.bo;
import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareExcelDTO;
import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO;
import com.engine.salary.enums.employeedeclare.CardTypeEnum;
import com.engine.salary.enums.employeedeclare.EmploymentTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryI18nUtil;
import org.apache.commons.lang3.StringUtils;
/**
* @author Harryxzy
* @ClassName EmployeeDeclareBO
* @date 2023/12/27 14:13
* @description
*/
public class EmployeeDeclareBO {
public static EmployeeDeclarePO convert2PO(EmployeeDeclareExcelDTO dto) {
if (dto == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "参数错误"));
}
EmployeeDeclarePO po = EmployeeDeclarePO.builder()
.jobNum(dto.getJobNum())
.employeeName(dto.getEmployeeName())
.cardType(dto.getCardType() == null ? null :CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue())
.cardNum(dto.getCardNum())
.employmentStatus(StringUtils.isBlank(dto.getEmploymentStatus()) ? null : new Integer(dto.getEmploymentStatus()))
.employmentType(EmploymentTypeEnum.getValueByDefaultLabel(dto.getEmploymentType()))
.employmentFirstYear(dto.getEmploymentFirstYear())
.mobile(dto.getMobile())
.employmentDate(StringUtils.isBlank(dto.getEmploymentDate()) ? null : SalaryDateUtil.stringToDate(dto.getEmploymentDate()) )
.dismissDate(StringUtils.isBlank(dto.getDismissDate()) ? null : SalaryDateUtil.stringToDate(dto.getDismissDate()))
.disability(dto.getDisability())
.disabilityCardNo(dto.getDisabilityCardNo())
.martyrDependents(dto.getMartyrDependents())
.martyrDependentsCardNo(dto.getMartyrDependentsCardNo())
.lonelyOld(dto.getLonelyOld())
.deductExpenses(dto.getDeductExpenses())
.gender(StringUtils.isBlank(dto.getGender()) ? null : new Integer(dto.getGender()))
.birthday(StringUtils.isBlank(dto.getBirthday()) ? null : SalaryDateUtil.stringToDate(dto.getBirthday()))
.build();
return po;
}
}

View File

@ -104,12 +104,33 @@ public class EmployeeDeclareExcelDTO {
@TableTitle(title = "任职受雇从业日期", dataIndex = "employmentDate", key = "employmentDate")
private String employmentDate;
// 入职年度就业情形
private String employmentFirstYear;
// 离职日期
@SalaryTableColumn(text = "离职日期", width = "10%", column = "dismissDate")
@TableTitle(title = "离职日期", dataIndex = "dismissDate", key = "dismissDate")
private String dismissDate;
// 是否残疾
private Integer disability;
// 残疾证号
private String disabilityCardNo;
// 是否孤老
private Integer lonelyOld;
// 是否是烈属
private Integer martyrDependents;
// 烈属证号
private String martyrDependentsCardNo;
// 是否扣除减除费用
private Integer deductExpenses;
// 申报状态
private DeclareStatusEnum declareStatus;

View File

@ -15,4 +15,14 @@ public class EmployeeDeclareImportParam extends EmployeeDeclareListQueryParam {
@ApiModelProperty("是否导出现有数据")
private String exportData;
//上传文件id
String imageId;
// 校验字段
private String checkType;
// 个税扣义务人id
private Long taxAgentId;
}

View File

@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare;
import com.engine.salary.enums.BaseEnum;
import java.util.Arrays;
/**
* 人员状态
* <p>Copyright: Copyright (c) 2023</p>
@ -41,4 +43,17 @@ public enum EmploymentStatusEnum implements BaseEnum<Integer> {
public Integer getLabelId() {
return labelId;
}
public static Integer getValueByDefaultLabel(String defaultLabel) {
if (defaultLabel == null) {
return null;
}
EmploymentStatusEnum[] enumAry = EmploymentStatusEnum.values();
for(int i = 0; i < Arrays.asList(enumAry).size(); i++){
if (enumAry[i].getDefaultLabel().equals(defaultLabel)) {
return enumAry[i].getValue();
}
}
return null;
}
}

View File

@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare;
import com.engine.salary.enums.BaseEnum;
import java.util.Arrays;
/**
* 任职受雇从业类型
* <p>Copyright: Copyright (c) 2023</p>
@ -44,4 +46,17 @@ public enum EmploymentTypeEnum implements BaseEnum<Integer> {
public Integer getLabelId() {
return labelId;
}
public static Integer getValueByDefaultLabel(String defaultLabel) {
if (defaultLabel == null) {
return null;
}
EmploymentTypeEnum[] enumAry = EmploymentTypeEnum.values();
for(int i = 0; i < Arrays.asList(enumAry).size(); i++){
if (enumAry[i].getDefaultLabel().equals(defaultLabel)) {
return enumAry[i].getValue();
}
}
return null;
}
}

View File

@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare;
import com.engine.salary.enums.BaseEnum;
import java.util.Arrays;
/**
* 性别
* <p>Copyright: Copyright (c) 2023</p>
@ -41,4 +43,17 @@ public enum GenderEnum implements BaseEnum<Integer> {
public Integer getLabelId() {
return labelId;
}
public static Integer getValueByDefaultLabel(String defaultLabel) {
if (defaultLabel == null) {
return null;
}
GenderEnum[] enumAry = GenderEnum.values();
for(int i = 0; i < Arrays.asList(enumAry).size(); i++){
if (enumAry[i].getDefaultLabel().equals(defaultLabel)) {
return enumAry[i].getValue();
}
}
return null;
}
}

View File

@ -4,6 +4,8 @@ import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareImportParam
import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Map;
/**
* @description: 人员报送人员导入导出
* @author: xiajun
@ -21,6 +23,21 @@ public interface EmployeeDeclareExcelService {
*/
XSSFWorkbook exportTemplate(EmployeeDeclareImportParam importParam);
/**
* 导入预览
* @param param
* @return
*/
Map<String, Object> preview(EmployeeDeclareImportParam param);
/**
* 导入人员报送数据
* @param param
* @return
*/
Map<String, Object> importData(EmployeeDeclareImportParam param);
/**
* 导出人员信息采集-全部
*

View File

@ -182,4 +182,6 @@ public interface EmployeeDeclareService{
* @return
*/
String syncEmploymentDate(EmployeeDeclareSyncStartDateParam param);
void batchInsert(List<EmployeeDeclarePO> insertList);
}

View File

@ -2,36 +2,62 @@ package com.engine.salary.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.employeedeclare.bo.EmployeeDeclareBO;
import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareExcelDTO;
import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareListDTO;
import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareImportParam;
import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam;
import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.SalaryOnOffEnum;
import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum;
import com.engine.salary.enums.employeedeclare.CardTypeEnum;
import com.engine.salary.enums.employeedeclare.DeclareStatusEnum;
import com.engine.salary.enums.employeedeclare.EmploymentStatusEnum;
import com.engine.salary.enums.employeedeclare.EmploymentTypeEnum;
import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum;
import com.engine.salary.enums.sicategory.DeleteTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.employeedeclare.EmployeeDeclareMapper;
import com.engine.salary.service.EmployeeDeclareExcelService;
import com.engine.salary.service.EmployeeDeclareService;
import com.engine.salary.service.SalaryEmployeeService;
import com.engine.salary.service.TaxAgentService;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryEnumUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.excel.ExcelSheetData;
import com.engine.salary.util.excel.ExcelUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.excel.*;
import com.engine.salary.util.valid.SalaryCardUtil;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import dm.jdbc.util.IdGenerator;
import lombok.extern.slf4j.Slf4j;
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 org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import weaver.file.ExcelSheet;
import weaver.file.ImageFileManager;
import weaver.general.Util;
import weaver.hrm.User;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX;
/**
* 人员报送人员导入导出
* <p>Copyright: Copyright (c) 2023</p>
@ -56,6 +82,10 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private EmployeeDeclareMapper getEmployeeDeclareMapper() {
return MapperProxyFactory.getProxy(EmployeeDeclareMapper.class);
}
@Override
public XSSFWorkbook exportTemplate(EmployeeDeclareImportParam importParam) {
// 查询人员
@ -78,8 +108,8 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee
row.add(employmentTypeEnum == null ? "" : employmentTypeEnum.getDefaultLabel());
row.add(employeeDeclare.getEmploymentFirstYear());
row.add(employeeDeclare.getMobile());
row.add(Util.null2String(employeeDeclare.getEmploymentDate()));
row.add(Util.null2String(employeeDeclare.getDismissDate()));
row.add(SalaryDateUtil.getFormatDate(employeeDeclare.getEmploymentDate()));
row.add(SalaryDateUtil.getFormatDate(employeeDeclare.getDismissDate()));
row.add(Objects.equals(employeeDeclare.getDisability(), 1) ? yesI18 : noI18);
row.add(employeeDeclare.getDisabilityCardNo());
row.add(Objects.equals(employeeDeclare.getMartyrDependents(), 1) ? yesI18 : noI18);
@ -96,6 +126,432 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee
return ExcelUtil.genWorkbook(excelSheetData);
}
@Override
public Map<String, Object> preview(EmployeeDeclareImportParam param) {
//1参数校验
String imageId = param.getImageId();
if (StringUtils.isBlank(imageId)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "文件id为空"));
}
Map<String, Object> map = new HashMap<>();
InputStream fileInputStream = null;
try {
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId()));
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 Map<String, Object> importData(EmployeeDeclareImportParam param) {
Map<String, Object> apidatas = new HashMap<>();
InputStream fileInputStream = null;
try {
Date now = new Date();
// 个税扣缴义务人id
Long taxAgentId = param.getTaxAgentId();
TaxAgentPO taxAgent = getTaxAgentService(user).getById(taxAgentId);
if (taxAgent == null) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "参数错误,无法找到个税扣缴义务人"));
}
// 税款所属期
String taxCycle = SalaryDateUtil.getFormatDate(param.getTaxCycle());
Date taxCycleDate = param.getTaxCycle();
// 导出模板中的表头
List<String> headerList = getImportHeader().stream().map(header -> header.toString()).collect(Collectors.toList());
// 查询所有的人员
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ORG);
// 查询所有的外部人员
List<DataCollectionEmployee> extEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.EXT);
// 查询人员报送表的人员
List<EmployeeDeclarePO> employeeDeclares = getEmployeeDeclareService(user).listByTaxCycleAndTaxAgentId(SalaryDateUtil.dateStrToLocalDate(taxCycle), taxAgentId);
// 校验字段
String checkType = param.getCheckType();
Map<String, DataCollectionEmployee> extEmployeeMap = Maps.newHashMap();
Map<String, DataCollectionEmployee> simpleEmployeeMap = Maps.newHashMap();
Map<String, EmployeeDeclarePO> employeeDeclareMap = Maps.newHashMapWithExpectedSize(employeeDeclares.size());
if (Objects.equals(checkType, "jobNum")) {
extEmployeeMap = Collections.emptyMap();
simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getWorkcode);
employeeDeclareMap = SalaryEntityUtil.convert2Map(employeeDeclares, EmployeeDeclarePO::getJobNum);
} else {
// 查询所有人员的个人信息
simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getIdNo);
extEmployeeMap = SalaryEntityUtil.convert2Map(extEmployees, DataCollectionEmployee::getIdNo);
employeeDeclareMap = SalaryEntityUtil.convert2Map(employeeDeclares, EmployeeDeclarePO::getCardNum);
}
// 需要新增的报送人员
List<EmployeeDeclarePO> needAddEmployeeDeclares = Lists.newArrayList();
// 需要更新的报送人员
List<EmployeeDeclarePO> needUpdateEmployeeDeclares = Lists.newArrayList();
// 索引(用于计算进度)
int index = 0;
// 失败的数量
int failCount = 0;
// 成功的数量
int successCount = 0;
// 错误行的索引
int failRowIndex = 1;
// 包含错误提示信息的sheet页
List<ExcelSheet> errorExcelSheets = Lists.newArrayList();
String imageId = Util.null2String(param.getImageId());
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId));
Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
// 表头
List<String> headers = ExcelSupport.getSheetHeader(sheet, 0);
// 检查表头
String isCorrectHeader = checkHeader(headers, headerList);
if (isCorrectHeader != null) {
throw new SalaryRunTimeException(isCorrectHeader);
}
// 数据
List<Map<String, Object>> data = ExcelParseHelper.parse2Map(sheet, 1);
if (CollectionUtils.isEmpty(data)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "导入数据不能为空"));
}
// 错误提示信息
List<ExcelComment> excelComments = Lists.newArrayList();
List<Map> errorData = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
//行号
String rowIndex = String.format("第%s行", i + 2);
Map<String, Object> map = data.get(i);
// 数据是否存在错误
boolean isError = false;
EmployeeDeclareExcelDTO employeeDeclareExcel = new EmployeeDeclareExcelDTO();
for (String dataKey : headerList) {
String dataValue = Util.null2String(map.get(dataKey));
if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel( 0, "工号"))) {
if (StringUtils.equals(checkType, "jobNum") && StringUtils.isEmpty(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "工号不能为空"));
errorData.add(errorMessageMap);
}
employeeDeclareExcel.setJobNum(dataValue);
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "姓名"))) {
if (StringUtils.isEmpty(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "姓名不能为空"));
errorData.add(errorMessageMap);
} else {
employeeDeclareExcel.setEmployeeName(dataValue);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "证件类型"))) {
employeeDeclareExcel.setCardType(CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue().toString());
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "证件号码"))) {
if (StringUtils.isEmpty(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "证件号码不能为空"));
errorData.add(errorMessageMap);
} else if (!SalaryCardUtil.checkIdNum(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "证件号码格式不正确"));
errorData.add(errorMessageMap);
} else {
employeeDeclareExcel.setCardNum(dataValue);
employeeDeclareExcel.setGender(SalaryCardUtil.judgeGender(dataValue).getValue().toString());
employeeDeclareExcel.setBirthday(SalaryCardUtil.judgeBirthday(dataValue).toString());
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "人员状态"))) {
boolean legalDataValue = false;
for (EmploymentStatusEnum employmentStatusEnum : EmploymentStatusEnum.values()) {
if (StringUtils.equals(dataValue, employmentStatusEnum.getDefaultLabel())) {
legalDataValue = true;
employeeDeclareExcel.setEmploymentStatus(employmentStatusEnum.getValue().toString());
break;
}
}
if (!legalDataValue) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态只能填写正常或非正常"));
errorData.add(errorMessageMap);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型"))) {
boolean legalDataValue = false;
for (EmploymentTypeEnum employmentTypeEnum : EmploymentTypeEnum.values()) {
if (StringUtils.equals(dataValue, employmentTypeEnum.getDefaultLabel())) {
legalDataValue = true;
employeeDeclareExcel.setEmploymentType(employmentTypeEnum.getValue().toString());
break;
}
}
if (!legalDataValue) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型填写错误"));
errorData.add(errorMessageMap);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "入职年度就业情形"))) {
employeeDeclareExcel.setEmploymentFirstYear(dataValue);
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "手机号码"))) {
if (StringUtils.isEmpty(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "手机号码不能为空"));
errorData.add(errorMessageMap);
} else if (!SalaryCardUtil.checkMobile(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "手机号码格式不正确"));
errorData.add(errorMessageMap);
} else {
employeeDeclareExcel.setMobile(dataValue);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "任职受雇从业日期"))) {
if (StringUtils.isEmpty(dataValue)) {
if (!Objects.equals(employeeDeclareExcel.getEmploymentType(), EmploymentTypeEnum.OTHER.getValue())) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型不为「其他」时,任职受雇从业日期为必填"));
errorData.add(errorMessageMap);
}
} else {
if (!SalaryDateUtil.checkDay(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "日期格式不正确"));
errorData.add(errorMessageMap);
} else {
employeeDeclareExcel.setEmploymentDate(LocalDate.parse(dataValue).toString());
}
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "离职日期"))) {
if (StringUtils.isEmpty(dataValue)) {
if (Objects.equals(employeeDeclareExcel.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue())) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态为非正常时,离职日期必填"));
errorData.add(errorMessageMap);
}
} else {
if (!SalaryDateUtil.checkDay(dataValue)) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "日期格式不正确"));
errorData.add(errorMessageMap);
} else {
employeeDeclareExcel.setDismissDate(LocalDate.parse(dataValue).toString());
}
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否残疾"))) {
if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) {
employeeDeclareExcel.setDisability(SalaryOnOffEnum.ON.getValue());
} else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) {
employeeDeclareExcel.setDisability(SalaryOnOffEnum.OFF.getValue());
} else {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否残疾只能填写是与否"));
errorData.add(errorMessageMap);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "残疾证号"))) {
if (StringUtils.isEmpty(dataValue)) {
if (Objects.equals(employeeDeclareExcel.getDisability(), SalaryOnOffEnum.ON.getValue())) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "「是否残疾」填「是」时,残疾证号必填"));
errorData.add(errorMessageMap);
}
} else {
employeeDeclareExcel.setDisabilityCardNo(dataValue);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否烈属"))) {
if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) {
employeeDeclareExcel.setMartyrDependents(SalaryOnOffEnum.ON.getValue());
} else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) {
employeeDeclareExcel.setMartyrDependents(SalaryOnOffEnum.OFF.getValue());
} else {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否烈属只能填写是与否"));
errorData.add(errorMessageMap);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "烈属证号"))) {
if (StringUtils.isEmpty(dataValue)) {
if (Objects.equals(employeeDeclareExcel.getMartyrDependents(), SalaryOnOffEnum.ON.getValue())) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "「是否烈属」填「是」时,烈属证号必填"));
errorData.add(errorMessageMap);
}
} else {
employeeDeclareExcel.setMartyrDependentsCardNo(dataValue);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否孤老"))) {
if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) {
employeeDeclareExcel.setLonelyOld(SalaryOnOffEnum.ON.getValue());
} else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) {
employeeDeclareExcel.setLonelyOld(SalaryOnOffEnum.OFF.getValue());
} else {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否孤老只能填写是与否"));
errorData.add(errorMessageMap);
}
} else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否扣除减除费用"))) {
if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) {
employeeDeclareExcel.setDeductExpenses(SalaryOnOffEnum.ON.getValue());
} else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) {
employeeDeclareExcel.setDeductExpenses(SalaryOnOffEnum.OFF.getValue());
} else {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否扣除减除费用只能填写是与否"));
errorData.add(errorMessageMap);
}
}
}
if (!isError) {
if (StringUtils.equals(checkType, "jobNum")) {
EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getJobNum());
if (employeeDeclare == null) {
DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getJobNum());
DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getJobNum());
if (extEmployee == null && simpleEmployee == null) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "系统内的人员不存在该工号"));
errorData.add(errorMessageMap);
} else {
needAddEmployeeDeclares.add(buildEmployeeDeclare(extEmployee, simpleEmployee,
employeeDeclareExcel, taxAgentId, taxCycleDate, now));
}
} else {
EmployeeDeclarePO newEmployeeDeclare = new EmployeeDeclarePO();
BeanUtils.copyProperties(employeeDeclare, newEmployeeDeclare);
BeanUtils.copyProperties(employeeDeclareExcel, newEmployeeDeclare);
newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1);
newEmployeeDeclare.setUpdateTime(now);
needUpdateEmployeeDeclares.add(newEmployeeDeclare);
if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) {
newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue());
newEmployeeDeclare.setDeclareErrorMsg("");
}
}
} else {
EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getCardNum());
if (employeeDeclare == null) {
DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getCardNum());
DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getCardNum());
if (extEmployee == null && simpleEmployee == null) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "系统内的人员不存在该证件号码"));
errorData.add(errorMessageMap);
} else {
needAddEmployeeDeclares.add(buildEmployeeDeclare(extEmployee, simpleEmployee,
employeeDeclareExcel, taxAgentId, taxCycleDate, now));
}
} else {
EmployeeDeclarePO newEmployeeDeclare = new EmployeeDeclarePO();
BeanUtils.copyProperties(employeeDeclare, newEmployeeDeclare);
EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel);
BeanUtils.copyProperties(employeeDeclarePO, newEmployeeDeclare, getNullPropertyNames(employeeDeclarePO));
newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1);
newEmployeeDeclare.setUpdateTime(now);
if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) {
newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue());
newEmployeeDeclare.setDeclareErrorMsg("");
}
needUpdateEmployeeDeclares.add(newEmployeeDeclare);
}
}
}
if (isError) {
failCount++;
failRowIndex++;
errorData.add(map);
continue;
}
successCount++;
}
if (CollectionUtils.isNotEmpty(needAddEmployeeDeclares)) {
getEmployeeDeclareService(user).batchInsert(needAddEmployeeDeclares);
}
if (CollectionUtils.isNotEmpty(needUpdateEmployeeDeclares)) {
needUpdateEmployeeDeclares.stream().forEach(getEmployeeDeclareMapper()::update);
}
apidatas.put("successCount", successCount);
apidatas.put("errorCount", failCount);
apidatas.put("errorNotice", errorData);
// 发送导入回调信息
// salaryBatchService.sendImportCallBackInfo(message, successCount, errorCount, errorExcelSheets);
} catch (Exception e) {
log.error("人员报送信息导入失败:{}", e.getMessage(), e);
} finally {
IOUtils.closeQuietly(fileInputStream);
}
return apidatas;
}
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for(PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
// 此处判断可根据需求修改
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
private EmployeeDeclarePO buildEmployeeDeclare(DataCollectionEmployee extEmployee, DataCollectionEmployee simpleEmployee,
EmployeeDeclareExcelDTO employeeDeclareExcel, Long taxAgentId,
Date taxCycle, Date now) {
EmployeeDeclarePO employeeDeclare = EmployeeDeclarePO.builder()
.id(IdGenerator.generate())
.taxAgentId(taxAgentId)
.taxCycle(taxCycle)
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.creator(Long.valueOf(user.getUID()))
.deleteType(DeleteTypeEnum.NOT_DELETED.getValue())
.createTime(now)
.updateTime(now).build();
EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel);
BeanUtils.copyProperties(employeeDeclarePO, employeeDeclare, getNullPropertyNames(employeeDeclarePO));
if (extEmployee != null) {
employeeDeclare.setEmployeeId(extEmployee.getEmployeeId());
employeeDeclare.setEmployeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue());
}
if (simpleEmployee != null) {
employeeDeclare.setEmployeeId(simpleEmployee.getEmployeeId());
employeeDeclare.setEmployeeType(EmployeeTypeEnum.ORGANIZATION.getValue());
}
return employeeDeclare;
}
@Override
public XSSFWorkbook export(EmployeeDeclareListQueryParam queryParam) {
// 查询需要报送的人员

View File

@ -727,4 +727,13 @@ public class EmployeeDeclareServiceImpl extends Service implements EmployeeDecla
return "执行完毕";
}
@Override
public void batchInsert(List<EmployeeDeclarePO> insertList) {
if (CollectionUtils.isEmpty(insertList)) {
return;
}
List<List<EmployeeDeclarePO>> partition = Lists.partition(insertList, 100);
partition.forEach(getEmployeeDeclareMapper()::batchInsert);
}
}

View File

@ -304,6 +304,35 @@ public class EmployeeDeclareController {
}
}
/**
* 人员报送-导入预览
*
* @param queryParam 导出参数
* @return
*/
@POST
@Path("/preview")
@Produces(MediaType.APPLICATION_JSON)
public String preview(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareImportParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<EmployeeDeclareImportParam, Map<String, Object>>(user).run(getEmployeeDeclareWrapper(user)::preview, queryParam);
}
/**
* 人员报送-导入
*
* @param queryParam 导出参数
* @return
*/
@POST
@Path("/importData")
@Produces(MediaType.APPLICATION_JSON)
public String importData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareImportParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<EmployeeDeclareImportParam, Map<String, Object>>(user).run(getEmployeeDeclareWrapper(user)::importData, queryParam);
}
/**
* 人员报送-导出全部人员
*

View File

@ -567,6 +567,26 @@ public class EmployeeDeclareWrapper extends Service {
return getEmployeeDeclareExcelService(user).exportTemplate(param);
}
/**
* 人员报送-导入数据
*
* @param param
* @return
*/
public Map<String, Object> preview(EmployeeDeclareImportParam param) {
return getEmployeeDeclareExcelService(user).preview(param);
}
/**
* 人员报送-导入数据
*
* @param param
* @return
*/
public Map<String, Object> importData(EmployeeDeclareImportParam param) {
return getEmployeeDeclareExcelService(user).importData(param);
}
/**
* 人员报送-导出本月全部的人员
*