Commit c274f9f9 authored by 刘斌's avatar 刘斌

feat: 增加编制计划初版

parent 48e0d69f
......@@ -13,36 +13,7 @@ public class ResumeTemplateStyleHandler implements CellWriteHandler, Order {
public void afterCellDispose(CellWriteHandlerContext context) {
// 1. 获取当前单元格和它对应的“第一个单元格数据”(通常承载了模板的原始样式)
Cell cell = context.getCell();
WriteCellData cellData = context.getFirstCellData();
// 2. 如果模板单元格有样式,则将其应用到当前单元格
if (cellData != null) {
WriteCellStyle writeCellStyle = cellData.getWriteCellStyle();
if (writeCellStyle != null) {
// 使用EasyExcel的工具类安全地转换并设置样式
// CellStyle style = StyleUtil.buildCellStyle(
// context.getWriteWorkbookHolder().getWorkbook(),
// writeCellStyle,
// originalStyle
// );
Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
// String content = cell.getStringCellValue();
// XSSFRichTextString text = new XSSFRichTextString(content);
// cell.setCellValue(text);
Font font = workbook.createFont();
font.setFontName("微软雅黑");
font.setFontHeightInPoints((short) 10);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
}
}
// 3. 关键:设置order值大于50000,确保本处理器在默认的FillStyleCellWriteHandler之后执行
......
package com.anplus.hr.config;
import cn.idev.excel.write.handler.RowWriteHandler;
import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
import cn.idev.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @author 刘斌
* 2025/12/15 19:25
*/
public class StaffingPlanExportHandler implements RowWriteHandler {
// 定义合计行的标识
private static final String DEPARTMENT_TOTAL = "部门合计";
private static final String AREA_TOTAL = "片区合计";
// 定义背景色(浅灰色)
private static final IndexedColors BACKGROUND_COLOR = IndexedColors.GREY_25_PERCENT;
// 缓存样式,避免重复创建
private final Map<String, CellStyle> styleCache = new HashMap<>();
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
Row row, Integer relativeRowIndex, Boolean isHead) {
Sheet sheet = writeSheetHolder.getSheet();
Workbook workbook = sheet.getWorkbook();
// 遍历行,找到合计行
// for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
// int rowNum = row.getRowNum();
//
// 获取板块列的值(假设是第一列,索引0)
Cell plateCell = row.getCell(0);
if (plateCell == null) {
return;
}
// 获取单元格值,处理可能为null的情况
String cellValue;
if (Objects.requireNonNull(plateCell.getCellType()) == CellType.STRING) {
cellValue = plateCell.getStringCellValue();
} else {
return;
}
if (DEPARTMENT_TOTAL.equals(cellValue) || AREA_TOTAL.equals(cellValue)) {
int rowNum = row.getRowNum();
// 合并前四列(0-3列)
CellRangeAddress region = new CellRangeAddress(rowNum, rowNum, 0, 3);
sheet.addMergedRegion(region);
// 获取或创建样式
CellStyle style = getOrCreateStyle(workbook, cellValue);
if (DEPARTMENT_TOTAL.equals(cellValue)) {
style.setFillForegroundColor(IndexedColors.ROSE.getIndex());
} else {
style.setFillForegroundColor(IndexedColors.RED.getIndex());
}
// 为合并后的单元格设置样式
for (int col = 0; col <= 3; col++) {
Cell cell = row.getCell(col);
if (cell == null) {
cell = row.createCell(col);
}
cell.setCellStyle(style);
}
// // 如果需要,清空第5列(岗位名称)的内容
// Cell positionCell = row.getCell(4);
// if (positionCell != null) {
// positionCell.setCellValue("");
// positionCell.setCellStyle(style);
// }
}
// }
}
/**
* 获取或创建单元格样式
*/
private CellStyle getOrCreateStyle(Workbook workbook, String cellValue) {
return styleCache.computeIfAbsent(cellValue, cv -> {
CellStyle style = workbook.createCellStyle();
// 设置背景色
style.setFillForegroundColor(BACKGROUND_COLOR.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 设置对齐方式
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置边框
style.setBorderTop(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
return style;
});
}
}
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.config.StaffingPlanExportHandler;
import com.anplus.hr.domain.params.StaffingPlanDataListParam;
import com.anplus.hr.domain.params.StaffingPlanDataParam;
import com.anplus.hr.domain.vo.StaffingPlanDataImportVo;
import com.anplus.hr.domain.vo.StaffingPlanDataVo;
import com.anplus.hr.domain.vo.StaffingPlanExportVo;
import com.anplus.hr.service.StaffingPlanDataServ;
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.log.annotation.PinSysLog;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
* 编制规划记录明细
*
* @author LiuBin
* @date 2025-12-14
*/
@Validated
@RestController
@RequestMapping("/employee/staffingPlanData")
public class StaffingPlanDataCtrl {
@Resource
private StaffingPlanDataServ staffingPlanDataServ;
/**
* 查询编制规划记录明细列表
*/
@SaCheckPermission("employee:staffingPlanData:list")
@GetMapping("/page")
public PageResponse<StaffingPlanDataVo> pageList(StaffingPlanDataListParam param) {
return staffingPlanDataServ.queryPageList(param);
}
/**
* 导出编制规划记录明细列表
*/
@ExcelExport(template = "编制导出模板.xlsx", fill = true, fillObjectFields = {"dataList"}, writeHandler =
{StaffingPlanExportHandler.class})
@SaCheckPermission("employee:staffingPlanData:export")
@PinSysLog(value = "编制规划记录明细", businessType = BusinessType.EXPORT)
@PostMapping("/export/{recordId}")
public List<StaffingPlanExportVo> export(@PathVariable Long recordId) {
return staffingPlanDataServ.exportList(recordId);
}
/**
* 导入兼职员工信息列表
*/
// @NoRepeatSubmit(interval = 60_000)
@PinSysLog(value = "兼职员工-导入", businessType = BusinessType.IMPORT)
@SaCheckPermission("employee:partTimeInfo:import")
@PostMapping(value = "/import/{recordId}")
public Response importEmployees(@ExcelStream(headRowNumber = 2) Stream<StaffingPlanDataImportVo> stream, @PathVariable @Min(1) Long recordId) {
return staffingPlanDataServ.importStaffingPlanDataList(recordId, stream);
}
/**
* 获取导入模板
*/
@ExcelExport(template = "编制模板.xlsx", fill = true)
@PostMapping("/importTemplate")
public List<StaffingPlanDataVo> importTemplate() {
return new ArrayList<>();
}
/**
* 获取编制规划记录明细详细信息
*
* @param id 主键
*/
@SaCheckPermission("employee:staffingPlanData:query")
@GetMapping("/{id}")
public SingleResponse<StaffingPlanDataVo> getDetail(@PathVariable @Min(1)
Long id) {
return SingleResponse.of(staffingPlanDataServ.queryById(id));
}
/**
* 新增编制规划记录明细
*/
@SaCheckPermission("employee:staffingPlanData:add")
@PinSysLog(value = "编制规划记录明细", businessType = BusinessType.INSERT)
@PostMapping()
public Response add(@Validated(AddGroup.class) @RequestBody StaffingPlanDataParam param) {
return ResponseUtils.ofResult(staffingPlanDataServ.insertByParam(param));
}
/**
* 修改编制规划记录明细
*/
@SaCheckPermission("employee:staffingPlanData:edit")
@PinSysLog(value = "编制规划记录明细", businessType = BusinessType.UPDATE)
@PutMapping()
public Response edit(@Validated(EditGroup.class) @RequestBody List<StaffingPlanDataParam> param) {
return ResponseUtils.ofResult(staffingPlanDataServ.updateByParam(param));
}
/**
* 删除编制规划记录明细
*
* @param ids 主键串
*/
@SaCheckPermission("employee:staffingPlanData:remove")
@PinSysLog(value = "编制规划记录明细", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public Response remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return ResponseUtils.ofResult(staffingPlanDataServ.delByIds(List.of(ids)));
}
}
\ No newline at end of file
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.StaffingPlanRecordsListParam;
import com.anplus.hr.domain.params.StaffingPlanRecordsParam;
import com.anplus.hr.domain.vo.StaffingPlanRecordsVo;
import com.anplus.hr.service.StaffingPlanRecordsServ;
/**
* 编制规划记录
*
* @author LiuBin
* @date 2025-12-14
*/
@Validated
@RestController
@RequestMapping("/employee/staffingPlanRecords")
public class StaffingPlanRecordsCtrl {
@Resource
private StaffingPlanRecordsServ staffingPlanRecordsServ;
/**
* 查询编制规划记录列表
*/
@SaCheckPermission("employee:staffingPlanRecords:list")
@GetMapping("/page")
public PageResponse<StaffingPlanRecordsVo> pageList(StaffingPlanRecordsListParam param) {
return staffingPlanRecordsServ.queryPageList(param);
}
/**
* 导出编制规划记录列表
*/
@ExcelExport
@SaCheckPermission("employee:staffingPlanRecords:export")
@PinSysLog(value = "编制规划记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public List<StaffingPlanRecordsVo> export(StaffingPlanRecordsListParam param) {
return staffingPlanRecordsServ.queryList(param);
}
/**
* 获取编制规划记录详细信息
*
* @param id 主键
*/
@SaCheckPermission("employee:staffingPlanRecords:query")
@GetMapping("/{id}")
public SingleResponse<StaffingPlanRecordsVo> getDetail(@PathVariable @Min(1)
Long id) {
return SingleResponse.of(staffingPlanRecordsServ.queryById(id));
}
/**
* 新增编制规划记录
*/
@SaCheckPermission("employee:staffingPlanRecords:add")
@PinSysLog(value = "编制规划记录", businessType = BusinessType.INSERT)
@PostMapping()
public Response add(@Validated(AddGroup.class) @RequestBody StaffingPlanRecordsParam param) {
return ResponseUtils.ofResult(staffingPlanRecordsServ.insertByParam(param));
}
/**
* 修改编制规划记录
*/
@SaCheckPermission("employee:staffingPlanRecords:edit")
@PinSysLog(value = "编制规划记录", businessType = BusinessType.UPDATE)
@PutMapping()
public Response edit(@Validated(EditGroup.class) @RequestBody StaffingPlanRecordsParam param) {
return ResponseUtils.ofResult(staffingPlanRecordsServ.updateByParam(param));
}
/**
* 删除编制规划记录
*
* @param ids 主键串
*/
@SaCheckPermission("employee:staffingPlanRecords:remove")
@PinSysLog(value = "编制规划记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public Response remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return ResponseUtils.ofResult(staffingPlanRecordsServ.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.io.Serial;
/**
* 编制规划记录明细对象 staffing_plan_data
*
* @author LiuBin
* @date 2025-12-14
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@TableName("staffing_plan_data")
public class StaffingPlanData extends TenantModel {
@Serial
private static final long serialVersionUID = 1L;
/**
* 编制记录ID
*/
private Long recordId;
/**
* 板块
*/
private String plate;
/**
* 一级部门
*/
private String firstLevelDepartment;
/**
* 二级部门
*/
private String secondLevelDepartment;
/**
* 三级部门
*/
private String thirdLevelDepartment;
/**
* 部门ID
*/
private Long deptId;
/**
* 一级部门ID
*/
private Long lv1DeptId;
/**
* 主岗位
*/
private String position;
/**
* 上一年编制
*/
private Integer lastYearStaffing;
/**
* 今年编制
*/
private Integer thisYearStaffing;
/**
* 下一年编制
*/
private Integer nextYearStaffing;
/**
* 1月正式工计划
*/
private Integer m1FormalPlan;
/**
* 1月正式工实际
*/
private String m1FormalActual;
/**
* 1月兼职计划
*/
private Integer m1PartPlan;
/**
* 1月兼职实际
*/
private String m1PartActual;
/**
* 2月正式工计划
*/
private Integer m2FormalPlan;
/**
* 2月正式工实际
*/
private String m2FormalActual;
/**
* 2月兼职计划
*/
private Integer m2PartPlan;
/**
* 2月兼职实际
*/
private String m2PartActual;
/**
* 3月正式工计划
*/
private Integer m3FormalPlan;
/**
* 3月正式工实际
*/
private String m3FormalActual;
/**
* 3月兼职计划
*/
private Integer m3PartPlan;
/**
* 3月兼职实际
*/
private String m3PartActual;
/**
* 4月正式工计划
*/
private Integer m4FormalPlan;
/**
* 4月正式工实际
*/
private String m4FormalActual;
/**
* 4月兼职计划
*/
private Integer m4PartPlan;
/**
* 4月兼职实际
*/
private String m4PartActual;
/**
* 5月正式工计划
*/
private Integer m5FormalPlan;
/**
* 5月正式工实际
*/
private String m5FormalActual;
/**
* 5月兼职计划
*/
private Integer m5PartPlan;
/**
* 5月兼职实际
*/
private String m5PartActual;
/**
* 6月正式工计划
*/
private Integer m6FormalPlan;
/**
* 6月正式工实际
*/
private String m6FormalActual;
/**
* 6月兼职计划
*/
private Integer m6PartPlan;
/**
* 6月兼职实际
*/
private String m6PartActual;
/**
* 7月正式工计划
*/
private Integer m7FormalPlan;
/**
* 7月正式工实际
*/
private String m7FormalActual;
/**
* 7月兼职计划
*/
private Integer m7PartPlan;
/**
* 7月兼职实际
*/
private String m7PartActual;
/**
* 8月正式工计划
*/
private Integer m8FormalPlan;
/**
* 8月正式工实际
*/
private String m8FormalActual;
/**
* 8月兼职计划
*/
private Integer m8PartPlan;
/**
* 8月兼职实际
*/
private String m8PartActual;
/**
* 9月正式工计划
*/
private Integer m9FormalPlan;
/**
* 9月正式工实际
*/
private String m9FormalActual;
/**
* 9月兼职计划
*/
private Integer m9PartPlan;
/**
* 9月兼职实际
*/
private String m9PartActual;
/**
* 10月正式工计划
*/
private Integer m10FormalPlan;
/**
* 10月正式工实际
*/
private String m10FormalActual;
/**
* 10月兼职计划
*/
private Integer m10PartPlan;
/**
* 10月兼职实际
*/
private String m10PartActual;
/**
* 11月正式工计划
*/
private Integer m11FormalPlan;
/**
* 11月正式工实际
*/
private String m11FormalActual;
/**
* 11月兼职计划
*/
private Integer m11PartPlan;
/**
* 11月兼职实际
*/
private String m11PartActual;
/**
* 12月正式工计划
*/
private Integer m12FormalPlan;
/**
* 12月正式工实际
*/
private String m12FormalActual;
/**
* 12月兼职计划
*/
private Integer m12PartPlan;
/**
* 12月兼职实际
*/
private String m12PartActual;
/**
* 合计行
*/
private String summary;
/**
* 备注
*/
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.io.Serial;
/**
* 编制规划记录对象 staffing_plan_records
*
* @author LiuBin
* @date 2025-12-14
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@TableName("staffing_plan_records")
public class StaffingPlanRecords extends TenantModel {
@Serial
private static final long serialVersionUID = 1L;
/**
* 记录时间
*/
private String recordDate;
/**
* 上一年标题
*/
private String lastYearTitle;
/**
* 今年标题
*/
private String currentYearTitle;
/**
* 明年标题
*/
private String nextYearTitle;
/**
* 是否已初始化
*/
private String initFlag;
/**
* 备注
*/
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;
/**
* 编制规划记录明细分页对象 staffing_plan_data
*
* @author LiuBin
* @date 2025-12-14
*/
@Getter
@Setter
public class StaffingPlanDataListParam extends PageQueryParam {
/**
* 编制记录ID
*/
private Long recordId;
/**
* 板块
*/
private String plate;
/**
* 一级部门
*/
private String firstLevelDepartment;
/**
* 二级部门
*/
private String secondLevelDepartment;
/**
* 三级部门
*/
private String thirdLevelDepartment;
/**
* 部门ID
*/
private Long deptId;
/**
* 主岗位
*/
private String position;
/**
* 上一年编制
*/
private Integer lastYearStaffing;
/**
* 今年编制
*/
private Integer thisYearStaffing;
/**
* 下一年编制
*/
private Integer nextYearStaffing;
/**
* 1月正式工计划
*/
private Integer m1FormalPlan;
/**
* 1月正式工实际
*/
private String m1FormalActual;
/**
* 1月兼职计划
*/
private Integer m1PartPlan;
/**
* 1月兼职实际
*/
private String m1PartActual;
/**
* 2月正式工计划
*/
private Integer m2FormalPlan;
/**
* 2月正式工实际
*/
private String m2FormalActual;
/**
* 2月兼职计划
*/
private Integer m2PartPlan;
/**
* 2月兼职实际
*/
private String m2PartActual;
/**
* 3月正式工计划
*/
private Integer m3FormalPlan;
/**
* 3月正式工实际
*/
private String m3FormalActual;
/**
* 3月兼职计划
*/
private Integer m3PartPlan;
/**
* 3月兼职实际
*/
private String m3PartActual;
/**
* 4月正式工计划
*/
private Integer m4FormalPlan;
/**
* 4月正式工实际
*/
private String m4FormalActual;
/**
* 4月兼职计划
*/
private Integer m4PartPlan;
/**
* 4月兼职实际
*/
private String m4PartActual;
/**
* 5月正式工计划
*/
private Integer m5FormalPlan;
/**
* 5月正式工实际
*/
private String m5FormalActual;
/**
* 5月兼职计划
*/
private Integer m5PartPlan;
/**
* 5月兼职实际
*/
private String m5PartActual;
/**
* 6月正式工计划
*/
private Integer m6FormalPlan;
/**
* 6月正式工实际
*/
private String m6FormalActual;
/**
* 6月兼职计划
*/
private Integer m6PartPlan;
/**
* 6月兼职实际
*/
private String m6PartActual;
/**
* 7月正式工计划
*/
private Integer m7FormalPlan;
/**
* 7月正式工实际
*/
private String m7FormalActual;
/**
* 7月兼职计划
*/
private Integer m7PartPlan;
/**
* 7月兼职实际
*/
private String m7PartActual;
/**
* 8月正式工计划
*/
private Integer m8FormalPlan;
/**
* 8月正式工实际
*/
private String m8FormalActual;
/**
* 8月兼职计划
*/
private Integer m8PartPlan;
/**
* 8月兼职实际
*/
private String m8PartActual;
/**
* 9月正式工计划
*/
private Integer m9FormalPlan;
/**
* 9月正式工实际
*/
private String m9FormalActual;
/**
* 9月兼职计划
*/
private Integer m9PartPlan;
/**
* 9月兼职实际
*/
private String m9PartActual;
/**
* 10月正式工计划
*/
private Integer m10FormalPlan;
/**
* 10月正式工实际
*/
private String m10FormalActual;
/**
* 10月兼职计划
*/
private Integer m10PartPlan;
/**
* 10月兼职实际
*/
private String m10PartActual;
/**
* 11月正式工计划
*/
private Integer m11FormalPlan;
/**
* 11月正式工实际
*/
private String m11FormalActual;
/**
* 11月兼职计划
*/
private Integer m11PartPlan;
/**
* 11月兼职实际
*/
private String m11PartActual;
/**
* 12月正式工计划
*/
private Integer m12FormalPlan;
/**
* 12月正式工实际
*/
private String m12FormalActual;
/**
* 12月兼职计划
*/
private Integer m12PartPlan;
/**
* 12月兼职实际
*/
private String m12PartActual;
/**
* 合计行
*/
private String summary;
private Map<String, Object> params = new HashMap<>();
}
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;
/**
* 编制规划记录分页对象 staffing_plan_records
*
* @author LiuBin
* @date 2025-12-14
*/
@Getter
@Setter
public class StaffingPlanRecordsListParam extends PageQueryParam {
/**
* 记录时间
*/
private String recordDate;
/**
* 上一年标题
*/
private String lastYearTitle;
/**
* 今年标题
*/
private String currentYearTitle;
/**
* 明年标题
*/
private String nextYearTitle;
/**
* 是否已初始化
*/
private String initFlag;
private Map<String, Object> params = new HashMap<>();
}
package com.anplus.hr.domain.params;
import com.anplus.hr.domain.StaffingPlanRecords;
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.*;
/**
* 编制规划记录业务对象 staffing_plan_records
*
* @author LiuBin
* @date 2025-12-14
*/
@Data
@AutoMapper(target = StaffingPlanRecords.class, reverseConvertGenerate = false)
public class StaffingPlanRecordsParam {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 记录时间
*/
@NotBlank(message = "记录时间不能为空", groups = { AddGroup.class, EditGroup.class })
private String recordDate;
/**
* 上一年标题
*/
// @NotBlank(message = "上一年标题不能为空", groups = { AddGroup.class, EditGroup.class })
private String lastYearTitle;
/**
* 今年标题
*/
// @NotBlank(message = "今年标题不能为空", groups = { AddGroup.class, EditGroup.class })
private String currentYearTitle;
/**
* 明年标题
*/
// @NotBlank(message = "明年标题不能为空", groups = { AddGroup.class, EditGroup.class })
private String nextYearTitle;
/**
* 是否已初始化
*/
// @NotBlank(message = "是否已初始化不能为空", groups = { AddGroup.class, EditGroup.class })
private String initFlag;
/**
* 备注
*/
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}
package com.anplus.hr.domain.vo;
import lombok.Data;
/**
* @author 刘斌
* @date 2025/12/15 11:35
*/
@Data
public class EmployeeDeptImportVo {
/**
* 板块
*/
private String plate;
/**
* 一级部门
*/
private String firstLevelDepartment;
/**
* 二级部门
*/
private String secondLevelDepartment;
/**
* 三级部门
*/
private String thirdLevelDepartment;
/**
* 兼岗板块
*/
private String concurrentPlate;
/**
* 兼岗一级部门
*/
private String concurrentFirstDept;
/**
* 兼岗二级部门
*/
private String concurrentSecondDept;
/**
* 兼岗三级部门
*/
private String concurrentThirdDept;
}
......@@ -26,6 +26,7 @@ import java.time.LocalDate;
@Getter
@AutoMappers({
@AutoMapper(target = EmployeeInfo.class, reverseConvertGenerate = false),
@AutoMapper(target = EmployeeDeptImportVo.class, reverseConvertGenerate = false)
})
public class EmployeeInfoImportVo extends ExcelBaseEntity implements Serializable {
@Serial
......
......@@ -20,6 +20,7 @@ import java.time.LocalDate;
@Getter
@AutoMappers({
@AutoMapper(target = EmployeeInfo.class, reverseConvertGenerate = false),
@AutoMapper(target = EmployeeDeptImportVo.class, reverseConvertGenerate = false)
})
public class EmployeeInfoResignImportVo extends EmployeeInfoImportVo {
@Serial
......
......@@ -3,7 +3,6 @@ package com.anplus.hr.domain.vo;
import cn.idev.excel.annotation.ExcelProperty;
import com.anplus.hr.constant.HrConstant;
import com.anplus.hr.domain.EmployeeInfo;
import com.anplus.hr.domain.params.EmployeePartTimeInfoParam;
import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMappers;
import jakarta.validation.constraints.NotBlank;
......@@ -25,7 +24,7 @@ import java.time.LocalDate;
@Getter
@AutoMappers({
@AutoMapper(target = EmployeeInfo.class, reverseConvertGenerate = false),
@AutoMapper(target = EmployeeInfoImportVo.class, reverseConvertGenerate = false)
@AutoMapper(target = EmployeeDeptImportVo.class, reverseConvertGenerate = false)
})
public class EmployeePartTimeInfoImportVo extends ExcelBaseEntity implements Serializable {
@Serial
......
package com.anplus.hr.domain.vo;
import com.anplus.hr.domain.StaffingPlanData;
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;
/**
* 编制规划记录明细视图对象 staffing_plan_data
*
* @author LiuBin
* @date 2025-12-14
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = StaffingPlanData.class)
public class StaffingPlanDataVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 板块
*/
@ExcelProperty(value = "板块")
private String plate;
/**
* 一级部门
*/
@ExcelProperty(value = "一级部门")
private String firstLevelDepartment;
/**
* 二级部门
*/
@ExcelProperty(value = "二级部门")
private String secondLevelDepartment;
/**
* 三级部门
*/
@ExcelProperty(value = "三级部门")
private String thirdLevelDepartment;
/**
* 部门ID
*/
// @ExcelProperty(value = "部门ID")
private Long deptId;
/**
* 主岗位
*/
@ExcelProperty(value = "主岗位")
private String position;
/**
* 上一年编制
*/
@ExcelProperty(value = "上一年编制")
private Integer lastYearStaffing;
/**
* 今年编制
*/
@ExcelProperty(value = "今年编制")
private Integer thisYearStaffing;
/**
* 下一年编制
*/
@ExcelProperty(value = "下一年编制")
private Integer nextYearStaffing;
/**
* 1月正式工计划
*/
@ExcelProperty(value = "1月正式工计划")
private Integer m1FormalPlan;
/**
* 1月正式工实际
*/
@ExcelProperty(value = "1月正式工实际")
private String m1FormalActual;
/**
* 1月兼职计划
*/
@ExcelProperty(value = "1月兼职计划")
private Integer m1PartPlan;
/**
* 1月兼职实际
*/
@ExcelProperty(value = "1月兼职实际")
private String m1PartActual;
/**
* 2月正式工计划
*/
@ExcelProperty(value = "2月正式工计划")
private Integer m2FormalPlan;
/**
* 2月正式工实际
*/
@ExcelProperty(value = "2月正式工实际")
private String m2FormalActual;
/**
* 2月兼职计划
*/
@ExcelProperty(value = "2月兼职计划")
private Integer m2PartPlan;
/**
* 2月兼职实际
*/
@ExcelProperty(value = "2月兼职实际")
private String m2PartActual;
/**
* 3月正式工计划
*/
@ExcelProperty(value = "3月正式工计划")
private Integer m3FormalPlan;
/**
* 3月正式工实际
*/
@ExcelProperty(value = "3月正式工实际")
private String m3FormalActual;
/**
* 3月兼职计划
*/
@ExcelProperty(value = "3月兼职计划")
private Integer m3PartPlan;
/**
* 3月兼职实际
*/
@ExcelProperty(value = "3月兼职实际")
private String m3PartActual;
/**
* 4月正式工计划
*/
@ExcelProperty(value = "4月正式工计划")
private Integer m4FormalPlan;
/**
* 4月正式工实际
*/
@ExcelProperty(value = "4月正式工实际")
private String m4FormalActual;
/**
* 4月兼职计划
*/
@ExcelProperty(value = "4月兼职计划")
private Integer m4PartPlan;
/**
* 4月兼职实际
*/
@ExcelProperty(value = "4月兼职实际")
private String m4PartActual;
/**
* 5月正式工计划
*/
@ExcelProperty(value = "5月正式工计划")
private Integer m5FormalPlan;
/**
* 5月正式工实际
*/
@ExcelProperty(value = "5月正式工实际")
private String m5FormalActual;
/**
* 5月兼职计划
*/
@ExcelProperty(value = "5月兼职计划")
private Integer m5PartPlan;
/**
* 5月兼职实际
*/
@ExcelProperty(value = "5月兼职实际")
private String m5PartActual;
/**
* 6月正式工计划
*/
@ExcelProperty(value = "6月正式工计划")
private Integer m6FormalPlan;
/**
* 6月正式工实际
*/
@ExcelProperty(value = "6月正式工实际")
private String m6FormalActual;
/**
* 6月兼职计划
*/
@ExcelProperty(value = "6月兼职计划")
private Integer m6PartPlan;
/**
* 6月兼职实际
*/
@ExcelProperty(value = "6月兼职实际")
private String m6PartActual;
/**
* 7月正式工计划
*/
@ExcelProperty(value = "7月正式工计划")
private Integer m7FormalPlan;
/**
* 7月正式工实际
*/
@ExcelProperty(value = "7月正式工实际")
private String m7FormalActual;
/**
* 7月兼职计划
*/
@ExcelProperty(value = "7月兼职计划")
private Integer m7PartPlan;
/**
* 7月兼职实际
*/
@ExcelProperty(value = "7月兼职实际")
private String m7PartActual;
/**
* 8月正式工计划
*/
@ExcelProperty(value = "8月正式工计划")
private Integer m8FormalPlan;
/**
* 8月正式工实际
*/
@ExcelProperty(value = "8月正式工实际")
private String m8FormalActual;
/**
* 8月兼职计划
*/
@ExcelProperty(value = "8月兼职计划")
private Integer m8PartPlan;
/**
* 8月兼职实际
*/
@ExcelProperty(value = "8月兼职实际")
private String m8PartActual;
/**
* 9月正式工计划
*/
@ExcelProperty(value = "9月正式工计划")
private Integer m9FormalPlan;
/**
* 9月正式工实际
*/
@ExcelProperty(value = "9月正式工实际")
private String m9FormalActual;
/**
* 9月兼职计划
*/
@ExcelProperty(value = "9月兼职计划")
private Integer m9PartPlan;
/**
* 9月兼职实际
*/
@ExcelProperty(value = "9月兼职实际")
private String m9PartActual;
/**
* 10月正式工计划
*/
@ExcelProperty(value = "10月正式工计划")
private Integer m10FormalPlan;
/**
* 10月正式工实际
*/
@ExcelProperty(value = "10月正式工实际")
private String m10FormalActual;
/**
* 10月兼职计划
*/
@ExcelProperty(value = "10月兼职计划")
private Integer m10PartPlan;
/**
* 10月兼职实际
*/
@ExcelProperty(value = "10月兼职实际")
private String m10PartActual;
/**
* 11月正式工计划
*/
@ExcelProperty(value = "11月正式工计划")
private Integer m11FormalPlan;
/**
* 11月正式工实际
*/
@ExcelProperty(value = "11月正式工实际")
private String m11FormalActual;
/**
* 11月兼职计划
*/
@ExcelProperty(value = "11月兼职计划")
private Integer m11PartPlan;
/**
* 11月兼职实际
*/
@ExcelProperty(value = "11月兼职实际")
private String m11PartActual;
/**
* 12月正式工计划
*/
@ExcelProperty(value = "12月正式工计划")
private Integer m12FormalPlan;
/**
* 12月正式工实际
*/
@ExcelProperty(value = "12月正式工实际")
private String m12FormalActual;
/**
* 12月兼职计划
*/
@ExcelProperty(value = "12月兼职计划")
private Integer m12PartPlan;
/**
* 12月兼职实际
*/
@ExcelProperty(value = "12月兼职实际")
private String m12PartActual;
/**
* 合计行
*/
@ExcelProperty(value = "合计行")
private String summary;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package com.anplus.hr.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.anplus.hr.domain.StaffingPlanRecords;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.util.List;
/**
* @author 刘斌
* @date 2025/12/15 19:54
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = StaffingPlanRecords.class, convertGenerate = false)
public class StaffingPlanExportVo {
/**
* 上一年标题
*/
@ExcelProperty(value = "上一年标题")
private String lastYearTitle;
/**
* 今年标题
*/
@ExcelProperty(value = "今年标题")
private String currentYearTitle;
/**
* 明年标题
*/
@ExcelProperty(value = "明年标题")
private String nextYearTitle;
/**
* 编制明细
*/
@ExcelProperty(value = "编制明细")
private List<StaffingPlanDataVo> dataList;
}
package com.anplus.hr.domain.vo;
import com.anplus.hr.domain.StaffingPlanRecords;
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;
/**
* 编制规划记录视图对象 staffing_plan_records
*
* @author LiuBin
* @date 2025-12-14
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = StaffingPlanRecords.class)
public class StaffingPlanRecordsVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 记录时间
*/
@ExcelProperty(value = "记录时间")
private String recordDate;
/**
* 上一年标题
*/
@ExcelProperty(value = "上一年标题")
private String lastYearTitle;
/**
* 今年标题
*/
@ExcelProperty(value = "今年标题")
private String currentYearTitle;
/**
* 明年标题
*/
@ExcelProperty(value = "明年标题")
private String nextYearTitle;
/**
* 是否已初始化
*/
@ExcelProperty(value = "是否已初始化")
private String initFlag;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package com.anplus.hr.mapper;
import com.anplus.hr.domain.StaffingPlanData;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 编制规划记录明细Mapper接口
*
* @author LiuBin
* @date 2025-12-14
*/
@Mapper
public interface StaffingPlanDataMapper extends BinBaseMapper<StaffingPlanData> {
}
package com.anplus.hr.mapper;
import com.anplus.hr.domain.StaffingPlanRecords;
import top.binfast.common.mybatis.mapper.BinBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 编制规划记录Mapper接口
*
* @author LiuBin
* @date 2025-12-14
*/
@Mapper
public interface StaffingPlanRecordsMapper extends BinBaseMapper<StaffingPlanRecords> {
}
......@@ -180,46 +180,6 @@ public interface EmployeeInfoServ extends IService<EmployeeInfo> {
*/
SysOssVo upload(MultipartFile file);
/**
* 构建部门名称字符串
*
* @param importVo 导入数据
* @return 部门名称字符串
*/
default String buildDeptNameStr(EmployeeInfoImportVo importVo) {
StringBuilder builder = new StringBuilder(importVo.getPlate());
if (StrUtil.isNotBlank(importVo.getFirstLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getFirstLevelDepartment());
}
if (StrUtil.isNotBlank(importVo.getSecondLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getSecondLevelDepartment());
}
if (StrUtil.isNotBlank(importVo.getThirdLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getThirdLevelDepartment());
}
return builder.toString();
}
/**
* 构建部门名称字符串
*
* @param importVo 导入数据
* @return 部门名称字符串
*/
default String buildPartDeptNameStr(EmployeeInfoImportVo importVo) {
StringBuilder builder = new StringBuilder(importVo.getConcurrentPlate());
if (StrUtil.isNotBlank(importVo.getConcurrentFirstDept())) {
builder.append(StrUtil.SLASH).append(importVo.getConcurrentFirstDept());
}
if (StrUtil.isNotBlank(importVo.getConcurrentSecondDept())) {
builder.append(StrUtil.SLASH).append(importVo.getConcurrentSecondDept());
}
if (StrUtil.isNotBlank(importVo.getConcurrentThirdDept())) {
builder.append(StrUtil.SLASH).append(importVo.getConcurrentThirdDept());
}
return builder.toString();
}
/**
* 构建员工家庭成员列表
* 按照【关系 姓名 出生年月 工作单位职务 联系方式】格式
......
package com.anplus.hr.service;
import cn.hutool.core.util.StrUtil;
import com.anplus.hr.domain.vo.EmployeeDeptImportVo;
import com.anplus.hr.domain.vo.EmployeeInfoImportVo;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import top.binfast.app.biz.sysapi.bean.params.sysDept.SysDeptParam;
import top.binfast.app.biz.sysapi.bean.vo.sysDept.SysDeptDTO;
......@@ -29,6 +34,11 @@ public interface EmployeeSysDeptServ {
*/
Map<String, Long> selectJoinDeptNames();
/**
* 获取部门名称,拼接成xx/xx/xx/xx或xx/xx
*/
Map<String, Long> selectJoinDeptNamesForStaffingPlan();
/**
* 构建部门查询条件
*
......@@ -36,4 +46,66 @@ public interface EmployeeSysDeptServ {
*/
List<Long> buildQueryWrapper(Long belongDeptId);
/**
* 构建部门名称字符串
*
* @param importVo 导入数据
* @return 部门名称字符串
*/
default String buildDeptNameStr(EmployeeDeptImportVo importVo) {
StringBuilder builder = new StringBuilder(importVo.getPlate());
if (StrUtil.isNotBlank(importVo.getFirstLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getFirstLevelDepartment());
}
if (StrUtil.isNotBlank(importVo.getSecondLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getSecondLevelDepartment());
}
if (StrUtil.isNotBlank(importVo.getThirdLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getThirdLevelDepartment());
}
return builder.toString();
}
/**
* 构建部门名称字符串
*
* @param importVo 导入数据
* @return 部门名称字符串
*/
default Pair<String, String> buildDeptNameStrForStaffingPlan(EmployeeDeptImportVo importVo) {
String lv1DeptName = "";
StringBuilder builder = new StringBuilder(importVo.getPlate());
if (StrUtil.isNotBlank(importVo.getFirstLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getFirstLevelDepartment());
lv1DeptName = builder.toString();
}
if (StrUtil.isNotBlank(importVo.getSecondLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getSecondLevelDepartment());
}
if (StrUtil.isNotBlank(importVo.getThirdLevelDepartment())) {
builder.append(StrUtil.SLASH).append(importVo.getThirdLevelDepartment());
}
return new MutablePair<>(lv1DeptName, builder.toString());
}
/**
* 构建部门名称字符串
*
* @param importVo 导入数据
* @return 部门名称字符串
*/
default String buildPartDeptNameStr(EmployeeDeptImportVo importVo) {
StringBuilder builder = new StringBuilder(importVo.getConcurrentPlate());
if (StrUtil.isNotBlank(importVo.getConcurrentFirstDept())) {
builder.append(StrUtil.SLASH).append(importVo.getConcurrentFirstDept());
}
if (StrUtil.isNotBlank(importVo.getConcurrentSecondDept())) {
builder.append(StrUtil.SLASH).append(importVo.getConcurrentSecondDept());
}
if (StrUtil.isNotBlank(importVo.getConcurrentThirdDept())) {
builder.append(StrUtil.SLASH).append(importVo.getConcurrentThirdDept());
}
return builder.toString();
}
}
package com.anplus.hr.service;
import com.alibaba.cola.dto.Response;
import com.anplus.hr.domain.StaffingPlanData;
import com.anplus.hr.domain.vo.StaffingPlanDataImportVo;
import com.anplus.hr.domain.vo.StaffingPlanDataVo;
import com.anplus.hr.domain.params.StaffingPlanDataListParam;
import com.anplus.hr.domain.params.StaffingPlanDataParam;
import com.alibaba.cola.dto.PageResponse;
import com.anplus.hr.domain.vo.StaffingPlanExportVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.stream.Stream;
/**
* 编制规划记录明细Service接口
*
* @author LiuBin
* @date 2025-12-14
*/
public interface StaffingPlanDataServ extends IService<StaffingPlanData> {
/**
* 分页查询编制规划记录明细列表
*
* @param param 查询条件
* @return 编制规划记录明细分页列表
*/
PageResponse<StaffingPlanDataVo> queryPageList(StaffingPlanDataListParam param);
/**
* 查询符合条件的编制规划记录明细列表
*
* @param param 查询条件
* @return 编制规划记录明细列表
*/
List<StaffingPlanDataVo> queryList(StaffingPlanDataListParam param);
List<StaffingPlanExportVo> exportList(Long recordId);
/**
* 导入编制规划记录明细列表
*
* @param stream 查询条件
* @return 编制规划记录明细列表
*/
Response importStaffingPlanDataList(Long recordId, Stream<StaffingPlanDataImportVo> stream);
/**
* 查询编制规划记录明细
*
* @param id 主键
* @return 编制规划记录明细
*/
StaffingPlanDataVo queryById(Long id);
/**
* 新增编制规划记录明细
*
* @param param 编制规划记录明细
* @return 是否新增成功
*/
Boolean insertByParam(StaffingPlanDataParam param);
/**
* 修改编制规划记录明细
*
* @param param 编制规划记录明细
* @return 是否修改成功
*/
Boolean updateByParam(List<StaffingPlanDataParam> param);
/**
* 校验并批量删除编制规划记录明细信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean delByIds(List<Long> ids);
}
package com.anplus.hr.service;
import com.anplus.hr.domain.StaffingPlanRecords;
import com.anplus.hr.domain.vo.StaffingPlanRecordsVo;
import com.anplus.hr.domain.params.StaffingPlanRecordsListParam;
import com.anplus.hr.domain.params.StaffingPlanRecordsParam;
import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 编制规划记录Service接口
*
* @author LiuBin
* @date 2025-12-14
*/
public interface StaffingPlanRecordsServ extends IService<StaffingPlanRecords> {
/**
* 分页查询编制规划记录列表
*
* @param param 查询条件
* @return 编制规划记录分页列表
*/
PageResponse<StaffingPlanRecordsVo> queryPageList(StaffingPlanRecordsListParam param);
/**
* 查询符合条件的编制规划记录列表
*
* @param param 查询条件
* @return 编制规划记录列表
*/
List<StaffingPlanRecordsVo> queryList(StaffingPlanRecordsListParam param);
/**
* 查询编制规划记录
*
* @param id 主键
* @return 编制规划记录
*/
StaffingPlanRecordsVo queryById(Long id);
/**
* 新增编制规划记录
*
* @param param 编制规划记录
* @return 是否新增成功
*/
Boolean insertByParam(StaffingPlanRecordsParam param);
/**
* 修改编制规划记录
*
* @param param 编制规划记录
* @return 是否修改成功
*/
Boolean updateByParam(StaffingPlanRecordsParam param);
/**
* 校验并批量删除编制规划记录信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean delByIds(List<Long> ids);
}
......@@ -8,6 +8,7 @@ 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.EmployeeDeptImportVo;
import com.anplus.hr.domain.vo.EmployeeInfoResignImportVo;
import com.anplus.hr.domain.vo.EmployeeInfoResignVo;
import com.anplus.hr.domain.vo.EmployeeInfoVo;
......@@ -127,8 +128,9 @@ public class EmployeeInfoResignServImpl extends ServiceImpl<EmployeeInfoMapper,
List<EmployeeInfo> insertList = new ArrayList<>(successList.size());
for (EmployeeInfoResignImportVo importVo : successList) {
SysOss sysOss = employeeInfoServ.handleImageToUrl(excelProcessingResult, importVo);
Long leafDeptId = deptNamesIdMap.get(employeeInfoServ.buildDeptNameStr(importVo));
Long concurrentDeptId = deptNamesIdMap.get(employeeInfoServ.buildPartDeptNameStr(importVo));
EmployeeDeptImportVo deptInfo = MapstructUtils.convert(importVo, EmployeeDeptImportVo.class);
Long leafDeptId = deptNamesIdMap.get(employeeSysDeptServ.buildDeptNameStr(deptInfo));
Long concurrentDeptId = deptNamesIdMap.get(employeeSysDeptServ.buildPartDeptNameStr(deptInfo));
// if (leafDeptId == null) {
// importVo.addError("部门不存在");
// errorList.add(importVo);
......
......@@ -279,13 +279,14 @@ public class EmployeeInfoServImpl extends ServiceImpl<EmployeeInfoMapper, Employ
List<EmployeeInfo> insertList = new ArrayList<>(successList.size());
for (EmployeeInfoImportVo importVo : successList) {
SysOss sysOss = this.handleImageToUrl(excelProcessingResult, importVo);
Long leafDeptId = deptNamesIdMap.get(buildDeptNameStr(importVo));
EmployeeDeptImportVo deptInfo = MapstructUtils.convert(importVo, EmployeeDeptImportVo.class);
Long leafDeptId = deptNamesIdMap.get(employeeSysDeptServ.buildDeptNameStr(deptInfo));
if (leafDeptId == null) {
importVo.addError("部门不存在");
errorList.add(importVo);
continue;
}
Long concurrentDeptId = deptNamesIdMap.get(buildPartDeptNameStr(importVo));
Long concurrentDeptId = deptNamesIdMap.get(employeeSysDeptServ.buildPartDeptNameStr(deptInfo));
List<EmployeeFamilyMembers> buildFamilyMembersList = buildFamilyMembers(importVo.getFamilyMembersInfo());
if (!buildFamilyMembersList.isEmpty()) {
familyMembersList.addAll(buildFamilyMembersList);
......
......@@ -12,10 +12,7 @@ import com.anplus.hr.constant.HrStatusEnum;
import com.anplus.hr.domain.EmployeeInfo;
import com.anplus.hr.domain.params.EmployeePartTimeInfoListParam;
import com.anplus.hr.domain.params.EmployeePartTimeInfoParam;
import com.anplus.hr.domain.vo.EmployeeInfoImportVo;
import com.anplus.hr.domain.vo.EmployeeInfoVo;
import com.anplus.hr.domain.vo.EmployeePartTimeInfoImportVo;
import com.anplus.hr.domain.vo.EmployeePartTimeInfoVo;
import com.anplus.hr.domain.vo.*;
import com.anplus.hr.mapper.EmployeeInfoMapper;
import com.anplus.hr.service.EmployeeInfoServ;
import com.anplus.hr.service.EmployeePartTimeInfoServ;
......@@ -162,8 +159,8 @@ public class EmployeePartTimeInfoServImpl extends ServiceImpl<EmployeeInfoMapper
Map<String, Long> deptNamesIdMap = employeeSysDeptServ.selectJoinDeptNames();
List<EmployeeInfo> insertList = new ArrayList<>(successList.size());
for (EmployeePartTimeInfoImportVo importVo : successList) {
EmployeeInfoImportVo deptInfo = MapstructUtils.convert(importVo, EmployeeInfoImportVo.class);
Long leafDeptId = deptNamesIdMap.get(employeeInfoServ.buildDeptNameStr(deptInfo));
EmployeeDeptImportVo deptInfo = MapstructUtils.convert(importVo, EmployeeDeptImportVo.class);
Long leafDeptId = deptNamesIdMap.get(employeeSysDeptServ.buildDeptNameStr(deptInfo));
if (leafDeptId == null) {
importVo.addError("部门不存在");
errorList.add(importVo);
......
......@@ -64,6 +64,15 @@ public class EmployeeSysDeptServImpl implements EmployeeSysDeptServ {
return result;
}
@Override
public Map<String, Long> selectJoinDeptNamesForStaffingPlan() {
Map<String, Long> result = new HashMap<>();
List<SysDeptDTO> sysDeptDTOS = sysDeptServ.deptTreeForOptions();
traverseDeptTreeForStaffingPlan(sysDeptDTOS, "", 1, result);
return result;
}
/**
* 构建部门查询条件
*
......@@ -93,4 +102,23 @@ public class EmployeeSysDeptServImpl implements EmployeeSysDeptServ {
}
}
}
// 遍历根节点列表
private <T extends TreeDTO> void traverseDeptTreeForStaffingPlan(List<T> deptList, String parentPath, Integer level, Map<String, Long> result) {
if (CollUtil.isEmpty(deptList)) {
return;
}
for (TreeDTO dept : deptList) {
String currentPath = StrUtil.isEmpty(parentPath) ? dept.getLabel() : parentPath + StrUtil.SLASH + dept.getLabel();
if (level == 2 || level == 4) {
result.put(currentPath, dept.getId());
}
// 递归处理子节点
if (CollUtil.isNotEmpty(dept.getChildren())) {
traverseDeptTreeForStaffingPlan(dept.getChildren(), currentPath, level + 1, result);
}
}
}
}
package com.anplus.hr.service.impl;
import cn.hutool.core.convert.Convert;
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.StaffingPlanRecords;
import com.anplus.hr.domain.vo.StaffingPlanRecordsVo;
import com.anplus.hr.domain.params.StaffingPlanRecordsListParam;
import com.anplus.hr.domain.params.StaffingPlanRecordsParam;
import com.anplus.hr.mapper.StaffingPlanRecordsMapper;
import com.anplus.hr.service.StaffingPlanRecordsServ;
import java.util.List;
/**
* 编制规划记录Service业务层处理
*
* @author LiuBin
* @date 2025-12-14
*/
@RequiredArgsConstructor
@Service
public class StaffingPlanRecordsServImpl extends ServiceImpl<StaffingPlanRecordsMapper, StaffingPlanRecords> implements StaffingPlanRecordsServ {
private final StaffingPlanRecordsMapper staffingPlanRecordsMapper;
/**
* 分页查询编制规划记录列表
*
* @param param 查询条件
* @return 编制规划记录分页列表
*/
@Override
public PageResponse<StaffingPlanRecordsVo> queryPageList(StaffingPlanRecordsListParam param) {
Page<StaffingPlanRecords> page = QueryUtil.getPage(param);
LambdaQueryWrapper<StaffingPlanRecords> lambdaQuery = this.buildQueryWrapper(param);
staffingPlanRecordsMapper.selectPage(page, lambdaQuery);
return QueryUtil.getPageResponse(page, MapstructUtils.convert(page.getRecords(), StaffingPlanRecordsVo.class));
}
/**
* 查询符合条件的编制规划记录列表
*
* @param param 查询条件
* @return 编制规划记录列表
*/
@Override
public List<StaffingPlanRecordsVo> queryList(StaffingPlanRecordsListParam param) {
LambdaQueryWrapper<StaffingPlanRecords> lambdaQuery = this.buildQueryWrapper(param);
return MapstructUtils.convert(staffingPlanRecordsMapper.selectList(lambdaQuery), StaffingPlanRecordsVo.class);
}
private LambdaQueryWrapper<StaffingPlanRecords> buildQueryWrapper(StaffingPlanRecordsListParam param) {
LambdaQueryWrapper<StaffingPlanRecords> lambdaQuery = Wrappers.<StaffingPlanRecords>lambdaQuery();
lambdaQuery.orderByDesc(StaffingPlanRecords::getId);
lambdaQuery.eq(StrUtil.isNotBlank(param.getRecordDate()), StaffingPlanRecords::getRecordDate, param.getRecordDate());
// lambdaQuery.eq(StrUtil.isNotBlank(param.getLastYearTitle()), StaffingPlanRecords::getLastYearTitle, param.getLastYearTitle());
// lambdaQuery.eq(StrUtil.isNotBlank(param.getCurrentYearTitle()), StaffingPlanRecords::getCurrentYearTitle, param.getCurrentYearTitle());
// lambdaQuery.eq(StrUtil.isNotBlank(param.getNextYearTitle()), StaffingPlanRecords::getNextYearTitle, param.getNextYearTitle());
// lambdaQuery.eq(StrUtil.isNotBlank(param.getInitFlag()), StaffingPlanRecords::getInitFlag, param.getInitFlag());
return lambdaQuery;
}
/**
* 查询编制规划记录
*
* @param id 主键
* @return 编制规划记录
*/
@Override
public StaffingPlanRecordsVo queryById(Long id){
StaffingPlanRecords staffingPlanRecords = staffingPlanRecordsMapper.selectById(id);
return MapstructUtils.convert(staffingPlanRecords, StaffingPlanRecordsVo.class);
}
/**
* 新增编制规划记录
*
* @param param 编制规划记录
* @return 是否新增成功
*/
@Override
public Boolean insertByParam(StaffingPlanRecordsParam param) {
StaffingPlanRecords staffingPlanRecords = MapstructUtils.convert(param, StaffingPlanRecords.class);
String recordDate = staffingPlanRecords.getRecordDate();
Integer recordYear = Convert.toInt(recordDate);
staffingPlanRecords.setLastYearTitle(StrUtil.subPre((recordYear - 1) + "年编制", 2));
staffingPlanRecords.setCurrentYearTitle(StrUtil.subPre(recordDate + "年编制", 2));
staffingPlanRecords.setNextYearTitle(StrUtil.subPre((recordYear + 1) + "年编制", 2));
return this.save(staffingPlanRecords);
}
/**
* 修改编制规划记录
*
* @param param 编制规划记录
* @return 是否修改成功
*/
@Override
public Boolean updateByParam(StaffingPlanRecordsParam param) {
StaffingPlanRecords staffingPlanRecords = MapstructUtils.convert(param, StaffingPlanRecords.class);
return this.updateById(staffingPlanRecords);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(StaffingPlanRecords entity){
// 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除编制规划记录信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
@Override
// @Transactional(rollbackFor = {Exception.class})
public Boolean delByIds(List<Long> ids) {
//做一些业务上的校验,判断是否需要校验
return this.removeByIds(ids);
}
}
<?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.StaffingPlanDataMapper">
</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.StaffingPlanRecordsMapper">
</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