- java实现审核流程

  • java实现审核流程

```java
CREATE TABLE `t_process_flow` (
  `process_id` bigint NOT NULL AUTO_INCREMENT COMMENT '审批任务流程id\r\n',
  `purchase_id` int DEFAULT NULL COMMENT '供应商子公司采购id',
  `operator_id` bigint DEFAULT NULL,
  `action` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `result` varchar(255) DEFAULT NULL,
  `reason` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `audit_time` datetime DEFAULT NULL,
  `order_no` int DEFAULT NULL,
  `state` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `is_last` int DEFAULT NULL COMMENT '是否是最后节点 0-1-是',
  PRIMARY KEY (`process_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;```

@Service
public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements IPurchaseService {

    @Autowired
    private PurchaseMapper purchaseMapper;
    @Autowired
    private ProcessFlowMapper processFlowMapper;

    @Override
    public Purchase createPurchase(Purchase purchase,Integer adminUserId) {
        //todo 事业部领导或者集团领导会不会直接添加供应商子公司采购??????
        //月度合作额度(元)
        Double monthlyCooperationQuota = purchase.getMonthlyCooperationQuota();

        // todo 查询当前用户的信息,及根据金额规则区间获取审批人

        // todo 保存供应商子公司采购信息
        purchase.setCreateTime(new Date());
        purchase.setCreator(1);
        purchase.setState(1);
        purchaseMapper.insert(purchase);
        // todo 保存审理流程表信息
        //1.保存第一条流程信息,表名表单提交,状态为complete
        ProcessFlow flow1 = new ProcessFlow();
        flow1.setPurchaseId(purchase.getId());
        flow1.setOperatorId(adminUserId.longValue());
        flow1.setAction("apply");
        flow1.setCreateTime(new Date());
        flow1.setOrderNo(1);
        flow1.setState("complete");
        flow1.setIsLast(0);
        processFlowMapper.insert(flow1);
        //2. 分情况保存审批人流程信息
        //2.1  根据月度合作额度决定审核主体
        Integer routeFlag = route(monthlyCooperationQuota);
        //todo 获取审核下一节点领导id
        ProcessFlow flow2 = new ProcessFlow();
        flow2.setPurchaseId(purchase.getId());
        flow2.setAction("audit");
        flow2.setCreateTime(new Date());
        flow2.setOrderNo(2);
        flow2.setState("process");

        if(Objects.equals(ApprovalProcessEnum.BUSINESS_DIVISION.getCode(), routeFlag)||
                Objects.equals(ApprovalProcessEnum.GROUP.getCode(), routeFlag)){
            //2.1.1 一级审核:事业部一级审核 或者 集团一级审核
            flow2.setOperatorId(getLeader(ApprovalProcessEnum.BUSINESS_DIVISION.getCode()));
            flow2.setIsLast(1);
            processFlowMapper.insert(flow2);
        }else {
            //2.1.2 事业部和集团两级审核
            //todo 获取当前用户的所属事业部领导和集团领导
            //事业部审核
            flow2.setOperatorId(getLeader(ApprovalProcessEnum.BUSINESS_DIVISION.getCode()));
            flow2.setIsLast(0);
            processFlowMapper.insert(flow2);
            //集团审核
            ProcessFlow flow3 = new ProcessFlow();
            flow3.setPurchaseId(purchase.getId());
            flow3.setAction("audit");
            flow3.setCreateTime(new Date());
            flow3.setOrderNo(3);
            flow3.setState("ready");
            flow3.setIsLast(1);
            processFlowMapper.insert(flow3);
        }

        // todo 保存流程通知表信息

        return purchase;
    }

    @Override
    public void audit(Long purchaseId, Long operatorId, Integer result, String reason) {
        //当前审核任务对象
        ProcessFlow process;

        //1.无论同意/驳回,当前任务状态变更为complete
        //通过采购id查询业务流程集合,按照审核流程序号
        Wrapper<ProcessFlow> wrapper = new EntityWrapper<>();
        wrapper.eq("purchase_id", purchaseId).last("order by order_no");
        List<ProcessFlow> flowList = processFlowMapper.selectList(wrapper);

        if(flowList.size() == 0){
            throw new ResponseException("无效的审批流程");
        }
        //获取当前任务ProcessFlow对象
        List<ProcessFlow> processList = flowList.stream()
                .filter(p -> Objects.equals(p.getOperatorId(), operatorId) && p.getState().equals(ProvessStateEnum.PROCESS.getValue()))
                .collect(Collectors.toList());

        if(processList.size()==0){
            throw new ResponseException("未找到待处理任务");
        }else {
            process = processList.get(0);
            process.setState(ProvessStateEnum.COMPLETE.getValue());
            //result审核结果状态:2-审核通过,3-审核拒绝
            //todo 把String改成int类型的
            process.setResult(result.toString());
            process.setReason(reason);
            process.setAuditTime(new Date());
            processFlowMapper.updateById(process);
        }
        //2.如果当前任务是最后一个节点,代表流程结束,更新请假单状态为对应的 2-审核通过,3-审核拒绝
        Purchase purchase = purchaseMapper.selectById(purchaseId);
        if(process.getIsLast() == 1){
            //状态:1-待审核,2-审核通过,3-审核拒绝
            purchase.setState(result);
            purchaseMapper.updateById(purchase);
        }else {
            //readyList包含所有后续任务节点
            List<ProcessFlow> readyList = flowList.stream()
                    .filter(p -> p.getState().equals(ProvessStateEnum.READY.getValue()))
                    .collect(Collectors.toList());
            //3.如果当前任务不是最后一个节点且审批通过,那下一个节点的状态从ready变为process
            if(result.equals(PurchaseAuditTypeEnum.APPROVED.getCode())){
                ProcessFlow readyProcess = readyList.get(0);
                readyProcess.setState(ProvessStateEnum.PROCESS.getValue());
                processFlowMapper.updateById(readyProcess);
            }else if(result.equals(PurchaseAuditTypeEnum.REFUSED.getCode())) {
                //4.如果当前任务不是最后一个节点且审批驳回,则后续所有任务状态变为cancel,请假单状态变为refused
                for(ProcessFlow p:readyList){
                    p.setState(ProvessStateEnum.CANCEL.getValue());
                    processFlowMapper.updateById(p);
                }
                purchase.setState(result);
                purchaseMapper.updateById(purchase);
            }
        }
    }


    /**
     * 审核流-路由方法
     * 月度合作额度(元)
     * @param monthlyCooperationQuota
     * @return 路由标识 1-事业部一级审核 2-事业部->集团两级审核 3.集团一级审核
     */
    private Integer route(Double monthlyCooperationQuota) {
        //todo 使用数据字典返回对应值,逻辑待实现
        return 1;
    }

    /**
     * 获取分管领导id
     * @param level 1-事业部 3-集团
     * @return
     */
    private Long getLeader(Integer level) {
        //todo 实现获取分管领导id逻辑
        return null;
    }
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java可以通过以下步骤来实现流程审批: 1. 设计数据库表结构:创建用于存储流程定义、流程实例和审批记录等信息的数据库表。 2. 定义流程模型:使用BPMN(Business Process Model and Notation)或自定义的方式,定义流程的节点、连线和条件等信息。 3. 实现流程引擎:使用Java编写流程引擎,负责解析和执行流程模型。流程引擎需要提供以下功能: - 流程部署:将流程模型解析为可执行的流程定义,并保存到数据库中。 - 流程启动:创建流程实例,并将其保存到数据库中。 - 任务分配:根据流程定义和流程实例,将任务分配给相应的用户或角色。 - 任务处理:用户或角色完成任务后,更新任务状态,并记录审批意见和审批结果等信息。 - 流程跟踪:提供查询接口,可以根据流程实例ID查询当前流程的状态和历史审批记录等信息。 4. 定义审批界面:使用Java的GUI(图形用户界面)技术,设计和实现审批界面,用于展示待审批任务和处理审批任务。 5. 集成权限管理:根据实际需求,将流程审批与权限管理系统集成,确保只有具有相应权限的用户可以处理相应的审批任务。 6. 实现通知机制:根据流程规则和审批结果,实现消息通知功能,例如发送邮件或短信通知审批结果。 7. 集成报表统计:根据业务需求,设计并实现报表统计功能,用于分析和监控流程审批的效率和质量。 以上是一个简单的流程审批系统的实现步骤,具体实现过程中还需要根据具体业务需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值