Commit 63cdeea9 authored by 刘斌's avatar 刘斌

feat: 增加家庭成员

parent 8d63cf30
......@@ -20,4 +20,9 @@ public interface HrEmployeeConstants {
* 合同形式-新签
*/
String CONTRACT_FORM_NEW = "1";
/**
* 是否-是
*/
String YES = "Y";
}
package com.anplus.hr.domain;
import top.binfast.common.mybatis.bean.model.TenantModel;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 员工家庭主要成员对象 employee_family_members
*
* @author LiuBin
* @date 2025-12-04
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@TableName("employee_family_members")
public class EmployeeFamilyMembers extends TenantModel {
@Serial
private static final long serialVersionUID = 1L;
/**
* 员工信息ID
*/
private Long employeeId;
/**
* 关系
*/
private String relation;
/**
* 姓名
*/
private String name;
/**
* 出生年月
*/
private String birthDate;
/**
* 工作单位及职务
*/
private String companyAndJob;
/**
* 联系方式
*/
private String contact;
/**
* 是否为紧急联系人
*/
private String emergencyFlag;
}
......@@ -7,6 +7,7 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
/**
* @author 刘斌
......@@ -87,17 +88,17 @@ public class EmployeeBaseInfoParam {
@NotBlank(message = "政治面貌不能为空")
private String politicalStatus;
/**
* 紧急联系人
*/
@NotBlank(message = "紧急联系人不能为空")
private String emergencyContact;
/**
* 紧急联系人电话
*/
@NotBlank(message = "紧急联系人电话不能为空")
private String emergencyContactPhone;
// /**
// * 紧急联系人
// */
// @NotBlank(message = "紧急联系人不能为空")
// private String emergencyContact;
//
// /**
// * 紧急联系人电话
// */
// @NotBlank(message = "紧急联系人电话不能为空")
// private String emergencyContactPhone;
/**
* 家庭地址
......@@ -195,6 +196,11 @@ public class EmployeeBaseInfoParam {
// @NotBlank(message = "外部个人履历不能为空", groups = { AddGroup.class, EditGroup.class })
private String externalResume;
/**
* 家庭成员
*/
private List<EmployeeFamilyMembersParam> employeeFamilyMembers;
/**
* tid
*/
......
package com.anplus.hr.domain.params;
import com.anplus.hr.domain.EmployeeFamilyMembers;
import top.binfast.common.core.validate.AddGroup;
import top.binfast.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import jakarta.validation.constraints.*;
/**
* 员工家庭主要成员业务对象 employee_family_members
*
* @author LiuBin
* @date 2025-12-04
*/
@Data
@AutoMapper(target = EmployeeFamilyMembers.class, reverseConvertGenerate = false)
public class EmployeeFamilyMembersParam {
/**
* 序号
*/
// @NotNull(message = "序号不能为空", groups = { EditGroup.class })
private Long id;
/**
* 员工信息ID
*/
// @NotNull(message = "员工信息ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long employeeId;
/**
* 关系
*/
@NotBlank(message = "关系不能为空", groups = { AddGroup.class, EditGroup.class })
private String relation;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 出生年月
*/
@NotBlank(message = "出生年月不能为空", groups = { AddGroup.class, EditGroup.class })
private String birthDate;
/**
* 工作单位及职务
*/
@NotBlank(message = "工作单位及职务不能为空", groups = { AddGroup.class, EditGroup.class })
private String companyAndJob;
/**
* 联系方式
*/
@NotBlank(message = "联系方式不能为空", groups = { AddGroup.class, EditGroup.class })
private String contact;
/**
* 是否为紧急联系人
*/
// @NotBlank(message = "是否为紧急联系人不能为空", groups = { AddGroup.class, EditGroup.class })
private String emergencyFlag;
}
package com.anplus.hr.domain.vo;
import com.anplus.hr.domain.EmployeeFamilyMembers;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.ExcelIgnore;
import top.binfast.common.excel.annotion.ExcelDictFormat;
import top.binfast.common.excel.converters.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 员工家庭主要成员视图对象 employee_family_members
*
* @author LiuBin
* @date 2025-12-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EmployeeFamilyMembers.class)
public class EmployeeFamilyMembersVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 序号
*/
private Long id;
/**
* 员工信息ID
*/
@ExcelProperty(value = "员工信息ID")
private Long employeeId;
/**
* 关系
*/
@ExcelProperty(value = "关系")
private String relation;
/**
* 姓名
*/
@ExcelProperty(value = "姓名")
private String name;
/**
* 出生年月
*/
@ExcelProperty(value = "出生年月")
private String birthDate;
/**
* 工作单位及职务
*/
@ExcelProperty(value = "工作单位及职务")
private String companyAndJob;
/**
* 联系方式
*/
@ExcelProperty(value = "联系方式")
private String contact;
/**
* 是否为紧急联系人
*/
@ExcelProperty(value = "是否为紧急联系人", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "SYS_YES_NO")
private String emergencyFlag;
}
......@@ -550,7 +550,8 @@ public class EmployeeInfoImportVo extends ExcelBaseEntity implements Serializabl
/**
* 成本费用细分
*/
@ExcelProperty(value = "成本费用细分")
@ExcelProperty(value = "成本费用细分", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = HrConstant.HR_COST_TYPE)
private String costType;
/**
......
package com.anplus.hr.mapper;
import com.anplus.hr.domain.EmployeeFamilyMembers;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 员工家庭主要成员Mapper接口
*
* @author LiuBin
* @date 2025-12-04
*/
@Mapper
public interface EmployeeFamilyMembersMapper extends BinBaseMapper<EmployeeFamilyMembers> {
}
......@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.anplus.hr.domain.EmployeeFamilyMembers;
import com.anplus.hr.domain.vo.EmployeeFlowVo;
import com.anplus.hr.domain.vo.EmployeeInfoResumeVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
......@@ -19,6 +20,7 @@ import top.binfast.common.excel.image.CellImageData;
import top.binfast.common.excel.image.ExcelProcessingResult;
import top.binfast.common.oss.entity.UploadResult;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
......@@ -197,6 +199,12 @@ public interface EmployeeInfoServ extends IService<EmployeeInfo> {
return builder.toString();
}
/**
* 构建部门名称字符串
*
* @param importVo 导入数据
* @return 部门名称字符串
*/
default String buildPartDeptNameStr(EmployeeInfoImportVo importVo) {
StringBuilder builder = new StringBuilder(importVo.getConcurrentPlate());
if (StrUtil.isNotBlank(importVo.getConcurrentFirstDept())) {
......@@ -211,4 +219,32 @@ public interface EmployeeInfoServ extends IService<EmployeeInfo> {
return builder.toString();
}
/**
* 构建员工家庭成员列表
* 按照【关系 姓名 出生年月 工作单位职务 联系方式】格式
* 用空格区分属性,用;区分人员
* @param familyMembersImportStr 员工家庭成员字符串
* @return 员工家庭成员列表
*/
default List<EmployeeFamilyMembers> buildFamilyMembers(String familyMembersImportStr) {
List<EmployeeFamilyMembers> familyMembers = new ArrayList<>();
if (StrUtil.isNotBlank(familyMembersImportStr)) {
String[] list = familyMembersImportStr.split(";");
for (String memberProp : list) {
EmployeeFamilyMembers member = new EmployeeFamilyMembers();
String[] split = memberProp.split(StrUtil.SPACE);
if (split.length != 5) {
continue;
}
member.setRelation(split[0]);
member.setName(split[1]);
member.setBirthDate(split[2]);
member.setCompanyAndJob(split[3]);
member.setContact(split[4]);
familyMembers.add(member);
}
}
return familyMembers;
}
}
......@@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.anplus.hr.constant.HrStatusEnum;
import com.anplus.hr.domain.EmployeeFamilyMembers;
import com.anplus.hr.domain.EmployeeInfo;
import com.anplus.hr.domain.params.EmployeeInfoListParam;
import com.anplus.hr.domain.params.EmployeeInfoParam;
import com.anplus.hr.domain.vo.EmployeeInfoResignImportVo;
import com.anplus.hr.domain.vo.EmployeeInfoResignVo;
import com.anplus.hr.domain.vo.EmployeeInfoVo;
import com.anplus.hr.mapper.EmployeeFamilyMembersMapper;
import com.anplus.hr.mapper.EmployeeInfoMapper;
import com.anplus.hr.service.EmployeeInfoResignServ;
import com.anplus.hr.service.EmployeeInfoServ;
......@@ -33,10 +35,7 @@ import top.binfast.common.excel.image.ExcelProcessingResult;
import top.binfast.common.excel.image.TempFileExcelImageImporter;
import top.binfast.common.mybatis.util.QueryUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
......@@ -52,6 +51,7 @@ public class EmployeeInfoResignServImpl extends ServiceImpl<EmployeeInfoMapper,
private final EmployeeInfoServ employeeInfoServ;
private final TransService transService;
private final SysOssMapper sysOssMapper;
private final EmployeeFamilyMembersMapper employeeFamilyMembersMapper;
private final EmployeeAsyncService employeeAsyncService;
private final EmployeeSysDeptServ employeeSysDeptServ;
......@@ -98,7 +98,10 @@ public class EmployeeInfoResignServImpl extends ServiceImpl<EmployeeInfoMapper,
List<EmployeeInfoResignImportVo> errorList = new ArrayList<>();
List<EmployeeInfoResignImportVo> successList = new ArrayList<>();
List<SysOss> ossList = new ArrayList<>();
List<EmployeeFamilyMembers> familyMembersList = new ArrayList<>();
Map<String, EmployeeInfo> ossEmployeeInfoMap = new HashMap<>();
Map<String, List<EmployeeFamilyMembers>> employeeFamilyMap = new HashMap<>();
Set<String> idCardNumberSet = new HashSet<>();
CompletableFuture<ExcelProcessingResult> future = CompletableFuture.supplyAsync(() -> {
try {
return TempFileExcelImageImporter.importExcelWithAllImages(file);
......@@ -113,11 +116,12 @@ public class EmployeeInfoResignServImpl extends ServiceImpl<EmployeeInfoMapper,
return;
}
EmployeeInfoParam employeeInfoParam = MapstructUtils.convert(item, EmployeeInfoParam.class);
if (!employeeInfoServ.checkEmployeeIdCardNumberUnique(employeeInfoParam)) {
if (employeeInfoServ.checkEmployeeIdCardNumberUnique(employeeInfoParam) || idCardNumberSet.contains(item.getIdCardNumber())) {
item.addError("身份证号已存在");
errorList.add(item);
return;
}
idCardNumberSet.add(item.getIdCardNumber());
successList.add(item);
});
if (CollUtil.isNotEmpty(successList)) {
......@@ -133,6 +137,11 @@ public class EmployeeInfoResignServImpl extends ServiceImpl<EmployeeInfoMapper,
// errorList.add(importVo);
// continue;
// }
List<EmployeeFamilyMembers> buildFamilyMembersList = employeeInfoServ.buildFamilyMembers(importVo.getFamilyMembersInfo());
if (!buildFamilyMembersList.isEmpty()) {
familyMembersList.addAll(buildFamilyMembersList);
employeeFamilyMap.put(importVo.getIdCardNumber(), buildFamilyMembersList);
}
EmployeeInfo employeeInfo = MapstructUtils.convert(importVo, EmployeeInfo.class);
employeeInfo.setStatus(HrStatusEnum.RESIGN.getStatus());
employeeInfo.setDeptId(leafDeptId);
......@@ -154,10 +163,18 @@ public class EmployeeInfoResignServImpl extends ServiceImpl<EmployeeInfoMapper,
}
}
}
employeeInfoMapper.insert(insertList);
// EmployeeDeptCheckAndSaveParam checkAndSaveParam =
// new EmployeeDeptCheckAndSaveParam(deptNameGroups, SecurityUtils.getCurrentUserId(), SecurityUtils.getTenantId());
// employeeDeptServ.checkAndSaveDept(checkAndSaveParam);
boolean insertEmployeeFlag = SqlHelper.retBool(employeeInfoMapper.insert(insertList));
if (insertEmployeeFlag && CollUtil.isNotEmpty(familyMembersList)) {
for (EmployeeInfo employeeInfo : insertList) {
List<EmployeeFamilyMembers> existFamilyMembers = employeeFamilyMap.get(employeeInfo.getIdCardNumber());
if (existFamilyMembers != null && !existFamilyMembers.isEmpty()) {
for (EmployeeFamilyMembers familyMember : existFamilyMembers) {
familyMember.setEmployeeId(employeeInfo.getId());
}
}
}
employeeFamilyMembersMapper.insert(familyMembersList);
}
}
StringBuilder message;
if (CollUtil.isNotEmpty(errorList)) {
......
......@@ -13,6 +13,7 @@ import com.anplus.hr.constant.HrEmployeeConstants;
import com.anplus.hr.constant.HrFlowEnum;
import com.anplus.hr.constant.HrFlowTypeConstant;
import com.anplus.hr.constant.HrStatusEnum;
import com.anplus.hr.domain.EmployeeFamilyMembers;
import com.anplus.hr.domain.EmployeeFlow;
import com.anplus.hr.domain.EmployeeInfo;
import com.anplus.hr.domain.params.*;
......@@ -20,6 +21,7 @@ import com.anplus.hr.domain.vo.EmployeeFlowVo;
import com.anplus.hr.domain.vo.EmployeeInfoImportVo;
import com.anplus.hr.domain.vo.EmployeeInfoResumeVo;
import com.anplus.hr.domain.vo.EmployeeInfoVo;
import com.anplus.hr.mapper.EmployeeFamilyMembersMapper;
import com.anplus.hr.mapper.EmployeeInfoMapper;
import com.anplus.hr.service.EmployeeAuditLogServ;
import com.anplus.hr.service.EmployeeFlowServ;
......@@ -79,6 +81,7 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
private final OssService ossService;
private final SysOssServ sysOssServ;
private final SysOssMapper sysOssMapper;
private final EmployeeFamilyMembersMapper employeeFamilyMembersMapper;
private final EmployeeAsyncService employeeAsyncService;
/**
......@@ -239,7 +242,10 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
List<EmployeeInfoImportVo> errorList = new ArrayList<>();
List<EmployeeInfoImportVo> successList = new ArrayList<>();
List<SysOss> ossList = new ArrayList<>();
List<EmployeeFamilyMembers> familyMembersList = new ArrayList<>();
Map<String, EmployeeInfo> ossEmployeeInfoMap = new HashMap<>();
Map<String, List<EmployeeFamilyMembers>> employeeFamilyMap = new HashMap<>();
Set<String> idCardNumberSet = new HashSet<>();
CompletableFuture<ExcelProcessingResult> future = CompletableFuture.supplyAsync(() -> {
try {
return TempFileExcelImageImporter.importExcelWithAllImages(file);
......@@ -254,7 +260,7 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
return;
}
EmployeeInfoParam employeeInfoParam = MapstructUtils.convert(item, EmployeeInfoParam.class);
if (!checkEmployeeIdCardNumberUnique(employeeInfoParam)) {
if (checkEmployeeIdCardNumberUnique(employeeInfoParam) || idCardNumberSet.contains(item.getIdCardNumber())) {
item.addError("身份证号已存在");
errorList.add(item);
return;
......@@ -262,6 +268,7 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
if (item.getContractEndDate() != null) {
item.setContractExpirationReminder(item.getContractEndDate().minusMonths(1));
}
idCardNumberSet.add(item.getIdCardNumber());
successList.add(item);
});
if (CollUtil.isNotEmpty(successList)) {
......@@ -277,6 +284,11 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
continue;
}
Long concurrentDeptId = deptNamesIdMap.get(buildPartDeptNameStr(importVo));
List<EmployeeFamilyMembers> buildFamilyMembersList = buildFamilyMembers(importVo.getFamilyMembersInfo());
if (!buildFamilyMembersList.isEmpty()) {
familyMembersList.addAll(buildFamilyMembersList);
employeeFamilyMap.put(importVo.getIdCardNumber(), buildFamilyMembersList);
}
EmployeeInfo employeeInfo = MapstructUtils.convert(importVo, EmployeeInfo.class);
employeeInfo.setDeptId(leafDeptId);
employeeInfo.setConcurrentDeptId(concurrentDeptId);
......@@ -300,7 +312,18 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
}
}
}
employeeInfoMapper.insert(insertList);
boolean insertEmployeeFlag = SqlHelper.retBool(employeeInfoMapper.insert(insertList));
if (insertEmployeeFlag && CollUtil.isNotEmpty(familyMembersList)) {
for (EmployeeInfo employeeInfo : insertList) {
List<EmployeeFamilyMembers> existFamilyMembers = employeeFamilyMap.get(employeeInfo.getIdCardNumber());
if (existFamilyMembers != null && !existFamilyMembers.isEmpty()) {
for (EmployeeFamilyMembers familyMember : existFamilyMembers) {
familyMember.setEmployeeId(employeeInfo.getId());
}
}
}
employeeFamilyMembersMapper.insert(familyMembersList);
}
// EmployeeDeptCheckAndSaveParam checkAndSaveParam =
// new EmployeeDeptCheckAndSaveParam(deptNameGroups, SecurityUtils.getCurrentUserId(), SecurityUtils.getTenantId());
// employeeDeptServ.checkAndSaveDept(checkAndSaveParam);
......@@ -358,10 +381,9 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
@Override
public Boolean checkEmployeeIdCardNumberUnique(EmployeeInfoParam employee) {
boolean exist = employeeInfoMapper.exists(new LambdaQueryWrapper<EmployeeInfo>()
return employeeInfoMapper.exists(new LambdaQueryWrapper<EmployeeInfo>()
.eq(EmployeeInfo::getIdCardNumber, employee.getIdCardNumber())
.ne(ObjectUtil.isNotNull(employee.getId()), EmployeeInfo::getId, employee.getId()));
return !exist;
}
/**
......@@ -469,7 +491,20 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
EmployeeInfoCalcUtils.calcAgeGroup(employeeInfo);
employeeInfo.setEntryApplyStatus(HrFlowEnum.DRAFT.getStatus());
employeeInfo.setStatus(HrStatusEnum.DRAFT.getStatus());
return this.save(employeeInfo);
boolean flag = this.save(employeeInfo);
if (flag && CollUtil.isNotEmpty(param.getEmployeeFamilyMembers())) {
List<EmployeeFamilyMembersParam> familyMembers = param.getEmployeeFamilyMembers();
for (EmployeeFamilyMembersParam familyMember : familyMembers) {
familyMember.setEmployeeId(employeeInfo.getId());
if (HrEmployeeConstants.YES.equals(familyMember.getEmergencyFlag())) {
employeeInfo.setEmergencyContact(familyMember.getName());
employeeInfo.setEmergencyContactPhone(familyMember.getContact());
}
}
List<EmployeeFamilyMembers> employeeFamilyMembers = MapstructUtils.convert(familyMembers, EmployeeFamilyMembers.class);
employeeFamilyMembersMapper.insert(employeeFamilyMembers);
}
return flag;
}
/**
......
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.anplus.hr.mapper.EmployeeFamilyMembersMapper">
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment