From 311488fa6c96f4d47f7f2a64f5518247d69a674b Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Fri, 29 Aug 2025 15:18:49 +0800 Subject: [PATCH 01/21] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=89=93=E5=8D=B0=E6=A8=A1=E6=9D=BF=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/vo/model/BpmModelMetaInfoVO.java | 17 +++++++++++++++++ .../definition/BpmProcessDefinitionInfoDO.java | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java index 943a82d546..5284281f10 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmModelMetaInfoVO.java @@ -100,6 +100,10 @@ public class BpmModelMetaInfoVO { @Schema(description = "任务后置通知设置", example = "{}") private HttpRequestSetting taskAfterTriggerSetting; + @Schema(description = "自定义打印模板设置", example = "{}") + @Valid + private PrintTemplateSetting printTemplateSetting; + @Schema(description = "流程 ID 规则") @Data @Valid @@ -180,4 +184,17 @@ public class BpmModelMetaInfoVO { } + @Schema(description = "自定义打印模板设置") + @Data + public static class PrintTemplateSetting { + + @Schema(description = "是否自定义打印模板", example = "false") + @NotNull(message = "是否自定义打印模板不能为空") + private Boolean enable; + + @Schema(description = "打印模板", example = "

") + private String template; + + } + } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 37e2c4462d..6fd905ee3d 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -224,4 +224,10 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { @TableField(typeHandler = JacksonTypeHandler.class) private BpmModelMetaInfoVO.HttpRequestSetting taskAfterTriggerSetting; + /** + * 自定义打印模板设置 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting; + } From c28ca2d87f4e871d64560a21badb7f3215b00eb0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 29 Aug 2025 20:40:14 +0800 Subject: [PATCH 02/21] =?UTF-8?q?review=EF=BC=9A=E3=80=90bpm=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E3=80=91=E5=AD=90=E6=B5=81=E7=A8=8B=E4=B8=8D?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 9dfb98725c..d26d406d6d 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -951,7 +951,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService status); } - // 1.3 如果子流程拒绝, 设置其父流程也为拒绝状态且结束父流程 + // 1.3 如果子流程拒绝,设置其父流程也为拒绝状态,且结束父流程 + // 相关问题链接:https://t.zsxq.com/kZhyb if (Objects.equals(status, BpmProcessInstanceStatusEnum.REJECT.getStatus()) && StrUtil.isNotBlank(instance.getSuperExecutionId())) { // 1.3.1 获取父流程实例 并标记为不通过 @@ -961,6 +962,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService // 1.3.2 结束父流程。需要在子流程结束事务提交后执行 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override public void afterCompletion(int transactionStatus) { // 回滚情况,直接返回 @@ -1020,7 +1022,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService runtimeService.setProcessInstanceName(instance.getProcessInstanceId(), name); } - // 流程前置通知:需要在流程启动后(事务提交后)。variables 已设置。或者放在 PROCESS_STARTED 事件中处理,先放这里。 + // 流程前置通知:需要在流程启动后(事务提交后),保证 variables 已设置 + // 相关问题链接:https://t.zsxq.com/DF7Kq if (ObjUtil.isNull(processDefinitionInfo.getProcessBeforeTriggerSetting())) { return; } From acbe083c7f0fa41fce13fd6c7744094002719992 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 2 Sep 2025 17:02:58 +0800 Subject: [PATCH 03/21] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=89=93=E5=8D=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/BpmProcessInstanceController.java | 8 + .../instance/BpmProcessPrintDataRespVO.java | 65 ++++++++ .../task/BpmProcessInstanceStatusEnum.java | 5 + .../bpm/enums/task/BpmTaskStatusEnum.java | 5 + .../task/BpmProcessInstanceService.java | 8 + .../task/BpmProcessInstanceServiceImpl.java | 143 ++++++++++++++++++ 6 files changed, 234 insertions(+) create mode 100644 yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index 8a3777772e..b66555cda3 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -196,4 +196,12 @@ public class BpmProcessInstanceController { return success(processInstanceService.getProcessInstanceBpmnModelView(id)); } + @GetMapping("/get-print-data") + @Operation(summary = "获得打印数据") + @Parameter(name = "id", description = "流程实例的编号", required = true) + @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") + public CommonResult getPrintData(@RequestParam("processInstanceId") String processInstanceId) { + return success(processInstanceService.getPrintData(getLoginUserId(), processInstanceId)); + } + } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java new file mode 100644 index 0000000000..a7897f1845 --- /dev/null +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + + +@Schema(description = "管理后台 - 打印数据 Response VO") +@Data +public class BpmProcessPrintDataRespVO { + + private Boolean printTemplateEnable; + + private Integer processStatus; + + private String processStatusShow; + + private String processInstanceId; + + private String processBusinessKey; + + private String processName; + + private String startUser; + + private String startUserDept; + + private String startTime; + + private List approveNodes; + + private List formFields; + + private String printTemplateHtml; + + @Data + public static class ApproveNode { + + private String nodeName; + + private String nodeDesc; + + private String signUrl; + + private String nodeId; + + } + + @Data + public static class FormField { + + private String formId; + + private String formName; + + private String formType; + + private String formValue; + + private String formValueShow; + + } + +} diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java index 5b42df50fe..87be32633b 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceStatusEnum.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.task; +import cn.hutool.core.util.ArrayUtil; import cn.iocoder.yudao.framework.common.core.ArrayValuable; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import lombok.AllArgsConstructor; @@ -47,4 +48,8 @@ public enum BpmProcessInstanceStatusEnum implements ArrayValuable { APPROVE.getStatus(), REJECT.getStatus(), CANCEL.getStatus()); } + public static BpmProcessInstanceStatusEnum valueOf(Integer status) { + return ArrayUtil.firstMatch(item -> item.getStatus().equals(status), values()); + } + } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskStatusEnum.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskStatusEnum.java index 9ba3b5cb3a..0f69c42795 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskStatusEnum.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmTaskStatusEnum.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.enums.task; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import lombok.AllArgsConstructor; @@ -68,4 +69,8 @@ public enum BpmTaskStatusEnum { return ObjUtil.equal(status, CANCEL.getStatus()); } + public static BpmTaskStatusEnum valueOf(Integer status) { + return ArrayUtil.firstMatch(item -> item.getStatus().equals(status), values()); + } + } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index abba2245e2..33e667716b 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -113,6 +113,14 @@ public interface BpmProcessInstanceService { */ BpmProcessInstanceBpmnModelViewRespVO getProcessInstanceBpmnModelView(String id); + /** + * 获取流程打印所需数据 + * @param loginUserId 打印人 + * @param processInstanceId 流程实例id + * @return 打印所需数据 + */ + BpmProcessPrintDataRespVO getPrintData(Long loginUserId, String processInstanceId); + // ========== Update 写入相关方法 ========== /** diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 9dfb98725c..153e51bfc3 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -2,9 +2,13 @@ package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.*; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils; @@ -57,6 +61,10 @@ import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceBuilder; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -726,6 +734,141 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService userMap, deptMap); } + @Override + public BpmProcessPrintDataRespVO getPrintData(Long loginUserId, String processInstanceId) { + // TODO 方法抽离 + // 流程实例 + HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId); + if (historicProcessInstance == null) { + throw exception(PROCESS_INSTANCE_NOT_EXISTS); + } + // 准备数据 + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService + .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()); + BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting(); + List formFieldList = processDefinitionInfo.getFormFields(); + List formFieldObjList = formFieldList.stream().map(JSONUtil::parseObj).toList(); + List tasks = historyService.createHistoricTaskInstanceQuery() + .finished() + .includeTaskLocalVariables() + .processInstanceId(processInstanceId) + .taskVariableValueNotEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, + BpmTaskStatusEnum.CANCEL.getStatus()) + .orderByHistoricTaskInstanceStartTime().asc().list(); + Set userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee())); + userIds.add(loginUserId); + Map userMap = adminUserApi.getUserMap(userIds); + HashMap printDataMap = new HashMap<>(8 + formFieldList.size()); + // 返回打印所需数据 + BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); + // 打印模板是否开启 + printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable())); + // 流程相关数据 + printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); + printData.setProcessStatusShow(BpmProcessInstanceStatusEnum.valueOf(printData.getProcessStatus()).getDesc()); + printData.setProcessInstanceId(historicProcessInstance.getId()); + printData.setProcessName(historicProcessInstance.getName()); + printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey()); + printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime())); + // 发起人 + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId())); + DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); + printData.setStartUser(startUser.getNickname()); + printData.setStartUserDept(dept.getName()); + // 审批历史 + List approveNodes = new ArrayList<>(tasks.size()); + tasks.forEach(item -> { + Map taskLocalVariables = item.getTaskLocalVariables(); + BpmProcessPrintDataRespVO.ApproveNode approveNode = new BpmProcessPrintDataRespVO.ApproveNode(); + approveNode.setNodeName(item.getName()); + approveNode.setNodeId(item.getId()); + approveNode.setSignUrl((String) taskLocalVariables.getOrDefault(BpmnVariableConstants.TASK_SIGN_PIC_URL, "")); + approveNode.setNodeDesc(StrUtil.format("{} / {} / {} / {} / {}", + userMap.get(Long.valueOf(item.getAssignee())).getNickname(), + item.getName(), + DateUtil.formatDateTime(item.getEndTime()), + BpmTaskStatusEnum.valueOf((Integer) taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_STATUS)).getName(), + taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_REASON))); + approveNodes.add(approveNode); + }); + printData.setApproveNodes(approveNodes); + // 表单数据 + Map processVariables = historicProcessInstance.getProcessVariables(); + List formFields = new ArrayList<>(formFieldList.size()); + formFieldObjList.forEach(item -> { + BpmProcessPrintDataRespVO.FormField formField = new BpmProcessPrintDataRespVO.FormField(); + formField.setFormName(item.getStr("title")); + formField.setFormType(item.getStr("type")); + formField.setFormId(item.getStr("field")); + formField.setFormValue(processVariables.get(item.getStr("field")).toString()); + // TODO 根据不同类型的表单展示,下面为图片和输入框示例 + if (formField.getFormType().equals("input")) { + formField.setFormValueShow(processVariables.get(item.getStr("field")).toString()); + } else if (formField.getFormType().equals("UploadImg")) { + formField.setFormValueShow(""); + } else { + formField.setFormValueShow("此类型表单展示未完善"); + } + printDataMap.put(formField.getFormId(), formField.getFormValueShow()); + formFields.add(formField); + }); + printData.setFormFields(formFields); + // 数据映射 + printDataMap.put("processName", printData.getProcessName()); + printDataMap.put("printUsername", userMap.get(loginUserId).getNickname()); + printDataMap.put("processNum", printData.getProcessInstanceId()); + printDataMap.put("printTime", DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(new DateTime())); + printDataMap.put("startUser", printData.getStartUser()); + printDataMap.put("startTime", printData.getStartTime()); + printDataMap.put("startUserDept", printData.getStartUserDept()); + printDataMap.put("processStatus", printData.getProcessStatusShow()); + // 自定义模板 + if (printData.getPrintTemplateEnable() && printTemplateSetting != null) { + Document document = Jsoup.parse(printTemplateSetting.getTemplate()); + // 添加table的border + Elements tables = document.select("table"); + tables.forEach(item -> { + item.attr("border", "1"); + }); + // 替换所有mention + Elements mention = document.getElementsByAttributeValue("data-w-e-type", "mention"); + mention.forEach(item -> { + String mentionId = JSONUtil.parseObj(URLUtil.decode(item.attr("data-info"))).getStr("id"); + item.html(printDataMap.get(mentionId)); + }); + // 替换流程记录 + Elements processRecords = document.getElementsByAttributeValue("data-w-e-type", "process-record"); + Element processRecordElement = null; + if (!processRecords.isEmpty()) { + processRecordElement = new Element("table", "") + .attr("style", "width:100%;") + .attr("border", "1"); + Element tbody = new Element("tbody", ""); + Element rowHead = new Element("tr", ""); + rowHead.appendChild(new Element("td", "") + .attr("colspan", "2") + .attr("width", "auto") + .attr("style", "text-align: center;") + .html("流程节点")); + tbody.appendChild(rowHead); + for (BpmProcessPrintDataRespVO.ApproveNode item : printData.getApproveNodes()) { + Element row = new Element("tr", ""); + row.appendChild(new Element("td", "") + .html(item.getNodeName())); + row.appendChild(new Element("td", "") + .html(item.getNodeDesc())); + tbody.appendChild(row); + } + processRecordElement.appendChild(tbody); + } + for (Element item : processRecords) { + item.html(processRecordElement.outerHtml()); + } + printData.setPrintTemplateHtml(document.html()); + } + return printData; + } + // ========== Update 写入相关方法 ========== @Override From 21f62b17b15957854dce21483dc5874419daa1e3 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Tue, 2 Sep 2025 17:08:06 +0800 Subject: [PATCH 04/21] =?UTF-8?q?fix:=20=E8=A1=A8=E5=8D=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=8D=E5=AD=98=E5=9C=A8=E6=97=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 153e51bfc3..d5c0a10931 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -800,12 +800,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService formField.setFormName(item.getStr("title")); formField.setFormType(item.getStr("type")); formField.setFormId(item.getStr("field")); - formField.setFormValue(processVariables.get(item.getStr("field")).toString()); + formField.setFormValue(processVariables.getOrDefault(item.getStr("field"), "").toString()); // TODO 根据不同类型的表单展示,下面为图片和输入框示例 if (formField.getFormType().equals("input")) { - formField.setFormValueShow(processVariables.get(item.getStr("field")).toString()); + formField.setFormValueShow(processVariables.getOrDefault(item.getStr("field"), "").toString()); } else if (formField.getFormType().equals("UploadImg")) { - formField.setFormValueShow(""); + formField.setFormValueShow(""); } else { formField.setFormValueShow("此类型表单展示未完善"); } From 9b426436bee0f12b0285c8db2331b49c04acd865 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 3 Sep 2025 13:24:54 +0800 Subject: [PATCH 05/21] =?UTF-8?q?review=EF=BC=9A=E3=80=90bpm=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E3=80=91=E6=B5=81=E7=A8=8B=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/task/BpmProcessInstanceController.java | 10 ++++++---- .../task/vo/instance/BpmProcessPrintDataRespVO.java | 6 ++++-- .../bpm/service/task/BpmProcessInstanceService.java | 2 +- .../service/task/BpmProcessInstanceServiceImpl.java | 12 ++++++++---- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java index b66555cda3..9eef45cd1c 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java @@ -192,16 +192,18 @@ public class BpmProcessInstanceController { @GetMapping("/get-bpmn-model-view") @Operation(summary = "获取流程实例的 BPMN 模型视图", description = "在【流程详细】界面中,进行调用") @Parameter(name = "id", description = "流程实例的编号", required = true) - public CommonResult getProcessInstanceBpmnModelView(@RequestParam(value = "id") String id) { + public CommonResult getProcessInstanceBpmnModelView( + @RequestParam(value = "id") String id) { return success(processInstanceService.getProcessInstanceBpmnModelView(id)); } @GetMapping("/get-print-data") - @Operation(summary = "获得打印数据") + @Operation(summary = "获得流程实例的打印数据") @Parameter(name = "id", description = "流程实例的编号", required = true) @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") - public CommonResult getPrintData(@RequestParam("processInstanceId") String processInstanceId) { - return success(processInstanceService.getPrintData(getLoginUserId(), processInstanceId)); + public CommonResult getProcessInstancePrintData( + @RequestParam("processInstanceId") String processInstanceId) { + return success(processInstanceService.getProcessInstancePrintData(getLoginUserId(), processInstanceId)); } } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java index a7897f1845..a1a0047a00 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java @@ -5,8 +5,8 @@ import lombok.Data; import java.util.List; - -@Schema(description = "管理后台 - 打印数据 Response VO") +// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇? +@Schema(description = "管理后台 - 流程实例的打印数据 Response VO") @Data public class BpmProcessPrintDataRespVO { @@ -14,6 +14,7 @@ public class BpmProcessPrintDataRespVO { private Integer processStatus; + // TODO @lesan:通过字典? private String processStatusShow; private String processInstanceId; @@ -22,6 +23,7 @@ public class BpmProcessPrintDataRespVO { private String processName; + // TODO @lesan:UserSimpleBaseVO 替代 startUser、startUserDept; private String startUser; private String startUserDept; diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java index 33e667716b..fd0a2aaca8 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java @@ -119,7 +119,7 @@ public interface BpmProcessInstanceService { * @param processInstanceId 流程实例id * @return 打印所需数据 */ - BpmProcessPrintDataRespVO getPrintData(Long loginUserId, String processInstanceId); + BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId); // ========== Update 写入相关方法 ========== diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 9c2c06525a..7fedca1880 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -735,7 +735,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService } @Override - public BpmProcessPrintDataRespVO getPrintData(Long loginUserId, String processInstanceId) { + public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) { // TODO 方法抽离 // 流程实例 HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId); @@ -747,7 +747,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()); BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting(); List formFieldList = processDefinitionInfo.getFormFields(); - List formFieldObjList = formFieldList.stream().map(JSONUtil::parseObj).toList(); + List formFieldObjList = formFieldList != null ? formFieldList.stream().map(JSONUtil::parseObj).toList() + : ListUtil.of(); List tasks = historyService.createHistoricTaskInstanceQuery() .finished() .includeTaskLocalVariables() @@ -758,7 +759,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService Set userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee())); userIds.add(loginUserId); Map userMap = adminUserApi.getUserMap(userIds); - HashMap printDataMap = new HashMap<>(8 + formFieldList.size()); + HashMap printDataMap = new HashMap<>(8 + formFieldObjList.size()); // 返回打印所需数据 BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); // 打印模板是否开启 @@ -776,6 +777,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService printData.setStartUser(startUser.getNickname()); printData.setStartUserDept(dept.getName()); // 审批历史 + // TODO @lesan:打印的时候,未来节点打印么? List approveNodes = new ArrayList<>(tasks.size()); tasks.forEach(item -> { Map taskLocalVariables = item.getTaskLocalVariables(); @@ -793,8 +795,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService }); printData.setApproveNodes(approveNodes); // 表单数据 + // TODO @lesan:这个可以在端上搞么?主要考虑,vben 和 vue3 plus 可能使用了不同的前端框架;可能直接使用 form-create 前端的工具方法,会更方便。 Map processVariables = historicProcessInstance.getProcessVariables(); - List formFields = new ArrayList<>(formFieldList.size()); + List formFields = new ArrayList<>(formFieldObjList.size()); formFieldObjList.forEach(item -> { BpmProcessPrintDataRespVO.FormField formField = new BpmProcessPrintDataRespVO.FormField(); formField.setFormName(item.getStr("title")); @@ -834,6 +837,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService Elements mention = document.getElementsByAttributeValue("data-w-e-type", "mention"); mention.forEach(item -> { String mentionId = JSONUtil.parseObj(URLUtil.decode(item.attr("data-info"))).getStr("id"); + // TODO @lesan:这里要求非空; item.html(printDataMap.get(mentionId)); }); // 替换流程记录 From a8223738db55f846c622b882b10fd0eb72fe1435 Mon Sep 17 00:00:00 2001 From: Lesan <1960681385@qq.com> Date: Thu, 4 Sep 2025 09:21:19 +0800 Subject: [PATCH 06/21] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../instance/BpmProcessPrintDataRespVO.java | 33 ++--- .../task/BpmProcessInstanceServiceImpl.java | 132 ++++-------------- 2 files changed, 34 insertions(+), 131 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java index a1a0047a00..700c68eb9b 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.List; +import java.util.Map; -// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇? +// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇?@芋艿:暂时先这样吧,BpmApprovalDetailRespVO 太大了。。。 @Schema(description = "管理后台 - 流程实例的打印数据 Response VO") @Data public class BpmProcessPrintDataRespVO { @@ -14,28 +16,26 @@ public class BpmProcessPrintDataRespVO { private Integer processStatus; - // TODO @lesan:通过字典? - private String processStatusShow; - private String processInstanceId; private String processBusinessKey; private String processName; - // TODO @lesan:UserSimpleBaseVO 替代 startUser、startUserDept; - private String startUser; - - private String startUserDept; + private UserSimpleBaseVO startUser; private String startTime; + private String endTime; + private List approveNodes; - private List formFields; + private List formFields; private String printTemplateHtml; + private Map processVariables; + @Data public static class ApproveNode { @@ -49,19 +49,4 @@ public class BpmProcessPrintDataRespVO { } - @Data - public static class FormField { - - private String formId; - - private String formName; - - private String formType; - - private String formValue; - - private String formValueShow; - - } - } diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 7fedca1880..1fb4256a5f 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -3,12 +3,9 @@ package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.*; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils; @@ -16,6 +13,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; @@ -61,10 +59,6 @@ import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceBuilder; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -736,19 +730,33 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @Override public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) { - // TODO 方法抽离 - // 流程实例 + // 1 数据准备 HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId); if (historicProcessInstance == null) { throw exception(PROCESS_INSTANCE_NOT_EXISTS); } - // 准备数据 BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()); BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting(); - List formFieldList = processDefinitionInfo.getFormFields(); - List formFieldObjList = formFieldList != null ? formFieldList.stream().map(JSONUtil::parseObj).toList() - : ListUtil.of(); + // 2 获取打印所需数据 + BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); + // 2.1 打印模板是否开启 + printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable())); + // 2.2 流程相关数据 + printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); + printData.setProcessInstanceId(historicProcessInstance.getId()); + printData.setProcessName(historicProcessInstance.getName()); + printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey()); + printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime())); + printData.setEndTime(Objects.isNull(historicProcessInstance.getEndTime()) ? + "" : DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getEndTime())); + printData.setProcessVariables(historicProcessInstance.getProcessVariables()); + // 2.3 发起人 + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId())); + DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); + printData.setStartUser(new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName())); + // 2.4 审批历史 + // TODO @lesan:打印的时候,未来节点打印么? @芋艿:只打印已完成的任务 List tasks = historyService.createHistoricTaskInstanceQuery() .finished() .includeTaskLocalVariables() @@ -757,27 +765,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService BpmTaskStatusEnum.CANCEL.getStatus()) .orderByHistoricTaskInstanceStartTime().asc().list(); Set userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee())); - userIds.add(loginUserId); Map userMap = adminUserApi.getUserMap(userIds); - HashMap printDataMap = new HashMap<>(8 + formFieldObjList.size()); - // 返回打印所需数据 - BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO(); - // 打印模板是否开启 - printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable())); - // 流程相关数据 - printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance)); - printData.setProcessStatusShow(BpmProcessInstanceStatusEnum.valueOf(printData.getProcessStatus()).getDesc()); - printData.setProcessInstanceId(historicProcessInstance.getId()); - printData.setProcessName(historicProcessInstance.getName()); - printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey()); - printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime())); - // 发起人 - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId())); - DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); - printData.setStartUser(startUser.getNickname()); - printData.setStartUserDept(dept.getName()); - // 审批历史 - // TODO @lesan:打印的时候,未来节点打印么? List approveNodes = new ArrayList<>(tasks.size()); tasks.forEach(item -> { Map taskLocalVariables = item.getTaskLocalVariables(); @@ -794,81 +782,11 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService approveNodes.add(approveNode); }); printData.setApproveNodes(approveNodes); - // 表单数据 - // TODO @lesan:这个可以在端上搞么?主要考虑,vben 和 vue3 plus 可能使用了不同的前端框架;可能直接使用 form-create 前端的工具方法,会更方便。 - Map processVariables = historicProcessInstance.getProcessVariables(); - List formFields = new ArrayList<>(formFieldObjList.size()); - formFieldObjList.forEach(item -> { - BpmProcessPrintDataRespVO.FormField formField = new BpmProcessPrintDataRespVO.FormField(); - formField.setFormName(item.getStr("title")); - formField.setFormType(item.getStr("type")); - formField.setFormId(item.getStr("field")); - formField.setFormValue(processVariables.getOrDefault(item.getStr("field"), "").toString()); - // TODO 根据不同类型的表单展示,下面为图片和输入框示例 - if (formField.getFormType().equals("input")) { - formField.setFormValueShow(processVariables.getOrDefault(item.getStr("field"), "").toString()); - } else if (formField.getFormType().equals("UploadImg")) { - formField.setFormValueShow(""); - } else { - formField.setFormValueShow("此类型表单展示未完善"); - } - printDataMap.put(formField.getFormId(), formField.getFormValueShow()); - formFields.add(formField); - }); - printData.setFormFields(formFields); - // 数据映射 - printDataMap.put("processName", printData.getProcessName()); - printDataMap.put("printUsername", userMap.get(loginUserId).getNickname()); - printDataMap.put("processNum", printData.getProcessInstanceId()); - printDataMap.put("printTime", DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(new DateTime())); - printDataMap.put("startUser", printData.getStartUser()); - printDataMap.put("startTime", printData.getStartTime()); - printDataMap.put("startUserDept", printData.getStartUserDept()); - printDataMap.put("processStatus", printData.getProcessStatusShow()); - // 自定义模板 + // 2.5 表单数据 + printData.setFormFields(processDefinitionInfo.getFormFields()); + // 2.6 自定义模板 if (printData.getPrintTemplateEnable() && printTemplateSetting != null) { - Document document = Jsoup.parse(printTemplateSetting.getTemplate()); - // 添加table的border - Elements tables = document.select("table"); - tables.forEach(item -> { - item.attr("border", "1"); - }); - // 替换所有mention - Elements mention = document.getElementsByAttributeValue("data-w-e-type", "mention"); - mention.forEach(item -> { - String mentionId = JSONUtil.parseObj(URLUtil.decode(item.attr("data-info"))).getStr("id"); - // TODO @lesan:这里要求非空; - item.html(printDataMap.get(mentionId)); - }); - // 替换流程记录 - Elements processRecords = document.getElementsByAttributeValue("data-w-e-type", "process-record"); - Element processRecordElement = null; - if (!processRecords.isEmpty()) { - processRecordElement = new Element("table", "") - .attr("style", "width:100%;") - .attr("border", "1"); - Element tbody = new Element("tbody", ""); - Element rowHead = new Element("tr", ""); - rowHead.appendChild(new Element("td", "") - .attr("colspan", "2") - .attr("width", "auto") - .attr("style", "text-align: center;") - .html("流程节点")); - tbody.appendChild(rowHead); - for (BpmProcessPrintDataRespVO.ApproveNode item : printData.getApproveNodes()) { - Element row = new Element("tr", ""); - row.appendChild(new Element("td", "") - .html(item.getNodeName())); - row.appendChild(new Element("td", "") - .html(item.getNodeDesc())); - tbody.appendChild(row); - } - processRecordElement.appendChild(tbody); - } - for (Element item : processRecords) { - item.html(processRecordElement.outerHtml()); - } - printData.setPrintTemplateHtml(document.html()); + printData.setPrintTemplateHtml(printTemplateSetting.getTemplate()); } return printData; } From 1c508add9235c1f0b7b8fb567ba69cb8c36d2595 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 4 Sep 2025 22:53:16 +0800 Subject: [PATCH 07/21] =?UTF-8?q?review=EF=BC=9A=E3=80=90bpm=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E3=80=91=E6=B5=81=E7=A8=8B=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/task/vo/instance/BpmProcessPrintDataRespVO.java | 4 +++- .../bpm/service/task/BpmProcessInstanceServiceImpl.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java index 700c68eb9b..5e21ae6a52 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java @@ -7,13 +7,13 @@ import lombok.Data; import java.util.List; import java.util.Map; -// TODO @lesan:这个可能复用 BpmApprovalDetailRespVO 哇?@芋艿:暂时先这样吧,BpmApprovalDetailRespVO 太大了。。。 @Schema(description = "管理后台 - 流程实例的打印数据 Response VO") @Data public class BpmProcessPrintDataRespVO { private Boolean printTemplateEnable; + // TODO @lesan:要不 processStatus、processInstanceId、processBusinessKey、processBusinessKey、startUser、endTime、processVariables 使用 BpmProcessInstanceRespVO ?虽然这个 VO 大了点,但是收一收字段。嘿嘿;进而只有 processInstance、tasks、formFields、printTemplateHtml 这些字段; private Integer processStatus; private String processInstanceId; @@ -28,6 +28,7 @@ public class BpmProcessPrintDataRespVO { private String endTime; + // TODO @lesan:变量要不改成 tasks; private List approveNodes; private List formFields; @@ -36,6 +37,7 @@ public class BpmProcessPrintDataRespVO { private Map processVariables; + // TODO @lesan:类名要不要改成 tasks ?然后 id、name、signUrl、description;感觉理解成本低点; @Data public static class ApproveNode { diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 1fb4256a5f..78961a38bf 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -728,6 +728,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService userMap, deptMap); } + // TODO @lesan:这个可以放在 controller + convert 哇?保证 Service 只尽量处理写逻辑; @Override public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) { // 1 数据准备 @@ -756,7 +757,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService DeptRespDTO dept = deptApi.getDept(startUser.getDeptId()); printData.setStartUser(new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName())); // 2.4 审批历史 - // TODO @lesan:打印的时候,未来节点打印么? @芋艿:只打印已完成的任务 List tasks = historyService.createHistoricTaskInstanceQuery() .finished() .includeTaskLocalVariables() From d7c621688cc1da618c82f39d09c034642f4e8abe Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 4 Sep 2025 23:08:03 +0800 Subject: [PATCH 08/21] =?UTF-8?q?fix=EF=BC=9A=E3=80=90infra=20=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E8=AE=BE=E6=96=BD=E3=80=91vben=20=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=97=B6=EF=BC=8Cparams=20=E6=9C=AA=E4=BC=A0=E9=80=92=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/codegen/vue3_vben5_antd/general/api/api.ts.vm | 2 +- .../main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm | 2 +- .../main/resources/codegen/vue3_vben5_ele/general/api/api.ts.vm | 2 +- .../main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm index 090b14845b..c3691a8b73 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm @@ -98,7 +98,7 @@ export function delete${simpleClassName}List(ids: number[]) { /** 导出${table.classComment} */ export function export${simpleClassName}(params: any) { - return requestClient.download('${baseURL}/export-excel', params); + return requestClient.download('${baseURL}/export-excel', { params }); } ## 特殊:主子表专属逻辑 diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm index 875cd6bb8f..682e5923ae 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm @@ -98,7 +98,7 @@ export function delete${simpleClassName}List(ids: number[]) { /** 导出${table.classComment} */ export function export${simpleClassName}(params: any) { - return requestClient.download('${baseURL}/export-excel', params); + return requestClient.download('${baseURL}/export-excel', { params }); } ## 特殊:主子表专属逻辑 diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/api/api.ts.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/api/api.ts.vm index 090b14845b..c3691a8b73 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/api/api.ts.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/general/api/api.ts.vm @@ -98,7 +98,7 @@ export function delete${simpleClassName}List(ids: number[]) { /** 导出${table.classComment} */ export function export${simpleClassName}(params: any) { - return requestClient.download('${baseURL}/export-excel', params); + return requestClient.download('${baseURL}/export-excel', { params }); } ## 特殊:主子表专属逻辑 diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm index 875cd6bb8f..682e5923ae 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm @@ -98,7 +98,7 @@ export function delete${simpleClassName}List(ids: number[]) { /** 导出${table.classComment} */ export function export${simpleClassName}(params: any) { - return requestClient.download('${baseURL}/export-excel', params); + return requestClient.download('${baseURL}/export-excel', { params }); } ## 特殊:主子表专属逻辑 From f29abe853db4563c6cb03866db79669e2002158a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 5 Sep 2025 01:05:41 +0800 Subject: [PATCH 09/21] =?UTF-8?q?reactor=EF=BC=9A=E3=80=90infra=20?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E8=AE=BE=E6=96=BD=E3=80=91=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20vben5=20+=20element-plus=20=E7=9A=84=20schema=20=E6=A8=A1?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/codegen/CodegenFrontTypeEnum.java | 5 +- .../service/codegen/inner/CodegenEngine.java | 11 +- .../vue3_vben5_ele/schema/api/api.ts.vm | 50 +++++--- .../vue3_vben5_ele/schema/views/data.ts.vm | 18 ++- .../vue3_vben5_ele/schema/views/form.vue.vm | 71 +++++------ .../vue3_vben5_ele/schema/views/index.vue.vm | 118 ++++++++++-------- .../schema/views/modules/form_sub_erp.vue.vm | 9 +- .../views/modules/form_sub_normal.vue.vm | 15 +-- .../schema/views/modules/list_sub_erp.vue.vm | 13 +- 9 files changed, 170 insertions(+), 140 deletions(-) diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenFrontTypeEnum.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenFrontTypeEnum.java index 0ff9e56a9c..7f55507e42 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenFrontTypeEnum.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenFrontTypeEnum.java @@ -21,9 +21,8 @@ public enum CodegenFrontTypeEnum { VUE3_VBEN5_ANTD_SCHEMA(40), // Vue3 VBEN5 + ANTD + schema 模版 VUE3_VBEN5_ANTD_GENERAL(41), // Vue3 VBEN5 + ANTD 标准模版 - // TODO @puhui999::50、51 会好点; - VUE3_VBEN5_EP_SCHEMA(42), // Vue3 VBEN5 + EP + schema 模版 - VUE3_VBEN5_EP_GENERAL(43), // Vue3 VBEN5 + EP 标准模版 + VUE3_VBEN5_EP_SCHEMA(50), // Vue3 VBEN5 + EP + schema 模版 + VUE3_VBEN5_EP_GENERAL(51), // Vue3 VBEN5 + EP 标准模版 ; /** diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java index a0ce062cdc..cf8e030945 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java @@ -343,7 +343,7 @@ public class CodegenEngine { filePath = formatFilePath(filePath, bindingMap); String content = templateEngine.getTemplate(vmPath).render(bindingMap); // 格式化代码 - content = prettyCode(content); + content = prettyCode(content, vmPath); result.put(filePath, content); } @@ -383,11 +383,14 @@ public class CodegenEngine { * 如果不处理,Vue 的 Pretty 格式校验可能会报错 * * @param content 格式化前的代码 + * @param vmPath 模板路径 * @return 格式化后的代码 */ - private String prettyCode(String content) { - // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错 - content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }"); + private String prettyCode(String content, String vmPath) { + // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错(需要排除 vben5) + if (!StrUtil.contains(vmPath, "vben5")) { + content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }"); + } // Vue 界面:去除多的 dateFormatter,只有一个的情况下,说明没使用到 if (StrUtil.count(content, "dateFormatter") == 1) { content = StrUtils.removeLineContains(content, "dateFormatter"); diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm index 682e5923ae..02f175da18 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm @@ -1,10 +1,11 @@ +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api") import type { PageParam, PageResult } from '@vben/request'; import type { Dayjs } from 'dayjs'; import { requestClient } from '#/api/request'; #set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") -export namespace ${simpleClassName}Api { +export namespace ${apiName} { ## 特殊:主子表专属逻辑 #foreach ($subTable in $subTables) #set ($index = $foreach.count - 1) @@ -60,27 +61,35 @@ export namespace ${simpleClassName}Api { #if ( $table.templateType != 2 ) /** 查询${table.classComment}分页 */ export function get${simpleClassName}Page(params: PageParam) { - return requestClient.get>('${baseURL}/page', { params }); + return requestClient.get>( + '${baseURL}/page', + { params }, + ); } #else /** 查询${table.classComment}列表 */ export function get${simpleClassName}List(params: any) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}[]>('${baseURL}/list', { params }); + return requestClient.get<${apiName}.${simpleClassName}[]>( + '${baseURL}/list', + { params }, + ); } #end /** 查询${table.classComment}详情 */ export function get${simpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}>(`${baseURL}/get?id=${id}`); + return requestClient.get<${apiName}.${simpleClassName}>( + `${baseURL}/get?id=${id}`, + ); } /** 新增${table.classComment} */ -export function create${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { +export function create${simpleClassName}(data: ${apiName}.${simpleClassName}) { return requestClient.post('${baseURL}/create', data); } /** 修改${table.classComment} */ -export function update${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { +export function update${simpleClassName}(data: ${apiName}.${simpleClassName}) { return requestClient.put('${baseURL}/update', data); } @@ -92,7 +101,9 @@ export function delete${simpleClassName}(id: number) { #if ( $table.templateType != 2 && $deleteBatchEnable) /** 批量删除${table.classComment} */ export function delete${simpleClassName}List(ids: number[]) { - return requestClient.delete(`${baseURL}/delete-list?ids=${ids.join(',')}`) + return requestClient.delete( + `${baseURL}/delete-list?ids=${ids.join(',')}`, + ); } #end @@ -118,31 +129,38 @@ export function export${simpleClassName}(params: any) { #if ( $table.templateType == 11 ) /** 获得${subTable.classComment}分页 */ export function get${subSimpleClassName}Page(params: PageParam) { - return requestClient.get>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params }); + return requestClient.get>( + `${baseURL}/${subSimpleClassName_strikeCase}/page`, + { params }, + ); } ## 情况二:非 MASTER_ERP 时,需要列表查询子表 #else #if ( $subTable.subJoinMany ) /** 获得${subTable.classComment}列表 */ export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); + return requestClient.get<${apiName}.${subSimpleClassName}[]>( + `${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`, + ); } #else /** 获得${subTable.classComment} */ export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); + return requestClient.get<${apiName}.${subSimpleClassName}>( + `${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`, + ); } #end #end ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 #if ( $table.templateType == 11 ) /** 新增${subTable.classComment} */ -export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { +export function create${subSimpleClassName}(data: ${apiName}.${subSimpleClassName}) { return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data); } /** 修改${subTable.classComment} */ -export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { +export function update${subSimpleClassName}(data: ${apiName}.${subSimpleClassName}) { return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data); } @@ -154,13 +172,17 @@ export function delete${subSimpleClassName}(id: number) { #if ($deleteBatchEnable) /** 批量删除${subTable.classComment} */ export function delete${subSimpleClassName}List(ids: number[]) { - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`) + return requestClient.delete( + `${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`, + ); } #end /** 获得${subTable.classComment} */ export function get${subSimpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`); + return requestClient.get<${apiName}.${subSimpleClassName}>( + `${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`, + ); } #end #end diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/data.ts.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/data.ts.vm index 6b3fd2b379..9b91cbe821 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/data.ts.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/data.ts.vm @@ -1,13 +1,9 @@ +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api") import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}'; +import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}'; -import { z } from '#/adapter/form'; -import { - DICT_TYPE, - getDictOptions, - getRangePickerDefaultProps, -} from '#/utils'; +import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps, } from '#/utils'; #if(${table.templateType} == 2)## 树表需要导入这些 import { get${simpleClassName}List } from '#/api/${table.moduleName}/${table.businessName}'; import { handleTree } from '@vben/utils'; @@ -186,7 +182,7 @@ export function useGridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -export function useGridColumns(): VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>['columns'] { +export function useGridColumns(): VxeTableGridOptions<${apiName}.${simpleClassName}>['columns'] { return [ #if ($table.templateType != 2 && $deleteBatchEnable) { type: 'checkbox', width: 40 }, @@ -389,7 +385,7 @@ export function use${subSimpleClassName}GridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>['columns'] { +export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions<${apiName}.${subSimpleClassName}>['columns'] { return [ #if ($table.templateType != 2 && $deleteBatchEnable) { type: 'checkbox', width: 40 }, @@ -426,7 +422,7 @@ export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions<${sim #else #if ($subTable.subJoinMany) ## 一对多 /** 新增/修改列表的字段 */ - export function use${subSimpleClassName}GridEditColumns(): VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>['columns'] { + export function use${subSimpleClassName}GridEditColumns(): VxeTableGridOptions<${apiName}.${subSimpleClassName}>['columns'] { return [ #foreach($column in $subColumns) #if ($column.createOperation || $column.updateOperation) @@ -602,4 +598,4 @@ export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions<${sim } #end #end -#end +#end \ No newline at end of file diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/form.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/form.vue.vm index dab7294b1e..2d8c4104e3 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/form.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/form.vue.vm @@ -1,8 +1,16 @@ +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api") @@ -135,20 +136,20 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm index c29beb9aa9..53ac024855 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm @@ -1,46 +1,57 @@ +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api") @@ -198,7 +206,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ - #if ($table.templateType == 11) ## erp情况 - + #foreach ($subTable in $subTables) #set ($index = $foreach.count - 1) #set ($subClassNameVar = $subClassNameVars.get($index)) #set ($subSimpleClassName = $subSimpleClassNames.get($index)) #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) - + <${subSimpleClassName}List :${subJoinColumn_strikeCase}="select${simpleClassName}?.id" /> - + #end - + #end - + \ No newline at end of file diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_erp.vue.vm index e41e1df323..232318a3ef 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_erp.vue.vm @@ -2,8 +2,9 @@ #set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 #set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api") @@ -135,8 +136,8 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm index 1e13de2e97..f67cf08512 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm @@ -1,46 +1,57 @@ +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api") @@ -255,8 +257,8 @@ const [Grid, gridApi] = useVbenVxeGrid({ type: 'primary', danger: true, icon: ACTION_ICON.DELETE, - disabled: isEmpty(checkedIds), auth: ['${table.moduleName}:${simpleClassName_strikeCase}:delete'], + disabled: isEmpty(checkedIds), onClick: handleDeleteBatch, }, #end @@ -297,7 +299,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ /> - #if ($table.templateType == 11) ## erp情况 @@ -314,4 +315,4 @@ const [Grid, gridApi] = useVbenVxeGrid({ #end - + \ No newline at end of file diff --git a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm index c71e0b46e0..74d97422c8 100644 --- a/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm +++ b/yudao-module-infra/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm @@ -2,8 +2,9 @@ #set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 #set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")