首页 > 其他分享 >责任链设计模式进行多级审批

责任链设计模式进行多级审批

时间:2023-05-10 16:35:53浏览次数:29  
标签:auditlist temp 多级 jeethink audituser 审批 审核 设计模式 com

业务场景:在上篇泛型用法中将所有的审批业务都通过泛型方法进行插入待审核记录了,现在便需要对这些待审记录进行审批,由于客户需要多级审批,也就是每个业务的审批人数都不相同

为此引入责任链设计模式

1.首先,创建五级审核人表(最多五级),对各个业务类型,部门分配对应的审核人

 2.创建责任链

        2.1:通用责任链接口(五级责任链均实现此接口)

package com.jeethink.project.business.audit;

import com.jeethink.project.business.domain.BusinessAuditlist;
import com.jeethink.project.system.domain.SysUser;

public interface AuditHandler {
    void handle(BusinessAuditlist auditlist, SysUser user, String status, String reason);
}

  2.2:实现方法,其中有一个字段为auditLink,表示审核环节字段,每次审核成功之后审核环节自增,最终审批完成之后将其设为空(后续审核代码中会呈现)

package com.jeethink.project.business.audit;

import com.jeethink.common.utils.DateUtils;
import com.jeethink.project.business.domain.BusinessAuditlist;
import com.jeethink.project.system.domain.SysUser;

/**
 * 责任链设计模式
 */
public class AuditHandler1 implements AuditHandler{
    private AuditHandler nextHandler;

    public void setNextHandler(AuditHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
    @Override
    public void handle(BusinessAuditlist auditlist, SysUser user, String status, String reason) {
        if (auditlist.getAuditLink() == 0) {
            auditlist.setAudit1UserId(user.getUserId());
            auditlist.setAudit1Time(DateUtils.getNowDate());
            auditlist.setAudit1UserName(user.getNickName());
            auditlist.setAudit1Status(status);
            auditlist.setAudit1Reason(reason);
        } else if (nextHandler != null) {
            nextHandler.handle(auditlist, user, status, reason);
        } else {
            throw new RuntimeException("审核失败");
        }
    }
}

  2.3 实现方法2:

     

package com.jeethink.project.business.audit;

import com.jeethink.common.utils.DateUtils;
import com.jeethink.project.business.domain.BusinessAuditlist;
import com.jeethink.project.system.domain.SysUser;

public class AuditHandler2 implements AuditHandler {

    private AuditHandler nextHandler;

    public void setNextHandler(AuditHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
    @Override
    public void handle(BusinessAuditlist auditlist, SysUser user, String status, String reason) {
        if (auditlist.getAuditLink() == 1) {
            auditlist.setAudit2UserId(user.getUserId());
            auditlist.setAudit2Time(DateUtils.getNowDate());
            auditlist.setAudit2UserName(user.getNickName());
            auditlist.setAudit2Status(status);
            auditlist.setAudit2Reason(reason);
        } else if (nextHandler != null) {
            nextHandler.handle(auditlist, user, status, reason);
        } else {
            throw new RuntimeException("审核失败");
        }

    }

}

  另外3,4,5级审批同上

   2.4:组成链路关系类

package com.jeethink.project.business.audit;

import com.jeethink.project.business.domain.BusinessAuditlist;
import com.jeethink.project.system.domain.SysUser;

/**
 * 组成链路关系
 */
public class AuditHandlerChain {

    private AuditHandler headHandler;

    public void setHeadHandler(AuditHandler headHandler) {
        this.headHandler = headHandler;
    }
    public void handle(BusinessAuditlist auditlist, SysUser user, String status, String reason) {
        headHandler.handle(auditlist, user, status, reason);
    }

}

  2.5:审核业务代码

/**
     * 责任链设计模式
     * @param businessAuditlist
     * @return
     */
    @PreAuthorize("@ss.hasPermi('business:auditlist:edit')")
    @Log(title = "待审核业务", businessType = BusinessType.UPDATE)
    @PutMapping("/audit")
    public AjaxResult audit(@RequestBody BusinessAuditlist businessAuditlist) {
        BusinessAuditlist temp = businessAuditlistService.selectBusinessAuditlistById(businessAuditlist.getId());
        if (temp == null) {
            return AjaxResult.error("查询待审核信息失败");
        }
        //当前审核人不是指定的审核人
        if(!Objects.equals(temp.getNestAudituserid(), getUserId())){
            return AjaxResult.error("非期望审核用户");
        }
        SysUser sysUser = getLoginUser().getUser();
        //查询出此环节的各个审核人
        AuditUserInfoParam auditUserInfoParam = new AuditUserInfoParam();
        auditUserInfoParam.setBusinessType(temp.getBusinessType());
        //todo 部门,单位
        BusinessAudituser audituser = audituserService.selectAuditUserByParam(auditUserInfoParam);
        //创建责任链
        AuditHandlerChain handlerChain = new AuditHandlerChain();
        AuditHandler1 handler1 = new AuditHandler1();
        AuditHandler2 handler2 = new AuditHandler2();
        AuditHandler3 handler3 = new AuditHandler3();
        AuditHandler4 handler4 = new AuditHandler4();
        AuditHandler5 handler5 = new AuditHandler5();
        handler1.setNextHandler(handler2);
        handler2.setNextHandler(handler3);
        handler3.setNextHandler(handler4);
        handler4.setNextHandler(handler5);
        handlerChain.setHeadHandler(handler1);
        handlerChain.handle(temp, sysUser, businessAuditlist.getAuditStatus(), businessAuditlist.getAuditReason());
        //审核成功
        if ("1".equals(businessAuditlist.getAuditStatus())) {
            //审核环节自增,指定下一级审核
            temp.setAuditLink(temp.getAuditLink() + 1);
            if (temp.getAuditLink() < 5 && audituser != null) {
                Long nextAuditUserId = null;
                switch ((int) temp.getAuditLink()) {
                    case 1:
                        //记录下一级审核人
                        nextAuditUserId = audituser.getAudit2UserId();
                        if(null != nextAuditUserId){
                            temp.setAudit2Status("0");
                            temp.setAudit2UserId(audituser.getAudit2UserId());
                            temp.setAudit2UserName(audituser.getAudit2UserName());
                        }
                        break;
                    case 2:
                        nextAuditUserId = audituser.getAudit3UserId();
                        if(null != nextAuditUserId) {
                            temp.setAudit3Status("0");
                            temp.setAudit3UserId(audituser.getAudit3UserId());
                            temp.setAudit3UserName(audituser.getAudit3UserName());
                        }
                        break;
                    case 3:
                        nextAuditUserId = audituser.getAudit4UserId();
                        if(null != nextAuditUserId) {
                            temp.setAudit4Status("0");
                            temp.setAudit4UserId(audituser.getAudit4UserId());
                            temp.setAudit4UserName(audituser.getAudit4UserName());
                        }
                        break;
                    case 4:
                        nextAuditUserId = audituser.getAudit5UserId();
                        if(null != nextAuditUserId) {
                            temp.setAudit5Status("0");
                            temp.setAudit5UserId(audituser.getAudit5UserId());
                            temp.setAudit5UserName(audituser.getAudit5UserName());
                        }
                        break;
                    default:
                        return AjaxResult.error("审核环节出错");
                }
                //下一级审核人不为空时,责任链往下继续
                if (nextAuditUserId != null) {
                    temp.setNestAudituserid(nextAuditUserId);
                } else {
                    //下一级审核人为空时,下级审核人为null,正常状态下级审核人会直接为空,直接审核修改这条数据,标识已审核成功
                    temp.setNestAudituserid(null);
                    temp.setIsComplete("1");
                    businessAuditlistService.handleAuditList(temp, businessAuditlist.getAuditReason());
                }
            }
        }
        if("2".equals(businessAuditlist.getAuditStatus())){
            //todo 驳回将原表的状态改为驳回,记录驳回原因
            businessAuditlistService.handleUnAuditList(temp,businessAuditlist.getAuditReason());
            //并且将当前审核的环节改为最终
            temp.setNestAudituserid(null);
            temp.setIsComplete("1");
        }
        return toAjax(businessAuditlistService.updateBusinessAuditlist(temp));
    }

  本质上是每次审核成功查出当前责任链对应的审核用户,而后审核环节自增,指定下一个指定人,当当前审核用户与期望审核人不同是,直接返回错误信息

 

      2.6:审核业务代码

handleAuditList
/**
     * 审核功能
     * @param temp 待审核对象
     * @return
     */
    @Override
    @Transactional
    public int handleAuditList(BusinessAuditlist temp,String auditReason) {
        //todo 根据当前用户审核权限进行不用的审核流程
        int i = 0;
        switch (temp.getBusinessType()){
            case "AssetsReceive" : i = assetsReceiveService.auditAssetsReceive(temp.getApplyId(),auditReason); break;
            case "AssetsTransfer" : i =assetsTransferService.auditAssetsTransfer(temp.getApplyId(),auditReason);break;
            case "AssetsLease" : i = assetsLeaseService.auditAssetsLease(temp.getApplyId(),auditReason);break;
            case "AssetsMaintenance" : i = assetsMaintenanceService.auditAssetsMaintenance(temp.getApplyId(),auditReason);break;
            case "AssetsLend" : i = assetsLendService.auditAssetsLend(temp.getApplyId(),auditReason);break;
            case "AssetsBorrow" : i = assetsBorrowService.auditAssetsBorrow(temp.getApplyId(),auditReason);break;
            default:break;
        }
        this.updateBusinessAuditlist(temp);
        return i;
    }

  再最后更新一下这条审核记录即可,多级审核便完成

标签:auditlist,temp,多级,jeethink,audituser,审批,审核,设计模式,com
From: https://www.cnblogs.com/jy6634/p/17388350.html

相关文章

  • C#设计模式18——迭代器模式的写法
    是什么:迭代器模式是一种行为型设计模式,它允许客户端通过一种统一的方式遍历集合对象中的元素,而无需暴露集合对象的内部结构。为什么:使用迭代器模式可以使得客户端程序与集合对象解耦,从而可以更加灵活地对集合对象进行遍历操作。此外,迭代器模式还可以提高代码的复用性,简化客户端......
  • C#设计模式16——中介者模式的写法
    是什么:中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互。中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活、易于扩展和维护。为什么:中介者模式可以将系统中的对象之间的交互行为进行抽象,从而可以提高系......
  • C#设计模式17——责任链模式的写法
    是什么:责任链模式是一种行为型设计模式,它允许对象组成一个链并依次检查另一个对象是否可以处理请求。如果一个对象可以处理请求,它处理请求,并且负责将请求传递给下一个对象,直到请求被处理为止。为什么:责任链模式可以降低系统中对象之间的耦合度,并提高系统的灵活性和可维护性。同......
  • C#设计模式15——观察者模式的写法
    是什么:观察者模式是一种设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,它的所有依赖者都能够得到相应的通知并作出相应的反应。观察者模式也被称为发布-订阅模式。为什么:观察者模式可以实现对象之间的松耦合,从而使得对象更容易扩展和维护。同时,......
  • C#设计模式14——模板方法的写法
    模板方法(TemplateMethod)是一种设计模式,它定义了一个操作中的算法的骨架,将某些步骤推迟到子类中实现,从而使得子类可以在不改变算法骨架的情况下重新定义算法的某些步骤。作用:使用模板方法可以使得代码的重复度降低,同时也能够避免由于算法中某个特定步骤的改变导致整体算法需要改......
  • C#设计模式13——建造者模式的写法
    1.什么是建造者模式?建造者模式是一种创建型设计模式,它通过将一个复杂的对象分解为多个简单的对象并按照一定的顺序进行组装而创建出一个复杂的对象。这样可以使得构造过程更加灵活,同时也可以隐藏创建过程的复杂性。2.建造者模式的使用场景?建造者模式适用于以下场景:(1)当需......
  • C#设计模式11——代理模式的写法
    1.什么是代理模式?代理模式是一种结构型设计模式,它允许通过代理对象来控制对真实对象的访问,以提供额外的功能或控制访问权限。2.代理模式的作用是什么?代理模式可以为对象提供保护代理、远程代理、虚拟代理和智能引用四种不同的实现方式,以适应不同的应用场景。代理模式还可以用......
  • C#设计模式10——享元模式的写法
    1.什么是享元模式?享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量。它通过将对象分为可共享的和不可共享的来实现这一目的。2.为什么要使用享元模式?使用享元模式可以大大减少系统中对象的数量,从而减少了内存的使用。在对象数量较大,且需要相同状......
  • C#设计模式08——桥接模式的写法
    什么是C#桥接模式?桥接模式是一种结构型设计模式,它可以将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过将实现细节从抽象类中分离出来,从而让它们可以根据需要独立变化。为什么要使用C#桥接模式?C#桥接模式的主要目的是使系统更加灵活,容易扩展和维护,同时避免类之间的紧......
  • C#设计模式07——装饰器模式的写法
    装饰器模式是一种结构型设计模式,可以在不修改原始对象的基础上添加新的功能和行为。该模式通过将对象包装在具有相同接口的装饰器类中来实现此目的。以下是5W1H分析:What(什么)?装饰器模式是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能和行为,而无需修改原始对象的代......