相关推荐recommended
【Django-vue-admin学习笔记】审批工作流业务流程动态设计
作者:mmseoamin日期:2024-02-20

在企业的运营管理中,审批流程的高效执行对于保障业务顺利进行至关重要。一个良好设计的审批系统能够显著提高决策的及时性和准确性,同时促进各部门间的协同工作。

本文将深入探讨如何构建一个既透明又高效的审批流程系统,通过案例分析学校的管理模式,展示如何实现一个清晰、灵活且易于管理的审批流程。本文还将探讨审批系统设计的关键要素,如基础模板配置、审批流程的设计,以及实现审批系统时需要注意的细节。通过这些讨论,目标是为读者提供一个关于如何有效管理和优化审批流程的全面视角。

文章目录

  • 业务场景
  • 设计方式
    • 基础模板配置(通用)
    • 审批流程(业务)
    • 实现方式注意
    • 总结

      业务场景

      一个企业的正常运作离不开审批工作,而这项工作往往需要各个部门的协同完成。因此,在审批业务中,需要实现全方面的协调和高效沟通。这不仅涉及到审批流程的透明度和可追踪性,也包括确保流程的灵活性以适应不同部门的特定需求。为了提高效率,审批系统应集成清晰的指导原则和标准操作流程,同时还需具备强大的数据支持和分析功能,以便实时监控审批进度,确保决策的及时性和准确性。此外考虑到各部门之间的相互依赖性,审批系统还应支持跨部门协作,确保信息的流畅传递和快速响应。通过这些措施,可以有效提升企业的运营效率,加强部门间的协同作用,从而推动整个企业的稳健发展。

      这里以学校的管理模式举例一个简单审批流程。对所有业务管理一目了然。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第1张

      设计方式

      模块分类模块应用
      基础模板配置(通用)审批模板,审批模板流程,审批日期以及用户流水单
      审批流程(业务)印章申请、学生退学、开具证明、离职申请、物品领用、采购审批、用车申请、损坏赔偿、报销/请款流程 等等

      这里设计的理念是通用配置+搭配个性配置应用,实现完整的业务流程。由于学校的管理流程审批比较简单因此这里这么设计比较合理。

      审批的工作方式分为创建基础流程配置与流程审批。

      基础模板配置(通用)

      基础流程配置需要创建审批模板以及对应模板的流程。

      这里需要配置4个地方审批的名称,模板的id,能够使用的部门即发起部门,能够审批的部门。这里可能会有疑问每个流程权限控制怎么处理?这里先卖个关子,这样配置后后面其实就不用考虑这些乱七八糟的问题了。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第2张

      点击每个模板的对应的审批模板可以配置该流程的顺序,这里例学生退学举例,这里分别配置的默认的配置部门顺序,这里对应的审批部门需要进行自定义配置,这里作用是在每次创建用户审批流水单的时候自动根据模板创建审批流程。

      这里审批模板流程可以使用前后端不同方式控制,我这里做了2套一个是前端验证一个是后端验证,目的是保证审批顺序不能重复,不能有跳的数字等等

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第3张

      后端验证操作比较麻烦,因此介绍一下前端配置的部分这里比较好理解。每次新增都会默认自增顺序,以及锁定模板名称和ID,这里只需要在下拉选择对应顺序的部门即可。删除流程只能从后往前逐一删除,避免了误操作的情况。如果想删除中间某个流程必须这么操作。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第4张

      以上配置会跟随着所有流程操作。

      并且在后端业务验证中需要进行判断如果流程没有完整的审核的话,即最少一个提交一个审核,那么需要进行提示操作。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第5张

      审批流程(业务)

      这里配置的业务用户创建的审核内容是每个审核流程都需要展示的,因此和之前基础的表单配置一致。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第6张

      但是这里的内容不用再这里显示给用户查看,揉入到每个新建流程中合并嵌套表单进行添加操作即可。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第7张

      这样设计为了后面嵌套直接匹配对应的模板就可以了,操作起来更加简单方便。

      在新建审批内容之后会看到第一行数据为提交该申请的部门,后面为审批顺序自动同步过来的流程数据。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第8张

      并且再新建完审批内容之后,每个参与审批的人直接点击审批操作都可以看到提交的内容信息。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第9张

      对应审批页面会看到每个流程的状态。这里会看到流程结束,审批通过和审批驳回3个特殊状态。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第10张

      这3个状态的逻辑是审批流程都完事即所有部门审批通过之后即审批通过并且标记流程结束。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第11张

      如果其中一个流程中被驳回会标记驳回并自动标记流程结束。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第12张

      在每个数据更新的环节需要有流程消息通知的环节。

      这里最重要的还是实现一个流程消息提醒功能。根据配置好的通知部门,不管在新建流程,还是审批环节都是要在消息中心创建对应的内容来提醒用户。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第13张

      这里是消息提醒的模块。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第14张

      实现方式注意

      需要对创建角色添加审批权限,在dvadmin/system/models.py中的class Role(CoreModel)添加字段控制是否有权限审核,默认为否。

      class Role(CoreModel):
      	......
          audit_permissions = models.BooleanField(default=False, verbose_name="审批审核权", help_text="审批审核权")
      	......
      

      然后需要在前端的角色管理编辑界面将添加的这个字段调出来可以操作即可。

      【Django-vue-admin学习笔记】审批工作流业务流程动态设计,在这里插入图片描述,第15张

      还需要再API接口的用户接口部分将该字段显示出来,需要修改dvadmin/system/view/user.py搜索result['role_info'] = role.values('id', 'name', 'key')添加权限表示字段即可。

      class UserViewSet(CustomModelViewSet):
      	....
          def user_info(self, request):
              """获取当前用户信息"""
      		......
              if role:
                  result['role_info'] = role.values('id', 'name', 'key', 'audit_permissions')
              ......
      

      这样设计比重新起一个对照表单接口要简单的多,不过要基于对框架比较熟悉的基础之上操作,否则可能项目都跑不起来了。

      在 message_center.py中修改MessageCenterCreateSerializer更改消息类型,这里可以根据前端配置的信息去修改显示消息的各种样式。

      class MessageCenterCreateSerializer(CustomModelSerializer):
          """
          消息中心-新增-序列化器
          """
          def save(self, **kwargs):
              data = super().save(**kwargs)
              initial_data = self.initial_data
              target_type = initial_data.get('target_type')
              # 在保存之前,根据目标类型,把目标用户查询出来并保存
              users = initial_data.get('target_user', [])
              if target_type in [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})
              if target_type in [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})
              if target_type in [3]:  # 系统通知
                  users = Users.objects.values_list('id', flat=True)
                  websocket_push("dvadmin", message={"sender": 'system', "contentType": 'SYSTEM',
      "content": '您有一条新消息~', "refresh_unread": True})
              if target_type in [4]:  # 审批消息
                  users = Users.objects.values_list('id', flat=True)
                  websocket_push("dvadmin", message={"sender": 'system', "contentType": 'WORKFLOW',
      "content": '您有一条新消息~', "refresh_unread": True})
              targetuser_data = []
              for user in users:
                  targetuser_data.append({
                      "messagecenter": data.id,
                      "users": user
                  })
                  if target_type in [1, 2]:
                      room_name = f"user_{user}"
                      websocket_push(room_name, message={"sender": 'system', "contentType": 'SYSTEM',
          "content": '您有一条新消息~', "refresh_unread": True})
              targetuser_instance = MessageCenterTargetUserSerializer(data=targetuser_data, many=True, request=self.request)
              targetuser_instance.is_valid(raise_exception=True)
              targetuser_instance.save()
              return data
          class Meta:
              model = MessageCenter
              fields = "__all__"
              read_only_fields = ["id"]
      

      总结

      通过详细的案例分析和实现细节讨论,本文展示了如何在企业环境中有效地设计和实施审批流程系统。关键在于结合通用配置和个性化设置,以满足不同部门的特定需求。在构建这样的系统时,不仅要考虑流程的透明度和可追踪性,还需要考虑跨部门协作和数据支持。

      本文中的方法和技巧,尤其是在实现方式中的注意事项,为打造一个高效、灵活且用户友好的审批系统提供了实用的指导。这样的系统不仅能提升企业的运营效率,还能加强部门间的协同作用,从而促进整个组织的稳健发展。