Files
klp-oa/klp-wms/src/main/java/com/klp/service/impl/WmsLeaveRequestServiceImpl.java
Joshi 05447c21ef feat(approval): 完善审批流程并新增部门管理功能
- 修改审批任务服务接口返回类型为Map以支持复杂数据结构
- 新增WMS部门管理模块,包括实体、业务对象、控制器和实现类
- 添加部门树形结构支持和部门负责人管理功能
- 更新审批流程逻辑,集成部门领导审批机制
- 重构审批任务查询方法以关联审批详情和申请人信息
- 添加部门ID字段到请假和外出申请相关实体中
- 优化多级审批流程,支持基于部门层级的审批链路
- 移除废弃的导入语句并整理代码结构
2026-03-02 14:41:43 +08:00

257 lines
10 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 com.klp.domain.bo.WmsApprovalBo;
import com.klp.service.IWmsApprovalService;
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;
import com.klp.mapper.WmsApprovalMapper;
import com.klp.domain.WmsApproval;
/**
* 员工请假申请Service业务层处理
*
* @author klp
* @date 2026-01-17
*/
@RequiredArgsConstructor
@Service
public class WmsLeaveRequestServiceImpl implements IWmsLeaveRequestService {
private final WmsLeaveRequestMapper baseMapper;
private final IWmsApprovalService approvalService;
/**
* 查询员工请假申请
*/
@Override
public WmsLeaveRequestVo queryById(Long leaveId) {
return baseMapper.selectVoById(leaveId);
}
/**
* 查询员工请假申请列表
*/
@Override
public TableDataInfo<WmsLeaveRequestVo> queryPageList(WmsLeaveRequestBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsLeaveRequest> lqw = buildQueryWrapper(bo);
Page<WmsLeaveRequestVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询员工请假申请列表
*/
@Override
public List<WmsLeaveRequestVo> queryList(WmsLeaveRequestBo bo) {
LambdaQueryWrapper<WmsLeaveRequest> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<WmsLeaveRequest> buildQueryWrapper(WmsLeaveRequestBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsLeaveRequest> lqw = Wrappers.lambdaQuery();
// 如果传入了ids则按ids筛选否则按其他条件筛选
if (StringUtils.isNotBlank(bo.getLeaveIds())) {
String[] idArray = bo.getLeaveIds().split(",");
List<Long> 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 <= endTime AND end_time >= startTime)
if (bo.getStartTime() != null && bo.getEndTime() != null) {
lqw.le(WmsLeaveRequest::getStartTime, bo.getEndTime())
.ge(WmsLeaveRequest::getEndTime, bo.getStartTime());
} else if (bo.getStartTime() != null) {
lqw.ge(WmsLeaveRequest::getEndTime, bo.getStartTime());
} else if (bo.getEndTime() != null) {
lqw.le(WmsLeaveRequest::getStartTime, bo.getEndTime());
}
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) {
WmsApprovalBo approval = new WmsApprovalBo();
approval.setApplyType("leave");
approval.setApplyId(add.getLeaveId());
approval.setApprovalStatus("待审批");
approval.setApproverName(bo.getApproverName());
approval.setApprovalType(bo.getApprovalType());
approval.setDeptId(bo.getDeptId());
approvalService.insertByBo(approval);
}
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<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 请假统计报表 - 按请假类型统计
*/
@Override
public List<Map<String, Object>> getLeaveTypeReport(WmsLeaveRequestBo bo) {
QueryWrapper<WmsLeaveRequest> 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, "end_time", bo.getStartTime()) // 请假结束时间 >= 查询开始时间
.le(bo.getEndTime() != null, "start_time", bo.getEndTime()) // 请假开始时间 <= 查询结束时间
.eq("del_flag", 0)
.groupBy("leave_type")
.orderByDesc("total_days");
return baseMapper.selectMaps(qw);
}
/**
* 请假统计报表 - 按部门统计
*/
@Override
public List<Map<String, Object>> getLeaveDeptReport(WmsLeaveRequestBo bo) {
QueryWrapper<WmsLeaveRequest> 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, "end_time", bo.getStartTime()) // 请假结束时间 >= 查询开始时间
.le(bo.getEndTime() != null, "start_time", bo.getEndTime()) // 请假开始时间 <= 查询结束时间
.eq("del_flag", 0)
.groupBy("applicant_dept_name")
.orderByDesc("total_days");
return baseMapper.selectMaps(qw);
}
/**
* 请假统计报表 - 按月份统计
*/
@Override
public List<Map<String, Object>> getLeaveMonthlyReport(WmsLeaveRequestBo bo) {
QueryWrapper<WmsLeaveRequest> 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, "end_time", bo.getStartTime()) // 请假结束时间 >= 查询开始时间
.le(bo.getEndTime() != null, "start_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<Map<String, Object>> getLeaveListGroupedByApplicant(WmsLeaveRequestBo bo) {
QueryWrapper<WmsLeaveRequest> 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.getStartTime() != null && bo.getEndTime() != null) {
qw.le("start_time", bo.getEndTime())
.ge("end_time", bo.getStartTime());
} else if (bo.getStartTime() != null) {
qw.ge("end_time", bo.getStartTime());
} else if (bo.getEndTime() != null) {
qw.le("start_time", bo.getEndTime());
}
// 其他筛选条件
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);
}
}