From 8eac708bacb8f5d76d7b7a62b44880dbc09ef1d2 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 12 May 2026 15:04:00 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat(attendance):=20=E5=80=92=E7=8F=AD?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在WmsAttendanceScheduleMapper.xml中新增shiftStartTime2和shiftEndTime2字段映射 - 修改SQL查询语句以包含新的时间段字段 - 更新WmsAttendanceScheduleVo类添加shiftStartTime2和shiftEndTime2属性 - 修复倒班逻辑计算方式,调整周期天数判断条件 - 注释掉连续两天排班的相关业务逻辑 --- .../domain/vo/WmsAttendanceScheduleVo.java | 13 +++++++ .../WmsAttendanceScheduleServiceImpl.java | 37 ++++++++++--------- .../klp/WmsAttendanceScheduleMapper.xml | 4 +- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceScheduleVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceScheduleVo.java index 111f06d9..07c332d7 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceScheduleVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceScheduleVo.java @@ -102,6 +102,19 @@ public class WmsAttendanceScheduleVo { @ExcelProperty(value = "结束时间") private java.util.Date shiftEndTime; + /** + * 班次开始时间2 + */ + @JsonFormat(pattern = "HH:mm") + @ExcelProperty(value = "开始时间2") + private java.util.Date shiftStartTime2; + + /** + * 班次结束时间2 + */ + @JsonFormat(pattern = "HH:mm") + @ExcelProperty(value = "结束时间2") + private java.util.Date shiftEndTime2; /** * 工时 */ diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java index 513cb453..8ceb4a8c 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java @@ -228,7 +228,8 @@ public class WmsAttendanceScheduleServiceImpl implements IWmsAttendanceScheduleS // 判断是否为倒班日 long cycleDays = rule.getCycleDays() != null ? rule.getCycleDays() : 10; - boolean isChangeDay = (daysFromStart + 1) % cycleDays == 0; + // boolean isChangeDay = (daysFromStart + 1) % cycleDays == 0; + boolean isChangeDay = daysFromStart > 0 && daysFromStart % cycleDays == 0; if (isChangeDay) { // 倒班日 @@ -241,24 +242,24 @@ public class WmsAttendanceScheduleServiceImpl implements IWmsAttendanceScheduleS schedule.setShiftId(rule.getShiftB()); schedule.setShiftName(shiftB.getShiftName()); } - // 下一天也使用倒班班次(工作18小时) - LocalDate nextDay = currentDate.plusDays(1); - if (!nextDay.isAfter(endDate) && !isScheduleExists(bo.getUserId(), nextDay)) { - WmsAttendanceSchedule nextSchedule = new WmsAttendanceSchedule(); - nextSchedule.setUserId(bo.getUserId()); - nextSchedule.setWorkDate(java.sql.Date.valueOf(nextDay)); - if (changeShiftB != null) { - nextSchedule.setShiftId(rule.getChangeShiftBId()); - nextSchedule.setShiftName(changeShiftB.getShiftName()); - } else { - nextSchedule.setShiftId(rule.getShiftB()); - nextSchedule.setShiftName(shiftB.getShiftName()); - } - schedules.add(nextSchedule); - } +// // 下一天也使用倒班班次(工作18小时) +// LocalDate nextDay = currentDate.plusDays(1); +// if (!nextDay.isAfter(endDate) && !isScheduleExists(bo.getUserId(), nextDay)) { +// WmsAttendanceSchedule nextSchedule = new WmsAttendanceSchedule(); +// nextSchedule.setUserId(bo.getUserId()); +// nextSchedule.setWorkDate(java.sql.Date.valueOf(nextDay)); +// if (changeShiftB != null) { +// nextSchedule.setShiftId(rule.getChangeShiftBId()); +// nextSchedule.setShiftName(changeShiftB.getShiftName()); +// } else { +// nextSchedule.setShiftId(rule.getShiftB()); +// nextSchedule.setShiftName(shiftB.getShiftName()); +// } +// schedules.add(nextSchedule); +// } isCurrentShiftA = false; - currentDate = currentDate.plusDays(1); // 跳过下一天,因为已经处理了 - daysFromStart++; +// currentDate = currentDate.plusDays(1); // 跳过下一天,因为已经处理了 +// daysFromStart++; } else { // 夜班转白班 if (changeShiftA != null) { diff --git a/klp-wms/src/main/resources/mapper/klp/WmsAttendanceScheduleMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceScheduleMapper.xml index 52697c62..af0145d2 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsAttendanceScheduleMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceScheduleMapper.xml @@ -33,13 +33,15 @@ + + SELECT s.schedule_id, s.user_id, s.work_date, s.shift_id, s.shift_name, s.shift_group, s.remark, e.name as employee_name, e.dept as employee_dept, e.job_type as employee_job_type, - sh.shift_type, sh.start_time as shift_start_time, sh.end_time as shift_end_time, sh.work_hours + sh.shift_type, sh.start_time as shift_start_time, sh.end_time as shift_end_time, sh.start_time2 as shift_start_time2, sh.end_time2 as shift_end_time2, sh.work_hours FROM wms_attendance_schedule s LEFT JOIN wms_employee_info e ON s.user_id = e.info_id AND e.del_flag = 0 LEFT JOIN wms_attendance_shift sh ON s.shift_id = sh.shift_id AND sh.del_flag = 0 From a314e05e4d80dea31b503175e5c4cf493fc757b9 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 12 May 2026 15:15:08 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(schedule):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8E=92=E7=8F=AD=E7=94=9F=E6=88=90=E5=8A=9F=E8=83=BD=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=89=B9=E9=87=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 IWmsAttendanceScheduleService.generateSchedule 方法参数改为 List 类型 - 更新 WmsAttendanceScheduleController 中的 generateSchedule 接口接收批量数据 - 在 WmsAttendanceScheduleServiceImpl 中实现循环处理多个排班生成请求 - 保持原有的单个排班生成逻辑不变,通过遍历列表实现批量功能 --- .../WmsAttendanceScheduleController.java | 4 +-- .../IWmsAttendanceScheduleService.java | 2 +- .../WmsAttendanceScheduleServiceImpl.java | 26 ++++++++++--------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/controller/WmsAttendanceScheduleController.java b/klp-wms/src/main/java/com/klp/controller/WmsAttendanceScheduleController.java index a40b16e5..3963152c 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsAttendanceScheduleController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsAttendanceScheduleController.java @@ -103,8 +103,8 @@ public class WmsAttendanceScheduleController extends BaseController { */ @Log(title = "生成排班", businessType = BusinessType.INSERT) @PostMapping("/generate") - public R generateSchedule(@Validated @RequestBody GenerateScheduleBo bo) { - iWmsAttendanceScheduleService.generateSchedule(bo); + public R generateSchedule(@Validated @RequestBody List boList) { + iWmsAttendanceScheduleService.generateSchedule(boList); return R.ok(); } } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsAttendanceScheduleService.java b/klp-wms/src/main/java/com/klp/service/IWmsAttendanceScheduleService.java index b7a383fe..8483d9f7 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsAttendanceScheduleService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsAttendanceScheduleService.java @@ -51,5 +51,5 @@ public interface IWmsAttendanceScheduleService { /** * 生成排班 */ - void generateSchedule(GenerateScheduleBo bo); + void generateSchedule(List boList); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java index 8ceb4a8c..353a70aa 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java @@ -134,20 +134,22 @@ public class WmsAttendanceScheduleServiceImpl implements IWmsAttendanceScheduleS */ @Override @Transactional(rollbackFor = Exception.class) - public void generateSchedule(GenerateScheduleBo bo) { - LocalDate startDate = bo.getStartDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); - LocalDate endDate = bo.getEndDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); + public void generateSchedule(List boList) { + for (GenerateScheduleBo bo : boList) { + LocalDate startDate = bo.getStartDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); + LocalDate endDate = bo.getEndDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); - if (startDate.isAfter(endDate)) { - throw new RuntimeException("开始时间不能大于结束时间"); - } + if (startDate.isAfter(endDate)) { + throw new RuntimeException("开始时间不能大于结束时间"); + } - if (bo.getRuleId() == null) { - // 正常排班,不倒班 - generateNormalSchedule(bo, startDate, endDate); - } else { - // 倒班排班 - generateShiftSchedule(bo, startDate, endDate); + if (bo.getRuleId() == null) { + // 正常排班,不倒班 + generateNormalSchedule(bo, startDate, endDate); + } else { + // 倒班排班 + generateShiftSchedule(bo, startDate, endDate); + } } } From d833bbd7fbb44d9bd24ca5765376c7a53f7eaa3d Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 12 May 2026 15:23:47 +0800 Subject: [PATCH 3/6] =?UTF-8?q?refactor(WmsAttendanceScheduleService):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=89=B9=E9=87=8F=E6=8F=92=E5=85=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将循环单条插入改为批量插入方法 - 添加批量插入失败异常处理 - 提升批量插入性能和错误处理能力 --- .../klp/service/impl/WmsAttendanceScheduleServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java index 353a70aa..af1e48bf 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceScheduleServiceImpl.java @@ -292,8 +292,9 @@ public class WmsAttendanceScheduleServiceImpl implements IWmsAttendanceScheduleS // 批量插入 if (!schedules.isEmpty()) { - for (WmsAttendanceSchedule schedule : schedules) { - baseMapper.insert(schedule); + boolean i = baseMapper.insertBatch(schedules); + if (!i) { + throw new RuntimeException("批量插入倒班排班失败"); } } } From 736b786ff934dc659047ac873dbfc4296241ebb5 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 12 May 2026 15:55:41 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E8=A7=84=E5=88=99=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建考勤规则实体类WmsAttendanceRule,包含迟到、早退、旷工相关配置字段 - 实现考勤规则业务对象WmsAttendanceRuleBo和视图对象WmsAttendanceRuleVo - 开发考勤规则服务接口IWmsAttendanceRuleService及其实现类 - 构建考勤规则控制器WmsAttendanceRuleController,提供增删改查API - 配置考勤规则数据访问层WmsAttendanceRuleMapper及对应的XML映射文件 - 实现考勤规则列表查询、详情获取、新增修改、删除导出等功能 - 添加数据验证、分页查询、Excel导出等基础功能支持 --- .../WmsAttendanceRuleController.java | 99 +++++++++++++++ .../com/klp/domain/WmsAttendanceRule.java | 66 ++++++++++ .../klp/domain/bo/WmsAttendanceRuleBo.java | 67 ++++++++++ .../klp/domain/vo/WmsAttendanceRuleVo.java | 83 +++++++++++++ .../klp/mapper/WmsAttendanceRuleMapper.java | 15 +++ .../service/IWmsAttendanceRuleService.java | 49 ++++++++ .../impl/WmsAttendanceRuleServiceImpl.java | 114 ++++++++++++++++++ .../mapper/klp/WmsAttendanceRuleMapper.xml | 25 ++++ 8 files changed, 518 insertions(+) create mode 100644 klp-wms/src/main/java/com/klp/controller/WmsAttendanceRuleController.java create mode 100644 klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java create mode 100644 klp-wms/src/main/java/com/klp/mapper/WmsAttendanceRuleMapper.java create mode 100644 klp-wms/src/main/java/com/klp/service/IWmsAttendanceRuleService.java create mode 100644 klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java create mode 100644 klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml diff --git a/klp-wms/src/main/java/com/klp/controller/WmsAttendanceRuleController.java b/klp-wms/src/main/java/com/klp/controller/WmsAttendanceRuleController.java new file mode 100644 index 00000000..2b5f4e53 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/controller/WmsAttendanceRuleController.java @@ -0,0 +1,99 @@ +package com.klp.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.domain.vo.WmsAttendanceRuleVo; +import com.klp.domain.bo.WmsAttendanceRuleBo; +import com.klp.service.IWmsAttendanceRuleService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 考勤规则(迟到/早退/旷工规则配置) + * + * @author klp + * @date 2026-05-12 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wms/attendanceRule") +public class WmsAttendanceRuleController extends BaseController { + + private final IWmsAttendanceRuleService iWmsAttendanceRuleService; + + /** + * 查询考勤规则(迟到/早退/旷工规则配置)列表 + */ + @GetMapping("/list") + public TableDataInfo list(WmsAttendanceRuleBo bo, PageQuery pageQuery) { + return iWmsAttendanceRuleService.queryPageList(bo, pageQuery); + } + + /** + * 导出考勤规则(迟到/早退/旷工规则配置)列表 + */ + @Log(title = "考勤规则(迟到/早退/旷工规则配置)", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsAttendanceRuleBo bo, HttpServletResponse response) { + List list = iWmsAttendanceRuleService.queryList(bo); + ExcelUtil.exportExcel(list, "考勤规则(迟到/早退/旷工规则配置)", WmsAttendanceRuleVo.class, response); + } + + /** + * 获取考勤规则(迟到/早退/旷工规则配置)详细信息 + * + * @param ruleId 主键 + */ + @GetMapping("/{ruleId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long ruleId) { + return R.ok(iWmsAttendanceRuleService.queryById(ruleId)); + } + + /** + * 新增考勤规则(迟到/早退/旷工规则配置) + */ + @Log(title = "考勤规则(迟到/早退/旷工规则配置)", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsAttendanceRuleBo bo) { + return toAjax(iWmsAttendanceRuleService.insertByBo(bo)); + } + + /** + * 修改考勤规则(迟到/早退/旷工规则配置) + */ + @Log(title = "考勤规则(迟到/早退/旷工规则配置)", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsAttendanceRuleBo bo) { + return toAjax(iWmsAttendanceRuleService.updateByBo(bo)); + } + + /** + * 删除考勤规则(迟到/早退/旷工规则配置) + * + * @param ruleIds 主键串 + */ + @Log(title = "考勤规则(迟到/早退/旷工规则配置)", businessType = BusinessType.DELETE) + @DeleteMapping("/{ruleIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ruleIds) { + return toAjax(iWmsAttendanceRuleService.deleteWithValidByIds(Arrays.asList(ruleIds), true)); + } +} diff --git a/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java b/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java new file mode 100644 index 00000000..1062ea88 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java @@ -0,0 +1,66 @@ +package com.klp.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 考勤规则(迟到/早退/旷工规则配置)对象 wms_attendance_rule + * + * @author klp + * @date 2026-05-12 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_attendance_rule") +public class WmsAttendanceRule extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键ID + */ + @TableId(value = "rule_id") + private Long ruleId; + /** + * 迟到警告阈值(分钟内仅警告,不扣款) + */ + private Long lateWarn; + /** + * 迟到一级阈值(分钟) + */ + private Long late1; + /** + * 迟到二级阈值(分钟) + */ + private Long late2; + /** + * 迟到一级扣款(元/次) + */ + private BigDecimal deduct1; + /** + * 迟到二级扣款(元/次) + */ + private BigDecimal deduct2; + /** + * 超过多少分钟按旷工半天处理 + */ + private Long absentHalfDay; + /** + * 连续旷工多少天自动离职 + */ + private Long continuousAbsentDays; + /** + * 备注 + */ + private String remark; + /** + * 删除标记(0正常 1删除) + */ + @TableLogic + private Long delFlag; + +} diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java new file mode 100644 index 00000000..0ba75cc1 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java @@ -0,0 +1,67 @@ +package com.klp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.math.BigDecimal; + +/** + * 考勤规则(迟到/早退/旷工规则配置)业务对象 wms_attendance_rule + * + * @author klp + * @date 2026-05-12 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class WmsAttendanceRuleBo extends BaseEntity { + + /** + * 主键ID + */ + private Long ruleId; + + /** + * 迟到警告阈值(分钟内仅警告,不扣款) + */ + private Long lateWarn; + + /** + * 迟到一级阈值(分钟) + */ + private Long late1; + + /** + * 迟到二级阈值(分钟) + */ + private Long late2; + + /** + * 迟到一级扣款(元/次) + */ + private BigDecimal deduct1; + + /** + * 迟到二级扣款(元/次) + */ + private BigDecimal deduct2; + + /** + * 超过多少分钟按旷工半天处理 + */ + private Long absentHalfDay; + + /** + * 连续旷工多少天自动离职 + */ + private Long continuousAbsentDays; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java new file mode 100644 index 00000000..5d7a73d7 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java @@ -0,0 +1,83 @@ +package com.klp.domain.vo; + +import java.math.BigDecimal; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.klp.common.annotation.ExcelDictFormat; +import com.klp.common.convert.ExcelDictConvert; +import lombok.Data; + + +/** + * 考勤规则(迟到/早退/旷工规则配置)视图对象 wms_attendance_rule + * + * @author klp + * @date 2026-05-12 + */ +@Data +@ExcelIgnoreUnannotated +public class WmsAttendanceRuleVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long ruleId; + + /** + * 迟到警告阈值(分钟内仅警告,不扣款) + */ + @ExcelProperty(value = "迟到警告阈值", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=钟内仅警告,不扣款") + private Long lateWarn; + + /** + * 迟到一级阈值(分钟) + */ + @ExcelProperty(value = "迟到一级阈值", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=钟") + private Long late1; + + /** + * 迟到二级阈值(分钟) + */ + @ExcelProperty(value = "迟到二级阈值", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "分=钟") + private Long late2; + + /** + * 迟到一级扣款(元/次) + */ + @ExcelProperty(value = "迟到一级扣款", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "元=/次") + private BigDecimal deduct1; + + /** + * 迟到二级扣款(元/次) + */ + @ExcelProperty(value = "迟到二级扣款", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "元=/次") + private BigDecimal deduct2; + + /** + * 超过多少分钟按旷工半天处理 + */ + @ExcelProperty(value = "超过多少分钟按旷工半天处理") + private Long absentHalfDay; + + /** + * 连续旷工多少天自动离职 + */ + @ExcelProperty(value = "连续旷工多少天自动离职") + private Long continuousAbsentDays; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsAttendanceRuleMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsAttendanceRuleMapper.java new file mode 100644 index 00000000..6c4d884c --- /dev/null +++ b/klp-wms/src/main/java/com/klp/mapper/WmsAttendanceRuleMapper.java @@ -0,0 +1,15 @@ +package com.klp.mapper; + +import com.klp.domain.WmsAttendanceRule; +import com.klp.domain.vo.WmsAttendanceRuleVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 考勤规则(迟到/早退/旷工规则配置)Mapper接口 + * + * @author klp + * @date 2026-05-12 + */ +public interface WmsAttendanceRuleMapper extends BaseMapperPlus { + +} diff --git a/klp-wms/src/main/java/com/klp/service/IWmsAttendanceRuleService.java b/klp-wms/src/main/java/com/klp/service/IWmsAttendanceRuleService.java new file mode 100644 index 00000000..e7f3a6e9 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/IWmsAttendanceRuleService.java @@ -0,0 +1,49 @@ +package com.klp.service; + +import com.klp.domain.WmsAttendanceRule; +import com.klp.domain.vo.WmsAttendanceRuleVo; +import com.klp.domain.bo.WmsAttendanceRuleBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 考勤规则(迟到/早退/旷工规则配置)Service接口 + * + * @author klp + * @date 2026-05-12 + */ +public interface IWmsAttendanceRuleService { + + /** + * 查询考勤规则(迟到/早退/旷工规则配置) + */ + WmsAttendanceRuleVo queryById(Long ruleId); + + /** + * 查询考勤规则(迟到/早退/旷工规则配置)列表 + */ + TableDataInfo queryPageList(WmsAttendanceRuleBo bo, PageQuery pageQuery); + + /** + * 查询考勤规则(迟到/早退/旷工规则配置)列表 + */ + List queryList(WmsAttendanceRuleBo bo); + + /** + * 新增考勤规则(迟到/早退/旷工规则配置) + */ + Boolean insertByBo(WmsAttendanceRuleBo bo); + + /** + * 修改考勤规则(迟到/早退/旷工规则配置) + */ + Boolean updateByBo(WmsAttendanceRuleBo bo); + + /** + * 校验并批量删除考勤规则(迟到/早退/旷工规则配置)信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java new file mode 100644 index 00000000..abf822ca --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java @@ -0,0 +1,114 @@ +package com.klp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.domain.bo.WmsAttendanceRuleBo; +import com.klp.domain.vo.WmsAttendanceRuleVo; +import com.klp.domain.WmsAttendanceRule; +import com.klp.mapper.WmsAttendanceRuleMapper; +import com.klp.service.IWmsAttendanceRuleService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 考勤规则(迟到/早退/旷工规则配置)Service业务层处理 + * + * @author klp + * @date 2026-05-12 + */ +@RequiredArgsConstructor +@Service +public class WmsAttendanceRuleServiceImpl implements IWmsAttendanceRuleService { + + private final WmsAttendanceRuleMapper baseMapper; + + /** + * 查询考勤规则(迟到/早退/旷工规则配置) + */ + @Override + public WmsAttendanceRuleVo queryById(Long ruleId){ + return baseMapper.selectVoById(ruleId); + } + + /** + * 查询考勤规则(迟到/早退/旷工规则配置)列表 + */ + @Override + public TableDataInfo queryPageList(WmsAttendanceRuleBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询考勤规则(迟到/早退/旷工规则配置)列表 + */ + @Override + public List queryList(WmsAttendanceRuleBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WmsAttendanceRuleBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getLateWarn() != null, WmsAttendanceRule::getLateWarn, bo.getLateWarn()); + lqw.eq(bo.getLate1() != null, WmsAttendanceRule::getLate1, bo.getLate1()); + lqw.eq(bo.getLate2() != null, WmsAttendanceRule::getLate2, bo.getLate2()); + lqw.eq(bo.getDeduct1() != null, WmsAttendanceRule::getDeduct1, bo.getDeduct1()); + lqw.eq(bo.getDeduct2() != null, WmsAttendanceRule::getDeduct2, bo.getDeduct2()); + lqw.eq(bo.getAbsentHalfDay() != null, WmsAttendanceRule::getAbsentHalfDay, bo.getAbsentHalfDay()); + lqw.eq(bo.getContinuousAbsentDays() != null, WmsAttendanceRule::getContinuousAbsentDays, bo.getContinuousAbsentDays()); + return lqw; + } + + /** + * 新增考勤规则(迟到/早退/旷工规则配置) + */ + @Override + public Boolean insertByBo(WmsAttendanceRuleBo bo) { + WmsAttendanceRule add = BeanUtil.toBean(bo, WmsAttendanceRule.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRuleId(add.getRuleId()); + } + return flag; + } + + /** + * 修改考勤规则(迟到/早退/旷工规则配置) + */ + @Override + public Boolean updateByBo(WmsAttendanceRuleBo bo) { + WmsAttendanceRule update = BeanUtil.toBean(bo, WmsAttendanceRule.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsAttendanceRule entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除考勤规则(迟到/早退/旷工规则配置) + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml new file mode 100644 index 00000000..57d4b5c9 --- /dev/null +++ b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + From 693de2ad5e690ba85657b72650f9227063435100 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 12 May 2026 16:29:54 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat(wms):=20=E6=96=B0=E5=A2=9E=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E6=AF=94=E5=AF=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 AttendanceCheckBo 数据传输对象用于考勤比对参数传递 - 定义 IWmsAttendanceCheckService 接口及其实现类 - 创建 WmsAttendanceCheck 实体类存储考勤比对结果数据 - 开发 WmsAttendanceCheckController 提供考勤比对接口 - 实现考勤比对核心逻辑,支持上下班时间段考勤检查 - 集成打卡记录查询和考勤规则应用功能 - 添加考勤状态判断和扣款计算逻辑 - 实现连续旷工天数统计功能 - 创建考勤比对结果的增删改查接口 - 配置 MyBatis 映射文件和 Excel 导出功能 --- .../WmsAttendanceCheckController.java | 58 +++ .../com/klp/domain/WmsAttendanceCheck.java | 54 +++ .../com/klp/domain/bo/AttendanceCheckBo.java | 19 + .../klp/domain/bo/WmsAttendanceCheckBo.java | 20 + .../klp/domain/vo/WmsAttendanceCheckVo.java | 71 ++++ .../klp/mapper/WmsAttendanceCheckMapper.java | 8 + .../service/IWmsAttendanceCheckService.java | 23 + .../impl/WmsAttendanceCheckServiceImpl.java | 398 ++++++++++++++++++ .../mapper/klp/WmsAttendanceCheckMapper.xml | 44 ++ 9 files changed, 695 insertions(+) create mode 100644 klp-wms/src/main/java/com/klp/controller/WmsAttendanceCheckController.java create mode 100644 klp-wms/src/main/java/com/klp/domain/WmsAttendanceCheck.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/AttendanceCheckBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceCheckBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceCheckVo.java create mode 100644 klp-wms/src/main/java/com/klp/mapper/WmsAttendanceCheckMapper.java create mode 100644 klp-wms/src/main/java/com/klp/service/IWmsAttendanceCheckService.java create mode 100644 klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java create mode 100644 klp-wms/src/main/resources/mapper/klp/WmsAttendanceCheckMapper.xml diff --git a/klp-wms/src/main/java/com/klp/controller/WmsAttendanceCheckController.java b/klp-wms/src/main/java/com/klp/controller/WmsAttendanceCheckController.java new file mode 100644 index 00000000..bce2b9b0 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/controller/WmsAttendanceCheckController.java @@ -0,0 +1,58 @@ +package com.klp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.enums.BusinessType; +import com.klp.domain.bo.AttendanceCheckBo; +import com.klp.domain.bo.WmsAttendanceCheckBo; +import com.klp.domain.vo.WmsAttendanceCheckVo; +import com.klp.service.IWmsAttendanceCheckService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotEmpty; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wms/attendanceCheck") +public class WmsAttendanceCheckController extends BaseController { + + private final IWmsAttendanceCheckService iWmsAttendanceCheckService; + + @GetMapping("/list") + public TableDataInfo list(WmsAttendanceCheckBo bo, PageQuery pageQuery) { + return iWmsAttendanceCheckService.queryPageList(bo, pageQuery); + } + + @GetMapping("/{checkId}") + public R getInfo(@PathVariable Long checkId) { + return R.ok(iWmsAttendanceCheckService.queryById(checkId)); + } + + @Log(title = "考勤比对", businessType = BusinessType.DELETE) + @DeleteMapping("/{checkIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] checkIds) { + return toAjax(iWmsAttendanceCheckService.deleteWithValidByIds(Arrays.asList(checkIds), true)); + } + + @Log(title = "考勤比对", businessType = BusinessType.INSERT) + @PostMapping("/check") + public R checkAttendance(@Validated @RequestBody AttendanceCheckBo bo) { + iWmsAttendanceCheckService.checkAttendance(bo); + return R.ok(); + } +} diff --git a/klp-wms/src/main/java/com/klp/domain/WmsAttendanceCheck.java b/klp-wms/src/main/java/com/klp/domain/WmsAttendanceCheck.java new file mode 100644 index 00000000..4a7e58d1 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/WmsAttendanceCheck.java @@ -0,0 +1,54 @@ +package com.klp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_attendance_check") +public class WmsAttendanceCheck extends BaseEntity { + + @TableId + private Long checkId; + private Long scheduleId; + private Long userId; + private String employeeName; + private Date workDate; + private Long shiftId; + private String shiftName; + private String shiftType; + + private Date p1StartTime; + private Date p1EndTime; + private Date p1FirstCheck; + private Date p1LastCheck; + private Integer p1LateMinutes; + private Integer p1EarlyMinutes; + private String p1Status; + private BigDecimal p1Deduct; + + private Date p2StartTime; + private Date p2EndTime; + private Date p2FirstCheck; + private Date p2LastCheck; + private Integer p2LateMinutes; + private Integer p2EarlyMinutes; + private String p2Status; + private BigDecimal p2Deduct; + + private String absentType; + private Integer continuousAbsentDays; + private BigDecimal totalDeduct; + private String overallStatus; + private String remark; + + @TableLogic + private Integer delFlag; +} diff --git a/klp-wms/src/main/java/com/klp/domain/bo/AttendanceCheckBo.java b/klp-wms/src/main/java/com/klp/domain/bo/AttendanceCheckBo.java new file mode 100644 index 00000000..7837ce1d --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/AttendanceCheckBo.java @@ -0,0 +1,19 @@ +package com.klp.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Data +public class AttendanceCheckBo { + + @NotNull(message = "开始日期不能为空") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + @NotNull(message = "结束日期不能为空") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; +} diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceCheckBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceCheckBo.java new file mode 100644 index 00000000..5e3a95fb --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceCheckBo.java @@ -0,0 +1,20 @@ +package com.klp.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +@Data +public class WmsAttendanceCheckBo { + + private Long userId; + private String employeeName; + private Long shiftId; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceCheckVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceCheckVo.java new file mode 100644 index 00000000..e9adc685 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceCheckVo.java @@ -0,0 +1,71 @@ +package com.klp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ExcelIgnoreUnannotated +public class WmsAttendanceCheckVo { + + private Long checkId; + private Long scheduleId; + private Long userId; + + @ExcelProperty(value = "员工姓名") + private String employeeName; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ExcelProperty(value = "日期") + private Date workDate; + + @ExcelProperty(value = "班次") + private String shiftName; + + @JsonFormat(pattern = "HH:mm") + private Date p1StartTime; + @JsonFormat(pattern = "HH:mm") + private Date p1EndTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date p1FirstCheck; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date p1LastCheck; + @ExcelProperty(value = "上午迟到(分钟)") + private Integer p1LateMinutes; + @ExcelProperty(value = "上午早退(分钟)") + private Integer p1EarlyMinutes; + @ExcelProperty(value = "上午状态") + private String p1Status; + @ExcelProperty(value = "上午扣款") + private BigDecimal p1Deduct; + + @JsonFormat(pattern = "HH:mm") + private Date p2StartTime; + @JsonFormat(pattern = "HH:mm") + private Date p2EndTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date p2FirstCheck; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date p2LastCheck; + @ExcelProperty(value = "下午迟到(分钟)") + private Integer p2LateMinutes; + @ExcelProperty(value = "下午早退(分钟)") + private Integer p2EarlyMinutes; + @ExcelProperty(value = "下午状态") + private String p2Status; + @ExcelProperty(value = "下午扣款") + private BigDecimal p2Deduct; + + @ExcelProperty(value = "旷工类型") + private String absentType; + @ExcelProperty(value = "连续旷工天数") + private Integer continuousAbsentDays; + @ExcelProperty(value = "总扣款") + private BigDecimal totalDeduct; + @ExcelProperty(value = "总体状态") + private String overallStatus; +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsAttendanceCheckMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsAttendanceCheckMapper.java new file mode 100644 index 00000000..ee3ae402 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/mapper/WmsAttendanceCheckMapper.java @@ -0,0 +1,8 @@ +package com.klp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.domain.WmsAttendanceCheck; +import com.klp.domain.vo.WmsAttendanceCheckVo; + +public interface WmsAttendanceCheckMapper extends BaseMapperPlus { +} diff --git a/klp-wms/src/main/java/com/klp/service/IWmsAttendanceCheckService.java b/klp-wms/src/main/java/com/klp/service/IWmsAttendanceCheckService.java new file mode 100644 index 00000000..f392c3f2 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/IWmsAttendanceCheckService.java @@ -0,0 +1,23 @@ +package com.klp.service; + +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.klp.domain.bo.AttendanceCheckBo; +import com.klp.domain.bo.WmsAttendanceCheckBo; +import com.klp.domain.vo.WmsAttendanceCheckVo; + +import java.util.Collection; +import java.util.List; + +public interface IWmsAttendanceCheckService { + + WmsAttendanceCheckVo queryById(Long checkId); + + TableDataInfo queryPageList(WmsAttendanceCheckBo bo, PageQuery pageQuery); + + List queryList(WmsAttendanceCheckBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + void checkAttendance(AttendanceCheckBo bo); +} diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java new file mode 100644 index 00000000..5c48a5ca --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java @@ -0,0 +1,398 @@ +package com.klp.service.impl; + +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.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.domain.AttendanceRecords; +import com.klp.domain.WmsAttendanceCheck; +import com.klp.domain.WmsAttendanceRule; +import com.klp.domain.bo.AttendanceCheckBo; +import com.klp.domain.bo.AttendanceRecordsBo; +import com.klp.domain.bo.WmsAttendanceCheckBo; +import com.klp.domain.bo.WmsAttendanceScheduleBo; +import com.klp.domain.vo.AttendanceRecordsVo; +import com.klp.domain.vo.WmsAttendanceCheckVo; +import com.klp.domain.vo.WmsAttendanceScheduleVo; +import com.klp.mapper.WmsAttendanceCheckMapper; +import com.klp.mapper.WmsAttendanceRuleMapper; +import com.klp.service.IAttendanceRecordsService; +import com.klp.service.IWmsAttendanceCheckService; +import com.klp.service.IWmsAttendanceScheduleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Service +public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService { + + private final WmsAttendanceCheckMapper baseMapper; + private final IWmsAttendanceScheduleService scheduleService; + private final IAttendanceRecordsService attendanceRecordsService; + private final WmsAttendanceRuleMapper ruleMapper; + + @Override + public WmsAttendanceCheckVo queryById(Long checkId) { + return baseMapper.selectVoById(checkId); + } + + @Override + public TableDataInfo queryPageList(WmsAttendanceCheckBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(WmsAttendanceCheckBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + private LambdaQueryWrapper buildQueryWrapper(WmsAttendanceCheckBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getUserId() != null, WmsAttendanceCheck::getUserId, bo.getUserId()); + lqw.like(StringUtils.isNotBlank(bo.getEmployeeName()), WmsAttendanceCheck::getEmployeeName, bo.getEmployeeName()); + lqw.eq(bo.getShiftId() != null, WmsAttendanceCheck::getShiftId, bo.getShiftId()); + lqw.ge(bo.getStartDate() != null, WmsAttendanceCheck::getWorkDate, bo.getStartDate()); + lqw.le(bo.getEndDate() != null, WmsAttendanceCheck::getWorkDate, bo.getEndDate()); + lqw.orderByDesc(WmsAttendanceCheck::getWorkDate); + return lqw; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void checkAttendance(AttendanceCheckBo bo) { + WmsAttendanceScheduleBo scheduleBo = new WmsAttendanceScheduleBo(); + scheduleBo.setStartDate(bo.getStartDate()); + scheduleBo.setEndDate(bo.getEndDate()); + List schedules = scheduleService.queryList(scheduleBo); + + if (schedules.isEmpty()) { + return; + } + + WmsAttendanceRule rule = getActiveRule(); + + LocalDate startLocal = toLocalDate(bo.getStartDate()); + LocalDate endLocal = toLocalDate(bo.getEndDate()); + + for (WmsAttendanceScheduleVo schedule : schedules) { + if (schedule.getEmployeeName() == null || schedule.getShiftStartTime() == null) { + continue; + } + + // 获取该员工该日期的所有打卡记录 + List records = getRecords(schedule.getEmployeeName(), schedule.getWorkDate()); + + WmsAttendanceCheck check = buildCheck(schedule, rule, records); + + // 删除已有的比对结果 + baseMapper.delete(Wrappers.lambdaQuery() + .eq(WmsAttendanceCheck::getScheduleId, schedule.getScheduleId())); + + baseMapper.insert(check); + } + + // 更新连续旷工天数 + updateContinuousAbsent(startLocal, endLocal); + } + + private WmsAttendanceRule getActiveRule() { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(WmsAttendanceRule::getDelFlag, 0); + wrapper.last("LIMIT 1"); + WmsAttendanceRule rule = ruleMapper.selectOne(wrapper); + if (rule == null) { + rule = new WmsAttendanceRule(); + rule.setLateWarn(3L); + rule.setLate1(5L); + rule.setLate2(15L); + rule.setDeduct1(new BigDecimal("10")); + rule.setDeduct2(new BigDecimal("30")); + rule.setAbsentHalfDay(15L); + rule.setContinuousAbsentDays(3L); + } + return rule; + } + + private List getRecords(String employeeName, Date workDate) { + AttendanceRecordsBo recordsBo = new AttendanceRecordsBo(); + recordsBo.setEname(employeeName); + LocalDate ld = toLocalDate(workDate); + recordsBo.setChecktimeStart(toDate(ld.atStartOfDay())); + recordsBo.setChecktimeEnd(toDate(ld.atTime(LocalTime.of(23, 59, 59)))); + List voList = attendanceRecordsService.queryList(recordsBo); + return voList.stream() + .map(v -> { + AttendanceRecords r = new AttendanceRecords(); + r.setId(v.getId()); + r.setEname(v.getEname()); + r.setChecktime(v.getChecktime()); + return r; + }) + .sorted(Comparator.comparing(AttendanceRecords::getChecktime)) + .collect(Collectors.toList()); + } + + private WmsAttendanceCheck buildCheck(WmsAttendanceScheduleVo schedule, WmsAttendanceRule rule, List records) { + WmsAttendanceCheck check = new WmsAttendanceCheck(); + check.setScheduleId(schedule.getScheduleId()); + check.setUserId(schedule.getUserId()); + check.setEmployeeName(schedule.getEmployeeName()); + check.setWorkDate(schedule.getWorkDate()); + check.setShiftId(schedule.getShiftId()); + check.setShiftName(schedule.getShiftName()); + check.setShiftType(schedule.getShiftType()); + + boolean hasPeriod2 = schedule.getShiftStartTime2() != null && schedule.getShiftEndTime2() != null; + + if (records.isEmpty()) { + check.setOverallStatus("absent_full"); + check.setAbsentType("full_day"); + return check; + } + + List checkTimes = records.stream() + .map(r -> toLocalDateTime(r.getChecktime()).toLocalTime()) + .collect(Collectors.toList()); + + if (hasPeriod2) { + // 正常班次:按时间中点划分上下午 + LocalTime p1End = toLocalTime(schedule.getShiftEndTime()); + LocalTime p2Start = toLocalTime(schedule.getShiftStartTime2()); + LocalTime split = LocalTime.of( + (p1End.getHour() + p2Start.getHour()) / 2, + (p1End.getMinute() + p2Start.getMinute()) / 2); + + List period1Times = new ArrayList<>(); + List period2Times = new ArrayList<>(); + for (LocalTime t : checkTimes) { + if (t.isBefore(split)) { + period1Times.add(t); + } else { + period2Times.add(t); + } + } + + check.setP1StartTime(schedule.getShiftStartTime()); + check.setP1EndTime(schedule.getShiftEndTime()); + checkPeriod(check, rule, 1, period1Times, schedule.getShiftStartTime(), schedule.getShiftEndTime(), records); + + check.setP2StartTime(schedule.getShiftStartTime2()); + check.setP2EndTime(schedule.getShiftEndTime2()); + checkPeriod(check, rule, 2, period2Times, schedule.getShiftStartTime2(), schedule.getShiftEndTime2(), records); + } else { + // 倒班:全天一个时段 + check.setP1StartTime(schedule.getShiftStartTime()); + check.setP1EndTime(schedule.getShiftEndTime()); + checkPeriod(check, rule, 1, checkTimes, schedule.getShiftStartTime(), schedule.getShiftEndTime(), records); + } + + // 总体判定 + calculateOverall(check, rule); + return check; + } + + private void checkPeriod(WmsAttendanceCheck check, WmsAttendanceRule rule, int period, + List periodTimes, Date expectedStart, Date expectedEnd, + List allRecords) { + if (periodTimes.isEmpty()) { + if (period == 1) { + check.setP1Status("missed"); + } else { + check.setP2Status("missed"); + } + return; + } + + LocalTime expStart = toLocalTime(expectedStart); + LocalTime expEnd = toLocalTime(expectedEnd); + LocalTime firstCheck = periodTimes.get(0); + LocalTime lastCheck = periodTimes.get(periodTimes.size() - 1); + + int lateMinutes = 0; + int earlyMinutes = 0; + BigDecimal deduct = BigDecimal.ZERO; + String status = "normal"; + + // 迟到判定:最早打卡 vs 理论上班时间 + if (firstCheck.isAfter(expStart)) { + lateMinutes = (int) Duration.between(expStart, firstCheck).toMinutes(); + if (lateMinutes > rule.getAbsentHalfDay()) { + status = "absent_half"; + } else if (lateMinutes > rule.getLate2()) { + status = "absent_half"; + } else if (lateMinutes > rule.getLate1()) { + status = "late_2"; + deduct = deduct.add(rule.getDeduct2()); + } else if (lateMinutes > rule.getLateWarn()) { + status = "late_1"; + deduct = deduct.add(rule.getDeduct1()); + } else { + status = "late_warn"; + } + } + + // 早退判定:最晚打卡 vs 理论下班时间 + if (lastCheck.isBefore(expEnd)) { + int min = (int) Duration.between(lastCheck, expEnd).toMinutes(); + if (min > rule.getAbsentHalfDay()) { + status = maxSeverity(status, "absent_half"); + earlyMinutes = min; + } else if (min > rule.getLate2()) { + status = maxSeverity(status, "absent_half"); + earlyMinutes = min; + } else if (min > rule.getLate1()) { + status = maxSeverity(status, "early_2"); + deduct = deduct.add(rule.getDeduct2()); + earlyMinutes = min; + } else if (min > rule.getLateWarn()) { + status = maxSeverity(status, "early_1"); + deduct = deduct.add(rule.getDeduct1()); + earlyMinutes = min; + } else { + if ("normal".equals(status)) { + status = "early_warn"; + } + earlyMinutes = min; + } + } + + // 找到对应的打卡时间 + for (AttendanceRecords r : allRecords) { + LocalTime ct = toLocalDateTime(r.getChecktime()).toLocalTime(); + if (ct.equals(firstCheck)) { + if (period == 1) check.setP1FirstCheck(r.getChecktime()); + else check.setP2FirstCheck(r.getChecktime()); + } + if (ct.equals(lastCheck)) { + if (period == 1) check.setP1LastCheck(r.getChecktime()); + else check.setP2LastCheck(r.getChecktime()); + } + } + + if (period == 1) { + check.setP1LateMinutes(lateMinutes); + check.setP1EarlyMinutes(earlyMinutes); + check.setP1Status(status); + check.setP1Deduct(deduct); + } else { + check.setP2LateMinutes(lateMinutes); + check.setP2EarlyMinutes(earlyMinutes); + check.setP2Status(status); + check.setP2Deduct(deduct); + } + } + + private String maxSeverity(String a, String b) { + List severity = java.util.Arrays.asList("normal", "late_warn", "early_warn", "late_1", "early_1", "late_2", "early_2", "absent_half"); + int ai = severity.indexOf(a); + int bi = severity.indexOf(b); + return severity.get(Math.max(ai, bi)); + } + + private void calculateOverall(WmsAttendanceCheck check, WmsAttendanceRule rule) { + BigDecimal total = BigDecimal.ZERO; + boolean hasAbsentHalf = false; + + if (check.getP1Deduct() != null) total = total.add(check.getP1Deduct()); + if (check.getP2Deduct() != null) total = total.add(check.getP2Deduct()); + + check.setTotalDeduct(total); + + if ("absent_half".equals(check.getP1Status()) || "absent_half".equals(check.getP2Status())) { + hasAbsentHalf = true; + } + if ("missed".equals(check.getP1Status()) && check.getP2StartTime() != null && "missed".equals(check.getP2Status())) { + check.setAbsentType("full_day"); + check.setOverallStatus("absent_full"); + return; + } + if (check.getP1StartTime() == null && check.getP2StartTime() == null) { + check.setAbsentType("full_day"); + check.setOverallStatus("absent_full"); + return; + } + if (hasAbsentHalf) { + check.setAbsentType("half_day"); + check.setOverallStatus("absent_half"); + return; + } + + boolean abnormal = !"normal".equals(check.getP1Status()) || (check.getP2Status() != null && !"normal".equals(check.getP2Status())); + check.setOverallStatus(abnormal ? "abnormal" : "normal"); + } + + private void updateContinuousAbsent(LocalDate startDate, LocalDate endDate) { + List checks = baseMapper.selectList(Wrappers.lambdaQuery() + .ge(WmsAttendanceCheck::getWorkDate, toDate(startDate.atStartOfDay())) + .le(WmsAttendanceCheck::getWorkDate, toDate(endDate.atTime(LocalTime.of(23, 59, 59)))) + .eq(WmsAttendanceCheck::getDelFlag, 0)); + + for (WmsAttendanceCheck check : checks) { + if (check.getAbsentType() != null) { + int continuous = countContinuousAbsent(check.getUserId(), toLocalDate(check.getWorkDate())); + check.setContinuousAbsentDays(continuous); + baseMapper.updateById(check); + } + } + } + + private int countContinuousAbsent(Long userId, LocalDate workDate) { + int count = 0; + LocalDate date = workDate.minusDays(1); + while (true) { + WmsAttendanceCheck prev = baseMapper.selectOne(Wrappers.lambdaQuery() + .eq(WmsAttendanceCheck::getUserId, userId) + .eq(WmsAttendanceCheck::getWorkDate, toDate(date.atStartOfDay())) + .eq(WmsAttendanceCheck::getDelFlag, 0)); + if (prev != null && prev.getAbsentType() != null) { + count++; + date = date.minusDays(1); + } else { + break; + } + } + return count; + } + + private static LocalDate toLocalDate(Date date) { + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } + + private static LocalTime toLocalTime(Date date) { + if (date == null) return null; + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime(); + } + + private static LocalDateTime toLocalDateTime(Date date) { + if (date == null) return null; + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + } + + private static Date toDate(LocalDateTime ldt) { + return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); + } +} diff --git a/klp-wms/src/main/resources/mapper/klp/WmsAttendanceCheckMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceCheckMapper.xml new file mode 100644 index 00000000..e0267684 --- /dev/null +++ b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceCheckMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 139f0ebb3e0ff8b428e9ede0ec0456a75c8e7efe Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 12 May 2026 17:09:37 +0800 Subject: [PATCH 6/6] =?UTF-8?q?refactor(wms):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E8=80=83=E5=8B=A4=E8=A7=84=E5=88=99=E5=AD=97=E6=AE=B5=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将迟到一级相关字段从 late1 重命名为 lateOne - 将迟到二级相关字段从 late2 重命名为 lateTwo - 将迟到一级扣款字段从 deduct1 重命名为 deductOne - 将迟到二级扣款字段从 deduct2 重命名为 deductTwo - 更新所有相关的 getter/setter 方法调用 - 修改映射文件中的字段映射配置 - 更新查询条件中的字段引用 --- .../com/klp/domain/WmsAttendanceRule.java | 8 ++--- .../klp/domain/bo/WmsAttendanceRuleBo.java | 8 ++--- .../klp/domain/vo/WmsAttendanceRuleVo.java | 8 ++--- .../impl/WmsAttendanceCheckServiceImpl.java | 30 +++++++++---------- .../impl/WmsAttendanceRuleServiceImpl.java | 8 ++--- .../mapper/klp/WmsAttendanceRuleMapper.xml | 8 ++--- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java b/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java index 1062ea88..41045b71 100644 --- a/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java +++ b/klp-wms/src/main/java/com/klp/domain/WmsAttendanceRule.java @@ -32,19 +32,19 @@ public class WmsAttendanceRule extends BaseEntity { /** * 迟到一级阈值(分钟) */ - private Long late1; + private Long lateOne; /** * 迟到二级阈值(分钟) */ - private Long late2; + private Long lateTwo; /** * 迟到一级扣款(元/次) */ - private BigDecimal deduct1; + private BigDecimal deductOne; /** * 迟到二级扣款(元/次) */ - private BigDecimal deduct2; + private BigDecimal deductTwo; /** * 超过多少分钟按旷工半天处理 */ diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java index 0ba75cc1..e1ab3110 100644 --- a/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsAttendanceRuleBo.java @@ -31,22 +31,22 @@ public class WmsAttendanceRuleBo extends BaseEntity { /** * 迟到一级阈值(分钟) */ - private Long late1; + private Long lateOne; /** * 迟到二级阈值(分钟) */ - private Long late2; + private Long lateTwo; /** * 迟到一级扣款(元/次) */ - private BigDecimal deduct1; + private BigDecimal deductOne; /** * 迟到二级扣款(元/次) */ - private BigDecimal deduct2; + private BigDecimal deductTwo; /** * 超过多少分钟按旷工半天处理 diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java index 5d7a73d7..c107c851 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsAttendanceRuleVo.java @@ -38,28 +38,28 @@ public class WmsAttendanceRuleVo { */ @ExcelProperty(value = "迟到一级阈值", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "分=钟") - private Long late1; + private Long lateOne; /** * 迟到二级阈值(分钟) */ @ExcelProperty(value = "迟到二级阈值", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "分=钟") - private Long late2; + private Long lateTwo; /** * 迟到一级扣款(元/次) */ @ExcelProperty(value = "迟到一级扣款", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "元=/次") - private BigDecimal deduct1; + private BigDecimal deductOne; /** * 迟到二级扣款(元/次) */ @ExcelProperty(value = "迟到二级扣款", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "元=/次") - private BigDecimal deduct2; + private BigDecimal deductTwo; /** * 超过多少分钟按旷工半天处理 diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java index 5c48a5ca..d15e3144 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceCheckServiceImpl.java @@ -127,10 +127,10 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService if (rule == null) { rule = new WmsAttendanceRule(); rule.setLateWarn(3L); - rule.setLate1(5L); - rule.setLate2(15L); - rule.setDeduct1(new BigDecimal("10")); - rule.setDeduct2(new BigDecimal("30")); + rule.setLateOne(5L); + rule.setLateTwo(15L); + rule.setDeductOne(new BigDecimal("10")); + rule.setDeductTwo(new BigDecimal("30")); rule.setAbsentHalfDay(15L); rule.setContinuousAbsentDays(3L); } @@ -242,14 +242,14 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService lateMinutes = (int) Duration.between(expStart, firstCheck).toMinutes(); if (lateMinutes > rule.getAbsentHalfDay()) { status = "absent_half"; - } else if (lateMinutes > rule.getLate2()) { + } else if (lateMinutes > rule.getLateTwo()) { status = "absent_half"; - } else if (lateMinutes > rule.getLate1()) { - status = "late_2"; - deduct = deduct.add(rule.getDeduct2()); + } else if (lateMinutes > rule.getLateOne()) { + status = "late_two"; + deduct = deduct.add(rule.getDeductTwo()); } else if (lateMinutes > rule.getLateWarn()) { - status = "late_1"; - deduct = deduct.add(rule.getDeduct1()); + status = "late_one"; + deduct = deduct.add(rule.getDeductOne()); } else { status = "late_warn"; } @@ -261,16 +261,16 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService if (min > rule.getAbsentHalfDay()) { status = maxSeverity(status, "absent_half"); earlyMinutes = min; - } else if (min > rule.getLate2()) { + } else if (min > rule.getLateTwo()) { status = maxSeverity(status, "absent_half"); earlyMinutes = min; - } else if (min > rule.getLate1()) { + } else if (min > rule.getLateOne()) { status = maxSeverity(status, "early_2"); - deduct = deduct.add(rule.getDeduct2()); + deduct = deduct.add(rule.getDeductTwo()); earlyMinutes = min; } else if (min > rule.getLateWarn()) { status = maxSeverity(status, "early_1"); - deduct = deduct.add(rule.getDeduct1()); + deduct = deduct.add(rule.getDeductOne()); earlyMinutes = min; } else { if ("normal".equals(status)) { @@ -307,7 +307,7 @@ public class WmsAttendanceCheckServiceImpl implements IWmsAttendanceCheckService } private String maxSeverity(String a, String b) { - List severity = java.util.Arrays.asList("normal", "late_warn", "early_warn", "late_1", "early_1", "late_2", "early_2", "absent_half"); + List severity = java.util.Arrays.asList("normal", "late_warn", "early_warn", "late_one", "early_1", "late_two", "early_2", "absent_half"); int ai = severity.indexOf(a); int bi = severity.indexOf(b); return severity.get(Math.max(ai, bi)); diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java index abf822ca..0d80fbbd 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAttendanceRuleServiceImpl.java @@ -61,10 +61,10 @@ public class WmsAttendanceRuleServiceImpl implements IWmsAttendanceRuleService { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getLateWarn() != null, WmsAttendanceRule::getLateWarn, bo.getLateWarn()); - lqw.eq(bo.getLate1() != null, WmsAttendanceRule::getLate1, bo.getLate1()); - lqw.eq(bo.getLate2() != null, WmsAttendanceRule::getLate2, bo.getLate2()); - lqw.eq(bo.getDeduct1() != null, WmsAttendanceRule::getDeduct1, bo.getDeduct1()); - lqw.eq(bo.getDeduct2() != null, WmsAttendanceRule::getDeduct2, bo.getDeduct2()); + lqw.eq(bo.getLateOne() != null, WmsAttendanceRule::getLateOne, bo.getLateOne()); + lqw.eq(bo.getLateTwo() != null, WmsAttendanceRule::getLateTwo, bo.getLateTwo()); + lqw.eq(bo.getDeductOne() != null, WmsAttendanceRule::getDeductOne, bo.getDeductOne()); + lqw.eq(bo.getDeductTwo() != null, WmsAttendanceRule::getDeductTwo, bo.getDeductTwo()); lqw.eq(bo.getAbsentHalfDay() != null, WmsAttendanceRule::getAbsentHalfDay, bo.getAbsentHalfDay()); lqw.eq(bo.getContinuousAbsentDays() != null, WmsAttendanceRule::getContinuousAbsentDays, bo.getContinuousAbsentDays()); return lqw; diff --git a/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml index 57d4b5c9..5cf61d2a 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsAttendanceRuleMapper.xml @@ -7,10 +7,10 @@ - - - - + + + +