提交 be28c0e2 authored 作者: hzh's avatar hzh

部门文件审批功能实现

上级 d6251d66
package org.dromara.workflow.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.workflow.domain.bo.FileApproveBo;
import org.dromara.workflow.domain.vo.FileApproveVo;
import org.dromara.workflow.service.IFileApproveService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 部门文件下载申请
* 前端访问路由地址为:/workflow/fileApprove
*
* @author hzh
* @date 2025-05-22
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/fileApprove")
public class FileApproveController extends BaseController {
private final IFileApproveService fileApproveService;
/**
* 查询部门文件下载申请列表
*/
@GetMapping("/list")
public TableDataInfo<FileApproveVo> list(FileApproveBo bo, PageQuery pageQuery) {
return fileApproveService.queryPageList(bo, pageQuery);
}
/**
* 获取部门文件下载申请详细信息
*
* @param id 主键
*/
@SaCheckPermission("workflow:fileApprove:query")
@GetMapping("/{id}")
public R<FileApproveVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(fileApproveService.queryById(id));
}
/**
* 新增部门文件下载申请
*/
@Log(title = "部门文件下载申请", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<FileApproveVo> add(@Validated(AddGroup.class) @RequestBody FileApproveBo bo) {
return R.ok(fileApproveService.insert(bo));
}
/**
* 修改部门文件下载申请
*/
@Log(title = "部门文件下载申请", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<FileApproveVo> edit(@Validated(EditGroup.class) @RequestBody FileApproveBo bo) {
return R.ok(fileApproveService.update(bo));
}
/**
* 删除部门文件下载申请
*
* @param ids 主键串
*/
@SaCheckPermission("workflow:fileApprove:remove")
@Log(title = "部门文件下载申请", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(fileApproveService.deleteWithValidByIds(List.of(ids), true));
}
}
package org.dromara.workflow.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 部门文件下载申请对象 sys_dept_file_approve
*
* @author hzh
* @date 2025-05-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dept_file_approve")
public class FileApprove extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 部门文件id
*/
private Long sysDeptFileId;
/**
* 文件名称
*/
private String fileName;
/**
* 用途
*/
private String purpose;
/**
* 邮箱
*/
private String email;
/**
* 状态
*/
private String status;
}
package org.dromara.workflow.domain.bo;
import org.dromara.workflow.domain.FileApprove;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 部门文件下载申请业务对象 sys_dept_file_approve
*
* @author hzh
* @date 2025-05-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = FileApprove.class, reverseConvertGenerate = false)
public class FileApproveBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 部门文件id
*/
@NotNull(message = "部门文件id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long sysDeptFileId;
/**
* 文件名称
*/
@NotBlank(message = "文件名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String fileName;
/**
* 用途
*/
@NotBlank(message = "用途不能为空", groups = { AddGroup.class, EditGroup.class })
private String purpose;
/**
* 邮箱
*/
@NotBlank(message = "邮箱不能为空", groups = { AddGroup.class, EditGroup.class })
private String email;
/**
* 状态
*/
@NotBlank(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
private String status;
}
package org.dromara.workflow.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.workflow.domain.FileApprove;
import java.io.Serial;
import java.io.Serializable;
/**
* 部门文件下载申请视图对象 sys_dept_file_approve
*
* @author hzh
* @date 2025-05-22
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = FileApprove.class)
public class FileApproveVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 部门文件id
*/
@ExcelProperty(value = "部门文件id")
private Long sysDeptFileId;
/**
* 文件名称
*/
@ExcelProperty(value = "文件名称")
private String fileName;
/**
* 用途
*/
@ExcelProperty(value = "用途")
private String purpose;
/**
* 邮箱
*/
@ExcelProperty(value = "邮箱")
private String email;
/**
* 状态
*/
@ExcelProperty(value = "状态")
private String status;
}
package org.dromara.workflow.mapper;
import org.dromara.workflow.domain.FileApprove;
import org.dromara.workflow.domain.vo.FileApproveVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 部门文件下载申请Mapper接口
*
* @author hzh
* @date 2025-05-22
*/
public interface FileApproveMapper extends BaseMapperPlus<FileApprove, FileApproveVo> {
}
package org.dromara.workflow.service;
import org.dromara.common.mybatis.service.IBaseService;
import org.dromara.workflow.domain.FileApprove;
import org.dromara.workflow.domain.bo.FileApproveBo;
import org.dromara.workflow.domain.vo.FileApproveVo;
/**
* 部门文件下载申请Service接口
*
* @author hzh
* @date 2025-05-22
*/
public interface IFileApproveService extends IBaseService<FileApproveVo, FileApproveBo, FileApprove>{
/**
* 新增
* @param bo bo
* @return 数据
*/
FileApproveVo insert(FileApproveBo bo);
/**
* 修改
* @param bo bo
* @return 数据
*/
FileApproveVo update(FileApproveBo bo);
}
package org.dromara.workflow.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.service.AbstractBaseService;
import org.dromara.workflow.api.domain.event.ProcessEvent;
import org.dromara.workflow.api.domain.event.ProcessTaskEvent;
import org.dromara.workflow.domain.FileApprove;
import org.dromara.workflow.domain.bo.FileApproveBo;
import org.dromara.workflow.domain.vo.FileApproveVo;
import org.dromara.workflow.mapper.FileApproveMapper;
import org.dromara.workflow.service.IFileApproveService;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 部门文件下载申请Service业务层处理
*
* @author hzh
* @date 2025-05-22
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class FileApproveServiceImpl extends AbstractBaseService<FileApproveVo, FileApproveBo, FileApprove> implements IFileApproveService {
private final FileApproveMapper baseMapper;
@Override
public BaseMapperPlus<FileApprove, FileApproveVo> mapper() {
return baseMapper;
}
@Override
public LambdaQueryWrapper<FileApprove> buildQueryWrapper(FileApproveBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<FileApprove> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getSysDeptFileId() != null, FileApprove::getSysDeptFileId, bo.getSysDeptFileId());
lqw.like(StringUtils.isNotBlank(bo.getFileName()), FileApprove::getFileName, bo.getFileName());
lqw.eq(StringUtils.isNotBlank(bo.getPurpose()), FileApprove::getPurpose, bo.getPurpose());
lqw.eq(StringUtils.isNotBlank(bo.getEmail()), FileApprove::getEmail, bo.getEmail());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), FileApprove::getStatus, bo.getStatus());
return lqw;
}
@Override
public FileApproveVo insert(FileApproveBo bo) {
FileApprove add = MapstructUtils.convert(bo, FileApprove.class);
if (StringUtils.isBlank(add.getStatus())) {
add.setStatus(BusinessStatusEnum.DRAFT.getStatus());
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return MapstructUtils.convert(add, FileApproveVo.class);
}
@Override
public FileApproveVo update(FileApproveBo bo) {
FileApprove update = MapstructUtils.convert(bo, FileApprove.class);
baseMapper.updateById(update);
return MapstructUtils.convert(update, FileApproveVo.class);
}
/**
* 总体流程监听(例如: 提交 退回 撤销 终止 作废等)
* 正常使用只需#processEvent.key=='leave1'
* 示例为了方便则使用startsWith匹配了全部示例key
*
* @param processEvent 参数
*/
@EventListener(condition = "#processEvent.key.startsWith('dept_file_approve')")
public void processHandler(ProcessEvent processEvent) {
log.info("当前任务执行了{}", processEvent.toString());
FileApprove fa = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey()));
fa.setStatus(processEvent.getStatus());
if (processEvent.isSubmit()) {
fa.setStatus(BusinessStatusEnum.WAITING.getStatus());
}
baseMapper.updateById(fa);
}
/**
* 执行办理任务监听
* 示例:也可通过 @EventListener(condition = "#processTaskEvent.key=='leave1'")进行判断
* 在方法中判断流程节点key
* if ("xxx".equals(processTaskEvent.getTaskDefinitionKey())) {
* //执行业务逻辑
* }
*
* @param processTaskEvent 参数
*/
@EventListener(condition = "#processTaskEvent.key.startsWith('dept_file_approve')")
public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
// 所有demo案例的申请人节点id
String[] ids = {};
if (StringUtils.equalsAny(processTaskEvent.getTaskDefinitionKey(), ids)) {
log.info("当前任务执行了{}", processTaskEvent.toString());
FileApprove fa = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey()));
fa.setStatus(BusinessStatusEnum.WAITING.getStatus());
baseMapper.updateById(fa);
}
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.workflow.mapper.FileApproveMapper">
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论