diff --git a/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java b/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java
new file mode 100644
index 000000000..d3d91e5f8
--- /dev/null
+++ b/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java
@@ -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;
+ }
+
+}
diff --git a/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java b/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java
index 5e1c658d7..8880ce557 100644
--- a/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java
+++ b/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java
@@ -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;
diff --git a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java
index 72a7bd9f3..114013a90 100644
--- a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java
+++ b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java
@@ -15,4 +15,14 @@ public class EmployeeDeclareImportParam extends EmployeeDeclareListQueryParam {
@ApiModelProperty("是否导出现有数据")
private String exportData;
+
+ //上传文件id
+ String imageId;
+
+ // 校验字段
+ private String checkType;
+
+ // 个税扣义务人id
+ private Long taxAgentId;
+
}
diff --git a/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java b/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java
index 75a8901b6..88e40e0de 100644
--- a/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java
+++ b/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java
@@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare;
import com.engine.salary.enums.BaseEnum;
+import java.util.Arrays;
+
/**
* 人员状态
*
Copyright: Copyright (c) 2023
@@ -41,4 +43,17 @@ public enum EmploymentStatusEnum implements BaseEnum {
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;
+ }
}
diff --git a/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java b/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java
index 609e7f8f8..08941637d 100644
--- a/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java
+++ b/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java
@@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare;
import com.engine.salary.enums.BaseEnum;
+import java.util.Arrays;
+
/**
* 任职受雇从业类型
* Copyright: Copyright (c) 2023
@@ -44,4 +46,17 @@ public enum EmploymentTypeEnum implements BaseEnum {
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;
+ }
}
diff --git a/src/com/engine/salary/enums/employeedeclare/GenderEnum.java b/src/com/engine/salary/enums/employeedeclare/GenderEnum.java
index 805afa7bd..a4849d129 100644
--- a/src/com/engine/salary/enums/employeedeclare/GenderEnum.java
+++ b/src/com/engine/salary/enums/employeedeclare/GenderEnum.java
@@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare;
import com.engine.salary.enums.BaseEnum;
+import java.util.Arrays;
+
/**
* 性别
* Copyright: Copyright (c) 2023
@@ -41,4 +43,17 @@ public enum GenderEnum implements BaseEnum {
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;
+ }
}
diff --git a/src/com/engine/salary/service/EmployeeDeclareExcelService.java b/src/com/engine/salary/service/EmployeeDeclareExcelService.java
index f48aa1199..cce2e72e9 100644
--- a/src/com/engine/salary/service/EmployeeDeclareExcelService.java
+++ b/src/com/engine/salary/service/EmployeeDeclareExcelService.java
@@ -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 preview(EmployeeDeclareImportParam param);
+
+ /**
+ * 导入人员报送数据
+ * @param param
+ * @return
+ */
+ Map importData(EmployeeDeclareImportParam param);
+
/**
* 导出人员信息采集-全部
*
diff --git a/src/com/engine/salary/service/EmployeeDeclareService.java b/src/com/engine/salary/service/EmployeeDeclareService.java
index 0869a5869..ed184159a 100644
--- a/src/com/engine/salary/service/EmployeeDeclareService.java
+++ b/src/com/engine/salary/service/EmployeeDeclareService.java
@@ -182,4 +182,6 @@ public interface EmployeeDeclareService{
* @return
*/
String syncEmploymentDate(EmployeeDeclareSyncStartDateParam param);
+
+ void batchInsert(List insertList);
}
diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java
index 783e15511..4352be9cf 100644
--- a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java
+++ b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java
@@ -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;
+
/**
* 人员报送(人员)导入导出
* Copyright: Copyright (c) 2023
@@ -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 preview(EmployeeDeclareImportParam param) {
+ //1、参数校验
+ String imageId = param.getImageId();
+ if (StringUtils.isBlank(imageId)) {
+ throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "文件id为空"));
+ }
+ Map map = new HashMap<>();
+
+ InputStream fileInputStream = null;
+ try {
+
+ fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId()));
+
+ Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
+ List headers = ExcelSupport.getSheetHeader(sheet, 0);
+
+ map.put("headers", headers);
+ map.put("list", ExcelParseHelper.parse2List(sheet, 1));
+
+ return map;
+
+ } finally {
+ IOUtils.closeQuietly(fileInputStream);
+ }
+ }
+
+ @Override
+ public Map importData(EmployeeDeclareImportParam param) {
+ Map 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 headerList = getImportHeader().stream().map(header -> header.toString()).collect(Collectors.toList());
+ // 查询所有的人员
+ List simpleEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ORG);
+ // 查询所有的外部人员
+ List extEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.EXT);
+ // 查询人员报送表的人员
+ List employeeDeclares = getEmployeeDeclareService(user).listByTaxCycleAndTaxAgentId(SalaryDateUtil.dateStrToLocalDate(taxCycle), taxAgentId);
+ // 校验字段
+ String checkType = param.getCheckType();
+ Map extEmployeeMap = Maps.newHashMap();
+ Map simpleEmployeeMap = Maps.newHashMap();
+ Map 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 needAddEmployeeDeclares = Lists.newArrayList();
+ // 需要更新的报送人员
+ List needUpdateEmployeeDeclares = Lists.newArrayList();
+ // 索引(用于计算进度)
+ int index = 0;
+ // 失败的数量
+ int failCount = 0;
+ // 成功的数量
+ int successCount = 0;
+ // 错误行的索引
+ int failRowIndex = 1;
+ // 包含错误提示信息的sheet页
+ List 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 headers = ExcelSupport.getSheetHeader(sheet, 0);
+
+ // 检查表头
+ String isCorrectHeader = checkHeader(headers, headerList);
+ if (isCorrectHeader != null) {
+ throw new SalaryRunTimeException(isCorrectHeader);
+ }
+ // 数据
+ List