From 31796b19a186ead1470b9157bd4e82927eabb188 Mon Sep 17 00:00:00 2001 From: lorne <1991wangliang@gmail.com> Date: Thu, 2 Apr 2026 10:19:46 +0800 Subject: [PATCH 1/2] fix form field permission verify bug --- flow-engine-example/pom.xml | 2 +- flow-engine-framework/pom.xml | 2 +- .../form/permission/FormFieldPermission.java | 4 ++ .../flow/service/WorkflowService.java | 24 +++++--- .../node/FormFieldPermissionStrategy.java | 60 +++++++++++++++++-- .../com/codingapi/flow/workflow/Workflow.java | 27 ++++++--- flow-engine-starter-api/pom.xml | 2 +- .../api/controller/WorkflowController.java | 6 +- flow-engine-starter-infra/pom.xml | 2 +- flow-engine-starter-query/pom.xml | 2 +- flow-engine-starter/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 105 insertions(+), 30 deletions(-) diff --git a/flow-engine-example/pom.xml b/flow-engine-example/pom.xml index 4a77d7bd..86021e40 100644 --- a/flow-engine-example/pom.xml +++ b/flow-engine-example/pom.xml @@ -6,7 +6,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 ../pom.xml diff --git a/flow-engine-framework/pom.xml b/flow-engine-framework/pom.xml index 30b99f4a..acecb8a8 100644 --- a/flow-engine-framework/pom.xml +++ b/flow-engine-framework/pom.xml @@ -6,7 +6,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 flow-engine-framework diff --git a/flow-engine-framework/src/main/java/com/codingapi/flow/form/permission/FormFieldPermission.java b/flow-engine-framework/src/main/java/com/codingapi/flow/form/permission/FormFieldPermission.java index 7064ff9d..841f1c37 100644 --- a/flow-engine-framework/src/main/java/com/codingapi/flow/form/permission/FormFieldPermission.java +++ b/flow-engine-framework/src/main/java/com/codingapi/flow/form/permission/FormFieldPermission.java @@ -29,4 +29,8 @@ public static FormFieldPermission fromMap(Map map) { permission.setType(PermissionType.valueOf((String) map.get("type"))); return permission; } + + public boolean isField(String formCode, String fieldCode) { + return this.getFormCode().equalsIgnoreCase(formCode) && this.getFieldCode().equalsIgnoreCase(fieldCode); + } } diff --git a/flow-engine-framework/src/main/java/com/codingapi/flow/service/WorkflowService.java b/flow-engine-framework/src/main/java/com/codingapi/flow/service/WorkflowService.java index 14ce00db..ecfcc043 100644 --- a/flow-engine-framework/src/main/java/com/codingapi/flow/service/WorkflowService.java +++ b/flow-engine-framework/src/main/java/com/codingapi/flow/service/WorkflowService.java @@ -31,7 +31,7 @@ public class WorkflowService { * @param currentVersion 当前版本 * @param creatable 是否创建新的版本 */ - public void saveWorkflowVersion(WorkflowVersion currentVersion, boolean creatable) { + public void saveWorkflowVersion(WorkflowVersion currentVersion, boolean creatable,boolean enable) { List updateList = new ArrayList<>(); currentVersion.enableVersion(); @@ -57,10 +57,14 @@ public void saveWorkflowVersion(WorkflowVersion currentVersion, boolean creatabl workflowVersionRepository.saveAll(updateList); Workflow workflow = currentVersion.toWorkflow(); - try { - workflow.enable(); - }catch (Exception ignore){ - workflow.disable(); + workflow.filterPermissions(); + + if(enable) { + try { + workflow.enable(); + } catch (Exception ignore) { + workflow.disable(); + } } workflowRepository.save(workflow); } @@ -118,7 +122,9 @@ public void changeVersion(long versionId) { } } workflowVersionRepository.saveAll(versionList); - workflowRepository.save(currentVersion.toWorkflow()); + Workflow workflow = currentVersion.toWorkflow(); + workflow.filterPermissions(); + workflowRepository.save(workflow); } @@ -148,9 +154,9 @@ public void delete(String workId) { * 保存流程 * @param workflow 流程对象 */ - public void saveWorkflow(Workflow workflow) { + public void saveWorkflow(Workflow workflow,boolean enable) { WorkflowVersion workflowVersion = new WorkflowVersion(workflow); - this.saveWorkflowVersion(workflowVersion, false); + this.saveWorkflowVersion(workflowVersion, false,enable); } /** @@ -181,7 +187,7 @@ public String importWorkflow(String body, IFlowOperator createOperator) { String json = Base64Utils.toJson(body); Workflow workflow = Workflow.formJson(json); workflow.resetWorkflow(createOperator); - this.saveWorkflow(workflow); + this.saveWorkflow(workflow,false); return workflow.getId(); } } diff --git a/flow-engine-framework/src/main/java/com/codingapi/flow/strategy/node/FormFieldPermissionStrategy.java b/flow-engine-framework/src/main/java/com/codingapi/flow/strategy/node/FormFieldPermissionStrategy.java index e8a166a6..e14c6897 100644 --- a/flow-engine-framework/src/main/java/com/codingapi/flow/strategy/node/FormFieldPermissionStrategy.java +++ b/flow-engine-framework/src/main/java/com/codingapi/flow/strategy/node/FormFieldPermissionStrategy.java @@ -46,7 +46,7 @@ public FormFieldPermissionStrategy(List fieldPermissions) { @Override public void verifyNode(FlowForm form) { Map fieldTypes = form.loadAllFieldDataTypeMaps(); - if(fieldPermissions!=null) { + if (fieldPermissions != null) { for (FormFieldPermission permission : fieldPermissions) { String key = permission.getFormCode() + "." + permission.getFieldCode(); if (!fieldTypes.containsKey(key)) { @@ -61,9 +61,9 @@ public void verifySession(FlowSession session) { FlowForm flowForm = session.getFormData().getFlowForm(); Map currentData = session.getCurrentRecord().getFormData(); Map latestData = session.getFormData().toMapData(); - if(fieldPermissions!=null) { + if (fieldPermissions != null) { for (FormFieldPermission permission : fieldPermissions) { - FormField formField = flowForm.getField(permission.getFormCode(),permission.getFieldCode()); + FormField formField = flowForm.getField(permission.getFormCode(), permission.getFieldCode()); // 子表 if (flowForm.isSubForm(permission.getFormCode())) { if (permission.getType() == PermissionType.READ) { @@ -92,7 +92,7 @@ public void verifySession(FlowSession session) { if (formField.isRequired() && permission.getType() == PermissionType.READ) { Object currentValue = currentData.get(permission.getFieldCode()); Object latestValue = latestData.get(permission.getFieldCode()); - if (latestValue!=null && currentValue!=null && !currentValue.equals(latestValue)) { + if (latestValue != null && currentValue != null && !currentValue.equals(latestValue)) { throw FlowValidationException.fieldReadOnly(permission.getFieldCode()); } } @@ -125,4 +125,56 @@ public static FormFieldPermissionStrategy defaultStrategy() { } + private FormFieldPermission getFormFieldPermission(String formCode,String fieldCode){ + if(this.fieldPermissions!=null) { + for (FormFieldPermission fieldPermission:this.fieldPermissions){ + if(fieldPermission.isField(formCode,fieldCode)){ + return fieldPermission; + } + } + } + return null; + } + + public void filterPermissions(FlowForm meta) { + Map fieldMap = meta.loadAllFieldDataTypeMaps(); + + if (this.fieldPermissions == null || this.getFieldPermissions().isEmpty()) { + // init fieldPermissions + this.fieldPermissions = new ArrayList<>(); + for (String formField:fieldMap.keySet()){ + String formCode = formField.split("\\.")[0]; + String fieldCode = formField.split("\\.")[1]; + + FormFieldPermission fieldPermission = new FormFieldPermission(); + fieldPermission.setFormCode(formCode); + fieldPermission.setFieldCode(fieldCode); + fieldPermission.setType(PermissionType.WRITE); + + this.fieldPermissions.add(fieldPermission); + } + + } else { + // filter fieldPermissions + System.out.println("filter fieldPermissions meta:" + meta); + + List fieldPermissions = new ArrayList<>(); + for (String formField:fieldMap.keySet()){ + String formCode = formField.split("\\.")[0]; + String fieldCode = formField.split("\\.")[1]; + + FormFieldPermission fieldPermission = this.getFormFieldPermission(formCode,fieldCode); + if(fieldPermission==null) { + fieldPermission = new FormFieldPermission(); + fieldPermission.setFormCode(formCode); + fieldPermission.setFieldCode(fieldCode); + fieldPermission.setType(PermissionType.WRITE); + } + fieldPermissions.add(fieldPermission); + } + + this.fieldPermissions = fieldPermissions; + } + + } } diff --git a/flow-engine-framework/src/main/java/com/codingapi/flow/workflow/Workflow.java b/flow-engine-framework/src/main/java/com/codingapi/flow/workflow/Workflow.java index 96128e51..23391b63 100644 --- a/flow-engine-framework/src/main/java/com/codingapi/flow/workflow/Workflow.java +++ b/flow-engine-framework/src/main/java/com/codingapi/flow/workflow/Workflow.java @@ -13,6 +13,7 @@ import com.codingapi.flow.node.nodes.StartNode; import com.codingapi.flow.operator.IFlowOperator; import com.codingapi.flow.script.node.OperatorMatchScript; +import com.codingapi.flow.strategy.node.FormFieldPermissionStrategy; import com.codingapi.flow.strategy.workflow.IWorkflowStrategy; import com.codingapi.flow.strategy.workflow.InterfereStrategy; import com.codingapi.flow.strategy.workflow.UrgeStrategy; @@ -89,7 +90,7 @@ public class Workflow { private boolean enable; - public boolean isDisable(){ + public boolean isDisable() { return !enable; } @@ -212,7 +213,7 @@ public static Workflow formJson(String json) { IFlowNode flowNode = NodeFactory.getInstance().createNode(node); nodeList.add(flowNode); } - workflow.setNodes(nodeList); + workflow.setNodes(nodeList); } List> strategies = (List>) data.get("strategies"); @@ -255,7 +256,7 @@ public void verify() { /** * 启动流程 */ - public void enable(){ + public void enable() { this.verify(); this.enable = true; this.updateTime(); @@ -265,7 +266,7 @@ public void enable(){ /** * 禁用流程 */ - public void disable(){ + public void disable() { this.enable = false; this.updateTime(); } @@ -291,7 +292,7 @@ private void verifyFields() { throw FlowValidationException.workflowRequired("createdOperator"); } if (nodes == null || nodes.isEmpty()) { - throw FlowValidationException.workflowRequired( "nodes"); + throw FlowValidationException.workflowRequired("nodes"); } } @@ -317,9 +318,9 @@ private void verifyNodes() { } } if (start != 1 || end != 1) { - if(start!=1) { + if (start != 1) { throw FlowValidationException.nodeRequired("startNode"); - }else { + } else { throw FlowValidationException.nodeRequired("endNode"); } } @@ -381,4 +382,16 @@ public void resetWorkflow(IFlowOperator createdOperator) { this.createdOperator = createdOperator; this.updateTime(); } + + public void filterPermissions() { + FlowForm meta = this.form; + + for (IFlowNode node : this.nodes) { + FormFieldPermissionStrategy formFieldPermissionStrategy = node.strategyManager().getStrategy(FormFieldPermissionStrategy.class); + if (formFieldPermissionStrategy != null) { + formFieldPermissionStrategy.filterPermissions(meta); + } + } + + } } diff --git a/flow-engine-starter-api/pom.xml b/flow-engine-starter-api/pom.xml index f78ae57b..db6ebfdb 100644 --- a/flow-engine-starter-api/pom.xml +++ b/flow-engine-starter-api/pom.xml @@ -6,7 +6,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 flow-engine-starter-api diff --git a/flow-engine-starter-api/src/main/java/com/codingapi/flow/api/controller/WorkflowController.java b/flow-engine-starter-api/src/main/java/com/codingapi/flow/api/controller/WorkflowController.java index 5085054a..c9f1befa 100644 --- a/flow-engine-starter-api/src/main/java/com/codingapi/flow/api/controller/WorkflowController.java +++ b/flow-engine-starter-api/src/main/java/com/codingapi/flow/api/controller/WorkflowController.java @@ -87,7 +87,7 @@ public Response changeState(@RequestBody IdRequest request) { } else { workflow.disable(); } - workflowService.saveWorkflow(workflow); + workflowService.saveWorkflow(workflow,false); return Response.buildSuccess(); } @@ -163,9 +163,9 @@ public Response save(@RequestBody JSONObject request) { if (StringUtils.hasText(versionName)) { WorkflowVersion workflowVersion = new WorkflowVersion(workflow); workflowVersion.setVersionName(versionName); - workflowService.saveWorkflowVersion(workflowVersion, true); + workflowService.saveWorkflowVersion(workflowVersion, true,true); } else { - workflowService.saveWorkflow(workflow); + workflowService.saveWorkflow(workflow,true); } return Response.buildSuccess(); } diff --git a/flow-engine-starter-infra/pom.xml b/flow-engine-starter-infra/pom.xml index 76e49093..b863842c 100644 --- a/flow-engine-starter-infra/pom.xml +++ b/flow-engine-starter-infra/pom.xml @@ -6,7 +6,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 flow-engine-starter-infra diff --git a/flow-engine-starter-query/pom.xml b/flow-engine-starter-query/pom.xml index c2edcd4c..bc5e9715 100644 --- a/flow-engine-starter-query/pom.xml +++ b/flow-engine-starter-query/pom.xml @@ -6,7 +6,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 flow-engine-starter-query diff --git a/flow-engine-starter/pom.xml b/flow-engine-starter/pom.xml index ca1bd34b..a68f2afb 100644 --- a/flow-engine-starter/pom.xml +++ b/flow-engine-starter/pom.xml @@ -6,7 +6,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 flow-engine-starter diff --git a/pom.xml b/pom.xml index bb85471d..e454baff 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.codingapi.flow flow-engine-parent - 0.0.10 + 0.0.11 pom https://github.com/codingapi/flow-engine From d26b85b53876294200012075724b3768fedae348 Mon Sep 17 00:00:00 2001 From: lorne <1991wangliang@gmail.com> Date: Thu, 2 Apr 2026 11:03:42 +0800 Subject: [PATCH 2/2] Update flow-frontend to latest main --- flow-frontend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow-frontend b/flow-frontend index 7f2a3b9c..7fecdaa4 160000 --- a/flow-frontend +++ b/flow-frontend @@ -1 +1 @@ -Subproject commit 7f2a3b9ce00a4786713ad690ad0b4f9e9ae82c8e +Subproject commit 7fecdaa46b9f81c2523ff9bd8031437da3b51be9