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 com.klp.common.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsLeaveRequestBo; import com.klp.domain.vo.WmsLeaveRequestVo; import com.klp.domain.WmsLeaveRequest; import com.klp.mapper.WmsLeaveRequestMapper; import com.klp.service.IWmsLeaveRequestService; import java.util.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; /** * 员工请假申请Service业务层处理 * * @author klp * @date 2026-01-17 */ @RequiredArgsConstructor @Service public class WmsLeaveRequestServiceImpl implements IWmsLeaveRequestService { private final WmsLeaveRequestMapper baseMapper; /** * 查询员工请假申请 */ @Override public WmsLeaveRequestVo queryById(Long leaveId){ return baseMapper.selectVoById(leaveId); } /** * 查询员工请假申请列表 */ @Override public TableDataInfo queryPageList(WmsLeaveRequestBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } /** * 查询员工请假申请列表 */ @Override public List queryList(WmsLeaveRequestBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } private LambdaQueryWrapper buildQueryWrapper(WmsLeaveRequestBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); // 如果传入了ids,则按ids筛选,否则按其他条件筛选 if (StringUtils.isNotBlank(bo.getLeaveIds())) { String[] idArray = bo.getLeaveIds().split(","); List idList = new ArrayList<>(); for (String id : idArray) { if (StringUtils.isNotBlank(id)) { try { idList.add(Long.parseLong(id.trim())); } catch (NumberFormatException e) { // 忽略无效的ID } } } if (!idList.isEmpty()) { lqw.in(WmsLeaveRequest::getLeaveId, idList); } } else { // 正常的条件筛选 lqw.eq(StringUtils.isNotBlank(bo.getLeaveTitle()), WmsLeaveRequest::getLeaveTitle, bo.getLeaveTitle()); lqw.eq(StringUtils.isNotBlank(bo.getLeaveType()), WmsLeaveRequest::getLeaveType, bo.getLeaveType()); lqw.like(StringUtils.isNotBlank(bo.getApplicantName()), WmsLeaveRequest::getApplicantName, bo.getApplicantName()); lqw.like(StringUtils.isNotBlank(bo.getApplicantDeptName()), WmsLeaveRequest::getApplicantDeptName, bo.getApplicantDeptName()); // 请假时间范围筛选:筛选出请假时间与查询时间范围有交集的记录 // 条件:(start_time <= endTimeParam AND end_time >= beginTime) if (bo.getBeginTime() != null && bo.getEndTimeParam() != null) { lqw.le(WmsLeaveRequest::getStartTime, bo.getEndTimeParam()) .ge(WmsLeaveRequest::getEndTime, bo.getBeginTime()); } else if (bo.getBeginTime() != null) { lqw.ge(WmsLeaveRequest::getEndTime, bo.getBeginTime()); } else if (bo.getEndTimeParam() != null) { lqw.le(WmsLeaveRequest::getStartTime, bo.getEndTimeParam()); } lqw.eq(bo.getStartTime() != null, WmsLeaveRequest::getStartTime, bo.getStartTime()); lqw.eq(bo.getEndTime() != null, WmsLeaveRequest::getEndTime, bo.getEndTime()); lqw.eq(StringUtils.isNotBlank(bo.getLeaveShift()), WmsLeaveRequest::getLeaveShift, bo.getLeaveShift()); lqw.eq(bo.getLeaveDays() != null, WmsLeaveRequest::getLeaveDays, bo.getLeaveDays()); lqw.eq(StringUtils.isNotBlank(bo.getLeaveReason()), WmsLeaveRequest::getLeaveReason, bo.getLeaveReason()); lqw.eq(StringUtils.isNotBlank(bo.getAttachmentUrls()), WmsLeaveRequest::getAttachmentUrls, bo.getAttachmentUrls()); } // 按请假开始时间倒序排列 lqw.orderByDesc(WmsLeaveRequest::getStartTime); return lqw; } /** * 新增员工请假申请 */ @Override public Boolean insertByBo(WmsLeaveRequestBo bo) { WmsLeaveRequest add = BeanUtil.toBean(bo, WmsLeaveRequest.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setLeaveId(add.getLeaveId()); } return flag; } /** * 修改员工请假申请 */ @Override public Boolean updateByBo(WmsLeaveRequestBo bo) { WmsLeaveRequest update = BeanUtil.toBean(bo, WmsLeaveRequest.class); validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } /** * 保存前的数据校验 */ private void validEntityBeforeSave(WmsLeaveRequest entity){ //TODO 做一些数据校验,如唯一约束 } /** * 批量删除员工请假申请 */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteBatchIds(ids) > 0; } /** * 请假统计报表 - 按请假类型统计 */ @Override public List> getLeaveTypeReport(WmsLeaveRequestBo bo) { QueryWrapper qw = new QueryWrapper<>(); qw.select("leave_type as type", "COUNT(*) as count", "SUM(leave_days) as total_days") .eq(bo.getApplicantDeptName() != null, "applicant_dept_name", bo.getApplicantDeptName()) .ge(bo.getStartTime() != null, "start_time", bo.getStartTime()) .le(bo.getEndTime() != null, "end_time", bo.getEndTime()) .eq("del_flag", 0) .groupBy("leave_type") .orderByDesc("total_days"); return baseMapper.selectMaps(qw); } /** * 请假统计报表 - 按部门统计 */ @Override public List> getLeaveDeptReport(WmsLeaveRequestBo bo) { QueryWrapper qw = new QueryWrapper<>(); qw.select("applicant_dept_name as dept_name", "COUNT(*) as count", "SUM(leave_days) as total_days") .isNotNull("applicant_dept_name") .eq(StringUtils.isNotBlank(bo.getLeaveType()), "leave_type", bo.getLeaveType()) .ge(bo.getStartTime() != null, "start_time", bo.getStartTime()) .le(bo.getEndTime() != null, "end_time", bo.getEndTime()) .eq("del_flag", 0) .groupBy("applicant_dept_name") .orderByDesc("total_days"); return baseMapper.selectMaps(qw); } /** * 请假统计报表 - 按月份统计 */ @Override public List> getLeaveMonthlyReport(WmsLeaveRequestBo bo) { QueryWrapper qw = new QueryWrapper<>(); qw.select("DATE_FORMAT(start_time, '%Y-%m') as month", "COUNT(*) as count", "SUM(leave_days) as total_days") .ge(bo.getStartTime() != null, "start_time", bo.getStartTime()) .le(bo.getEndTime() != null, "end_time", bo.getEndTime()) .eq(StringUtils.isNotBlank(bo.getLeaveType()), "leave_type", bo.getLeaveType()) .eq(bo.getApplicantDeptName() != null, "applicant_dept_name", bo.getApplicantDeptName()) .eq("del_flag", 0) .groupBy("month") .orderByAsc("month"); return baseMapper.selectMaps(qw); } /** * 根据请假人分组获取请假信息 */ @Override public List> getLeaveListGroupedByApplicant(WmsLeaveRequestBo bo) { QueryWrapper qw = new QueryWrapper<>(); qw.select("applicant_name", "applicant_dept_name", "GROUP_CONCAT(CONCAT(leave_type, ':', DATE_FORMAT(start_time, '%Y-%m-%d %H:%i'), '~', DATE_FORMAT(end_time, '%Y-%m-%d %H:%i'), '(', leave_days, '天)') ORDER BY start_time SEPARATOR '; ') as leave_details", "SUM(leave_days) as total_days", "COUNT(*) as leave_count") .eq("del_flag", 0); // 时间范围筛选 if (bo.getBeginTime() != null && bo.getEndTimeParam() != null) { qw.le("start_time", bo.getEndTimeParam()) .ge("end_time", bo.getBeginTime()); } else if (bo.getBeginTime() != null) { qw.ge("end_time", bo.getBeginTime()); } else if (bo.getEndTimeParam() != null) { qw.le("start_time", bo.getEndTimeParam()); } // 其他筛选条件 qw.eq(StringUtils.isNotBlank(bo.getLeaveType()), "leave_type", bo.getLeaveType()) .like(StringUtils.isNotBlank(bo.getApplicantName()), "applicant_name", bo.getApplicantName()) .like(StringUtils.isNotBlank(bo.getApplicantDeptName()), "applicant_dept_name", bo.getApplicantDeptName()) .groupBy("applicant_name", "applicant_dept_name") .orderByDesc("total_days"); return baseMapper.selectMaps(qw); } }