金融类贷款系统-用工作流实现方案

41 阅读2分钟

引言

以前一直在公司写业务代码, 从来没有通过技术实现自己变现。 最近正好有一个机会。
接手了一个外包项目。 主要面向的行业是助贷。
其实也不是很难, 类似于一个贷款系统,但更多的的功能是客户关联相关的业务开发。
其中最核心的就是整个贷款审批流程如何在系统中进行实现。
涉及业务核心秘密,本文以一个简单的业务流程来模拟说明实现过程。

用户画像

角色场景功能
客户申请页面填写贷款信息,身份认证,人脸识别,家庭资料
信审信审页面电话回访,约访客户, 填写综合评估
财务放款 页面进行打款操作

以上场景描述针对于贷款申请提交的流程,其他各个方向的业务流程也是同样的分析。

业务建模

WX20231214-115518@2x.png

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_11ipbjg" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.10.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
  <bpmn:collaboration id="Collaboration_1kvnfde">
    <bpmn:documentation>泳道图</bpmn:documentation>
    <bpmn:participant id="Participant_0parxuu" name="贷款审批系统1" processRef="Process_0kqpuin" />
  </bpmn:collaboration>
  <bpmn:process id="Process_0kqpuin" name="贷款审批系统1" isExecutable="true">
    <bpmn:laneSet id="LaneSet_0zjm3ye">
      <bpmn:lane id="Lane_06ydaco" name="客户">
        <bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>Activity_0te11um</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>Activity_0abw2mm</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>Event_1b3ej7k</bpmn:flowNodeRef>
      </bpmn:lane>
      <bpmn:lane id="Lane_1pga0np" name="审批员">
        <bpmn:flowNodeRef>Activity_0u5947u</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>Activity_1by69vy</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>Event_027qbxn</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>Event_0781ryj</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:sequenceFlow id="Flow_034d6w0" sourceRef="StartEvent_1" targetRef="Activity_0te11um" />
    <bpmn:sequenceFlow id="Flow_1saiyww" sourceRef="Activity_0te11um" targetRef="Activity_0abw2mm" />
    <bpmn:sequenceFlow id="Flow_1cjgd14" sourceRef="Activity_0abw2mm" targetRef="Event_1b3ej7k" />
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>Flow_034d6w0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:userTask id="Activity_0te11um" name="贷款申请" camunda:assignee="${general}">
      <bpmn:extensionElements>
        <camunda:formData>
          <camunda:formField id="numValue" label="数字" type="long" />
          <camunda:formField id="textValue" label="文本" type="string" />
        </camunda:formData>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_034d6w0</bpmn:incoming>
      <bpmn:outgoing>Flow_1saiyww</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:serviceTask id="Activity_0abw2mm" name="身份认证" camunda:delegateExpression="${identityTask}">
      <bpmn:incoming>Flow_1saiyww</bpmn:incoming>
      <bpmn:outgoing>Flow_1cjgd14</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="Event_1b3ej7k">
      <bpmn:incoming>Flow_1cjgd14</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0gtexbo" sourceRef="Event_0781ryj" targetRef="Activity_0u5947u" />
    <bpmn:userTask id="Activity_0u5947u" name="初审1" camunda:assignee="${leader}">
      <bpmn:extensionElements>
        <camunda:formData>
          <camunda:formField id="comment" label="评论" type="string" />
          <camunda:formField id="imageUrl" label="图片" type="string" />
        </camunda:formData>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_0gtexbo</bpmn:incoming>
      <bpmn:outgoing>Flow_0l8stkn</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:sequenceFlow id="Flow_0l8stkn" sourceRef="Activity_0u5947u" targetRef="Activity_1by69vy" />
    <bpmn:serviceTask id="Activity_1by69vy" name="放款通知" camunda:delegateExpression="${lookDoctor}">
      <bpmn:incoming>Flow_0l8stkn</bpmn:incoming>
      <bpmn:outgoing>Flow_1o8n4yy</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="Event_027qbxn">
      <bpmn:incoming>Flow_1o8n4yy</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1o8n4yy" sourceRef="Activity_1by69vy" targetRef="Event_027qbxn" />
    <bpmn:startEvent id="Event_0781ryj" camunda:initiator="starter">
      <bpmn:outgoing>Flow_0gtexbo</bpmn:outgoing>
      <bpmn:messageEventDefinition id="MessageEventDefinition_1st0cs0" messageRef="Message_3cu91hu" />
    </bpmn:startEvent>
  </bpmn:process>
  <bpmn:message id="Message_3cu91hu" name="Message_3cu91hu" />

</bpmn:definitions>

以上建模是一个简单版本,主要将角色分为两类, 客户角色在提交表单之后。
流转到身份认证节点(实际有好几个节点包括人脸识别,公司信息,家庭信息等)。
在身份认证节点结束后, 将发送消息到信审环节。
关于身份认证代码如下:

@Component("identityTask")
@Slf4j
public class IdentityTask implements JavaDelegate {

    @Override
    public void execute(DelegateExecution delegateExecution) throws Exception {
        String businessKey = String.valueOf(delegateExecution.getVariable("businessKey"));
        String general = String.valueOf(delegateExecution.getVariable("general"));
        RuntimeService runtimeService = delegateExecution.getProcessEngine().getRuntimeService();
        IdentityService identityService = delegateExecution.getProcessEngine().getIdentityService();
        identityService.setAuthenticatedUserId(general);
        Map<String, Object> params = new HashMap<>(4);
        params.put("leader", "刘备");
        params.put("starter", general);
        params.put("number", 12);
        params.put("numValue", 12);
        params.put("textValue", "测试");
        params.put("city", "测试");
        //此处将消息发送,启动另外一个信审的流程。
        runtimeService.startProcessInstanceByMessage("Message_3cu91hu", businessKey, params);
    }
}

实际运行页面

 a1.png

a2.png

a3.png

a4.png

b站视频教程