Commit fa260ec8 authored by 刘斌's avatar 刘斌

feat: 增加面试,培训,人力成本

parent 373a7775
......@@ -100,4 +100,14 @@ public interface HrConstant {
* 员工成本费用细分
*/
String HR_COST_TYPE = "hr_cost_type";
/**
* 员工审批类型
*/
String HR_APPLY_TYPE = "hr_apply_type";
/**
* 面试结果
*/
String HR_INTERVIEW_RESULT = "hr_interview_result";
}
......@@ -12,7 +12,13 @@ public interface HrResignationTypeConstant {
// 被动离职
String FIRED = "2";
// 试用期未转正
String PROBATION_NOT_PASSED = "3";
// 试用期辞职
String RESIGN_DURING_PROBATION = "3";
// 试用期淘汰
String PROBATION_NOT_PASSED = "4";
// 退休
String RETIREMENT = "5";
}
......@@ -7,6 +7,7 @@ import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.anplus.hr.config.ResumeTemplateStyleHandler;
import com.anplus.hr.domain.params.*;
import com.anplus.hr.domain.vo.EmployeeFlowVo;
import com.anplus.hr.domain.vo.EmployeeInfoImportVo;
......@@ -27,7 +28,6 @@ import top.binfast.app.biz.sysapi.bean.vo.sysDept.SysDeptDTO;
import top.binfast.app.biz.sysapi.bean.vo.sysOss.SysOssVo;
import top.binfast.common.core.constant.BusinessType;
import top.binfast.common.core.enums.ResultCode;
import top.binfast.common.core.exception.PlatformException;
import top.binfast.common.core.util.ResponseUtils;
import top.binfast.common.core.validate.AddGroup;
import top.binfast.common.core.validate.EditGroup;
......@@ -81,7 +81,8 @@ public class EmployeeInfoCtrl {
/**
* 导出员工信息列表
*/
@ExcelExport(template = "简历模板.xlsx", fill = true)
@ExcelExport(template = "简历模板.xlsx", fill = true, fillObjectFields = {"familyMembers", "trainings"},
writeHandler = {ResumeTemplateStyleHandler.class})
@SaCheckPermission("employee:info:export")
@PinSysLog(value = "员工信息", businessType = BusinessType.EXPORT)
@PostMapping("/export/{id}")
......
package com.anplus.hr.controller;
import java.util.List;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import top.binfast.common.core.constant.BusinessType;
import top.binfast.common.core.validate.AddGroup;
import top.binfast.common.core.validate.EditGroup;
import top.binfast.common.core.util.ResponseUtils;
import top.binfast.common.excel.annotion.ExcelExport;
import top.binfast.common.log.annotation.PinSysLog;
import com.anplus.hr.domain.params.EmployeeLaborCostListParam;
import com.anplus.hr.domain.params.EmployeeLaborCostParam;
import com.anplus.hr.domain.vo.EmployeeLaborCostVo;
import com.anplus.hr.service.EmployeeLaborCostServ;
/**
* 人工成本档案
*
* @author LiuBin
* @date 2025-12-09
*/
@Validated
@RestController
@RequestMapping("/employee/laborCost")
public class EmployeeLaborCostCtrl {
@Resource
private EmployeeLaborCostServ employeeLaborCostServ;
/**
* 查询人工成本档案列表
*/
@SaCheckPermission("employee:laborCost:list")
@GetMapping("/page")
public PageResponse<EmployeeLaborCostVo> pageList(EmployeeLaborCostListParam param) {
return employeeLaborCostServ.queryPageList(param);
}
/**
* 导出人工成本档案列表
*/
@ExcelExport
@SaCheckPermission("employee:laborCost:export")
@PinSysLog(value = "人工成本档案", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public List<EmployeeLaborCostVo> export(EmployeeLaborCostListParam param) {
return employeeLaborCostServ.queryList(param);
}
/**
* 获取人工成本档案详细信息
*
* @param id 主键
*/
@SaCheckPermission("employee:laborCost:query")
@GetMapping("/{id}")
public SingleResponse<EmployeeLaborCostVo> getDetail(@PathVariable @Min(1)
Long id) {
return SingleResponse.of(employeeLaborCostServ.queryById(id));
}
/**
* 新增人工成本档案
*/
@SaCheckPermission("employee:laborCost:add")
@PinSysLog(value = "人工成本档案", businessType = BusinessType.INSERT)
@PostMapping()
public Response add(@Validated(AddGroup.class) @RequestBody EmployeeLaborCostParam param) {
return ResponseUtils.ofResult(employeeLaborCostServ.insertByParam(param));
}
/**
* 修改人工成本档案
*/
@SaCheckPermission("employee:laborCost:edit")
@PinSysLog(value = "人工成本档案", businessType = BusinessType.UPDATE)
@PutMapping()
public Response edit(@Validated(EditGroup.class) @RequestBody EmployeeLaborCostParam param) {
return ResponseUtils.ofResult(employeeLaborCostServ.updateByParam(param));
}
/**
* 删除人工成本档案
*
* @param ids 主键串
*/
@SaCheckPermission("employee:laborCost:remove")
@PinSysLog(value = "人工成本档案", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public Response remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return ResponseUtils.ofResult(employeeLaborCostServ.delByIds(List.of(ids)));
}
}
\ No newline at end of file
package com.anplus.hr.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.anplus.hr.domain.params.EmployeeTrainingListParam;
import com.anplus.hr.domain.params.EmployeeTrainingParam;
import com.anplus.hr.domain.vo.EmployeeTrainingImportVo;
import com.anplus.hr.domain.vo.EmployeeTrainingVo;
import com.anplus.hr.service.EmployeeTrainingServ;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import top.binfast.common.core.constant.BusinessType;
import top.binfast.common.core.util.ResponseUtils;
import top.binfast.common.core.validate.AddGroup;
import top.binfast.common.core.validate.EditGroup;
import top.binfast.common.excel.annotion.ExcelExport;
import top.binfast.common.excel.annotion.ExcelStream;
import top.binfast.common.excel.core.ExcelDownHandler;
import top.binfast.common.log.annotation.PinSysLog;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
* 员工培训档案
*
* @author LiuBin
* @date 2025-12-07
*/
@Validated
@RestController
@RequestMapping("/employee/training")
public class EmployeeTrainingCtrl {
@Resource
private EmployeeTrainingServ employeeTrainingServ;
/**
* 查询员工培训档案列表
*/
@SaCheckPermission("employee:training:list")
@GetMapping("/page")
public PageResponse<EmployeeTrainingVo> pageList(EmployeeTrainingListParam param) {
return employeeTrainingServ.queryPageList(param);
}
/**
* 导出员工培训档案列表
*/
@ExcelExport
@SaCheckPermission("employee:training:export")
@PinSysLog(value = "员工培训档案", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public List<EmployeeTrainingVo> export(EmployeeTrainingListParam param) {
return employeeTrainingServ.queryList(param);
}
/**
* 导入数据
*/
@PinSysLog(value = "员工培训档案", businessType = BusinessType.IMPORT)
@SaCheckPermission("employee:training:import")
@PostMapping(value = "/import")
public Response importData(@ExcelStream Stream<EmployeeTrainingImportVo> stream) {
return employeeTrainingServ.importTrainingList(stream);
}
/**
* 获取导入模板
*/
@ExcelExport(clazz = EmployeeTrainingImportVo.class, writeHandler = ExcelDownHandler.class)
@PostMapping("/importTemplate")
public List<EmployeeTrainingImportVo> importTemplate() {
return new ArrayList<>();
}
/**
* 获取员工培训档案详细信息
*
* @param id 主键
*/
@SaCheckPermission("employee:training:query")
@GetMapping("/{id}")
public SingleResponse<EmployeeTrainingVo> getDetail(@PathVariable @Min(1)
Long id) {
return SingleResponse.of(employeeTrainingServ.queryById(id));
}
/**
* 新增员工培训档案
*/
@SaCheckPermission("employee:training:add")
@PinSysLog(value = "员工培训档案", businessType = BusinessType.INSERT)
@PostMapping()
public Response add(@Validated(AddGroup.class) @RequestBody EmployeeTrainingParam param) {
return ResponseUtils.ofResult(employeeTrainingServ.insertByParam(param));
}
/**
* 修改员工培训档案
*/
@SaCheckPermission("employee:training:edit")
@PinSysLog(value = "员工培训档案", businessType = BusinessType.UPDATE)
@PutMapping()
public Response edit(@Validated(EditGroup.class) @RequestBody EmployeeTrainingParam param) {
return ResponseUtils.ofResult(employeeTrainingServ.updateByParam(param));
}
/**
* 删除员工培训档案
*
* @param ids 主键串
*/
@SaCheckPermission("employee:training:remove")
@PinSysLog(value = "员工培训档案", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public Response remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return ResponseUtils.ofResult(employeeTrainingServ.delByIds(List.of(ids)));
}
}
\ No newline at end of file
package com.anplus.hr.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.anplus.hr.domain.params.InterviewProfileListParam;
import com.anplus.hr.domain.params.InterviewProfileParam;
import com.anplus.hr.domain.vo.InterviewProfileImportVo;
import com.anplus.hr.domain.vo.InterviewProfileVo;
import com.anplus.hr.service.InterviewProfileServ;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import top.binfast.common.core.constant.BusinessType;
import top.binfast.common.core.util.ResponseUtils;
import top.binfast.common.core.validate.AddGroup;
import top.binfast.common.core.validate.EditGroup;
import top.binfast.common.excel.annotion.ExcelExport;
import top.binfast.common.excel.annotion.ExcelStream;
import top.binfast.common.excel.core.ExcelDownHandler;
import top.binfast.common.log.annotation.PinSysLog;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
* 面试档案
*
* @author LiuBin
* @date 2025-12-08
*/
@Validated
@RestController
@RequestMapping("/employee/interviewProfile")
public class InterviewProfileCtrl {
@Resource
private InterviewProfileServ interviewProfileServ;
/**
* 查询面试档案列表
*/
@SaCheckPermission("employee:interviewProfile:list")
@GetMapping("/page")
public PageResponse<InterviewProfileVo> pageList(InterviewProfileListParam param) {
return interviewProfileServ.queryPageList(param);
}
/**
* 导出面试档案列表
*/
@ExcelExport
@SaCheckPermission("employee:interviewProfile:export")
@PinSysLog(value = "面试档案", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public List<InterviewProfileVo> export(InterviewProfileListParam param) {
return interviewProfileServ.queryList(param);
}
/**
* 导入数据
*/
@PinSysLog(value = "面试档案", businessType = BusinessType.IMPORT)
@SaCheckPermission("employee:interviewProfile:import")
@PostMapping(value = "/import")
public Response importData(@ExcelStream Stream<InterviewProfileImportVo> stream) {
return interviewProfileServ.importInterviewList(stream);
}
/**
* 获取导入模板
*/
@ExcelExport(clazz = InterviewProfileImportVo.class, writeHandler = ExcelDownHandler.class)
@PostMapping("/importTemplate")
public List<InterviewProfileImportVo> importTemplate() {
return new ArrayList<>();
}
/**
* 获取面试档案详细信息
*
* @param id 主键
*/
@SaCheckPermission("employee:interviewProfile:query")
@GetMapping("/{id}")
public SingleResponse<InterviewProfileVo> getDetail(@PathVariable @Min(1)
Long id) {
return SingleResponse.of(interviewProfileServ.queryById(id));
}
/**
* 新增面试档案
*/
@SaCheckPermission("employee:interviewProfile:add")
@PinSysLog(value = "面试档案", businessType = BusinessType.INSERT)
@PostMapping()
public Response add(@Validated(AddGroup.class) @RequestBody InterviewProfileParam param) {
return ResponseUtils.ofResult(interviewProfileServ.insertByParam(param));
}
/**
* 修改面试档案
*/
@SaCheckPermission("employee:interviewProfile:edit")
@PinSysLog(value = "面试档案", businessType = BusinessType.UPDATE)
@PutMapping()
public Response edit(@Validated(EditGroup.class) @RequestBody InterviewProfileParam param) {
return ResponseUtils.ofResult(interviewProfileServ.updateByParam(param));
}
/**
* 删除面试档案
*
* @param ids 主键串
*/
@SaCheckPermission("employee:interviewProfile:remove")
@PinSysLog(value = "面试档案", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public Response remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return ResponseUtils.ofResult(interviewProfileServ.delByIds(List.of(ids)));
}
}
\ No newline at end of file
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.time.LocalDate;
import java.io.Serial;
/**
* 人工成本档案对象 employee_labor_cost
*
* @author LiuBin
* @date 2025-12-09
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@TableName("employee_labor_cost")
public class EmployeeLaborCost extends TenantModel {
@Serial
private static final long serialVersionUID = 1L;
/**
* 记录时间
*/
private LocalDate recordDate;
/**
* 文件ID
*/
private Long ossId;
/**
* 文件Key
*/
private String fileKey;
/**
* 备注
*/
private String remark;
}
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.math.BigDecimal;
import java.time.LocalDate;
import java.io.Serial;
/**
* 员工培训档案对象 employee_training
*
* @author LiuBin
* @date 2025-12-07
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@TableName("employee_training")
public class EmployeeTraining extends TenantModel {
@Serial
private static final long serialVersionUID = 1L;
/**
* 员工信息ID
*/
private Long employeeId;
/**
* 姓名
*/
private String name;
/**
* 身份证号
*/
private String idCardNumber;
/**
* 培训课程
*/
private String trainingCourse;
/**
* 培训机构
*/
private String trainingInstitution;
/**
* 培训讲师
*/
private String trainer;
/**
* 参训时间
*/
private LocalDate trainingTime;
/**
* 服务期
*/
private LocalDate serviceEndDate;
/**
* 服务年限
*/
private String serviceYears;
/**
* 培训金额
*/
private BigDecimal trainingAmount;
/**
* 备注
*/
private String remark;
}
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.time.LocalDate;
import java.io.Serial;
/**
* 面试档案对象 interview_profile
*
* @author LiuBin
* @date 2025-12-08
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@TableName("interview_profile")
public class InterviewProfile extends TenantModel {
@Serial
private static final long serialVersionUID = 1L;
/**
* 员工信息ID
*/
private Long employeeId;
/**
* 招揽岗位
*/
private String jobPosition;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String gender;
/**
* 身份证号
*/
private String idCardNumber;
/**
* 学历
*/
private String education;
/**
* 院校
*/
private String school;
/**
* 专业
*/
private String major;
/**
* 联系方式
*/
private String phoneNumber;
/**
* 标杆企业
*/
private String benchmarkEnterprise;
/**
* 面试时间
*/
private LocalDate interviewDate;
/**
* 面试情况
*/
private String interviewSituation;
/**
* 面试结果
*/
private String interviewResult;
/**
* 备注
*/
private String remark;
}
......@@ -31,19 +31,19 @@ public class EmployeeFlowListParam extends PageQueryParam {
private String flowType;
/**
* 员工信息ID
* 员工姓名
*/
private Long employeeId;
/**
* 开始时间
*/
private LocalDateTime startDate;
/**
* 结束时间
*/
private LocalDateTime endDate;
private String name;
//
// /**
// * 开始时间
// */
// private LocalDateTime startDate;
//
// /**
// * 结束时间
// */
// private LocalDateTime endDate;
/**
* 状态
......
package com.anplus.hr.domain.params;
import lombok.Getter;
import lombok.Setter;
import top.binfast.common.core.bean.params.PageQueryParam;
import java.util.HashMap;
import java.util.Map;
import java.time.LocalDate;
/**
* 人工成本档案分页对象 employee_labor_cost
*
* @author LiuBin
* @date 2025-12-09
*/
@Getter
@Setter
public class EmployeeLaborCostListParam extends PageQueryParam {
/**
* 记录时间
*/
private LocalDate recordDate;
/**
* 文件ID
*/
private Long ossId;
/**
* 文件Key
*/
private String fileKey;
private Map<String, Object> params = new HashMap<>();
}
package com.anplus.hr.domain.params;
import com.anplus.hr.domain.EmployeeLaborCost;
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.*;
import java.time.LocalDate;
/**
* 人工成本档案业务对象 employee_labor_cost
*
* @author LiuBin
* @date 2025-12-09
*/
@Data
@AutoMapper(target = EmployeeLaborCost.class, reverseConvertGenerate = false)
public class EmployeeLaborCostParam {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 记录时间
*/
@NotNull(message = "记录时间不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate recordDate;
/**
* 文件ID
*/
@NotNull(message = "文件ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long ossId;
/**
* 文件Key
*/
// @NotBlank(message = "文件Key不能为空", groups = { AddGroup.class, EditGroup.class })
private String fileKey;
/**
* 备注
*/
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}
package com.anplus.hr.domain.params;
import lombok.Getter;
import lombok.Setter;
import top.binfast.common.core.bean.params.PageQueryParam;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
/**
* 员工培训档案分页对象 employee_training
*
* @author LiuBin
* @date 2025-12-07
*/
@Getter
@Setter
public class EmployeeTrainingListParam extends PageQueryParam {
/**
* 员工信息ID
*/
private Long employeeId;
/**
* 姓名
*/
private String name;
/**
* 身份证号
*/
private String idCardNumber;
/**
* 培训课程
*/
private String trainingCourse;
/**
* 培训机构
*/
private String trainingInstitution;
/**
* 培训讲师
*/
private String trainer;
/**
* 参训时间
*/
private LocalDate trainingTime;
/**
* 服务期
*/
private LocalDate serviceEndDate;
/**
* 服务年限
*/
private String serviceYears;
/**
* 培训金额
*/
private BigDecimal trainingAmount;
private Map<String, Object> params = new HashMap<>();
}
package com.anplus.hr.domain.params;
import com.anplus.hr.domain.EmployeeTraining;
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.*;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 员工培训档案业务对象 employee_training
*
* @author LiuBin
* @date 2025-12-07
*/
@Data
@AutoMapper(target = EmployeeTraining.class, reverseConvertGenerate = false)
public class EmployeeTrainingParam {
/**
* 主键
*/
@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 name;
/**
* 身份证号
*/
@NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
private String idCardNumber;
/**
* 培训课程
*/
@NotBlank(message = "培训课程不能为空", groups = { AddGroup.class, EditGroup.class })
private String trainingCourse;
/**
* 培训机构
*/
@NotBlank(message = "培训机构不能为空", groups = { AddGroup.class, EditGroup.class })
private String trainingInstitution;
/**
* 培训讲师
*/
// @NotBlank(message = "培训讲师不能为空", groups = { AddGroup.class, EditGroup.class })
private String trainer;
/**
* 参训时间
*/
@NotNull(message = "参训时间不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate trainingTime;
/**
* 服务期
*/
@NotNull(message = "服务期不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate serviceEndDate;
/**
* 服务年限
*/
@NotBlank(message = "服务年限不能为空", groups = { AddGroup.class, EditGroup.class })
private String serviceYears;
/**
* 培训金额
*/
@NotNull(message = "培训金额不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal trainingAmount;
/**
* 备注
*/
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}
package com.anplus.hr.domain.params;
import lombok.Getter;
import lombok.Setter;
import top.binfast.common.core.bean.params.PageQueryParam;
import java.util.HashMap;
import java.util.Map;
import java.time.LocalDate;
/**
* 面试档案分页对象 interview_profile
*
* @author LiuBin
* @date 2025-12-08
*/
@Getter
@Setter
public class InterviewProfileListParam extends PageQueryParam {
/**
* 员工信息ID
*/
private Long employeeId;
/**
* 招揽岗位
*/
private String jobPosition;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String gender;
/**
* 身份证号
*/
private String idCardNumber;
/**
* 学历
*/
private String education;
/**
* 院校
*/
private String school;
/**
* 专业
*/
private String major;
/**
* 联系方式
*/
private String phoneNumber;
/**
* 标杆企业
*/
private String benchmarkEnterprise;
/**
* 面试时间
*/
private LocalDate interviewDate;
/**
* 面试情况
*/
private String interviewSituation;
/**
* 面试结果
*/
private String interviewResult;
private Map<String, Object> params = new HashMap<>();
}
package com.anplus.hr.domain.params;
import com.anplus.hr.domain.InterviewProfile;
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.*;
import java.time.LocalDate;
/**
* 面试档案业务对象 interview_profile
*
* @author LiuBin
* @date 2025-12-08
*/
@Data
@AutoMapper(target = InterviewProfile.class, reverseConvertGenerate = false)
public class InterviewProfileParam {
/**
* 主键
*/
@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 jobPosition;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 性别
*/
@NotBlank(message = "性别不能为空", groups = { AddGroup.class, EditGroup.class })
private String gender;
/**
* 身份证号
*/
@NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
private String idCardNumber;
/**
* 学历
*/
@NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class })
private String education;
/**
* 院校
*/
@NotBlank(message = "院校不能为空", groups = { AddGroup.class, EditGroup.class })
private String school;
/**
* 专业
*/
@NotBlank(message = "专业不能为空", groups = { AddGroup.class, EditGroup.class })
private String major;
/**
* 联系方式
*/
@NotBlank(message = "联系方式不能为空", groups = { AddGroup.class, EditGroup.class })
private String phoneNumber;
/**
* 标杆企业
*/
@NotBlank(message = "标杆企业不能为空", groups = { AddGroup.class, EditGroup.class })
private String benchmarkEnterprise;
/**
* 面试时间
*/
@NotNull(message = "面试时间不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate interviewDate;
/**
* 面试情况
*/
@NotBlank(message = "面试情况不能为空", groups = { AddGroup.class, EditGroup.class })
private String interviewSituation;
/**
* 面试结果
*/
@NotBlank(message = "面试结果不能为空", groups = { AddGroup.class, EditGroup.class })
private String interviewResult;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}
......@@ -92,8 +92,20 @@ public class EmployeeChangeAnalysisVo implements Serializable {
/**
* 被动离职
*/
@ExcelProperty(value = {"月离职人数", "被动离职"})
private Integer passiveResignation;
@ExcelProperty(value = {"月离职人数", "被动离职", "试用期内(6个月)"})
private Integer passiveProbationPeriod;
/**
* 被动离职
*/
@ExcelProperty(value = {"月离职人数", "被动离职", "优化"})
private Integer passiveLayoff;
/**
* 退休
*/
@ExcelProperty(value = {"月离职人数", "退休"})
private Integer retirement;
/**
* 总离职
......@@ -128,8 +140,20 @@ public class EmployeeChangeAnalysisVo implements Serializable {
/**
* 被动离职率
*/
@ExcelProperty(value = {"月离职率", "被动离职率"})
private String passiveResignationRate;
@ExcelProperty(value = {"月离职率", "被动离职率", "试用期内(6个月)"})
private String passiveProbationPeriodRate;
/**
* 被动离职
*/
@ExcelProperty(value = {"月离职率", "被动离职率", "优化"})
private String passiveLayoffRate;
/**
* 退休
*/
@ExcelProperty(value = {"月离职率", "退休"})
private String retirementRate;
/**
* 总离职率
......@@ -148,7 +172,9 @@ public class EmployeeChangeAnalysisVo implements Serializable {
this.probationPeriod = 0;
this.within3Years = 0;
this.over3Years = 0;
this.passiveResignation = 0;
this.passiveProbationPeriod = 0;
this.passiveLayoff = 0;
this.retirement = 0;
this.totalResignation = 0;
this.endingCount = 0;
}
......
......@@ -16,6 +16,7 @@ import top.binfast.common.excel.converters.ExcelUrlImageConverter;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
/**
* 简历视图对象
......@@ -163,6 +164,12 @@ public class EmployeeInfoResumeVo implements Serializable {
@ExcelProperty(value = "手机号码")
private String phoneNumber;
/**
* 是否兼岗
*/
@ExcelProperty(value = "是否兼岗")
private String concurrentFlag;
/**
* 兼岗板块
*/
......@@ -312,4 +319,48 @@ public class EmployeeInfoResumeVo implements Serializable {
*/
@ExcelProperty(value = "处罚情况")
private String punishmentStatus;
/**
* 家庭主要成员
*/
@ExcelProperty(value = "家庭主要成员")
private List<EmployeeFamilyMembersVo> familyMembers;
/**
* 培训情况
*/
@ExcelProperty(value = "培训情况")
private List<EmployeeTrainingVo> trainings;
/**
* 招揽岗位
*/
@ExcelProperty(value = "招揽岗位")
private String jobPosition;
/**
* 标杆企业
*/
@ExcelProperty(value = "标杆企业")
private String benchmarkEnterprise;
/**
* 面试时间
*/
@ExcelProperty(value = "面试时间")
private LocalDate interviewDate;
/**
* 面试情况
*/
@ExcelProperty(value = "面试情况")
private String interviewSituation;
/**
* 面试结果
*/
@ExcelProperty(value = "面试结果", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = HrConstant.HR_INTERVIEW_RESULT)
private String interviewResult;
}
package com.anplus.hr.domain.vo;
import java.time.LocalDate;
import com.anplus.hr.domain.EmployeeLaborCost;
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_labor_cost
*
* @author LiuBin
* @date 2025-12-09
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EmployeeLaborCost.class)
public class EmployeeLaborCostVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 记录时间
*/
@ExcelProperty(value = "记录时间")
private LocalDate recordDate;
/**
* 文件ID
*/
@ExcelProperty(value = "文件ID")
private Long ossId;
/**
* 文件Key
*/
@ExcelProperty(value = "文件Key")
private String fileKey;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package com.anplus.hr.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.write.style.*;
import cn.idev.excel.enums.poi.FillPatternTypeEnum;
import com.anplus.hr.domain.EmployeeTraining;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Getter;
import lombok.Setter;
import top.binfast.common.excel.bean.ExcelBaseEntity;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* @author 刘斌
* @date 2025/12/7 21:18
*/
@Getter
@ExcelIgnoreUnannotated
@ContentRowHeight(20)
@HeadRowHeight(25)
@ColumnWidth(20)
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(color = 9, fontHeightInPoints = 11)
@AutoMapper(target = EmployeeTraining.class, convertGenerate = false)
public class EmployeeTrainingImportVo extends ExcelBaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 姓名
*/
@ExcelProperty(value = "姓名")
private String name;
/**
* 身份证号
*/
@ExcelProperty(value = "身份证号")
private String idCardNumber;
/**
* 培训课程
*/
@ExcelProperty(value = "培训课程")
private String trainingCourse;
/**
* 培训机构
*/
@ExcelProperty(value = "培训机构")
private String trainingInstitution;
/**
* 培训讲师
*/
@ExcelProperty(value = "培训讲师")
private String trainer;
/**
* 参训时间
*/
@Setter
@ExcelProperty(value = "参训时间")
private LocalDate trainingTime;
/**
* 服务期
*/
@Setter
@ExcelProperty(value = "服务期")
private LocalDate serviceEndDate;
/**
* 服务年限
*/
@ExcelProperty(value = "服务年限")
private String serviceYears;
/**
* 培训金额
*/
@Setter
@ExcelProperty(value = "培训金额")
private BigDecimal trainingAmount;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public void setTrainingCourse(String trainingCourse) {
this.trainingCourse = trainingCourse == null ? null : trainingCourse.trim();
}
public void setTrainingInstitution(String trainingInstitution) {
this.trainingInstitution = trainingInstitution == null ? null : trainingInstitution.trim();
}
public void setTrainer(String trainer) {
this.trainer = trainer == null ? null : trainer.trim();
}
public void setServiceYears(String serviceYears) {
this.serviceYears = serviceYears == null ? null : serviceYears.trim();
}
public void setRemark(String remark) {
this.remark = remark == null ? null : remark.trim();
}
public void setIdCardNumber(String idCardNumber) {
this.idCardNumber = idCardNumber == null ? null : idCardNumber.trim();
}
}
package com.anplus.hr.domain.vo;
import java.math.BigDecimal;
import java.time.LocalDate;
import com.anplus.hr.domain.EmployeeTraining;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.ExcelIgnore;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import top.binfast.common.excel.bean.ExcelBaseEntity;
import java.io.Serial;
import java.io.Serializable;
/**
* 员工培训档案视图对象 employee_training
*
* @author LiuBin
* @date 2025-12-07
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = EmployeeTraining.class)
public class EmployeeTrainingVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelIgnore
private Long id;
/**
* 员工信息ID
*/
@ExcelIgnore
private Long employeeId;
/**
* 姓名
*/
@ExcelProperty(value = "姓名")
private String name;
/**
* 身份证号
*/
@ExcelProperty(value = "身份证号")
private String idCardNumber;
/**
* 培训课程
*/
@ExcelProperty(value = "培训课程")
private String trainingCourse;
/**
* 培训机构
*/
@ExcelProperty(value = "培训机构")
private String trainingInstitution;
/**
* 培训讲师
*/
@ExcelProperty(value = "培训讲师")
private String trainer;
/**
* 参训时间
*/
@ExcelProperty(value = "参训时间")
private LocalDate trainingTime;
/**
* 服务期
*/
@ExcelProperty(value = "服务期")
private LocalDate serviceEndDate;
/**
* 服务年限
*/
@ExcelProperty(value = "服务年限")
private String serviceYears;
/**
* 培训金额
*/
@ExcelProperty(value = "培训金额")
private BigDecimal trainingAmount;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package com.anplus.hr.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.write.style.*;
import cn.idev.excel.enums.poi.FillPatternTypeEnum;
import com.anplus.hr.constant.HrConstant;
import com.anplus.hr.domain.InterviewProfile;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Getter;
import lombok.Setter;
import top.binfast.common.excel.annotion.ExcelDictFormat;
import top.binfast.common.excel.bean.ExcelBaseEntity;
import top.binfast.common.excel.converters.ExcelDictConvert;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author 刘斌
* @date 2025/12/8 10:04
*/
@Getter
@ExcelIgnoreUnannotated
@ContentRowHeight(20)
@HeadRowHeight(25)
@ColumnWidth(20)
//IndexedColors.SKY_BLUE.getIndex()
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(color = 9, fontHeightInPoints = 11)
@AutoMapper(target = InterviewProfile.class, convertGenerate = false)
public class InterviewProfileImportVo extends ExcelBaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 招揽岗位
*/
@ExcelProperty(value = "招揽岗位")
private String jobPosition;
/**
* 姓名
*/
@ExcelProperty(value = "姓名")
private String name;
/**
* 身份证号
*/
@ExcelProperty(value = "身份证号")
private String idCardNumber;
/**
* 性别
*/
@ExcelProperty(value = "性别")
private String gender;
/**
* 学历
*/
@ExcelProperty(value = "学历")
private String education;
/**
* 标杆企业
*/
@ExcelProperty(value = "标杆企业")
private String benchmarkEnterprise;
/**
* 院校
*/
@ExcelProperty(value = "院校")
private String school;
/**
* 专业
*/
@ExcelProperty(value = "专业")
private String major;
/**
* 联系方式
*/
@ExcelProperty(value = "联系方式")
private String phoneNumber;
/**
* 面试时间
*/
@Setter
@ExcelProperty(value = "面试时间")
private LocalDate interviewDate;
/**
* 面试情况
*/
@ExcelProperty(value = "面试情况")
private String interviewSituation;
/**
* 面试结果
*/
@ExcelProperty(value = "面试结果", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = HrConstant.HR_INTERVIEW_RESULT)
private String interviewResult;
public void setJobPosition(String jobPosition) {
this.jobPosition = jobPosition == null ? null : jobPosition.trim();
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public void setGender(String gender) {
this.gender = gender == null ? null : gender.trim();
}
public void setIdCardNumber(String idCardNumber) {
this.idCardNumber = idCardNumber == null ? null : idCardNumber.trim();
}
public void setEducation(String education) {
this.education = education == null ? null : education.trim();
}
public void setSchool(String school) {
this.school = school == null ? null : school.trim();
}
public void setMajor(String major) {
this.major = major == null ? null : major.trim();
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber == null ? null : phoneNumber.trim();
}
public void setBenchmarkEnterprise(String benchmarkEnterprise) {
this.benchmarkEnterprise = benchmarkEnterprise == null ? null : benchmarkEnterprise.trim();
}
public void setInterviewSituation(String interviewSituation) {
this.interviewSituation = interviewSituation == null ? null : interviewSituation.trim();
}
public void setInterviewResult(String interviewResult) {
this.interviewResult = interviewResult == null ? null : interviewResult.trim();
}
}
package com.anplus.hr.domain.vo;
import java.time.LocalDate;
import com.anplus.hr.constant.HrConstant;
import com.anplus.hr.domain.InterviewProfile;
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;
/**
* 面试档案视图对象 interview_profile
*
* @author LiuBin
* @date 2025-12-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = InterviewProfile.class)
public class InterviewProfileVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 员工信息ID
*/
@ExcelProperty(value = "员工信息ID")
private Long employeeId;
/**
* 招揽岗位
*/
@ExcelProperty(value = "招揽岗位")
private String jobPosition;
/**
* 姓名
*/
@ExcelProperty(value = "姓名")
private String name;
/**
* 性别
*/
@ExcelProperty(value = "性别")
private String gender;
/**
* 身份证号
*/
@ExcelProperty(value = "身份证号")
private String idCardNumber;
/**
* 学历
*/
@ExcelProperty(value = "学历")
private String education;
/**
* 院校
*/
@ExcelProperty(value = "院校")
private String school;
/**
* 专业
*/
@ExcelProperty(value = "专业")
private String major;
/**
* 联系方式
*/
@ExcelProperty(value = "联系方式")
private String phoneNumber;
/**
* 标杆企业
*/
@ExcelProperty(value = "标杆企业")
private String benchmarkEnterprise;
/**
* 面试时间
*/
@ExcelProperty(value = "面试时间")
private LocalDate interviewDate;
/**
* 面试情况
*/
@ExcelProperty(value = "面试情况")
private String interviewSituation;
/**
* 面试结果
*/
@ExcelProperty(value = "面试结果", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = HrConstant.HR_INTERVIEW_RESULT)
private String interviewResult;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package com.anplus.hr.mapper;
import com.anplus.hr.domain.EmployeeFlow;
import com.anplus.hr.domain.vo.EmployeeFlowVo;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import top.binfast.common.mybatis.datascope.annotation.DataColumn;
import top.binfast.common.mybatis.datascope.annotation.DataPermission;
import top.binfast.common.mybatis.datascope.core.DeptDataScope;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
import java.util.List;
/**
* 人事审批对象Mapper接口
*
......@@ -13,4 +23,16 @@ import top.binfast.common.mybatis.mapper.BinBaseMapper;
@Mapper
public interface EmployeeFlowMapper extends BinBaseMapper<EmployeeFlow> {
@DataPermission(type = DeptDataScope.DATA_SCOPE_TYPE, value = {
@DataColumn(key = DeptDataScope.DEPT_DATA_SCOPE_KEY, value = "e.dept_id"),
@DataColumn(key = DeptDataScope.USER_DATA_SCOPE_KEY, value = "f.create_by")
})
Page<EmployeeFlowVo> selectPageVo(@Param("page") Page<EmployeeFlow> page, @Param(Constants.WRAPPER) Wrapper<EmployeeFlow> queryWrapper);
@DataPermission(type = DeptDataScope.DATA_SCOPE_TYPE, value = {
@DataColumn(key = DeptDataScope.DEPT_DATA_SCOPE_KEY, value = "e.dept_id"),
@DataColumn(key = DeptDataScope.USER_DATA_SCOPE_KEY, value = "f.create_by")
})
List<EmployeeFlowVo> selectListVo(@Param(Constants.WRAPPER) Wrapper<EmployeeFlow> queryWrapper);
}
package com.anplus.hr.mapper;
import com.anplus.hr.domain.EmployeeLaborCost;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 人工成本档案Mapper接口
*
* @author LiuBin
* @date 2025-12-09
*/
@Mapper
public interface EmployeeLaborCostMapper extends BinBaseMapper<EmployeeLaborCost> {
}
package com.anplus.hr.mapper;
import com.anplus.hr.domain.EmployeeTraining;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 员工培训档案Mapper接口
*
* @author LiuBin
* @date 2025-12-07
*/
@Mapper
public interface EmployeeTrainingMapper extends BinBaseMapper<EmployeeTraining> {
default List<EmployeeTraining> selectListByEmployeeId(Long employeeId) {
return selectList(new LambdaUpdateWrapper<EmployeeTraining>().eq(EmployeeTraining::getEmployeeId, employeeId));
}
}
package com.anplus.hr.mapper;
import com.anplus.hr.domain.InterviewProfile;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
/**
* 面试档案Mapper接口
*
* @author LiuBin
* @date 2025-12-08
*/
@Mapper
public interface InterviewProfileMapper extends BinBaseMapper<InterviewProfile> {
default InterviewProfile selectByEmployeeId(Long employeeId) {
return selectOne(new LambdaUpdateWrapper<InterviewProfile>().eq(InterviewProfile::getEmployeeId, employeeId));
}
}
package com.anplus.hr.service;
import com.anplus.hr.domain.EmployeeLaborCost;
import com.anplus.hr.domain.vo.EmployeeLaborCostVo;
import com.anplus.hr.domain.params.EmployeeLaborCostListParam;
import com.anplus.hr.domain.params.EmployeeLaborCostParam;
import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 人工成本档案Service接口
*
* @author LiuBin
* @date 2025-12-09
*/
public interface EmployeeLaborCostServ extends IService<EmployeeLaborCost> {
/**
* 分页查询人工成本档案列表
*
* @param param 查询条件
* @return 人工成本档案分页列表
*/
PageResponse<EmployeeLaborCostVo> queryPageList(EmployeeLaborCostListParam param);
/**
* 查询符合条件的人工成本档案列表
*
* @param param 查询条件
* @return 人工成本档案列表
*/
List<EmployeeLaborCostVo> queryList(EmployeeLaborCostListParam param);
/**
* 查询人工成本档案
*
* @param id 主键
* @return 人工成本档案
*/
EmployeeLaborCostVo queryById(Long id);
/**
* 新增人工成本档案
*
* @param param 人工成本档案
* @return 是否新增成功
*/
Boolean insertByParam(EmployeeLaborCostParam param);
/**
* 修改人工成本档案
*
* @param param 人工成本档案
* @return 是否修改成功
*/
Boolean updateByParam(EmployeeLaborCostParam param);
/**
* 校验并批量删除人工成本档案信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean delByIds(List<Long> ids);
}
package com.anplus.hr.service;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.anplus.hr.domain.EmployeeTraining;
import com.anplus.hr.domain.params.EmployeeTrainingListParam;
import com.anplus.hr.domain.params.EmployeeTrainingParam;
import com.anplus.hr.domain.vo.EmployeeTrainingImportVo;
import com.anplus.hr.domain.vo.EmployeeTrainingVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.stream.Stream;
/**
* 员工培训档案Service接口
*
* @author LiuBin
* @date 2025-12-07
*/
public interface EmployeeTrainingServ extends IService<EmployeeTraining> {
/**
* 分页查询员工培训档案列表
*
* @param param 查询条件
* @return 员工培训档案分页列表
*/
PageResponse<EmployeeTrainingVo> queryPageList(EmployeeTrainingListParam param);
/**
* 查询符合条件的员工培训档案列表
*
* @param param 查询条件
* @return 员工培训档案列表
*/
List<EmployeeTrainingVo> queryList(EmployeeTrainingListParam param);
/**
* 导入员工培训档案列表
*
* @param list 员工培训档案列表
* @return 是否导入成功
*/
Response importTrainingList(Stream<EmployeeTrainingImportVo> list);
/**
* 查询员工培训档案
*
* @param id 主键
* @return 员工培训档案
*/
EmployeeTrainingVo queryById(Long id);
/**
* 新增员工培训档案
*
* @param param 员工培训档案
* @return 是否新增成功
*/
Boolean insertByParam(EmployeeTrainingParam param);
/**
* 修改员工培训档案
*
* @param param 员工培训档案
* @return 是否修改成功
*/
Boolean updateByParam(EmployeeTrainingParam param);
/**
* 校验并批量删除员工培训档案信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean delByIds(List<Long> ids);
}
package com.anplus.hr.service;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.anplus.hr.domain.InterviewProfile;
import com.anplus.hr.domain.params.InterviewProfileListParam;
import com.anplus.hr.domain.params.InterviewProfileParam;
import com.anplus.hr.domain.vo.InterviewProfileImportVo;
import com.anplus.hr.domain.vo.InterviewProfileVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.stream.Stream;
/**
* 面试档案Service接口
*
* @author LiuBin
* @date 2025-12-08
*/
public interface InterviewProfileServ extends IService<InterviewProfile> {
/**
* 分页查询面试档案列表
*
* @param param 查询条件
* @return 面试档案分页列表
*/
PageResponse<InterviewProfileVo> queryPageList(InterviewProfileListParam param);
/**
* 查询符合条件的面试档案列表
*
* @param param 查询条件
* @return 面试档案列表
*/
List<InterviewProfileVo> queryList(InterviewProfileListParam param);
/**
* 导入数据
*
* @param list 数据列表
* @return 是否导入成功
*/
Response importInterviewList(Stream<InterviewProfileImportVo> list);
/**
* 查询面试档案
*
* @param id 主键
* @return 面试档案
*/
InterviewProfileVo queryById(Long id);
/**
* 新增面试档案
*
* @param param 面试档案
* @return 是否新增成功
*/
Boolean insertByParam(InterviewProfileParam param);
/**
* 修改面试档案
*
* @param param 面试档案
* @return 是否修改成功
*/
Boolean updateByParam(InterviewProfileParam param);
/**
* 校验并批量删除面试档案信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean delByIds(List<Long> ids);
}
......@@ -64,7 +64,9 @@ public class EmployeeChangeAnalysisServImpl extends ServiceImpl<EmployeeInfoMapp
analysisVo.setProbationResignationRate(calcResignationRate(analysisVo.getProbationPeriod(), analysisVo.getEndingCount()));
analysisVo.setWithin3YearsResignationRate(calcResignationRate(analysisVo.getWithin3Years(), analysisVo.getEndingCount()));
analysisVo.setOver3YearsResignationRate(calcResignationRate(analysisVo.getOver3Years(), analysisVo.getEndingCount()));
analysisVo.setPassiveResignationRate(calcResignationRate(analysisVo.getPassiveResignation(), analysisVo.getEndingCount()));
analysisVo.setPassiveProbationPeriodRate(calcResignationRate(analysisVo.getPassiveProbationPeriod(), analysisVo.getEndingCount()));
analysisVo.setPassiveLayoffRate(calcResignationRate(analysisVo.getPassiveLayoff(), analysisVo.getEndingCount()));
analysisVo.setRetirementRate(calcResignationRate(analysisVo.getRetirement(), analysisVo.getEndingCount()));
analysisVo.setTotalResignationRate(calcResignationRate(analysisVo.getTotalResignation(), analysisVo.getEndingCount()));
}
}
......@@ -83,7 +85,9 @@ public class EmployeeChangeAnalysisServImpl extends ServiceImpl<EmployeeInfoMapp
sumVo.setProbationPeriod(sumVo.getProbationPeriod() + changeAnalysisVo.getProbationPeriod());
sumVo.setWithin3Years(sumVo.getWithin3Years() + changeAnalysisVo.getWithin3Years());
sumVo.setOver3Years(sumVo.getOver3Years() + changeAnalysisVo.getOver3Years());
sumVo.setPassiveResignation(sumVo.getPassiveResignation() + changeAnalysisVo.getPassiveResignation());
sumVo.setPassiveProbationPeriod(sumVo.getPassiveProbationPeriod() + changeAnalysisVo.getPassiveProbationPeriod());
sumVo.setPassiveLayoff(sumVo.getPassiveLayoff() + changeAnalysisVo.getPassiveLayoff());
sumVo.setRetirement(sumVo.getRetirement() + changeAnalysisVo.getRetirement());
sumVo.setTotalResignation(sumVo.getTotalResignation() + changeAnalysisVo.getTotalResignation());
sumVo.setEndingCount(sumVo.getEndingCount() + changeAnalysisVo.getEndingCount());
}
......
......@@ -22,7 +22,8 @@ import com.anplus.hr.mapper.EmployeeInfoMapper;
import com.anplus.hr.service.EmployeeAuditLogServ;
import com.anplus.hr.service.EmployeeChangeLogServ;
import com.anplus.hr.service.EmployeeFlowServ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......@@ -78,9 +79,9 @@ public class EmployeeFlowServImpl extends ServiceImpl<EmployeeFlowMapper, Employ
@Override
public PageResponse<EmployeeFlowVo> queryPageList(EmployeeFlowListParam param) {
Page<EmployeeFlow> page = QueryUtil.getPage(param);
LambdaQueryWrapper<EmployeeFlow> lambdaQuery = this.buildQueryWrapper(param);
employeeFlowMapper.selectPage(page, lambdaQuery);
return QueryUtil.getPageResponse(page, MapstructUtils.convert(page.getRecords(), EmployeeFlowVo.class));
Wrapper<EmployeeFlow> lambdaQuery = this.buildQueryWrapper(param);
Page<EmployeeFlowVo> employeeFlowVoPage = employeeFlowMapper.selectPageVo(page, lambdaQuery);
return QueryUtil.getPageResponse(employeeFlowVoPage);
}
......@@ -92,20 +93,18 @@ public class EmployeeFlowServImpl extends ServiceImpl<EmployeeFlowMapper, Employ
*/
@Override
public List<EmployeeFlowVo> queryList(EmployeeFlowListParam param) {
LambdaQueryWrapper<EmployeeFlow> lambdaQuery = this.buildQueryWrapper(param);
return MapstructUtils.convert(employeeFlowMapper.selectList(lambdaQuery), EmployeeFlowVo.class);
Wrapper<EmployeeFlow> lambdaQuery = this.buildQueryWrapper(param);
return employeeFlowMapper.selectListVo(lambdaQuery);
}
private LambdaQueryWrapper<EmployeeFlow> buildQueryWrapper(EmployeeFlowListParam param) {
LambdaQueryWrapper<EmployeeFlow> lambdaQuery = Wrappers.<EmployeeFlow>lambdaQuery();
lambdaQuery.orderByDesc(EmployeeFlow::getId);
lambdaQuery.eq(StrUtil.isNotBlank(param.getApplyCode()), EmployeeFlow::getApplyCode, param.getApplyCode());
lambdaQuery.eq(StrUtil.isNotBlank(param.getFlowType()), EmployeeFlow::getFlowType, param.getFlowType());
lambdaQuery.eq(param.getEmployeeId() != null, EmployeeFlow::getEmployeeId, param.getEmployeeId());
lambdaQuery.eq(param.getStartDate() != null, EmployeeFlow::getStartDate, param.getStartDate());
lambdaQuery.eq(param.getEndDate() != null, EmployeeFlow::getEndDate, param.getEndDate());
lambdaQuery.eq(StrUtil.isNotBlank(param.getStatus()), EmployeeFlow::getStatus, param.getStatus());
return lambdaQuery;
private Wrapper<EmployeeFlow> buildQueryWrapper(EmployeeFlowListParam param) {
QueryWrapper<EmployeeFlow> wrapper = Wrappers.<EmployeeFlow>query();
wrapper.orderByDesc("f.id");
wrapper.eq(StrUtil.isNotBlank(param.getApplyCode()), "f.apply_code", param.getApplyCode());
wrapper.eq(StrUtil.isNotBlank(param.getFlowType()), "f.flow_type", param.getFlowType());
wrapper.like(StrUtil.isNotBlank(param.getName()), "e.name", param.getName());
wrapper.eq(StrUtil.isNotBlank(param.getStatus()), "f.status", param.getStatus());
return wrapper;
}
/**
......
......@@ -13,15 +13,12 @@ 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.*;
import com.anplus.hr.domain.params.*;
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.domain.vo.*;
import com.anplus.hr.mapper.EmployeeInfoMapper;
import com.anplus.hr.mapper.EmployeeTrainingMapper;
import com.anplus.hr.mapper.InterviewProfileMapper;
import com.anplus.hr.service.EmployeeAuditLogServ;
import com.anplus.hr.service.EmployeeFlowServ;
import com.anplus.hr.service.EmployeeInfoServ;
......@@ -59,6 +56,7 @@ import top.binfast.common.mybatis.util.QueryUtil;
import top.binfast.common.oss.core.OssService;
import top.binfast.common.oss.entity.UploadResult;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
......@@ -84,6 +82,8 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
private final SysOssMapper sysOssMapper;
private final EmployeeFamilyMembersCmdExe familyMembersCmdExe;
private final EmployeeAsyncService employeeAsyncService;
private final EmployeeTrainingMapper employeeTrainingMapper;
private final InterviewProfileMapper interviewProfileMapper;
/**
* 分页查询员工信息列表
......@@ -433,7 +433,24 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
@Override
public EmployeeInfoResumeVo infoDetailForResume(Long id) {
EmployeeInfoVo employeeInfoVo = infoDetail(id);
List<EmployeeTraining> trainings = employeeTrainingMapper.selectListByEmployeeId(id);
InterviewProfile interviewProfile = interviewProfileMapper.selectByEmployeeId(id);
List<EmployeeFamilyMembersVo> familyMembersVos = familyMembersCmdExe.selectListByEmployeeId(id);
EmployeeInfoResumeVo employeeInfoResumeVo = MapstructUtils.convert(employeeInfoVo, EmployeeInfoResumeVo.class);
employeeInfoResumeVo.setTrainings(MapstructUtils.convert(trainings, EmployeeTrainingVo.class));
employeeInfoResumeVo.setFamilyMembers(familyMembersVos);
if (interviewProfile != null) {
employeeInfoResumeVo.setInterviewDate(interviewProfile.getInterviewDate());
employeeInfoResumeVo.setInterviewResult(interviewProfile.getInterviewResult());
employeeInfoResumeVo.setInterviewSituation(interviewProfile.getInterviewSituation());
employeeInfoResumeVo.setBenchmarkEnterprise(interviewProfile.getBenchmarkEnterprise());
employeeInfoResumeVo.setJobPosition(interviewProfile.getJobPosition());
}
if (StrUtil.isNotBlank(employeeInfoResumeVo.getConcurrentPlate())) {
employeeInfoResumeVo.setConcurrentFlag("是");
} else {
employeeInfoResumeVo.setConcurrentFlag("否");
}
// transService.transOne(employeeInfoVo);
return employeeInfoResumeVo;
}
......
package com.anplus.hr.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import top.binfast.common.core.util.MapstructUtils;
import top.binfast.common.mybatis.util.QueryUtil;
import com.anplus.hr.domain.EmployeeLaborCost;
import com.anplus.hr.domain.vo.EmployeeLaborCostVo;
import com.anplus.hr.domain.params.EmployeeLaborCostListParam;
import com.anplus.hr.domain.params.EmployeeLaborCostParam;
import com.anplus.hr.mapper.EmployeeLaborCostMapper;
import com.anplus.hr.service.EmployeeLaborCostServ;
import java.util.List;
/**
* 人工成本档案Service业务层处理
*
* @author LiuBin
* @date 2025-12-09
*/
@RequiredArgsConstructor
@Service
public class EmployeeLaborCostServImpl extends ServiceImpl<EmployeeLaborCostMapper, EmployeeLaborCost> implements EmployeeLaborCostServ {
private final EmployeeLaborCostMapper employeeLaborCostMapper;
/**
* 分页查询人工成本档案列表
*
* @param param 查询条件
* @return 人工成本档案分页列表
*/
@Override
public PageResponse<EmployeeLaborCostVo> queryPageList(EmployeeLaborCostListParam param) {
Page<EmployeeLaborCost> page = QueryUtil.getPage(param);
LambdaQueryWrapper<EmployeeLaborCost> lambdaQuery = this.buildQueryWrapper(param);
employeeLaborCostMapper.selectPage(page, lambdaQuery);
return QueryUtil.getPageResponse(page, MapstructUtils.convert(page.getRecords(), EmployeeLaborCostVo.class));
}
/**
* 查询符合条件的人工成本档案列表
*
* @param param 查询条件
* @return 人工成本档案列表
*/
@Override
public List<EmployeeLaborCostVo> queryList(EmployeeLaborCostListParam param) {
LambdaQueryWrapper<EmployeeLaborCost> lambdaQuery = this.buildQueryWrapper(param);
return MapstructUtils.convert(employeeLaborCostMapper.selectList(lambdaQuery), EmployeeLaborCostVo.class);
}
private LambdaQueryWrapper<EmployeeLaborCost> buildQueryWrapper(EmployeeLaborCostListParam param) {
LambdaQueryWrapper<EmployeeLaborCost> lambdaQuery = Wrappers.<EmployeeLaborCost>lambdaQuery();
lambdaQuery.orderByDesc(EmployeeLaborCost::getId);
lambdaQuery.eq(param.getRecordDate() != null, EmployeeLaborCost::getRecordDate, param.getRecordDate());
lambdaQuery.eq(param.getOssId() != null, EmployeeLaborCost::getOssId, param.getOssId());
lambdaQuery.eq(StrUtil.isNotBlank(param.getFileKey()), EmployeeLaborCost::getFileKey, param.getFileKey());
return lambdaQuery;
}
/**
* 查询人工成本档案
*
* @param id 主键
* @return 人工成本档案
*/
@Override
public EmployeeLaborCostVo queryById(Long id){
EmployeeLaborCost employeeLaborCost = employeeLaborCostMapper.selectById(id);
return MapstructUtils.convert(employeeLaborCost, EmployeeLaborCostVo.class);
}
/**
* 新增人工成本档案
*
* @param param 人工成本档案
* @return 是否新增成功
*/
@Override
public Boolean insertByParam(EmployeeLaborCostParam param) {
EmployeeLaborCost employeeLaborCost = MapstructUtils.convert(param, EmployeeLaborCost.class);
return this.save(employeeLaborCost);
}
/**
* 修改人工成本档案
*
* @param param 人工成本档案
* @return 是否修改成功
*/
@Override
public Boolean updateByParam(EmployeeLaborCostParam param) {
EmployeeLaborCost employeeLaborCost = MapstructUtils.convert(param, EmployeeLaborCost.class);
return this.updateById(employeeLaborCost);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(EmployeeLaborCost entity){
// 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除人工成本档案信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
@Override
// @Transactional(rollbackFor = {Exception.class})
public Boolean delByIds(List<Long> ids) {
//做一些业务上的校验,判断是否需要校验
return this.removeByIds(ids);
}
}
package com.anplus.hr.service.impl;
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.EmployeeInfo;
import com.anplus.hr.domain.EmployeeTraining;
import com.anplus.hr.domain.params.EmployeeTrainingListParam;
import com.anplus.hr.domain.params.EmployeeTrainingParam;
import com.anplus.hr.domain.vo.EmployeeTrainingImportVo;
import com.anplus.hr.domain.vo.EmployeeTrainingVo;
import com.anplus.hr.mapper.EmployeeInfoMapper;
import com.anplus.hr.mapper.EmployeeTrainingMapper;
import com.anplus.hr.service.EmployeeTrainingServ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import top.binfast.common.core.enums.ResultCode;
import top.binfast.common.core.util.LambdaUtil;
import top.binfast.common.core.util.MapstructUtils;
import top.binfast.common.mybatis.util.QueryUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
/**
* 员工培训档案Service业务层处理
*
* @author LiuBin
* @date 2025-12-07
*/
@RequiredArgsConstructor
@Service
public class EmployeeTrainingServImpl extends ServiceImpl<EmployeeTrainingMapper, EmployeeTraining> implements EmployeeTrainingServ {
private final EmployeeTrainingMapper employeeTrainingMapper;
private final EmployeeInfoMapper employeeInfoMapper;
/**
* 分页查询员工培训档案列表
*
* @param param 查询条件
* @return 员工培训档案分页列表
*/
@Override
public PageResponse<EmployeeTrainingVo> queryPageList(EmployeeTrainingListParam param) {
Page<EmployeeTraining> page = QueryUtil.getPage(param);
LambdaQueryWrapper<EmployeeTraining> lambdaQuery = this.buildQueryWrapper(param);
employeeTrainingMapper.selectPage(page, lambdaQuery);
return QueryUtil.getPageResponse(page, MapstructUtils.convert(page.getRecords(), EmployeeTrainingVo.class));
}
/**
* 查询符合条件的员工培训档案列表
*
* @param param 查询条件
* @return 员工培训档案列表
*/
@Override
public List<EmployeeTrainingVo> queryList(EmployeeTrainingListParam param) {
LambdaQueryWrapper<EmployeeTraining> lambdaQuery = this.buildQueryWrapper(param);
return MapstructUtils.convert(employeeTrainingMapper.selectList(lambdaQuery), EmployeeTrainingVo.class);
}
private LambdaQueryWrapper<EmployeeTraining> buildQueryWrapper(EmployeeTrainingListParam param) {
LambdaQueryWrapper<EmployeeTraining> lambdaQuery = Wrappers.<EmployeeTraining>lambdaQuery();
lambdaQuery.orderByDesc(EmployeeTraining::getId);
// lambdaQuery.eq(param.getEmployeeId() != null, EmployeeTraining::getEmployeeId, param.getEmployeeId());
lambdaQuery.like(StrUtil.isNotBlank(param.getName()), EmployeeTraining::getName, param.getName());
lambdaQuery.eq(StrUtil.isNotBlank(param.getTrainingCourse()), EmployeeTraining::getTrainingCourse, param.getTrainingCourse());
lambdaQuery.eq(StrUtil.isNotBlank(param.getTrainingInstitution()), EmployeeTraining::getTrainingInstitution, param.getTrainingInstitution());
lambdaQuery.eq(StrUtil.isNotBlank(param.getTrainer()), EmployeeTraining::getTrainer, param.getTrainer());
lambdaQuery.eq(param.getTrainingTime() != null, EmployeeTraining::getTrainingTime, param.getTrainingTime());
lambdaQuery.eq(param.getServiceEndDate() != null, EmployeeTraining::getServiceEndDate, param.getServiceEndDate());
lambdaQuery.eq(StrUtil.isNotBlank(param.getServiceYears()), EmployeeTraining::getServiceYears, param.getServiceYears());
lambdaQuery.eq(param.getTrainingAmount() != null, EmployeeTraining::getTrainingAmount, param.getTrainingAmount());
return lambdaQuery;
}
@Override
public Response importTrainingList(Stream<EmployeeTrainingImportVo> list) {
List<EmployeeTrainingImportVo> errorList = new ArrayList<>();
List<EmployeeTraining> successList = new ArrayList<>();
list.forEach(item -> {
if (item.hasError()) {
errorList.add(item);
return;
}
EmployeeTraining training = MapstructUtils.convert(item, EmployeeTraining.class);
successList.add(training);
});
if (CollUtil.isNotEmpty(successList)) {
connectToEmployee(successList);
employeeTrainingMapper.insert(successList);
}
StringBuilder message;
if (CollUtil.isNotEmpty(errorList)) {
message = new StringBuilder("共" + errorList.size() + "条数据导入失败,错误如下:<br/>");
errorList.forEach(item -> message.append(item.defaultFailMsg()));
return Response.buildFailure(ResultCode.FAIL.getCode(), message.toString());
} else {
message = new StringBuilder("共" + successList.size() + "条数据导入成功");
Response response = Response.buildSuccess();
response.setErrMessage(message.toString());
return response;
}
}
/**
* 连接员工培训档案和员工信息
*
* @param list 员工培训档案列表
*/
private void connectToEmployee(List<EmployeeTraining> list) {
if (CollUtil.isEmpty(list)) {
return;
}
List<EmployeeTraining> filter = LambdaUtil.filter(list, item -> item.getEmployeeId() == null);
if (CollUtil.isEmpty(filter)) {
return;
}
Map<String, EmployeeTraining> idCardMap;
for (List<EmployeeTraining> splitedList : CollectionUtils.split(filter, 15)) {
idCardMap = LambdaUtil.filterToMap(splitedList, item -> StrUtil.isNotBlank(item.getIdCardNumber()),
EmployeeTraining::getIdCardNumber, item -> item);
if (CollUtil.isNotEmpty(idCardMap.keySet())) {
List<EmployeeInfo> employeeInfos = employeeInfoMapper.selectList(new LambdaUpdateWrapper<EmployeeInfo>()
.in(EmployeeInfo::getIdCardNumber, idCardMap.keySet()));
if (CollUtil.isNotEmpty(employeeInfos)) {
for (EmployeeInfo employeeInfo : employeeInfos) {
idCardMap.get(employeeInfo.getIdCardNumber()).setEmployeeId(employeeInfo.getId());
}
}
}
}
}
/**
* 查询员工培训档案
*
* @param id 主键
* @return 员工培训档案
*/
@Override
public EmployeeTrainingVo queryById(Long id) {
EmployeeTraining employeeTraining = employeeTrainingMapper.selectById(id);
return MapstructUtils.convert(employeeTraining, EmployeeTrainingVo.class);
}
/**
* 新增员工培训档案
*
* @param param 员工培训档案
* @return 是否新增成功
*/
@Override
public Boolean insertByParam(EmployeeTrainingParam param) {
EmployeeTraining employeeTraining = MapstructUtils.convert(param, EmployeeTraining.class);
connectToEmployee(List.of(employeeTraining));
return this.save(employeeTraining);
}
/**
* 修改员工培训档案
*
* @param param 员工培训档案
* @return 是否修改成功
*/
@Override
public Boolean updateByParam(EmployeeTrainingParam param) {
EmployeeTraining employeeTraining = MapstructUtils.convert(param, EmployeeTraining.class);
return this.updateById(employeeTraining);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(EmployeeTraining entity) {
// 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除员工培训档案信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
@Override
// @Transactional(rollbackFor = {Exception.class})
public Boolean delByIds(List<Long> ids) {
//做一些业务上的校验,判断是否需要校验
return this.removeByIds(ids);
}
}
......@@ -8,7 +8,6 @@ import com.anplus.hr.domain.params.EmployeeFamilyMembersParam;
import com.anplus.hr.domain.vo.EmployeeFamilyMembersVo;
import com.anplus.hr.domain.vo.EmployeeInfoVo;
import com.anplus.hr.mapper.EmployeeFamilyMembersMapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import lombok.RequiredArgsConstructor;
import org.dromara.trans.service.impl.TransService;
......@@ -101,6 +100,19 @@ public class EmployeeFamilyMembersCmdExe {
}
}
/**
* 根据员工ID查询员工家庭档案
*/
public List<EmployeeFamilyMembersVo> selectListByEmployeeId(Long employeeId) {
List<EmployeeFamilyMembers> familyMembers = employeeFamilyMembersMapper.selectByEmployeeId(employeeId);
if (CollUtil.isEmpty(familyMembers)) {
return null;
}
List<EmployeeFamilyMembersVo> familyMembersVos = MapstructUtils.convert(familyMembers, EmployeeFamilyMembersVo.class);
transService.transBatch(familyMembersVos);
return familyMembersVos;
}
/**
* 批量插入导入数据
*/
......
......@@ -3,5 +3,20 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.anplus.hr.mapper.EmployeeFlowMapper">
<sql id="selectEmployeeFlowVo">
select f.id, f.apply_code, f.flow_type, f.employee_id, f.status, f.remark, e.name,
concat(e.plate, '/', e.first_level_department , '/', e.second_level_department, '/', e.third_level_department) as dept_name
from employee_flow f left join employee_info e on f.employee_id = e.id
</sql>
<select id="selectPageVo" resultType="com.anplus.hr.domain.vo.EmployeeFlowVo">
<include refid="selectEmployeeFlowVo"/>
${ew.getCustomSqlSegment}
</select>
<select id="selectListVo" resultType="com.anplus.hr.domain.vo.EmployeeFlowVo">
<include refid="selectEmployeeFlowVo"/>
${ew.getCustomSqlSegment}
</select>
</mapper>
......@@ -29,24 +29,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-- 转出:统计本段时间部门转出员工数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@TransferOut}, 1, 0)) AS transferOut,
-- 离职并试用期内:统计本段时间离职时仍在试用期的员工数
-- 主动离职并试用期内:统计本段时间离职时仍在试用期的员工数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@HAND_IN_WORK}
AND t.resign_years_of_service_type = ${@com.anplus.hr.constant.HrResignYearsOfServiceTypeEnum@PROBATION_PERIOD.getCode()}, 1, 0)) AS probationPeriod,
-- 离职并入职3年内:统计本段时间离职时入职3年内的员工数
-- 主动离职并入职3年内:统计本段时间离职时入职3年内的员工数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@HAND_IN_WORK}
AND t.resign_years_of_service_type = ${@com.anplus.hr.constant.HrResignYearsOfServiceTypeEnum@UNDER_THREE_YEARS.getCode()}, 1, 0)) AS within3Years,
-- 离职并入职3年以上:统计本段时间离职时入职3年以上的员工数
-- 主动离职并入职3年以上:统计本段时间离职时入职3年以上的员工数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@HAND_IN_WORK}
AND t.resign_years_of_service_type = ${@com.anplus.hr.constant.HrResignYearsOfServiceTypeEnum@OVER_THREE_YEARS.getCode()}, 1, 0)) AS over3Years,
-- 被动离职:统计本段时间被动离职人数
-- 被动离职并试用期内:统计本段时间被动离职时在试用期内的人数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@FIRED}, 1, 0)) AS passiveResignation,
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@FIRED}
AND t.resign_years_of_service_type = ${@com.anplus.hr.constant.HrResignYearsOfServiceTypeEnum@PROBATION_PERIOD.getCode()}, 1, 0)) AS passiveProbationPeriod,
-- 被动离职并裁员:统计本段时间被动离职是裁员的人数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@FIRED}
AND t.resign_years_of_service_type <> ${@com.anplus.hr.constant.HrResignYearsOfServiceTypeEnum@PROBATION_PERIOD.getCode()}, 1, 0)) AS passiveLayoff,
-- 退休:统计本段时间退休人数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}
AND t.resign_type = ${@com.anplus.hr.constant.HrResignationTypeConstant@RETIREMENT}, 1, 0)) AS retirement,
-- 总离职:统计本段时间总离职人数
SUM(IF(t.type = ${@com.anplus.hr.constant.EmployeeChangeLogTypeConstant@Resign}, 1, 0)) AS totalResignation,
......
<?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.EmployeeLaborCostMapper">
</mapper>
<?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.EmployeeTrainingMapper">
</mapper>
<?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.InterviewProfileMapper">
</mapper>
......@@ -18,7 +18,7 @@
<mapstruct-plus.version>1.4.8</mapstruct-plus.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
<binfast.version>1.2.8</binfast.version>
<binfast.version>1.2.9</binfast.version>
<lombok.version>1.18.38</lombok.version>
</properties>
......
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