在企业的运营管理中,审批流程的高效执行对于保障业务顺利进行至关重要。一个良好设计的审批系统能够显著提高决策的及时性和准确性,同时促进各部门间的协同工作。
本文将深入探讨如何构建一个既透明又高效的审批流程系统,通过案例分析学校的管理模式,展示如何实现一个清晰、灵活且易于管理的审批流程。本文还将探讨审批系统设计的关键要素,如基础模板配置、审批流程的设计,以及实现审批系统时需要注意的细节。通过这些讨论,目标是为读者提供一个关于如何有效管理和优化审批流程的全面视角。
文章目录
- 业务场景
- 设计方式
- 基础模板配置(通用)
- 审批流程(业务)
- 实现方式注意
- 总结
业务场景
一个企业的正常运作离不开审批工作,而这项工作往往需要各个部门的协同完成。因此,在审批业务中,需要实现全方面的协调和高效沟通。这不仅涉及到审批流程的透明度和可追踪性,也包括确保流程的灵活性以适应不同部门的特定需求。为了提高效率,审批系统应集成清晰的指导原则和标准操作流程,同时还需具备强大的数据支持和分析功能,以便实时监控审批进度,确保决策的及时性和准确性。此外考虑到各部门之间的相互依赖性,审批系统还应支持跨部门协作,确保信息的流畅传递和快速响应。通过这些措施,可以有效提升企业的运营效率,加强部门间的协同作用,从而推动整个企业的稳健发展。
这里以学校的管理模式举例一个简单审批流程。对所有业务管理一目了然。
设计方式
| 模块分类 | 模块应用 |
|---|---|
| 基础模板配置(通用) | 审批模板,审批模板流程,审批日期以及用户流水单 |
| 审批流程(业务) | 印章申请、学生退学、开具证明、离职申请、物品领用、采购审批、用车申请、损坏赔偿、报销/请款流程 等等 |
这里设计的理念是通用配置+搭配个性配置应用,实现完整的业务流程。由于学校的管理流程审批比较简单因此这里这么设计比较合理。
审批的工作方式分为创建基础流程配置与流程审批。
基础模板配置(通用)
基础流程配置需要创建审批模板以及对应模板的流程。
这里需要配置4个地方审批的名称,模板的id,能够使用的部门即发起部门,能够审批的部门。这里可能会有疑问每个流程权限控制怎么处理?这里先卖个关子,这样配置后后面其实就不用考虑这些乱七八糟的问题了。
点击每个模板的对应的审批模板可以配置该流程的顺序,这里例学生退学举例,这里分别配置的默认的配置部门顺序,这里对应的审批部门需要进行自定义配置,这里作用是在每次创建用户审批流水单的时候自动根据模板创建审批流程。
这里审批模板流程可以使用前后端不同方式控制,我这里做了2套一个是前端验证一个是后端验证,目的是保证审批顺序不能重复,不能有跳的数字等等
后端验证操作比较麻烦,因此介绍一下前端配置的部分这里比较好理解。每次新增都会默认自增顺序,以及锁定模板名称和ID,这里只需要在下拉选择对应顺序的部门即可。删除流程只能从后往前逐一删除,避免了误操作的情况。如果想删除中间某个流程必须这么操作。
以上配置会跟随着所有流程操作。
并且在后端业务验证中需要进行判断如果流程没有完整的审核的话,即最少一个提交一个审核,那么需要进行提示操作。
审批流程(业务)
这里配置的业务用户创建的审核内容是每个审核流程都需要展示的,因此和之前基础的表单配置一致。
但是这里的内容不用再这里显示给用户查看,揉入到每个新建流程中合并嵌套表单进行添加操作即可。
这样设计为了后面嵌套直接匹配对应的模板就可以了,操作起来更加简单方便。
在新建审批内容之后会看到第一行数据为提交该申请的部门,后面为审批顺序自动同步过来的流程数据。
并且再新建完审批内容之后,每个参与审批的人直接点击审批操作都可以看到提交的内容信息。
对应审批页面会看到每个流程的状态。这里会看到流程结束,审批通过和审批驳回3个特殊状态。
这3个状态的逻辑是审批流程都完事即所有部门审批通过之后即审批通过并且标记流程结束。
如果其中一个流程中被驳回会标记驳回并自动标记流程结束。
在每个数据更新的环节需要有流程消息通知的环节。这里最重要的还是实现一个流程消息提醒功能。根据配置好的通知部门,不管在新建流程,还是审批环节都是要在消息中心创建对应的内容来提醒用户。
这里是消息提醒的模块。
实现方式注意
需要对创建角色添加审批权限,在dvadmin/system/models.py中的class Role(CoreModel)添加字段控制是否有权限审核,默认为否。
classRole(CoreModel):......audit_permissions=models.BooleanField(default=False,verbose_name="审批审核权",help_text="审批审核权")......然后需要在前端的角色管理编辑界面将添加的这个字段调出来可以操作即可。
还需要再API接口的用户接口部分将该字段显示出来,需要修改dvadmin/system/view/user.py搜索result['role_info'] = role.values('id', 'name', 'key')添加权限表示字段即可。
classUserViewSet(CustomModelViewSet):....defuser_info(self,request):"""获取当前用户信息"""......ifrole:result['role_info']=role.values('id','name','key','audit_permissions')......这样设计比重新起一个对照表单接口要简单的多,不过要基于对框架比较熟悉的基础之上操作,否则可能项目都跑不起来了。
在message_center.py中修改MessageCenterCreateSerializer更改消息类型,这里可以根据前端配置的信息去修改显示消息的各种样式。主要用于处理消息中心新增数据的序列化和保存操作。通过这个类,不仅完成了消息数据的保存,还根据消息的不同类型推送了相应的通知给特定的用户。
classMessageCenterCreateSerializer(CustomModelSerializer):""" 消息中心-新增-序列化器 """save方法被重写。这个方法是核心部分,首先调用父类的save方法,将数据保存到数据库中。随后,代码通过self.initial_data获取请求中传入的原始数据,具体提取了target_type以及其他相关字段,如目标用户、角色、部门等信息。
defsave(self,**kwargs):data=super().save(**kwargs)# 保存数据并获取返回的结果initial_data=self.initial_data target_type=initial_data.get('target_type')users=initial_data.get('target_user',[])根据target_type的不同值,决定了应该如何筛选目标用户。比如,当target_type为 1 时,表示按角色推送消息。代码会从传入的target_role列表中查询拥有这些角色的用户。类似地,target_type为 2 表示按部门发送,此时会根据传入的target_dept查找用户。当消息是系统通知或者审批消息时,推送给所有用户。
iftarget_typein[1]:# 按角色target_role=initial_data.get('target_role',[])users=Users.objects.filter(role__id__in=target_role).values_list('id',flat=True)websocket_push("dvadmin",message={"sender":'system',"contentType":'USER',"content":'您有一条新消息~',"refresh_unread":True})iftarget_typein[2]:# 按部门target_dept=initial_data.get('target_dept',[])users=Users.objects.filter(dept__id__in=target_dept).values_list('id',flat=True)websocket_push("dvadmin",message={"sender":'system',"contentType":'DEPT',"content":'您有一条新消息~',"refresh_unread":True})iftarget_typein[3]:# 系统通知users=Users.objects.values_list('id',flat=True)websocket_push("dvadmin",message={"sender":'system',"contentType":'SYSTEM',"content":'您有一条新消息~',"refresh_unread":True})iftarget_typein[4]:# 审批消息users=Users.objects.values_list('id',flat=True)websocket_push("dvadmin",message={"sender":'system',"contentType":'WORKFLOW',"content":'您有一条新消息~',"refresh_unread":True})在找到目标用户后,代码会将用户与消息中心的数据进行关联,并保存这些信息。同时,如果目标类型是按角色或部门推送,代码还会创建一个专门的 WebSocket 通道,通过该通道向每个用户发送实时通知。
targetuser_data=[]foruserinusers:targetuser_data.append({"messagecenter":data.id,"users":user})iftarget_typein[1,2]:room_name=f"user_{user}"websocket_push(room_name,message={"sender":'system',"contentType":'SYSTEM',"content":'您有一条新消息~',"refresh_unread":True})最后,通过MessageCenterTargetUserSerializer序列化器,确保这些用户数据能够正确保存到数据库中。该序列化器负责验证生成的targetuser_data数据,并将其保存。
targetuser_instance=MessageCenterTargetUserSerializer(data=targetuser_data,many=True,request=self.request)targetuser_instance.is_valid(raise_exception=True)targetuser_instance.save()returndata整个save方法通过以上几个步骤完成了消息的保存、用户的筛选以及通知的推送,最终实现了消息中心新增操作的功能。而Meta类定义了模型和字段,指定使用MessageCenter这个模型,并将所有字段序列化,但将id字段设为只读。
classMeta:model=MessageCenter fields="__all__"read_only_fields=["id"]总结
通过详细的案例分析和实现细节讨论,本文展示了如何在企业环境中有效地设计和实施审批流程系统。关键在于结合通用配置和个性化设置,以满足不同部门的特定需求。在构建这样的系统时,不仅要考虑流程的透明度和可追踪性,还需要考虑跨部门协作和数据支持。
本文中的方法和技巧,尤其是在实现方式中的注意事项,为打造一个高效、灵活且用户友好的审批系统提供了实用的指导。这样的系统不仅能提升企业的运营效率,还能加强部门间的协同作用,从而促进整个组织的稳健发展。