From 81e98ab75118b99abc245f529eaae07e0753af30 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 2 Mar 2026 11:06:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E5=A2=9E=E5=8A=A0=E5=A4=9A?= =?UTF-8?q?=E7=BA=A7=E5=AE=A1=E6=89=B9=E5=8A=9F=E8=83=BD=E5=92=8C=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在WmsApproval实体类中增加审批类型、需要审批人数、已审批人数、最终状态字段 - 实现审批任务通过和驳回功能,支持单人和多级审批流程 - 创建WmsApprovalTask相关实体类、业务对象、数据访问层和控制器 - 集成部门领导查询机制,实现多级审批链路构建 - 更新审批控制器,添加审批任务相关的API接口 - 优化审批列表查询,集成审批任务信息展示 - 配置MyBatis映射文件,支持新的审批任务数据表结构 --- .../klp/controller/WmsApprovalController.java | 45 +++ .../controller/WmsApprovalTaskController.java | 99 +++++++ .../main/java/com/klp/domain/WmsApproval.java | 16 ++ .../java/com/klp/domain/WmsApprovalTask.java | 69 +++++ .../java/com/klp/domain/bo/WmsApprovalBo.java | 20 ++ .../com/klp/domain/bo/WmsApprovalTaskBo.java | 58 ++++ .../com/klp/domain/vo/WmsApprovalTaskVo.java | 69 +++++ .../java/com/klp/domain/vo/WmsApprovalVo.java | 26 ++ .../com/klp/mapper/WmsApprovalTaskMapper.java | 15 + .../com/klp/service/IWmsApprovalService.java | 18 ++ .../klp/service/IWmsApprovalTaskService.java | 33 +++ .../service/impl/WmsApprovalServiceImpl.java | 259 +++++++++++++++++- .../impl/WmsApprovalTaskServiceImpl.java | 90 ++++++ .../mapper/klp/WmsApprovalMapper.xml | 4 + .../mapper/klp/WmsApprovalTaskMapper.xml | 38 +++ 15 files changed, 850 insertions(+), 9 deletions(-) create mode 100644 klp-wms/src/main/java/com/klp/controller/WmsApprovalTaskController.java create mode 100644 klp-wms/src/main/java/com/klp/domain/WmsApprovalTask.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalTaskBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalTaskVo.java create mode 100644 klp-wms/src/main/java/com/klp/mapper/WmsApprovalTaskMapper.java create mode 100644 klp-wms/src/main/java/com/klp/service/IWmsApprovalTaskService.java create mode 100644 klp-wms/src/main/java/com/klp/service/impl/WmsApprovalTaskServiceImpl.java create mode 100644 klp-wms/src/main/resources/mapper/klp/WmsApprovalTaskMapper.xml diff --git a/klp-wms/src/main/java/com/klp/controller/WmsApprovalController.java b/klp-wms/src/main/java/com/klp/controller/WmsApprovalController.java index 54174cf0..62f50a9a 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsApprovalController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsApprovalController.java @@ -20,7 +20,9 @@ import com.klp.common.enums.BusinessType; import com.klp.common.utils.poi.ExcelUtil; import com.klp.domain.vo.WmsApprovalVo; import com.klp.domain.bo.WmsApprovalBo; +import com.klp.domain.vo.WmsApprovalTaskVo; import com.klp.service.IWmsApprovalService; +import com.klp.service.IWmsApprovalTaskService; import com.klp.common.core.page.TableDataInfo; /** @@ -36,6 +38,7 @@ import com.klp.common.core.page.TableDataInfo; public class WmsApprovalController extends BaseController { private final IWmsApprovalService iWmsApprovalService; + private final IWmsApprovalTaskService iWmsApprovalTaskService; /** * 查询通用审批(支持请假/外出等申请的审批)列表 @@ -97,4 +100,46 @@ public class WmsApprovalController extends BaseController { @PathVariable Long[] approvalIds) { return toAjax(iWmsApprovalService.deleteWithValidByIds(Arrays.asList(approvalIds), true)); } + + /** + * 审批任务通过 + * + * @param taskId 任务ID + * @param approvalOpinion 审批意见 + */ + @Log(title = "审批任务通过", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/approve") + public R> approveTask( + @NotNull(message = "任务ID不能为空") + @RequestParam Long taskId, + @RequestParam(required = false) String approvalOpinion) { + return R.ok(iWmsApprovalService.approveTask(taskId, approvalOpinion)); + } + + /** + * 审批任务驳回 + * + * @param taskId 任务ID + * @param approvalOpinion 审批意见 + */ + @Log(title = "审批任务驳回", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/reject") + public R> rejectTask( + @NotNull(message = "任务ID不能为空") + @RequestParam Long taskId, + @RequestParam(required = false) String approvalOpinion) { + return R.ok(iWmsApprovalService.rejectTask(taskId, approvalOpinion)); + } + + /** + * 查询审批任务列表 + * + * @param approvalId 审批ID + */ + @GetMapping("/tasks/{approvalId}") + public R> getTasks(@PathVariable Long approvalId) { + return R.ok(iWmsApprovalTaskService.queryByApprovalId(approvalId)); + } } diff --git a/klp-wms/src/main/java/com/klp/controller/WmsApprovalTaskController.java b/klp-wms/src/main/java/com/klp/controller/WmsApprovalTaskController.java new file mode 100644 index 00000000..3b6fcc90 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/controller/WmsApprovalTaskController.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.WmsApprovalTaskVo; +import com.klp.domain.bo.WmsApprovalTaskBo; +import com.klp.service.IWmsApprovalTaskService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 审批任务 + * + * @author klp + * @date 2026-01-20 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wms/approvalTask") +public class WmsApprovalTaskController extends BaseController { + + private final IWmsApprovalTaskService iWmsApprovalTaskService; + + /** + * 查询审批任务列表 + */ + @GetMapping("/list") + public TableDataInfo list(WmsApprovalTaskBo bo, PageQuery pageQuery) { + return iWmsApprovalTaskService.queryPageList(bo, pageQuery); + } + + /** + * 导出审批任务列表 + */ + @Log(title = "审批任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsApprovalTaskBo bo, HttpServletResponse response) { + List list = iWmsApprovalTaskService.queryList(bo); + ExcelUtil.exportExcel(list, "审批任务", WmsApprovalTaskVo.class, response); + } + + /** + * 获取审批任务详细信息 + * + * @param taskId 主键 + */ + @GetMapping("/{taskId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long taskId) { + return R.ok(iWmsApprovalTaskService.queryById(taskId)); + } + + /** + * 新增审批任务 + */ + @Log(title = "审批任务", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsApprovalTaskBo bo) { + return toAjax(iWmsApprovalTaskService.insertByBo(bo)); + } + + /** + * 修改审批任务 + */ + @Log(title = "审批任务", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsApprovalTaskBo bo) { + return toAjax(iWmsApprovalTaskService.updateByBo(bo)); + } + + /** + * 删除审批任务 + * + * @param taskIds 主键串 + */ + @Log(title = "审批任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{taskIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] taskIds) { + return toAjax(iWmsApprovalTaskService.deleteWithValidByIds(Arrays.asList(taskIds), true)); + } +} diff --git a/klp-wms/src/main/java/com/klp/domain/WmsApproval.java b/klp-wms/src/main/java/com/klp/domain/WmsApproval.java index 58534403..0724f69d 100644 --- a/klp-wms/src/main/java/com/klp/domain/WmsApproval.java +++ b/klp-wms/src/main/java/com/klp/domain/WmsApproval.java @@ -42,6 +42,22 @@ public class WmsApproval extends BaseEntity { * 审批状态(待审批/已同意/已驳回/已撤销) */ private String approvalStatus; + /** + * 审批类型(single=单人审批,multi=多级审批) + */ + private String approvalType; + /** + * 需要审批的人数 + */ + private Integer requiredApprovers; + /** + * 已审批的人数 + */ + private Integer currentApprovers; + /** + * 最终状态(pending=审批中,all_approved=全部通过,rejected=已驳回) + */ + private String finalStatus; /** * 审批意见 */ diff --git a/klp-wms/src/main/java/com/klp/domain/WmsApprovalTask.java b/klp-wms/src/main/java/com/klp/domain/WmsApprovalTask.java new file mode 100644 index 00000000..5cf79393 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/WmsApprovalTask.java @@ -0,0 +1,69 @@ +package com.klp.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 审批任务对象 wms_approval_task + * + * @author klp + * @date 2026-01-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_approval_task") +public class WmsApprovalTask extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 任务ID,主键 + */ + @TableId(value = "task_id") + private Long taskId; + + /** + * 审批流程ID + */ + private Long approvalId; + + /** + * 审批人ID + */ + private Long approverId; + + /** + * 审批人姓名 + */ + private String approverName; + + /** + * 任务状态 + */ + private String taskStatus; + + /** + * 审批意见 + */ + private String approvalOpinion; + + /** + * 审批时间 + */ + private Date approvalTime; + + /** + * 删除标志(0代表存在 1代表删除) + */ + @TableLogic + private Integer delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalBo.java index 52f59a26..c5c8d130 100644 --- a/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalBo.java +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalBo.java @@ -44,6 +44,26 @@ public class WmsApprovalBo extends BaseEntity { */ private String approvalStatus; + /** + * 审批类型(single=单人审批,multi=多级审批) + */ + private String approvalType; + + /** + * 需要审批的人数 + */ + private Integer requiredApprovers; + + /** + * 已审批的人数 + */ + private Integer currentApprovers; + + /** + * 最终状态(pending=审批中,all_approved=全部通过,rejected=已驳回) + */ + private String finalStatus; + /** * 审批意见 */ diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalTaskBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalTaskBo.java new file mode 100644 index 00000000..4b13c342 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsApprovalTaskBo.java @@ -0,0 +1,58 @@ +package com.klp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 审批任务业务对象 wms_approval_task + * + * @author klp + * @date 2026-01-20 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WmsApprovalTaskBo extends BaseEntity { + + /** + * 任务ID + */ + private Long taskId; + + /** + * 审批ID + */ + private Long approvalId; + + /** + * 审批人ID + */ + private Long approverId; + + /** + * 审批人姓名 + */ + private String approverName; + + /** + * 任务状态 + */ + private String taskStatus; + + /** + * 审批意见 + */ + private String approvalOpinion; + + /** + * 审批时间 + */ + private Date approvalTime; + + /** + * 备注 + */ + private String remark; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalTaskVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalTaskVo.java new file mode 100644 index 00000000..0ce42b54 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalTaskVo.java @@ -0,0 +1,69 @@ +package com.klp.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.convert.ExcelDictConvert; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 审批任务视图对象 wms_approval_task + * + * @author klp + * @date 2026-01-20 + */ +@Data +public class WmsApprovalTaskVo { + + private Long taskId; + + /** + * 审批ID + */ + @ExcelProperty(value = "审批ID") + private Long approvalId; + + /** + * 审批人ID + */ + @ExcelProperty(value = "审批人ID") + private Long approverId; + + /** + * 审批人姓名 + */ + @ExcelProperty(value = "审批人姓名") + private String approverName; + + /** + * 任务状态(pending=待审批,approved=已通过,rejected=已驳回) + */ + @ExcelProperty(value = "任务状态", converter = ExcelDictConvert.class) + private String taskStatus; + + /** + * 审批意见 + */ + @ExcelProperty(value = "审批意见") + private String approvalOpinion; + + /** + * 审批时间 + */ + @ExcelProperty(value = "审批时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date approvalTime; + + private String remark; + + private Date createTime; + + private String createBy; + + private Date updateTime; + + private String updateBy; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalVo.java index bf8c4b74..18a94ac8 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsApprovalVo.java @@ -54,6 +54,32 @@ public class WmsApprovalVo { @ExcelDictFormat(readConverterExp = "待=审批/已同意/已驳回/已撤销") private String approvalStatus; + /** + * 审批类型(single=单人审批,multi=多级审批) + */ + @ExcelProperty(value = "审批类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "single=单人审批,multi=多级审批") + private String approvalType; + + /** + * 需要审批的人数 + */ + @ExcelProperty(value = "需要审批的人数") + private Integer requiredApprovers; + + /** + * 已审批的人数 + */ + @ExcelProperty(value = "已审批的人数") + private Integer currentApprovers; + + /** + * 最终状态(pending=审批中,all_approved=全部通过,rejected=已驳回) + */ + @ExcelProperty(value = "最终状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "pending=审批中,all_approved=全部通过,rejected=已驳回") + private String finalStatus; + /** * 审批意见 */ diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsApprovalTaskMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsApprovalTaskMapper.java new file mode 100644 index 00000000..4cade5d1 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/mapper/WmsApprovalTaskMapper.java @@ -0,0 +1,15 @@ +package com.klp.mapper; + +import com.klp.domain.WmsApprovalTask; +import com.klp.domain.vo.WmsApprovalTaskVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 审批任务Mapper接口 + * + * @author klp + * @date 2026-01-20 + */ +public interface WmsApprovalTaskMapper extends BaseMapperPlus { + +} diff --git a/klp-wms/src/main/java/com/klp/service/IWmsApprovalService.java b/klp-wms/src/main/java/com/klp/service/IWmsApprovalService.java index 0cb3f694..9dd7ec2b 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsApprovalService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsApprovalService.java @@ -47,4 +47,22 @@ public interface IWmsApprovalService { * 校验并批量删除通用审批(支持请假/外出等申请的审批)信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 审批任务通过 + * + * @param taskId 任务ID + * @param approvalOpinion 审批意见 + * @return 操作结果 + */ + Map approveTask(Long taskId, String approvalOpinion); + + /** + * 审批任务驳回 + * + * @param taskId 任务ID + * @param approvalOpinion 审批意见 + * @return 操作结果 + */ + Map rejectTask(Long taskId, String approvalOpinion); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsApprovalTaskService.java b/klp-wms/src/main/java/com/klp/service/IWmsApprovalTaskService.java new file mode 100644 index 00000000..7c864f7a --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/IWmsApprovalTaskService.java @@ -0,0 +1,33 @@ +package com.klp.service; + +import com.klp.domain.WmsApprovalTask; +import com.klp.domain.vo.WmsApprovalTaskVo; +import com.klp.domain.bo.WmsApprovalTaskBo; +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-01-20 + */ +public interface IWmsApprovalTaskService { + + WmsApprovalTaskVo queryById(Long taskId); + + TableDataInfo queryPageList(WmsApprovalTaskBo bo, PageQuery pageQuery); + + List queryList(WmsApprovalTaskBo bo); + + Boolean insertByBo(WmsApprovalTaskBo bo); + + Boolean updateByBo(WmsApprovalTaskBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List queryByApprovalId(Long approvalId); +} diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalServiceImpl.java index c1a2438f..1da916c1 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalServiceImpl.java @@ -2,22 +2,35 @@ package com.klp.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; -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.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.model.LoginUser; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.entity.SysDept; +import com.klp.common.core.domain.entity.SysUser; import com.klp.common.core.service.UserService; +import com.klp.common.helper.LoginHelper; import com.klp.common.utils.StringUtils; +import com.klp.domain.WmsApprovalTask; +import com.klp.system.mapper.SysDeptMapper; +import com.klp.system.mapper.SysUserMapper; import com.klp.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.klp.domain.bo.WmsApprovalBo; import com.klp.domain.vo.WmsApprovalVo; import com.klp.domain.WmsApproval; +import com.klp.domain.bo.WmsApprovalTaskBo; +import com.klp.domain.vo.WmsApprovalTaskVo; import com.klp.mapper.WmsApprovalMapper; +import com.klp.mapper.WmsApprovalTaskMapper; import com.klp.service.IWmsApprovalService; +import com.klp.service.IWmsApprovalTaskService; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -25,6 +38,7 @@ import com.klp.mapper.WmsLeaveRequestMapper; import com.klp.mapper.WmsOutRequestMapper; import com.klp.domain.vo.WmsLeaveRequestVo; import com.klp.domain.vo.WmsOutRequestVo; +import com.klp.domain.WmsLeaveRequest; /** * 通用审批(支持请假/外出等申请的审批)Service业务层处理 @@ -37,9 +51,12 @@ import com.klp.domain.vo.WmsOutRequestVo; public class WmsApprovalServiceImpl implements IWmsApprovalService { private final WmsApprovalMapper baseMapper; + private final WmsApprovalTaskMapper approvalTaskMapper; private final WmsLeaveRequestMapper leaveRequestMapper; private final WmsOutRequestMapper outRequestMapper; private final ISysUserService userService; + private final SysDeptMapper deptMapper; + private final SysUserMapper userMapper; /** * 查询通用审批(支持请假/外出等申请的审批) @@ -79,7 +96,7 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { } /** - * 查询通用审批列表(含请假/外出详情+创建人昵称转换) + * 查询通用审批列表(含请假/外出详情+创建人昵称转换+审批任务) */ @Override public TableDataInfo> queryPageList(WmsApprovalBo bo, PageQuery pageQuery) { @@ -99,7 +116,23 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { return TableDataInfo.build(emptyResultPage); } - // 2. 处理审批列表,拼接请假/外出详情,并收集所有需要转换的创建人账号 + // 2. 收集所有审批ID,用于查询审批任务 + List approvalIds = approvalList.stream() + .map(WmsApprovalVo::getApprovalId) + .collect(Collectors.toList()); + + // 2.1 批量查询所有审批任务 + List allTasks = approvalTaskMapper.selectVoList( + Wrappers.lambdaQuery() + .in(com.klp.domain.WmsApprovalTask::getApprovalId, approvalIds) + .orderByAsc(com.klp.domain.WmsApprovalTask::getCreateTime) + ); + + // 2.2 按审批ID分组任务 + Map> tasksMap = allTasks.stream() + .collect(Collectors.groupingBy(WmsApprovalTaskVo::getApprovalId)); + + // 3. 处理审批列表,拼接请假/外出详情,并收集所有需要转换的创建人账号 List> resultList = new ArrayList<>(); Set userNames = new HashSet<>(); // 存储所有需要查询昵称的账号 @@ -107,11 +140,15 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { Map item = new HashMap<>(); item.put("approval", approval); // 审批基础信息 + // 3.1 添加审批任务列表 + List tasks = tasksMap.getOrDefault(approval.getApprovalId(), new ArrayList<>()); + item.put("tasks", tasks); + String applyType = approval.getApplyType(); Long applyId = approval.getApplyId(); Object detail = null; - // 3. 查询请假/外出详情,并收集创建人账号 + // 4. 查询请假/外出详情,并收集创建人账号 if (StringUtils.isNotBlank(applyType) && applyId != null) { if ("leave".equalsIgnoreCase(applyType)) { WmsLeaveRequestVo leaveDetail = leaveRequestMapper.selectVoById(applyId); @@ -135,13 +172,13 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { resultList.add(item); } - // 4. 批量查询昵称映射 + // 5. 批量查询昵称映射 Map nickMap = Collections.emptyMap(); if (!userNames.isEmpty()) { nickMap = userService.selectNickNameMapByUserNames(new ArrayList<>(userNames)); } - // 5. 遍历填充请假/外出申请的创建人昵称 + // 6. 遍历填充请假/外出申请的创建人昵称 for (Map item : resultList) { Object detail = item.get("detail"); if (detail == null || nickMap.isEmpty()) { @@ -163,7 +200,7 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { } } - // 6. 构建分页返回结果 + // 7. 构建分页返回结果 Page> resultPage = new Page<>(); resultPage.setRecords(resultList); resultPage.setTotal(approvalPage.getTotal()); @@ -193,6 +230,8 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { lqw.eq(StringUtils.isNotBlank(bo.getApprovalStatus()), WmsApproval::getApprovalStatus, bo.getApprovalStatus()); lqw.eq(StringUtils.isNotBlank(bo.getApprovalOpinion()), WmsApproval::getApprovalOpinion, bo.getApprovalOpinion()); lqw.eq(bo.getApprovalTime() != null, WmsApproval::getApprovalTime, bo.getApprovalTime()); + // 根据创建时间倒叙 + lqw.orderByDesc(WmsApproval::getCreateTime); return lqw; } @@ -200,16 +239,142 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { * 新增通用审批(支持请假/外出等申请的审批) */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(WmsApprovalBo bo) { WmsApproval add = BeanUtil.toBean(bo, WmsApproval.class); validEntityBeforeSave(add); + + if (add.getApprovalType() == null) { + add.setApprovalType("single"); + } + if (add.getRequiredApprovers() == null) { + add.setRequiredApprovers(0); + } + if (add.getCurrentApprovers() == null) { + add.setCurrentApprovers(0); + } + if (add.getFinalStatus() == null) { + add.setFinalStatus("pending"); + } + boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setApprovalId(add.getApprovalId()); + + if ("leave".equals(add.getApplyType()) && add.getApplyId() != null) { + createApprovalTasks(add.getApprovalId(), add.getApplyId(), add.getApplyType(),add.getApprovalType()); + } } return flag; } + private void createApprovalTasks(Long approvalId, Long applyId, String applyType, String approvalType) { + if (!"leave".equals(applyType)) { + return; + } + + WmsLeaveRequest leaveRequest = leaveRequestMapper.selectById(applyId); + if (leaveRequest == null) { + return; + } + + boolean isMultiLevel = approvalType.equals("multi"); + + WmsApproval updateApproval = new WmsApproval(); + updateApproval.setApprovalId(approvalId); + updateApproval.setApprovalType(approvalType); + + if (isMultiLevel) { + List leaderUserIds = getDeptLeaders(leaveRequest.getApplicantDeptName()); + updateApproval.setRequiredApprovers(leaderUserIds.size()); + + for (Long leaderUserId : leaderUserIds) { + SysUser leaderUser = userMapper.selectById(leaderUserId); + if (leaderUser != null) { + WmsApprovalTaskBo taskBo = new WmsApprovalTaskBo(); + taskBo.setApprovalId(approvalId); + taskBo.setApproverId(leaderUserId); + taskBo.setApproverName(leaderUser.getNickName()); + taskBo.setTaskStatus("pending"); + approvalTaskMapper.insert(BeanUtil.toBean(taskBo, WmsApprovalTask.class)); + } + } + } else { + updateApproval.setRequiredApprovers(1); + LoginUser currentUser = LoginHelper.getLoginUser(); + if (currentUser != null) { + WmsApprovalTaskBo taskBo = new WmsApprovalTaskBo(); + taskBo.setApprovalId(approvalId); + taskBo.setApproverId(LoginHelper.getUserId()); + taskBo.setApproverName(LoginHelper.getNickName()); + taskBo.setTaskStatus("pending"); + approvalTaskMapper.insert(BeanUtil.toBean(taskBo, WmsApprovalTask.class)); + } + } + + baseMapper.updateById(updateApproval); + } + + private List getDeptLeaders(String applicantDeptName) { + List leaderUserIds = new ArrayList<>(); + + if (StringUtils.isBlank(applicantDeptName)) { + return leaderUserIds; + } + + // 根据部门名称查询部门信息 + SysDept dept = deptMapper.selectOne(new LambdaQueryWrapper() + .eq(SysDept::getDeptName, applicantDeptName)); + + if (dept == null) { + return leaderUserIds; + } + + // 获取部门的所有祖先部门ID(包括自己) + List ancestorDeptIds = new ArrayList<>(); + Long currentDeptId = dept.getDeptId(); + + while (currentDeptId != null) { + ancestorDeptIds.add(currentDeptId); + SysDept currentDept = deptMapper.selectById(currentDeptId); + if (currentDept != null) { + currentDeptId = currentDept.getParentId(); + } else { + break; + } + } + + // 查询每个祖先部门的leader字段内容 + if (!ancestorDeptIds.isEmpty()) { + List ancestorDepts = deptMapper.selectList(new LambdaQueryWrapper() + .in(SysDept::getDeptId, ancestorDeptIds)); + + if (CollectionUtil.isNotEmpty(ancestorDepts)) { + // 提取所有leader字段的内容 + List leaderNames = ancestorDepts.stream() + .map(SysDept::getLeader) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + + // 根据leader名称查询对应的用户ID + if (!leaderNames.isEmpty()) { + List leaders = userMapper.selectList(new LambdaQueryWrapper() + .in(SysUser::getNickName, leaderNames)); + + if (CollectionUtil.isNotEmpty(leaders)) { + leaderUserIds = leaders.stream() + .map(SysUser::getUserId) + .distinct() + .collect(Collectors.toList()); + } + } + } + } + + return leaderUserIds; + } + /** * 修改通用审批(支持请假/外出等申请的审批) */ @@ -238,4 +403,80 @@ public class WmsApprovalServiceImpl implements IWmsApprovalService { return baseMapper.deleteBatchIds(ids) > 0; } + @Override + @Transactional(rollbackFor = Exception.class) + public Map approveTask(Long taskId, String approvalOpinion) { + Map result = new HashMap<>(); + + com.klp.domain.WmsApprovalTask task = approvalTaskMapper.selectById(taskId); + if (task == null) { + result.put("success", false); + result.put("message", "审批任务不存在"); + return result; + } + + if (!"pending".equals(task.getTaskStatus())) { + result.put("success", false); + result.put("message", "该任务已审批,不能重复审批"); + return result; + } + + task.setTaskStatus("approved"); + task.setApprovalOpinion(approvalOpinion); + task.setApprovalTime(new Date()); + approvalTaskMapper.updateById(task); + + WmsApproval approval = baseMapper.selectById(task.getApprovalId()); + if (approval != null) { + int currentApprovers = (approval.getCurrentApprovers() != null ? approval.getCurrentApprovers() : 0) + 1; + approval.setCurrentApprovers(currentApprovers); + + if (currentApprovers >= approval.getRequiredApprovers()) { + approval.setApprovalStatus("已同意"); + approval.setFinalStatus("all_approved"); + } + + baseMapper.updateById(approval); + } + + result.put("success", true); + result.put("message", "审批通过"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map rejectTask(Long taskId, String approvalOpinion) { + Map result = new HashMap<>(); + + com.klp.domain.WmsApprovalTask task = approvalTaskMapper.selectById(taskId); + if (task == null) { + result.put("success", false); + result.put("message", "审批任务不存在"); + return result; + } + + if (!"pending".equals(task.getTaskStatus())) { + result.put("success", false); + result.put("message", "该任务已审批,不能重复审批"); + return result; + } + + task.setTaskStatus("rejected"); + task.setApprovalOpinion(approvalOpinion); + task.setApprovalTime(new Date()); + approvalTaskMapper.updateById(task); + + WmsApproval approval = baseMapper.selectById(task.getApprovalId()); + if (approval != null) { + approval.setApprovalStatus("已驳回"); + approval.setFinalStatus("rejected"); + baseMapper.updateById(approval); + } + + result.put("success", true); + result.put("message", "审批驳回"); + return result; + } + } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalTaskServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalTaskServiceImpl.java new file mode 100644 index 00000000..7a35d419 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsApprovalTaskServiceImpl.java @@ -0,0 +1,90 @@ +package com.klp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +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.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.klp.domain.WmsApprovalTask; +import com.klp.domain.bo.WmsApprovalTaskBo; +import com.klp.domain.vo.WmsApprovalTaskVo; +import com.klp.mapper.WmsApprovalTaskMapper; +import com.klp.service.IWmsApprovalTaskService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 审批任务Service业务层处理 + * + * @author klp + * @date 2026-01-20 + */ +@RequiredArgsConstructor +@Service +public class WmsApprovalTaskServiceImpl implements IWmsApprovalTaskService { + + private final WmsApprovalTaskMapper baseMapper; + + @Override + public WmsApprovalTaskVo queryById(Long taskId) { + return baseMapper.selectVoById(taskId); + } + + @Override + public TableDataInfo queryPageList(WmsApprovalTaskBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(WmsApprovalTaskBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WmsApprovalTaskBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getApprovalId() != null, WmsApprovalTask::getApprovalId, bo.getApprovalId()); + lqw.eq(bo.getApproverId() != null, WmsApprovalTask::getApproverId, bo.getApproverId()); + lqw.eq(bo.getApproverName() != null, WmsApprovalTask::getApproverName, bo.getApproverName()); + lqw.eq(bo.getTaskStatus() != null, WmsApprovalTask::getTaskStatus, bo.getTaskStatus()); + lqw.orderByDesc(WmsApprovalTask::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(WmsApprovalTaskBo bo) { + WmsApprovalTask add = BeanUtil.toBean(bo, WmsApprovalTask.class); + validEntityBeforeSave(add); + return baseMapper.insert(add) > 0; + } + + private void validEntityBeforeSave(WmsApprovalTask entity) { + } + + @Override + public Boolean updateByBo(WmsApprovalTaskBo bo) { + WmsApprovalTask update = BeanUtil.toBean(bo, WmsApprovalTask.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List queryByApprovalId(Long approvalId) { + return baseMapper.selectVoList(Wrappers.lambdaQuery() + .eq(WmsApprovalTask::getApprovalId, approvalId) + .orderByAsc(WmsApprovalTask::getCreateTime)); + } +} diff --git a/klp-wms/src/main/resources/mapper/klp/WmsApprovalMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsApprovalMapper.xml index 49ae471a..8ed0be60 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsApprovalMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsApprovalMapper.xml @@ -10,6 +10,10 @@ + + + + diff --git a/klp-wms/src/main/resources/mapper/klp/WmsApprovalTaskMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsApprovalTaskMapper.xml new file mode 100644 index 00000000..8002d3fe --- /dev/null +++ b/klp-wms/src/main/resources/mapper/klp/WmsApprovalTaskMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +