diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/entity/PostHandleEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/entity/PostHandleEntity.java index 707e37d2..31355182 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/entity/PostHandleEntity.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/entity/PostHandleEntity.java @@ -104,7 +104,7 @@ public class PostHandleEntity extends BaseEntity { /** * 用工类型 */ - @Schema(description = "用工类型") + @Schema(description = "用工类型(1实习工,2正式工)") private Short staffType; /** * 参加工作时间 diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/enums/MarriageEnum.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/enums/MarriageEnum.java new file mode 100644 index 00000000..0a5eba2b --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/enums/MarriageEnum.java @@ -0,0 +1,57 @@ +package org.springblade.desk.jobTransfer.pojo.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringPool; + +import java.util.Arrays; + +/** + * 婚姻枚举 + * + * @author qyl + * @date 2026-01-09 + */ +@Getter +@AllArgsConstructor +public enum MarriageEnum { + EMPTY(StringPool.EMPTY, ""), + + /** + * 状态枚举 + */ + MARRIED("已婚", "1"), + SPINSTERHOOD("未婚", "0"), + ; + final String name; + final String code; + + /** + * 匹配枚举值 + * + * @param name 名称 + * @return + */ + public static MarriageEnum of(String name) { + return Arrays.stream(MarriageEnum.values()) + .filter(enumItem -> enumItem.getName().equalsIgnoreCase(name != null ? name : "")) + .findFirst() + // 在没有找到匹配项时返回默认值 + .orElse(MarriageEnum.EMPTY); + } + + /** + * 根据值获取名称 + * + * @param code + * @return + */ + public static String getName(String code) { + MarriageEnum item = Arrays.stream(MarriageEnum.values()) + .filter(enumItem -> enumItem.getCode().equalsIgnoreCase(code)) + .findFirst() + .orElse(null); + return ObjectUtil.isEmpty(item) ? StringPool.EMPTY : item.getName(); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/enums/SkillEnum.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/enums/SkillEnum.java new file mode 100644 index 00000000..53f4f507 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/enums/SkillEnum.java @@ -0,0 +1,58 @@ +package org.springblade.desk.jobTransfer.pojo.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringPool; + +import java.util.Arrays; + +/** + * 技能等级枚举 + * + * @author qyl + * @date 2026-01-09 + */ +@Getter +@AllArgsConstructor +public enum SkillEnum { + EMPTY(StringPool.EMPTY, -1), + + /** + * 状态枚举 + */ + MIDDLE_RANK("中级", 1), + SENIOR("高级", 2), + ARTIFICER("技师", 3), + ; + final String name; + final Integer code; + + /** + * 匹配枚举值 + * + * @param name 名称 + * @return + */ + public static SkillEnum of(String name) { + return Arrays.stream(SkillEnum.values()) + .filter(enumItem -> enumItem.getName().equalsIgnoreCase(name != null ? name : "")) + .findFirst() + // 在没有找到匹配项时返回默认值 + .orElse(SkillEnum.EMPTY); + } + + /** + * 根据值获取名称 + * + * @param code + * @return + */ + public static String getName(int code) { + SkillEnum item = Arrays.stream(SkillEnum.values()) + .filter(enumItem -> enumItem.getCode() == code) + .findFirst() + .orElse(null); + return ObjectUtil.isEmpty(item) ? StringPool.EMPTY : item.getName(); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/PostHandleImport.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/PostHandleImport.java new file mode 100644 index 00000000..f8234e17 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/jobTransfer/pojo/excel/PostHandleImport.java @@ -0,0 +1,130 @@ +package org.springblade.desk.jobTransfer.pojo.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 岗位处理导入 + * + * @author qyl + * @since 2026-01-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PostHandleImport extends BaseEntity { + + /** + * 用户code + */ + @ExcelProperty(index = 0) + private String code; + /** + * 名称 + */ + @ExcelProperty(index = 1) + private String name; + /** + * 民族 + */ + @ExcelProperty(index = 2) + private String nation; + /** + * 年龄 + */ + @ExcelProperty(index = 3) + private Short age; + /** + * 身份证号码 + */ + @ExcelProperty(index = 4) + private String idCard; + /** + * 籍贯 + */ + @ExcelProperty(index = 5) + private String nativePlace; + + /** + * 所属岗位 + */ + @ExcelProperty(index = 6) + private String station; + /** + * 出生日期 + */ + @ExcelProperty(index = 7) + @DateTimeFormat("yyyy/MM/dd") + private Date dataBirth; + /** + * 政治面貌 + */ + @ExcelProperty(index = 8) + private String face; + /** + * 婚姻状态(0未婚,1已婚) + */ + @ExcelProperty(index = 9) + private String marriageName; + /** + * 毕业院校 + */ + @ExcelProperty(index = 10) + private String school; + /** + * 所学专业 + */ + @ExcelProperty(index = 11) + private String major; + /** + * 最高学历 + */ + @ExcelProperty(index = 12) + private String education; + /** + * 毕业时间 + */ + @ExcelProperty(index = 13) + @DateTimeFormat("yyyy/MM/dd") + private Date endDate; + /** + * 用工类型 + */ + @ExcelProperty(index = 14) + private String staffTypeName; + /** + * 参加工作时间 + */ + @ExcelProperty(index = 15) + @DateTimeFormat("yyyy/MM/dd") + private Date joinJobDate; + /** + * 技能等级 + */ + @ExcelProperty(index = 16) + private String skillName; + /** + * 任现职时间 + */ + @ExcelProperty(index = 17) + @DateTimeFormat("yyyy/MM/dd") + private Date inJobDate; + /** + * 合同到期 + */ + @ExcelProperty(index = 18) + @DateTimeFormat("yyyy/MM/dd") + private Date conExpDate; + /** + * 家庭住址 + */ + @ExcelProperty(index = 19) + private String address; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java index 470a2afb..a6810c52 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/controller/PostHandleController.java @@ -1,7 +1,5 @@ package org.springblade.desk.jobTransfer.controller; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Schema; @@ -18,8 +16,13 @@ import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.util.ExcelExtUtil; import org.springblade.desk.jobTransfer.pojo.excel.PostHandleExcel; +import org.springblade.desk.jobTransfer.pojo.excel.PostHandleImport; import org.springblade.desk.jobTransfer.pojo.request.PostHandleQuery; +import org.springframework.beans.BeanUtils; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -30,12 +33,13 @@ import org.springblade.desk.jobTransfer.service.IPostHandleService; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.excel.util.ExcelUtil; -import org.springblade.core.tool.constant.BladeConstant; import java.util.Map; import java.util.List; +import java.util.stream.Collectors; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; /** * 岗位处理 控制器 @@ -147,7 +151,7 @@ public class PostHandleController extends BladeController { * @return */ @PostMapping("/JobTransferPlan") - @ApiOperationSupport(order = 8) + @ApiOperationSupport(order = 9) @Operation(summary = "批量转岗计划", description = "传入ids") public R JobTransferPlan(@Parameter(description = "主键集合", required = true) @RequestParam String ids, @Parameter(description = "培训师id", required = true) @RequestParam Long teacherId, @@ -166,7 +170,7 @@ public class PostHandleController extends BladeController { * @return */ @PostMapping("/layoffPlan") - @ApiOperationSupport(order = 8) + @ApiOperationSupport(order = 10) @Operation(summary = "批量下岗计划", description = "传入ids") public R layoffPlan(@Parameter(description = "主键集合", required = true) @RequestParam String ids, @Parameter(description = "培训师id", required = true) @RequestParam Long teacherId, @@ -180,7 +184,7 @@ public class PostHandleController extends BladeController { */ @IsAdmin @GetMapping("/export-postHandle") - @ApiOperationSupport(order = 9) + @ApiOperationSupport(order = 11) @Operation(summary = "导出数据", description = "传入postHandle") public void exportPostHandle(@Parameter(hidden = true) @RequestParam Map postHandle, BladeUser bladeUser, HttpServletResponse response) { QueryWrapper queryWrapper = Condition.getQueryWrapper(postHandle, PostHandleEntity.class); @@ -192,4 +196,33 @@ public class PostHandleController extends BladeController { ExcelUtil.export(response, "岗位处理数据" + DateUtil.time(), "岗位处理数据表", list, PostHandleExcel.class); } + /** + * 下载Excel模板 + */ + @GetMapping("/downloadExcelTemplate") + @ApiOperationSupport(order = 12) + @Operation(summary = "下载Excel模板", description = "") + public ResponseEntity downloadExcelTemplate() { + return ExcelExtUtil.downloadXlsTemplate( + "Excel/jobTransfer/岗位处理导入模板下载.xls", + "岗位处理导入模板下载.xls"); + } + + /** + * 导入Excel + */ + @PostMapping("/importExcel") + @ApiOperationSupport(order = 13) + @Operation(summary = "导入Excel", description = "MultipartFile") + public R importExcel(@RequestParam("file") MultipartFile file) { + R checkR = ExcelExtUtil.importExcelCheck(file); + if (checkR != null) { + return checkR; + } + List importList = ExcelUtil.read( + file, 0, 1, PostHandleImport.class + ); + return postHandleService.saveExcelData(importList); + } + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/IPostHandleService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/IPostHandleService.java index 10945d1e..05d9052b 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/IPostHandleService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/IPostHandleService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import org.springblade.core.tool.api.R; import org.springblade.desk.jobTransfer.pojo.entity.PostHandleEntity; import org.springblade.desk.jobTransfer.pojo.excel.PostHandleExcel; +import org.springblade.desk.jobTransfer.pojo.excel.PostHandleImport; import org.springblade.desk.jobTransfer.pojo.request.PostHandleQuery; import org.springblade.desk.jobTransfer.pojo.vo.PostHandleVO; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -74,4 +75,11 @@ public interface IPostHandleService extends BaseService { */ R layoffPlan(List ids, Long teacherId, String teacherName, Long trainingPlanId); + /** + * 导入Excel + * + * @param postHandleEntityList + * @return + */ + R saveExcelData(List postHandleEntityList); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/PostHandleServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/PostHandleServiceImpl.java index e6ec1149..70815818 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/PostHandleServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/jobTransfer/service/impl/PostHandleServiceImpl.java @@ -1,18 +1,23 @@ package org.springblade.desk.jobTransfer.service.impl; import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import jakarta.annotation.Resource; import org.springblade.core.tool.api.R; import org.springblade.desk.jobTransfer.pojo.entity.CultivateDetailEntity; import org.springblade.desk.jobTransfer.pojo.entity.PostHandleEntity; -import org.springblade.desk.jobTransfer.pojo.enums.PostHandleStatusEnum; -import org.springblade.desk.jobTransfer.pojo.enums.StaffTypeEnum; -import org.springblade.desk.jobTransfer.pojo.enums.TrainingStatusEnum; +import org.springblade.desk.jobTransfer.pojo.enums.*; import org.springblade.desk.jobTransfer.pojo.excel.PostHandleExcel; +import org.springblade.desk.jobTransfer.pojo.excel.PostHandleImport; import org.springblade.desk.jobTransfer.pojo.request.PostHandleQuery; import org.springblade.desk.jobTransfer.pojo.vo.PostHandleVO; import org.springblade.desk.jobTransfer.mapper.PostHandleMapper; import org.springblade.desk.jobTransfer.service.ICultivateDetailService; import org.springblade.desk.jobTransfer.service.IPostHandleService; +import org.springblade.system.cache.SysCache; +import org.springblade.system.cache.UserCache; +import org.springblade.system.pojo.entity.User; +import org.springblade.system.pojo.entity.UserInfo; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -20,9 +25,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 岗位处理 服务实现类 @@ -33,7 +37,7 @@ import java.util.List; @Service public class PostHandleServiceImpl extends BaseServiceImpl implements IPostHandleService { - @Autowired + @Resource private ICultivateDetailService iCultivateDetailService; @Override @@ -102,7 +106,7 @@ public class PostHandleServiceImpl extends BaseServiceImpl postHandleImports) { + //检查导入的集合postHandleImports,不允许用户code重复 + Set importedCodes = new HashSet<>(); + Set duplicateCodes = postHandleImports.stream() + .map(PostHandleImport::getCode) // 假设PostHandleImport有getCode方法 + .filter(code -> !importedCodes.add(code)) // 如果add失败,说明已存在,即重复 + .collect(Collectors.toSet()); + + if (!duplicateCodes.isEmpty()) { + // 存在重复的用户code,返回错误信息。假设R是统一的返回结果类 + return R.fail("导入数据中存在重复的工号:" + duplicateCodes); + } + List list = postHandleImports.stream().map(this::convertSingle).collect(Collectors.toList()); + //获取全部用户id,对比PostHandleEntity已有数据,不允许重复添加 + List ids = list.stream().map(PostHandleEntity::getUserId) + .collect(Collectors.toList()); + Long existCount = this.lambdaQuery() + .in(PostHandleEntity::getUserId, ids) + .eq(PostHandleEntity::getIsDeleted, 0) + .count(); + if (existCount > 0) { + return R.fail("用户已存在岗位处理记录,不允许重复添加"); + } + boolean saved = this.saveBatch(list); + if (!saved) { + return R.fail("操作失败"); + } + try { + createPlan(list); // 确保此方法中的异常能传播出来 + } catch (Exception e) { + // 由于配置了 rollbackFor = Exception.class,异常抛出后事务将回滚 + throw new RuntimeException("创建培训计划失败,数据已回滚", e); + } + return R.status(saved); + } + + /** + * 转换单个对象 + */ + private PostHandleEntity convertSingle(PostHandleImport excel) { + PostHandleEntity entity = new PostHandleEntity(); + // 核心:属性拷贝,两个类的字段名和类型必须一致 + BeanUtils.copyProperties(excel, entity); + // 对于字段名不完全一致或有特殊处理的字段,可以在此手动设置 + //用工类型 + entity.setStaffType(StaffTypeEnum.of(excel.getStaffTypeName()).getCode().shortValue()); + //用户及部门 + UserInfo userByCode = UserCache.getUserByCode(excel.getCode()); + if (userByCode == null || userByCode.getUser() == null) { + //报错并提示 + throw new IllegalArgumentException("工号 '" + excel.getCode() + "' 在系统中不存在,请检查数据准确性"); + } + entity.setUserId(userByCode.getUser().getId()); + entity.setName(userByCode.getUser().getRealName()); + entity.setDeptId(Long.valueOf(userByCode.getUser().getDeptId())); + //技能等级 + entity.setSkill(SkillEnum.of(excel.getSkillName()).getCode().shortValue()); + //婚姻状态 + entity.setMarriage(MarriageEnum.of(excel.getMarriageName()).getCode().toString()); + // 如果是正式工状态为正常 + if (entity.getStaffType() == StaffTypeEnum.FORMAL.getCode().shortValue()) { + entity.setPhStatus(PostHandleStatusEnum.NORMALITY.getCode().shortValue()); + } else { + entity.setPhStatus(PostHandleStatusEnum.IN_PRACTICE.getCode().shortValue()); + } + return entity; + } /** * 实习工自动创建一条培训计划 * - * @param postHandleEntity + * @param postHandleEntitys */ - public void createPlan(PostHandleEntity postHandleEntity) { - if (postHandleEntity.getStaffType() == StaffTypeEnum.of("实习工").getCode().shortValue()) { - CultivateDetailEntity cultivateDetailEntity = new CultivateDetailEntity(); - cultivateDetailEntity.setPhId(postHandleEntity.getId()); - cultivateDetailEntity.setType((short) 1); - cultivateDetailEntity.setCaStatus(TrainingStatusEnum.of("未配置").getCode().shortValue()); - iCultivateDetailService.save(cultivateDetailEntity); - } + public void createPlan(List postHandleEntitys) { + //新增实习工时,为其创建一条培训计划 + List cultivateDetailEntities = postHandleEntitys.stream() + .filter(entity -> entity.getStaffType() == StaffTypeEnum.FIELD_WORK.getCode().shortValue()) + .map(fieldWork -> { + CultivateDetailEntity detailEntity = new CultivateDetailEntity(); + detailEntity.setPhId(fieldWork.getId()); + detailEntity.setType((short) 1); + detailEntity.setCaStatus(TrainingStatusEnum.NOT_CONFIGURED.getCode().shortValue()); + return detailEntity; + }) + .collect(Collectors.toList()); + + iCultivateDetailService.saveBatch(cultivateDetailEntities); } } diff --git a/blade-service/blade-desk/src/main/resources/Excel/jobTransfer/岗位处理导入模板下载.xls b/blade-service/blade-desk/src/main/resources/Excel/jobTransfer/岗位处理导入模板下载.xls new file mode 100644 index 00000000..125619c0 Binary files /dev/null and b/blade-service/blade-desk/src/main/resources/Excel/jobTransfer/岗位处理导入模板下载.xls differ