首页 > 其他分享 >审批流程的设计

审批流程的设计

时间:2023-02-22 00:12:42浏览次数:35  
标签:COMMENT AUDIT DEFAULT 流程 suggestion 审核 审批 设计 byte

应用场景

在项目开发中,有时会遇到一些审批流程的需求,流程大同小异,可以根据需求进行设计开发。

表结构示例

CREATE TABLE `tt_audit` (
  `id` int(10) NOT NULL COMMENT '流水号',
  `submit_date` date NOT NULL COMMENT '提交日期',
  `submit_reason` varchar(500)  DEFAULT '' COMMENT '提交意见',
  `submit_user_id` varchar(30) NOT NULL DEFAULT '' COMMENT '提交方用户id',
  `submit_files` varchar(200) DEFAULT NULL COMMENT '提议内容的文件',
  `first_audit_result` tinyint(4)  DEFAULT '0' COMMENT '第一次审核结果 1:通过, 2:驳回',
  `first_audit_idea` varchar(500)  DEFAULT '' COMMENT '第一次审核意见',
  `first_audit_user_id` varchar(30) DEFAULT '' COMMENT '第一次审核的用户id',
  `first_audit_time` datetime DEFAULT NULL COMMENT '第一次审核时间',
  `disapprove_reason` varchar(500) DEFAULT '' COMMENT '不认可原因1',
  `second_audit_result` tinyint(4) DEFAULT '0' COMMENT '二次复审结果 1:通过, 2:驳回',
  `second_audit_idea` varchar(500)  DEFAULT '' COMMENT '二次复审意见',
  `second_audit_user_id` varchar(30) DEFAULT '' COMMENT '二次复审人的用户id',
  `second_audit_time` datetime DEFAULT NULL COMMENT '二次复审意见时间',
  `disapprove_reason2` varchar(500)  DEFAULT '' COMMENT '不认可原因2',
  `third_audit_result` tinyint(4)  DEFAULT '0' COMMENT '第三次复审结果 1:通过, 2:驳回',
  `third_audit_idea` varchar(500)  DEFAULT '' COMMENT '第三次复审意见',
  `third_audit_user_id` varchar(30) DEFAULT '' COMMENT '第三次审核人的用户id',
  `third_audit_user_name` varchar(30) DEFAULT '' COMMENT '第三次审核人姓名',
  `third_audit_time` datetime DEFAULT NULL COMMENT '第三次复审意见时间',
  `finish_time` datetime DEFAULT NULL COMMENT '审核完成时间',
  `deal_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '处理节点状态.1:待第一次审核, 10:第一次审核-通过,
  20:第一次审核-驳回, 30:待二次复审, 40:二次复审完成, 50:二次复审-通过,
  60:二次复审-驳回, 70:待第三次审核, 80:第三次审核完成, 90:审核完成',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间,默认当前时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间,更新时默认当前时间',
  PRIMARY KEY (`id`),
  KEY `idx_submit_user_id` (`submit_user_id`),
  KEY `idx_submit_date` (`submit_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='审核流程表'

设计审批流程表的时候,要注意几点:

  • 要有创建时间、更新时间,出现问题时,有记录时间可以定位。
  • 审核状态,数值最好分隔开,用10,20,30,40,50,不要用12345,这样后续需求变更,流程中新增审核状态时,可以在中间加上新的数值。
  • 反馈时间,反馈人id,反馈人姓名,这几个得有。
  • 审核时间、审核人id、审核人姓名,这几个最好加上,出现线上问题时,方便回溯。

代码示例

  • 审核结果的枚举:

@AllArgsConstructor
@Getter
public enum AuditEnum {


    AUDIT_DEFAULT((byte) 0, ""),
    AUDIT_PASS((byte) 1, "通过"),
    AUDIT_REJECT((byte) 2, "驳回");

    private final byte auditNum;
    private final String auditDesc;

    public static String getDescByAuditNum(byte num) {
        AuditEnum[] values = AuditEnum.values();
        for (AuditEnum e : values) {
            if (e.getAuditNum() == num) {
                return e.getAuditDesc();
            }
        }
        return null;
    }

    public static byte getNumByAuditDesc(String desc) {
        AuditEnum[] values = AuditEnum.values();
        for (AuditEnum e : values) {
            if (e.getAuditDesc().equals(desc)) {
                return e.getAuditNum();
            }
        }
        return (byte) 0;
    }

}

  • 处理状态的枚举:
@AllArgsConstructor
@Getter
public enum DealStatusEnum {

    WAIT_AUDIT((byte) 10, "待初次审核"),
    WAIT_SECOND_AUDIT((byte) 20, "待二次复审"),
    WAIT_THIRD_AUDIT((byte) 30, "待第三次审核"),
    AUDIT_FINISH((byte) 40, "审核完成-通过"),
    AUDIT_HEAD_REJECT((byte) 50, "初次审核不通过"),
    AUDIT_SECOND_REJECT((byte) 60, "二次复审不通过"),
    AUDIT_THIRD_REJECT((byte) 70, "第三次审核不通过"),

    AUDIT_REJECT((byte) 80, "审核完成-驳回");



    private final byte dealStatus;
    private final String dealStatusDesc;

    public static String getDescByStatus(byte dealStatus){
        DealStatusEnum[] values = DealStatusEnum.values();
        for(DealStatusEnum e : values) {
            if(e.getDealStatus() == dealStatus) {
                return e.getDealStatusDesc();
            }
        }
        return null;
    }

}

  • 审批流程:

public class AuditImpl {

    public int audit(SuggestionAuditDTO auditDTO) {

        //当前状态
        Byte dealStatus = auditDTO.getDealStatus();
        suggestion.setDealStatus(dealStatus);

        //根据处理节点的状态,判断审核结果/意见
        if (WAIT_HEAD_AUDIT.getDealStatus() == dealStatus) {
            setFirstAudit(suggestion, auditResult, auditIdea);
        } else if (WAIT_SECOND_AUDIT.getDealStatus() == dealStatus) {
            setSecondAudit(suggestion, auditResult, auditIdea);
        } else if (WAIT_Third_AUDIT.getDealStatus() == dealStatus) {
            setThirdAudit(suggestion, auditResult, auditIdea);
        }
        return updateByIdSelective(suggestion);
    }


    /**
     * 设置第一次审批的结果
     *
     */
    public void setFirstAudit(Suggestion suggestion, Byte auditResult, String auditIdea) {

        suggestion.setFirstAuditResult(auditResult);
        suggestion.setFirstAuditIdea(auditIdea);
        suggestion.setFirstAuditTime(new Date());
        suggestion.setFirstUserId(userId);
        setDealStatusByAudit(suggestion, auditResult, AUDIT_HEAD_PASS.getDealStatus(), AUDIT_HEAD_REJECT.getDealStatus());
    }



    /**
     * 根据审核结果,设置处理节点
     *
     * @param suggestion
     * @param auditResult  审核结果
     * @param passStatus 通过跳转的处理节点
     * @param rejectStatus 不通过跳转的处理节点
     */
    public void setDealStatusByAudit(Suggestion suggestion, Byte auditResult,Byte passStatus, Byte rejectStatus) {
        if (AUDIT_PASS.getAuditNum() == auditResult) {
            suggestion.setDealStatus(passStatus);
        } else if (AUDIT_REJECT.getAuditNum() == auditResult) {
            suggestion.setDealStatus(rejectStatus);
        }

    }


    /**
     * 设置二次复审的结果
     */
    public void setSecondAudit(Suggestion suggestion, Byte auditResult, String auditIdea) {

        suggestion.setSecondAuditResult(auditResult);
        suggestion.setSecondAuditIdea(auditIdea);
        suggestion.setSecondAuditTime(new Date());
        suggestion.setSecondAuditEmpCode(ContextUtils.getContext().getUserNo());
        setDealStatusByAudit(suggestion, auditResult, SECOND_AUDIT_PASS.getDealStatus(), SECOND_AUDIT_REJECT.getDealStatus());
    }



    /**
     * 设置第三次审核的结果
     */
    public void setThirdAudit(Suggestion suggestion, Byte auditResult, String auditIdea ) {

        suggestion.setThirdAuditResult(auditResult);
        suggestion.setThirdAuditIdea(auditIdea);
        suggestion.setThirdAuditTime(new Date());
        suggestion.setThirdAuditEmpCode(userId);

        setDealStatusByAudit(suggestion, auditResult, Third_AUDIT_FINISH.getDealStatus()
                , Third_AUDIT_FINISH.getDealStatus());
    }
    
    
    
}

标签:COMMENT,AUDIT,DEFAULT,流程,suggestion,审核,审批,设计,byte
From: https://www.cnblogs.com/expiator/p/17142977.html

相关文章

  • 设计模式之动态代理
    JDK动态代理:publicinterfaceSubject{publicvoidshopping();} publicclassPersonimplementsSubject{@Overridepublicvoidshopping(){......
  • C#的string是一种糟糕的设计吗?
    前言    最近有人在某平台提问“C#的string是一种糟糕的设计吗?”,他认为官方为字符串做了很多内部优化处理,这种处理增加了理解成本,为什么不能提供char[]指针处理方案呢......
  • 【Vue】Vue开源样式库 Vuex的使用 vuex的执行流程 Vue-router的使用 路由跳转 路由守
    目录昨日回顾纯净的Vue项目今日内容0开源样式库1Vuex的使用1.1vuex的执行流程图Vuex的使用购物车案例2Vue-router的使用2.1基本使用2.2路由的跳转传入字符串进行跳......
  • 【java 基础】代码在jvm的内存运行流程分析总结
    堆:存储new出来的对象(包括成员变量、数组、方法的地址)栈:正在调用的方法中的局部变量(包括方法的参数)方法区/元空间:.class字节码文件(包括所有方法)publicclassStudentTe......
  • B端业务中仓库标签打印系统设计方案
    需求背景:仓库在给客户货物打包途中需要在包裹上贴标签,在客户比较多且标签样式多样化的前提下,给仓库人员带来了工作量,为了节约仓库人员工作流程时间,公司开发了一套标签管理......
  • 一起看看小程序定制开发的基本流程!
    定制开发小程序比起模板来说,流程更加复杂,下面就个大家简单介绍一下小程序开发的基本流程。1、梳理需求。企业和开发公司详细沟通,了解需求企业的具体想法和目的,开发公司进......
  • 学习安卓App开发的基本流程
    许多小伙伴想了解学习开发一个安卓系统的App大概需要什么流程,那我们简单看一下吧!第一、开发语言选择。语言其实只是开发实际应用的第一步,安卓开发的首选语言是Kotlin,次选......
  • 接口测试流程是怎样的?
    接口测试流程是怎样的?总所周知,接口测试流程是怎样的?总所周知接口测试在软件测试中是一个非常重要的一部分,其主要目的是测试应用程序的接口是否能够按照规范要求与其他系统......
  • git初始化流程
    1.添加SSHkey一台主机仅需要设置一次1.1检查主机是否已经有SSHkey只需要检查~/.ssh下是否存在id_rsa.pub或id_dsa.pub。若已存在,跳转至步骤31.2生成SSHk......
  • 设计模式
    单例模式(懒汉版)线程安全/***懒汉式*线程安全*/publicclassSingleton{//私有构造方法privateSingleton(){}//在成员位置创建该类的对象......