Flujo de trabajo integrado de la plataforma de desarrollo de aplicaciones: función de reversión y salto de modelado de procesos

fondo

Para el problema de la configuración de proceso hostil, DingTalk nacional diseñó e implementó un conjunto de modos de modelado de procesos por separado, que no tiene nada que ver con la especificación bpmn. Alguien lo imitó y lo hizo de código abierto ( https://github.com/StavinLi/ Workflow -Vue3 ), el diagrama de efectos es el siguiente:

el principio general de implementación se basa en nodos secundarios anidados infinitamente, genera datos json y los pasa al backend. Después del análisis del backend, llama a la API del motor Camunda. lo convierte en un modelo de proceso y luego lo conserva.

**Este modo, en comparación con el modelado de procesos de la especificación bpmn2.0 que viene con Camunda, es mucho más amigable, pero también introduce nuevos problemas y es imposible establecer un "flujo de salto" entre enlaces. ** La "transferencia de salto" mencionada aquí en realidad incluye dos direcciones de transferencia, una es saltar del enlace actual a un enlace de seguimiento no directo y la otra es retroceder del enlace actual a un determinado enlace anterior. enlace de pedido.

Los requisitos anteriores no se pueden resolver a través de ramas de enrutamiento. Para el modelo BPMN nativo, puede dibujar bordes entre el nodo de inicio y el nodo de destino, y establecer condiciones en los bordes, y este conjunto de modo de modelado de procesos DingTalk de imitación, que fundamentalmente hace que el La solución de "bordes de dibujo" es inviable, ¿qué debo hacer?

Ideas de implementación

En el modo de modelado de procesos existente, es necesario adaptarse para realizar el flujo de salto. La idea de implementación específica es almacenar los enlaces que se pueden revertir u omitir en cada enlace mediante una configuración personalizada y usarlo como una parte de configuración del enlace.
Dado que está diseñado por sí mismo, el grado de libertad es mayor y el tipo de flujo de salto se puede distinguir agregando atributos, ya sea un retroceso o un salto. En el bpmn nativo, el borde dibujado no tiene tipo. El borde normal, el borde predeterminado, el borde de retorno y el borde de salto se implementan de la misma manera y se pueden agregar condiciones. Para distinguir entre retroceso y salto, solo estableciendo las condiciones acordadas. Las implementaciones indirectas, como establecer variables como ${reject==true} para marcar alternativas, no son elegantes.

Pensando en cuestiones clave

¿La configuración predeterminada es la alternativa al enlace de inicio y al enlace anterior?

La reversión se puede implementar mediante configuración para restringir a los usuarios, y no se permite la reversión arbitraria. Sin embargo, es un requisito común recurrir al enlace de inicio y al enlace anterior. Si estas dos situaciones son manejadas por la plataforma de forma predeterminada, es decir, se puede revertir sin configuración y luego solo configurar el enlace de respaldo para ¿Otras situaciones que necesitan ser procesadas están bien?

De hecho, la configuración predeterminada del sistema puede reducir una parte de la carga de trabajo de configuración, pero puede destruir la controlabilidad general y la estandarización del proceso. Por ejemplo, un proceso largo se divide en tres etapas principales en términos de gestión. En la segunda etapa, no se permite recurrir al enlace de inicio. Una vez que se agrega el procesamiento predeterminado, esta restricción comercial se romperá. Además, para las dos situaciones siguientes, no se permite la reversión:
1. Enlace de refrendación de varias personas, antes de que todos los participantes lo hayan procesado
2. El enlace actualmente en la rama de enrutamiento, se revierte directamente al enlace de la rama principal

Teniendo en cuenta los escenarios y limitaciones anteriores, finalmente se decide que el sistema no se configurará de forma predeterminada y el modelador de procesos lo configurará de acuerdo con las necesidades comerciales reales.

Si el nombre del enlace se almacena de forma redundante

Durante el modelado de procesos, al configurar la lista de enlaces a los que un determinado enlace puede saltar y volver, no hay problema en utilizar el identificador del enlace para realizar un juicio lógico y utilizar el nombre del enlace para mostrarlo. Se plantea una cuestión: si el nombre del enlace debe almacenarse de forma redundante. En términos de amabilidad, se requiere almacenamiento redundante. Pero el almacenamiento redundante significa que las actualizaciones deben sincronizarse, lo cual no es fácil de lograr. El usuario configura primero el salto o la reversión del enlace y luego cambia el nombre del enlace de destino. La configuración del salto o la reversión del enlace es en realidad imperceptible.

Para resolver este problema, hay dos soluciones:
una es simplemente no almacenar de forma redundante los nombres de los enlaces en la configuración de la lista de enlaces del salto y reversión, y solo guardar el identificador del enlace, encontrar dinámicamente el nombre del enlace y mostrarlo. al usuario Puede garantizar que los nombres de los enlaces sean consistentes en tiempo real, pero el procesamiento es engorroso e implica análisis y procesamiento de modelos.
El segundo es aún realizar almacenamiento redundante, en el enlace de guardado del modelo, actualización transversal, es decir, el tipo de consulta es el enlace de inicio o procesamiento, y de acuerdo con el identificador de definición del proceso y el identificador del enlace, la configuración de la lista de Los enlaces para saltar y regresar se actualizan en lotes.

El problema con la Solución 2 es que los datos en la tabla en la biblioteca de back-end se actualizan, pero el modelo en el formato json de front-end en realidad no se actualiza. Si el modelo se exporta y luego se importa, generará errores resultados de la migración del modelo. Por lo tanto, en esencia, es necesario actualizar desde el front-end, pero es bastante problemático hacerlo desde el front-end.

Este problema se suspende por el momento y el almacenamiento redundante se realiza primero, sin actualización sincrónica y la posibilidad de modificar el nombre del enlace es baja. Si no se implementa la actualización sincrónica, se puede actualizar manualmente a través de la configuración y la carga de trabajo. es pequeño.

Implementación frontal

extensión de configuración

La interfaz coloca la información de configuración en el atributo de configuración del nodo, que es paralelo a la configuración de personal personConfig y la configuración de permisos permisoConfig, y expande y agrega backNodeList y la lista de enlaces de salto jumpNodeList. Teóricamente, los dos tipos de nodos, el enlace de iniciación y el enlace de manipulación, se manejan manualmente, lo que implica la necesidad de una "transferencia por salto".
Las configuraciones de backNodeList y jumpNodeList son las mismas, porque el proceso puede permitir que el enlace actual retroceda o salte a varios enlaces, por lo que es una matriz que incluye dos atributos clave de identificación y nombre del enlace de destino, a saber, Can.

Los ejemplos son los siguientes:

{
    
    
	"name": "填报",
	"id": "root",
	"type": "ROOT",
	"config": {
    
    
		"permissionConfig": [{
    
    
			"areaCode": "applyArea",
			"permission": "EDITABLE"
		}, {
    
    
			"areaCode": "organizationApproval",
			"permission": "READONLY"
		}, {
    
    
			"areaCode": "hrApproval",
			"permission": "INVISIBLE"
		}],
		"jumpNodeList": [{
    
    
			"id": "node2268_3ea5_a5db_15b0",
			"name": "人事审批"
		}]
	},
	"branchList": [],
	"child": {
    
    
		"name": "部门审批",
		"id": "node1938_8b28_c3ed_030f",
		"type": "HANDLE",
		"config": {
    
    
			"personConfig": {
    
    
				"mode": "COUNTERSIGN",
				"setAssigneeFlag": "YES",
				"userGroup": "99",
				"userGroupName": "系统管理员"
			},
			"permissionConfig": [{
    
    
				"areaCode": "applyArea",
				"permission": "READONLY"
			}, {
    
    
				"areaCode": "organizationApproval",
				"permission": "READONLY"
			}, {
    
    
				"areaCode": "hrApproval",
				"permission": "READONLY"
			}]
		},
		"child": {
    
    
			"name": "人事审批",
			"id": "node2268_3ea5_a5db_15b0",
			"type": "HANDLE",
			"config": {
    
    
				"personConfig": {
    
    
					"mode": "NORMAL",
					"setAssigneeFlag": "YES",
					"userGroup": "99",
					"userGroupName": "系统管理员"
				},
				"permissionConfig": [{
    
    
					"areaCode": "applyArea",
					"permission": "READONLY"
				}, {
    
    
					"areaCode": "organizationApproval",
					"permission": "READONLY"
				}, {
    
    
					"areaCode": "hrApproval",
					"permission": "READONLY"
				}],
				"backNodeList": [{
    
    
					"id": "root",
					"name": "填报"
				}, {
    
    
					"id": "node1938_8b28_c3ed_030f",
					"name": "部门审批"
				}]
			},
			"child": {
    
    }
		}
	}
}

configuración del enlace

Para el enlace de inicio, es el punto de partida del proceso y no hay problema de reversión. ¿Se puede realizar el salto mediante la función de enrutamiento? Piénselo, en realidad existen múltiples escenarios.
Escenario 1: una lista, cuando se cumple una determinada regla, salta directamente a un determinado enlace en el medio, y esta regla puede no ser lo suficientemente clara para que el sistema la juzgue y procese automáticamente, y debe juzgarse manualmente si el salto debe realizarse.
Escenario 2: Una orden pasa a una determinada etapa de aprobación, y si hay algún problema, vuelve a la etapa de inicio y el solicitante hace ajustes, después del ajuste no quiere volver a pasar por la etapa, pero quiere saltar directamente al rechazo El escenario específico es similar a la aprobación del contrato, donde departamentos multifuncionales participan en la revisión, como finanzas, legal, etc. Si se encuentran problemas en el proceso de revisión legal y es necesario ajustarlos, no lo hago. Quiero volver a pasar por el proceso de revisión financiera.
En resumen, el enlace de inicio aún necesita establecer la configuración del enlace de salto.

El enlace de procesamiento es un enlace de proceso manual que requiere tanto la función de reversión como la función de salto.

Tome la configuración del enlace de salto como ejemplo, como se muestra
imagen.png
en la siguiente figura: Primero, después de hacer clic en el botón "Agregar", aparecerá un cuadro de diálogo para mostrar todos los enlaces de destino a los que se puede saltar. El enlace de destino debe cumplir con lo siguiente condiciones: 1.
Tipo Solo puede ser el enlace de inicio y el enlace de procesamiento, y no puede saltar al nodo de enrutamiento. Si se permite el salto al nodo de enrutamiento, dañará gravemente la naturaleza normativa y restrictiva del flujo de trabajo como proceso. plantilla.
2. Debe excluirse, saltar a usted mismo, bucle sin fin ...
3. Luego expanda el tipo de nodo, como enlaces de procesamiento automático (como el envío de correos electrónicos), se puede expandir según la situación y está permitido. ser el nodo objetivo.

Además, hay otro lugar aquí: para el enlace de procesamiento, si es una contraseña, desde un punto de vista comercial, se le debe permitir retroceder o saltar a este enlace, pero se informará un error al llamar al subyacente de Camunda. API Aquí es solo una mención, en el próximo capítulo abordaré específicamente este tema.

implementación de back-end

configuración de entidad

Los atributos de entidad del enlace de reversión y el enlace de salto de la configuración del enlace son en realidad exactamente los mismos. Si se utiliza la misma tabla de base de datos para el almacenamiento, se requiere un atributo adicional para que la entidad distinga entre reversión y salto. Un campo adicional es agregado a la tabla de la biblioteca y el código Juicios lógicos adicionales.
Con base en la alta eficiencia de la configuración de código bajo de la plataforma, primero realice la entidad de configuración del enlace de respaldo y luego realice la configuración del enlace de salto copiando las nuevas funciones.
La siguiente es la lista de atributos de información de la entidad de configuración del enlace alternativo
imagen.png
de la siguiente manera:
imagen.png

Análisis y persistencia de modelos.

Cuando se convierte el modelo de proceso, el enlace de lectura coopera con el atributo backNodeList en el atributo de configuración

    private void configBackNodeList(String tempVersion, String id,String configString) {
    
    
        if(StringUtils.isNoneBlank(configString)) {
    
    

            List<WorkflowBackNodeConfig> backNodeList = new ArrayList<>();
            JSONArray jsonArray = JSON.parseArray(configString);
            for (int i = 0; i < jsonArray.size(); i++) {
    
    
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                WorkflowBackNodeConfig entity = new WorkflowBackNodeConfig();
                entity.setTargetNodeId(jsonObject.getString("id"));
                entity.setTargetNodeName(jsonObject.getString("name"));
                backNodeList.add(entity);
            }
            workflowBackNodeConfigService.updateConfig(tempVersion, id, backNodeList);
        }

    }

El método de servicio, updateConfig, es el siguiente. Utiliza el modo de borrar la configuración primero y luego crearla. Por cierto, limpia los datos basura que quedan debido a los cambios de nodo.

    @Override
    public void updateConfig(String processDefinitionId, String nodeId, List<WorkflowBackNodeConfig> jumpNodeList) {
    
    
        // 先清空配置
        QueryWrapper<WorkflowBackNodeConfig> queryWrapper=new QueryWrapper<>();
        queryWrapper.lambda().eq(WorkflowBackNodeConfig::getProcessDefinitionId,processDefinitionId)
                .eq(WorkflowBackNodeConfig::getNodeId,nodeId);
        remove(queryWrapper);
        // 后生成配置
        int orderNo=0;
        for(WorkflowBackNodeConfig entity:jumpNodeList){
    
    
            orderNo++;
            entity.setProcessDefinitionId(processDefinitionId);
            entity.setNodeId(nodeId);
            entity.setOrderNo(StringUtils.leftPad(String.valueOf(orderNo),2,"0"));
            add(entity);
        }

    }

Información de la plataforma de desarrollo.

Nombre de la plataforma: Plataforma de desarrollo One Two Three
Introducción: Plataforma de desarrollo general de nivel empresarial
Información de diseño: columna csdn
Dirección de código abierto: Protocolo de código abierto Gitee
: El código abierto del MIT
no es fácil, bienvenido a favoritos, me gusta y comentarios.

Supongo que te gusta

Origin blog.csdn.net/seawaving/article/details/132508061
Recomendado
Clasificación