薪酬系统-非系统人员管理,非系统人员导入

This commit is contained in:
sy 2023-07-28 10:12:59 +08:00
parent 82d708966e
commit 007d6df3cd
4 changed files with 308 additions and 2 deletions

View File

@ -25,4 +25,9 @@ public class DeptInfo {
* 名称
*/
private String name;
/**
* 所属分部id
*/
private Long subcompanyid1;
}

View File

@ -87,4 +87,19 @@ public interface EmployMapper {
List<HrmInfoDTO> listHrmInfoByIdAndName(@Param("param") HrmQueryParam param);
/**
* 根据部门名称查询部门
*/
List<DeptInfo> getDeptInfosByName(String name);
/**
* 根据分部名称查询分部
*/
List<SubCompanyInfo> getSubCompanyInfosByName(String name);
/**
* 根据部门id查询部门
*/
DeptInfo getDeptInfoById(Long id);
}

View File

@ -348,4 +348,26 @@
</if>
</select>
<select id="getDeptInfosByName" resultType="com.engine.salary.entity.hrm.DeptInfo">
select d.departmentname as name,
d.id as id
d.subcompanyid1 as subcompanyid1
from hrmdepartment d
where d.departmentname = #{name}
</select>
<select id="getSubCompanyInfosByName" resultType="com.engine.salary.entity.hrm.SubCompanyInfo">
select d.subcompanyname as name,
d.id as id
from hrmsubcompany d
where d.subcompanyname = #{name}
</select>
<select id="getDeptInfoById" resultType="com.engine.salary.entity.hrm.DeptInfo">
select d.departmentname as name,
d.id as id
d.subcompanyid1 as subcompanyid1
from hrmdepartment d
where d.id = #{id}
</select>
</mapper>

View File

@ -11,9 +11,11 @@ import com.engine.salary.entity.hrm.DeptInfo;
import com.engine.salary.entity.hrm.SubCompanyInfo;
import com.engine.salary.entity.salarysob.param.SalarySobRangeEmpQueryParam;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.datacollection.EmployMapper;
import com.engine.salary.mapper.extemp.ExternalEmployeeMapper;
import com.engine.salary.service.ExtEmpService;
import com.engine.salary.service.SalaryEmployeeService;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.excel.ExcelComment;
@ -24,14 +26,17 @@ 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.commons.lang3.Validate;
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 weaver.file.ImageFileManager;
import weaver.general.Util;
import weaver.hrm.User;
import java.io.InputStream;
@ -59,6 +64,9 @@ public class ExtEmpServiceImpl extends Service implements ExtEmpService {
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
}
private EmployMapper getEmployMapper() {
return MapperProxyFactory.getProxy(EmployMapper.class);
}
@Override
public List<ExtEmpPO> list(ExtEmpQueryParam param) {
@ -268,7 +276,263 @@ public class ExtEmpServiceImpl extends Service implements ExtEmpService {
}
@Override
public Map<String, Object> importExtEmp(ExtEmpImportParam param) {
return null;
public Map<String, Object> importExtEmp(ExtEmpImportParam param){
Map<String, Object> apidatas = new HashMap<String, Object>();
//excel文件id
String imageId = Util.null2String(param.getImageId());
Validate.notBlank(imageId, SalaryI18nUtil.getI18nLabel(542127, "imageId为空"));
// 失败的数量
int failCount = 0;
// 成功的数量
int successCount = 0;
InputStream fileInputStream = null;
try {
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId()));
Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
//数据库中现有非系统人员集合
List<ExtEmpPO> allExtEmpInfo= getExternalEmployeeMapper().listAll();
// 错误提示信息
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 SalaryRunTimeException("表头为空");
}
if (CollectionUtils.isEmpty(data)) {
throw new SalaryRunTimeException("无数据");
}
//存储待新增和待更新的ExtEmpPO数据
List<ExtEmpPO> updateExtEmpPOList = new ArrayList<>();
List<ExtEmpPO> insertExtEmpPOList = new ArrayList<>();
//遍历excel表具体数据
for (int i = 0; i < data.size(); i++) {
String row = "" + (i + 1) + "";
boolean isError = false;
Map<String, Object> map = data.get(i);
Long employeeId = 0L;
String username = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(25034, "姓名"), "");
String departmentName = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(27511, "部门"), "");
String subcompanyName = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(33553, "分部"), "");
String companystartdate = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(1516, "入职日期"), "");
//校验姓名
if (StringUtils.isBlank(username)) {
//姓名是必填项
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空"));
excelComments.add(errorMessageMap);
}
long usernameNum = updateExtEmpPOList.stream().filter(f -> f.getUsername().equals(username)).count() + insertExtEmpPOList.stream().filter(f -> f.getUsername().equals(username)).count();
if (usernameNum > 0) {
//excel中姓名相同时只会录入第一次出现的数据
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "本次excel文件中已存在该姓名相关数据本行数据无法录入"));
excelComments.add(errorMessageMap);
}
//校验部门分部
List<SubCompanyInfo> subCompanyInfos = new ArrayList<>();
List<DeptInfo> deptInfos = new ArrayList<>();
if (StringUtils.isNotBlank(subcompanyName)) {
subCompanyInfos = getEmployMapper().getSubCompanyInfosByName(subcompanyName);
if (subCompanyInfos.size() == 0) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "分部信息不存在,请检查分部数据是否正确"));
excelComments.add(errorMessageMap);
}
}
if (StringUtils.isNotBlank(departmentName)) {
deptInfos = getEmployMapper().getDeptInfosByName(departmentName);
if (deptInfos.size() == 0) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "部门信息不存在,请检查部门数据是否正确"));
excelComments.add(errorMessageMap);
}
}
if (StringUtils.isNotBlank(companystartdate) && (companystartdate.length() < 10 || !SalaryDateUtil.checkDay(companystartdate.substring(0, 10)))) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "入职日期格式错误正确格式为YYYY-MM或者yyyy-MM-dd"));
excelComments.add(errorMessageMap);
}
if (!isError){
//校验当前数据是否有相关数据姓名相同存在数据库中有则更新无则新建
List<ExtEmpPO> targetExtEmpInfoList = allExtEmpInfo.stream().filter(f -> f.getUsername().equals(username)).collect(Collectors.toList());
//校验部门和分部关系
List<DeptInfo> targetDeptInfos = new ArrayList<>();
List<SubCompanyInfo> targetSubCompanyInfos = new ArrayList<>();
if (targetExtEmpInfoList.size() == 1) {
ExtEmpPO targetExtEmpInfo = targetExtEmpInfoList.get(0);
//将库中已有的部门和分布信息取出excel行未设置对应字段数据时
if (targetExtEmpInfo.getSubcompanyId() != null && subCompanyInfos.size() == 0) {
subCompanyInfos.add(SubCompanyInfo.builder().id(targetExtEmpInfo.getSubcompanyId()).name(targetExtEmpInfo.getSubcompanyName()).build());
}
if (targetExtEmpInfo.getDepartmentId() != null && deptInfos.size() == 0) {
DeptInfo oldDeptInfo = getEmployMapper().getDeptInfoById(targetExtEmpInfo.getDepartmentId());
deptInfos.add(oldDeptInfo);
}
}
//分部结果数为0部门结果数大于1则无法匹配
if(subCompanyInfos.size() == 0 && deptInfos.size() > 1) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "系统中存在重复部门信息,无法指定当前人员关联的唯一部门,请通过填写部门所属的分部信息来缩小部门筛选范围"));
excelComments.add(errorMessageMap);
} else if (subCompanyInfos.size() > 1 && deptInfos.size() == 0) {
//部门结果数为0分部结果数大于1则无法匹配
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "系统中存在重复分部信息,无法指定当前人员关联的唯一分部,请通过填写人员所属的部门信息来缩小分部筛选范围"));
excelComments.add(errorMessageMap);
} else if (subCompanyInfos.size() >= 1 && deptInfos.size() >= 1) {
//部门结果数大于等于1分部结果数大于等于1筛选出可配对的组合根据部门的所属分部字段进行配对
for (DeptInfo deptInfo : deptInfos) {
if (subCompanyInfos.stream().filter(g -> g.getId().equals(deptInfo.getSubcompanyid1())).count() > 0) {
targetDeptInfos.add(deptInfo);
}
}
if (targetDeptInfos.size() == 0) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "部门与分部无法匹配"));
excelComments.add(errorMessageMap);
} else if (targetDeptInfos.size() > 1) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "该组数据中的部门和分部信息在系统中出现多组匹配的部门和分布组合,无法指定唯一的部门和分部组合"));
excelComments.add(errorMessageMap);
} else {
targetSubCompanyInfos = subCompanyInfos.stream().filter(f -> f.getId().equals(targetDeptInfos.get(0).getSubcompanyid1())).collect(Collectors.toList());
}
} else if (subCompanyInfos.size() == 0 && deptInfos.size() == 1) {
//分部结果数为0部门结果数为1可以匹配
targetDeptInfos.add(deptInfos.get(0));
} else if (subCompanyInfos.size() == 1 && deptInfos.size() == 0) {
//部门结果数为0分部结果数为1可以匹配
targetSubCompanyInfos.add(subCompanyInfos.get(0));
}
//收集excel有效数据并区分新增和更新
DeptInfo finalDeptInfo = targetDeptInfos.size() > 0 ? targetDeptInfos.get(0) : null;
SubCompanyInfo finalSubCompanyInfo = targetSubCompanyInfos.size() > 0 ? targetSubCompanyInfos.get(0) : null;
if (targetExtEmpInfoList.isEmpty()) {
if (!isError) {
//添加一条新建数据
insertExtEmpPOList.add(handleExtEmpInfo(null, map, finalDeptInfo, finalSubCompanyInfo));
}
} else if (targetExtEmpInfoList.size() > 1) {
isError = true;
Map<String, String> errorMessageMap = Maps.newHashMap();
errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(0, "数据库中非系统人员信息存在姓名相同数据,请先确保姓名唯一"));
excelComments.add(errorMessageMap);
} else {
if (!isError) {
//添加一条更新数据
updateExtEmpPOList.add(handleExtEmpInfo(targetExtEmpInfoList.get(0), map, finalDeptInfo, finalSubCompanyInfo));
}
}
}
if (isError) {
failCount++;
errorDatas.add(map);
} else {
successCount++;
}
}
//更新
for(ExtEmpPO po : updateExtEmpPOList) {
getExternalEmployeeMapper().updateIgnoreNull(po);
}
//新建
for(ExtEmpPO po : insertExtEmpPOList) {
getExternalEmployeeMapper().insertIgnoreNull(po);
}
apidatas.put("successCount", successCount);
apidatas.put("errorCount", failCount);
apidatas.put("errorData", excelComments);
} finally {
IOUtils.closeQuietly(fileInputStream);
}
return apidatas;
}
public ExtEmpPO handleExtEmpInfo(ExtEmpPO po, Map<String, Object> map, DeptInfo deptInfo, SubCompanyInfo subCompanyInfo) {
ExtEmpPO resultPo = new ExtEmpPO();
if (po == null) {
//新建
resultPo.setId(IdGenerator.generate());
resultPo.setCreateTime(new Date());
resultPo.setUpdateTime(new Date());
resultPo.setDeleteType(0);
resultPo.setCreator((long) user.getUID());
} else {
//更新
BeanUtils.copyProperties(po, resultPo);
resultPo.setUpdateTime(new Date());
}
String username = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(25034, "姓名"), "");
// String departmentName = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(27511, "部门"), "");
// String subcompanyName = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(33553, "分部"), "");
String companystartdate = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(1516, "入职日期"), "");
String mobile = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(125238, "手机号"), "");
String workcode = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(1933, "工号"), "");
String idNo = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(1887, "身份证号码"), "");
String bankCardNum = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(0, "本人开户的银行卡卡号"), "");
String bankName = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(0, "本人开户的银行卡开户支行全称"), "");
if (StringUtils.isNotBlank(companystartdate)) {
resultPo.setCompanystartdate(companystartdate.substring(0, 10));
}
if (StringUtils.isNotBlank(username)) {
resultPo.setUsername(username);
}
if (StringUtils.isNotBlank(mobile)) {
resultPo.setMobile(mobile);
}
if (StringUtils.isNotBlank(workcode)) {
resultPo.setWorkcode(workcode);
}
if (StringUtils.isNotBlank(idNo)) {
resultPo.setIdNo(idNo);
}
if (StringUtils.isNotBlank(bankCardNum)) {
resultPo.setBankCardNum(bankCardNum);
}
if (StringUtils.isNotBlank(bankName)) {
resultPo.setBankName(bankName);
}
if (deptInfo != null) {
resultPo.setDepartmentName(deptInfo.getName());
resultPo.setDepartmentId(deptInfo.getId());
}
if (subCompanyInfo != null) {
resultPo.setSubcompanyName(subCompanyInfo.getName());
resultPo.setSubcompanyId(subCompanyInfo.getId());
}
resultPo.setModifier((long) user.getUID());
return resultPo;
}
}