From f681b7e5c33cf64fb37ce11a6a165bd6151af9b1 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Mon, 18 May 2026 09:47:42 +0800 Subject: [PATCH 1/7] =?UTF-8?q?yxk-20260518-=E5=BE=85=E5=8A=9E=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?deadline=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=BB=8E=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java | 4 +++- .../jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java | 2 ++ .../main/java/org/jeecg/modules/tasktask/entity/TaskTask.java | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java index 0e381a6..72f92b3 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java @@ -55,6 +55,8 @@ public class TaskDTO implements java.io.Serializable { /** 业务标题*/ private String bpmBizTitle; + /** 截止时间 */ + private String deadline; /** 流程状态 未发起、处理中、处理完成*/ private String bpmStatus; /** 超时提醒*/ @@ -88,4 +90,4 @@ public class TaskDTO implements java.io.Serializable { } - \ No newline at end of file + diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java index c100c40..9b5111d 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java @@ -296,6 +296,7 @@ public class ActivitiServiceImpl implements ActivitiService { Set needSet = new HashSet(); needSet.add(WorkFlowGlobals.BPM_BIZ_TITLE); needSet.add(WorkFlowGlobals.BPM_DES_FORM_CODE); + needSet.add("deadline"); Map processVariables = runtimeService.getVariables(processInstanceId,needSet); //流程定义 @@ -309,6 +310,7 @@ public class ActivitiServiceImpl implements ActivitiService { dto.setTaskId(t.getTaskDefinitionKey()); dto.setTaskEndTime(t.getDueDate()); dto.setProcessInstanceId(t.getProcessInstanceId()); + dto.setDeadline(oConvertUtils.getString(processVariables.get("deadline"))); dto.setProcessApplyUserId(applyUserId); // dto.setProcessApplyUserName(ownerSysUser!=null?ownerSysUser.getRealname():""); dto.setProcessDefinitionId(processInstance != null ? processInstance.getProcessDefinitionId() : null); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/entity/TaskTask.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/entity/TaskTask.java index cb1fcd1..1a6f992 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/entity/TaskTask.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/entity/TaskTask.java @@ -80,6 +80,7 @@ public class TaskTask implements Serializable { private java.lang.String processType; /**流程状态*/ @Excel(name = "流程状态", width = 15) + @Dict(dicCode = "super_status") @Schema(description = "流程状态") private java.lang.String bpmStatus; /**关联台账事项ID*/ From a5d4965f9c9bed403456f3fbc2b402645b4c0449 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Mon, 18 May 2026 15:33:40 +0800 Subject: [PATCH 2/7] =?UTF-8?q?yxk-20260518-=E5=BE=85=E5=8A=9E=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0=E6=88=AA=E8=87=B3=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=EF=BC=8C=E9=80=BE=E6=9C=9F?= =?UTF-8?q?=E5=92=8C=E5=8D=B3=E5=B0=86=E5=88=B0=E6=9C=9F=E7=9A=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=86=E5=88=AB=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/modules/bpm/dto/TaskDTO.java | 10 +++++ .../bpm/service/impl/ActivitiServiceImpl.java | 43 +++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java index 72f92b3..90088a0 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/dto/TaskDTO.java @@ -57,6 +57,16 @@ public class TaskDTO implements java.io.Serializable { private String bpmBizTitle; /** 截止时间 */ private String deadline; + /** 截止时间是否逾期 */ + private Boolean deadlineOverdue; + /** 截止时间逾期天数 */ + private Long overdueDays; + /** 截止时间是否临近 */ + private Boolean deadlineSoon; + /** 截止时间剩余天数 */ + private Long remainingDays; + /** 截止时间提醒文案 */ + private String deadlineWarnText; /** 流程状态 未发起、处理中、处理完成*/ private String bpmStatus; /** 超时提醒*/ diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java index 9b5111d..b25a1df 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/bpm/service/impl/ActivitiServiceImpl.java @@ -310,7 +310,21 @@ public class ActivitiServiceImpl implements ActivitiService { dto.setTaskId(t.getTaskDefinitionKey()); dto.setTaskEndTime(t.getDueDate()); dto.setProcessInstanceId(t.getProcessInstanceId()); - dto.setDeadline(oConvertUtils.getString(processVariables.get("deadline"))); + String deadline = oConvertUtils.getString(processVariables.get("deadline")); + dto.setDeadline(deadline); + Long deadlineGapDays = calcDeadlineGapDays(deadline); + dto.setDeadlineOverdue(false); + dto.setDeadlineSoon(false); + if (deadlineGapDays != null && deadlineGapDays < 0) { + Long overdueDays = Math.abs(deadlineGapDays); + dto.setDeadlineOverdue(true); + dto.setOverdueDays(overdueDays); + dto.setDeadlineWarnText("已逾期" + overdueDays + "天"); + } else if (deadlineGapDays != null && deadlineGapDays <= 3) { + dto.setDeadlineSoon(true); + dto.setRemainingDays(deadlineGapDays); + dto.setDeadlineWarnText(deadlineGapDays == 0 ? "今天截止" : "剩余" + deadlineGapDays + "天"); + } dto.setProcessApplyUserId(applyUserId); // dto.setProcessApplyUserName(ownerSysUser!=null?ownerSysUser.getRealname():""); dto.setProcessDefinitionId(processInstance != null ? processInstance.getProcessDefinitionId() : null); @@ -547,10 +561,33 @@ public class ActivitiServiceImpl implements ActivitiService { } - + + /** + * 计算截止日期与今天的天数差,负数表示已逾期 + * @param deadline + * @return + */ + private Long calcDeadlineGapDays(String deadline) { + if (oConvertUtils.isEmpty(deadline)) { + return null; + } + try { + String deadlineText = deadline.trim(); + if (deadlineText.length() < 10) { + return null; + } + String deadlineDateText = deadlineText.substring(0, 10).replace("/", "-").replace(".", "-"); + java.time.LocalDate deadlineDate = java.time.LocalDate.parse(deadlineDateText); + return java.time.temporal.ChronoUnit.DAYS.between(java.time.LocalDate.now(), deadlineDate); + } catch (Exception e) { + log.warn("待办任务deadline解析失败:{}", deadline); + return null; + } + } + /** * 获取业务ID - * + * * @param task * @return */ From 1568110e663a8681ea0c699e6f87f57e521a7d76 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 19 May 2026 11:02:28 +0800 Subject: [PATCH 3/7] =?UTF-8?q?yxk-20260519-YHJY004-=E5=85=9A=E5=A7=94?= =?UTF-8?q?=E4=BC=9A=E5=A2=9E=E5=8A=A0=E5=8D=8F=E5=8A=9E=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20=E5=8F=91=E8=B5=B7=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E5=90=88=E5=B9=B6=E4=B8=BB?= =?UTF-8?q?=E5=8A=9E=E9=83=A8=E9=97=A8=E5=92=8C=E5=8D=8F=E5=8A=9E=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=8E=BB=E9=87=8D=E5=90=8E?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=B8=BA=E8=A2=AB=E7=9D=A3=E5=8A=9E=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E4=BE=9B=E7=94=A8=E6=88=B7=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/bgpartymatter/entity/BgPartymatter.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java index e911000..8853124 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java @@ -83,11 +83,16 @@ public class BgPartymatter implements Serializable { @Excel(name = "事项目录编码", width = 15) @Schema(description = "事项目录编码") private java.lang.String matterCode; - /**责任部门*/ - @Excel(name = "责任部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") + /**主办部门*/ + @Excel(name = "主办部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") @Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") - @Schema(description = "责任部门") + @Schema(description = "主办部门") private java.lang.String responDeptid; + /**协办部门*/ + @Excel(name = "协办部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") + @Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") + @Schema(description = "协办部门") + private java.lang.String assistDeptid; /**实际执行情况*/ @Excel(name = "实际执行情况", width = 15) @Schema(description = "实际执行情况") From 733b19ad916c70f4e09adee93278bb5e7f05bbba Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 19 May 2026 16:14:18 +0800 Subject: [PATCH 4/7] =?UTF-8?q?yxk-20260519-=E5=85=9A=E5=A7=94=E4=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=84=E5=91=8A=E5=8D=95=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E3=80=81=E6=98=AF=E5=90=A6=E4=B8=BA=E4=B8=89=E9=87=8D=E4=B8=80?= =?UTF-8?q?=E5=A4=A7=E5=86=B3=E7=AD=96=E4=B8=A4=E4=B8=AA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bgpartymatter/entity/BgPartymatter.java | 18 ++++++++++++++---- .../entity/BgPartymatterFeedback.java | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java index 8853124..50db0f6 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableLogic; @@ -83,6 +84,15 @@ public class BgPartymatter implements Serializable { @Excel(name = "事项目录编码", width = 15) @Schema(description = "事项目录编码") private java.lang.String matterCode; + /**抄告单编号*/ + @Excel(name = "抄告单编号", width = 15) + @Schema(description = "抄告单编号") + private java.lang.String noticeNumber; + /**是否为三重一大决策*/ + @Excel(name = "是否为三重一大决策", width = 15, dicCode = "yn") + @Dict(dicCode = "yn") + @Schema(description = "是否为三重一大决策") + private java.lang.String isImportant; /**主办部门*/ @Excel(name = "主办部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") @Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id") @@ -112,10 +122,10 @@ public class BgPartymatter implements Serializable { @DateTimeFormat(pattern="yyyy-MM-dd") @Schema(description = "要求完成日期") private java.util.Date deadline; - /**紧急程度*/ - @Excel(name = "紧急程度", width = 15) - @Dict(dicCode = "urgency_level") - @Schema(description = "紧急程度") + /**是否急件*/ + @Excel(name = "是否急件", width = 15, dicCode = "yn") + @Dict(dicCode = "yn") + @Schema(description = "是否急件") private java.lang.String urgencyLevel; /**是否需要所办领导审批*/ @Excel(name = "是否需要所办领导审批", width = 15,replace = {"是_1","否_0"} ) diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatterFeedback.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatterFeedback.java index 24af22b..f791fff 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatterFeedback.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatterFeedback.java @@ -80,6 +80,7 @@ public class BgPartymatterFeedback implements Serializable { private java.util.Date actualTime; /**完成状态*/ @Excel(name = "完成状态", width = 15) + @Dict(dicCode = "feedback_status") @Schema(description = "完成状态") private java.lang.String bpmStatus; /**流程实例id*/ From 795e10adb9431a28a63d1f85edb62f6b85cdb1b3 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Wed, 20 May 2026 09:40:05 +0800 Subject: [PATCH 5/7] =?UTF-8?q?yxk-20260520-=E6=B5=81=E7=A8=8Bbug=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=9A=E5=8F=91=E5=B8=83=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E5=86=85?= =?UTF-8?q?=E5=B5=8C=E5=AD=90=E6=B5=81=E7=A8=8B=E7=9A=84=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BC=9A=E8=A2=AB=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ExtActProcessServiceImpl.java | 115 +++++++++++++++--- 1 file changed, 100 insertions(+), 15 deletions(-) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessServiceImpl.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessServiceImpl.java index c06789c..502848f 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessServiceImpl.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/service/impl/ExtActProcessServiceImpl.java @@ -7,6 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StreamUtils; +import org.flowable.bpmn.converter.BpmnXMLConverter; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.FlowElementsContainer; +import org.flowable.bpmn.model.Task; import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.IdentityService; import org.flowable.engine.RepositoryService; @@ -51,6 +56,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletRequest; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamReader; +import java.io.ByteArrayInputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.sql.Blob; import java.sql.Clob; import java.util.*; @@ -183,6 +193,11 @@ public class ExtActProcessServiceImpl extends ServiceImpl processNodeInfoMap = parseProcessNodeInfoMap(processDescriptor); + DesUtils.checkNodeDuplicate(toDesignerNodeString(processNodeInfoMap.values())); ExtActProcess process = extActProcessMapper.selectById(processDefinitionId); //第一次进入设计流程的时候,processDefinitionId始终为零,导致流程保存多份 if ("0".equals(processDefinitionId) && process == null) { @@ -1351,19 +1368,16 @@ public class ExtActProcessServiceImpl extends ServiceImpl oldNodeList = extActProcessNodeMapper.queryAllNodesByProcessKey(processkey); - List newNodeList = new ArrayList<>(); - if (nodes != null && nodes.length() > 3) { - String[] temp = nodes.split("@@@"); - for (int i = 0; i < temp.length; i++) { - ExtActProcessNode processnode = null; - String[] fileds = temp[i].split("###"); - String tid = fileds[0].substring(3); - String name = fileds[1].substring(9); - newNodeList.add(tid); + Map oldNodeMap = oldNodeList.stream() + .collect(Collectors.toMap(ExtActProcessNode::getProcessNodeCode, node -> node, (left, right) -> left)); + // newNodeList 是 XML 中真实存在的可配置任务节点,后续只删除不在此清单中的旧配置。 + List newNodeList = new ArrayList<>(processNodeInfoMap.keySet()); + for (ProcessNodeInfo nodeInfo : processNodeInfoMap.values()) { + String tid = nodeInfo.getId(); + String name = nodeInfo.getName(); + ExtActProcessNode processnode = oldNodeMap.get(tid); // 2.查询节点是否存在 - processnode = oldNodeList.stream().filter(node -> node.getProcessNodeCode().equals(tid)).findFirst().orElse(null); - //processnode = extActProcessNodeMapper.queryByNodeCodeAndProcessKey(processkey, tid); if (processnode == null) { processnode = new ExtActProcessNode(); processnode.setProcessNodeCode(tid); @@ -1385,7 +1399,6 @@ public class ExtActProcessServiceImpl extends ServiceImpl needToDeleteNodes = oldNodeList.stream().filter(element -> !newNodeList.contains(element.getProcessNodeCode()) && !element.getProcessNodeCode().toLowerCase().contains("start")) + List needToDeleteNodes = oldNodeList.stream().filter(element -> !newNodeList.contains(element.getProcessNodeCode())) .map(ExtActProcessNode::getProcessNodeCode).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(needToDeleteNodes)){ extActProcessNodeMapper.deleteNodeByProcessId(process.getId(), needToDeleteNodes); } - } //update-end---author:scott ---date::2023-11-18 for:【QQYUN-7020】流程设计器里面节点删除了,但是配置里面节点未删除 return j; } + + /** + * 从 BPMN XML 解析流程配置节点。XML 解析失败时直接中断保存,避免按不完整节点清单删除已有配置。 + */ + private Map parseProcessNodeInfoMap(String processDescriptor) throws Exception { + if (oConvertUtils.isEmpty(processDescriptor)) { + throw new Exception("Process XML cannot be empty"); + } + XMLInputFactory xif = XMLInputFactory.newInstance(); + xif.setProperty(XMLInputFactory.SUPPORT_DTD, false); + xif.setProperty("javax.xml.stream.isSupportingExternalEntities", false); + try (InputStreamReader xmlIn = new InputStreamReader(new ByteArrayInputStream(processDescriptor.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8)) { + XMLStreamReader xtr = xif.createXMLStreamReader(xmlIn); + BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr); + Map nodeInfoMap = new LinkedHashMap<>(); + for (org.flowable.bpmn.model.Process process : bpmnModel.getProcesses()) { + collectProcessNodeInfos(process, nodeInfoMap); + } + return nodeInfoMap; + } catch (Exception e) { + log.error("Parse BPMN XML process nodes failed", e); + throw new Exception("Parse BPMN XML process nodes failed, please check process designer XML", e); + } + } + + private void collectProcessNodeInfos(FlowElementsContainer container, Map nodeInfoMap) { + if (container == null || CollectionUtils.isEmpty(container.getFlowElements())) { + return; + } + for (FlowElement flowElement : container.getFlowElements()) { + if (isConfigurableProcessNode(flowElement) && oConvertUtils.isNotEmpty(flowElement.getId())) { + nodeInfoMap.put(flowElement.getId(), new ProcessNodeInfo(flowElement.getId(), oConvertUtils.getString(flowElement.getName(), ""))); + } + // 子流程本身不作为配置节点保存,但要递归进入子流程内部收集任务节点。 + if (flowElement instanceof FlowElementsContainer) { + collectProcessNodeInfos((FlowElementsContainer) flowElement, nodeInfoMap); + } + } + } + + private boolean isConfigurableProcessNode(FlowElement flowElement) { + // 只同步任务节点,排除开始、结束事件以及 bpmn:SubProcess 容器。 + return flowElement instanceof Task; + } + + private String toDesignerNodeString(Collection nodeInfos) { + if (CollectionUtils.isEmpty(nodeInfos)) { + return ""; + } + StringBuilder nodes = new StringBuilder(); + for (ProcessNodeInfo nodeInfo : nodeInfos) { + nodes.append("id=").append(nodeInfo.getId()).append("###nodeName=").append(nodeInfo.getName()).append("@@@"); + } + return nodes.toString(); + } + + private static class ProcessNodeInfo { + private final String id; + private final String name; + + private ProcessNodeInfo(String id, String name) { + this.id = id; + this.name = name; + } + + private String getId() { + return id; + } + + private String getName() { + return name; + } + } } From 50dffa0829dbbde0545d4c3313c318f693ea9c93 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Wed, 20 May 2026 10:14:51 +0800 Subject: [PATCH 6/7] =?UTF-8?q?yxk-20260520-=E5=85=9A=E5=A7=94=E4=BC=9A?= =?UTF-8?q?=EF=BC=9A=E6=96=B0=E5=A2=9E=E8=AE=AE=E9=A2=98=E5=BA=8F=E5=8F=B7?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20=E5=BA=8F=E5=8F=B7=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90=EF=BC=8C=E6=98=8E=E7=A1=AE=E7=94=9F=E6=88=90?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=88=E5=85=88=E9=80=89=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E5=86=8D=E9=80=89=E8=AE=AE=E9=A2=98=EF=BC=89=EF=BC=8C20260520-?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BgPartymatterController.java | 16 ++++++++++++++++ .../demo/bgpartymatter/entity/BgPartymatter.java | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java index 3253192..6bbb384 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java @@ -36,6 +36,7 @@ import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -106,6 +107,7 @@ public class BgPartymatterController extends JeecgController edit(@RequestBody BgPartymatter bgPartymatter) { + fillGeneratedNumber(bgPartymatter); bgPartymatterService.updateById(bgPartymatter); return Result.OK("编辑成功!"); } @@ -139,11 +142,24 @@ public class BgPartymatterController extends JeecgController Date: Thu, 21 May 2026 09:25:32 +0800 Subject: [PATCH 7/7] =?UTF-8?q?yxk-20260521-=E5=B7=B2=E5=8A=9E=E3=80=81?= =?UTF-8?q?=E6=8A=84=E9=80=81=E3=80=81=E5=8E=86=E5=8F=B2=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8CgetHisProcessNodeInfo=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0businessId=E5=92=8CbusinessTableName?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExtActProcessNodeController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java index 9dbddda..966df5b 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActProcessNodeController.java @@ -46,6 +46,11 @@ import java.util.stream.Stream; @RequestMapping("/act/process/extActProcessNode") @Slf4j public class ExtActProcessNodeController { + private static final String BUSINESS_ID = "business_id"; + private static final String BUSINESS_TABLE_NAME = "business_tablename"; + private static final String BUSINESS_ID_CAMEL = "businessId"; + private static final String BUSINESS_TABLE_NAME_CAMEL = "businessTablename"; + @Autowired private IExtActProcessNodeService extActProcessNodeService; @Autowired @@ -359,9 +364,20 @@ public class ExtActProcessNodeController { String formUrlMobile = activitiService.getHisVarinst(WorkFlowGlobals.BPM_FORM_CONTENT_URL_MOBILE,procInstId); String dataId = activitiService.getHisVarinst(WorkFlowGlobals.BPM_DATA_ID,procInstId); String tableName = activitiService.getHisVarinst(WorkFlowGlobals.BPM_FORM_KEY,procInstId); + // 历史/抄送查看需要真实业务表数据,补齐发起流程时写入的业务ID和业务表名变量。 + String businessId = getHisVarinstByNames(procInstId, BUSINESS_ID, BUSINESS_ID_CAMEL); + String businessTableName = getHisVarinstByNames(procInstId, BUSINESS_TABLE_NAME, BUSINESS_TABLE_NAME_CAMEL); Map variablesMap = new HashMap(); variablesMap.put(WorkFlowGlobals.BPM_DATA_ID, dataId); variablesMap.put(WorkFlowGlobals.BPM_FORM_KEY, tableName); + if (oConvertUtils.isNotEmpty(businessId)) { + variablesMap.put(BUSINESS_ID, businessId); + variablesMap.put(BUSINESS_ID_CAMEL, businessId); + } + if (oConvertUtils.isNotEmpty(businessTableName)) { + variablesMap.put(BUSINESS_TABLE_NAME, businessTableName); + variablesMap.put(BUSINESS_TABLE_NAME_CAMEL, businessTableName); + } Map map = new HashMap(); map.put("formUrl", formUrl); map.put("formUrlMobile", formUrlMobile); @@ -375,6 +391,16 @@ public class ExtActProcessNodeController { result.setSuccess(true); return result; } + + private String getHisVarinstByNames(String procInstId, String... varNames) { + for (String varName : varNames) { + String value = activitiService.getHisVarinst(varName, procInstId); + if (oConvertUtils.isNotEmpty(value)) { + return value; + } + } + return null; + } /**