huminmin
2026-07-10 2ee9e158e3129070f6b1fd953da1540f05d4f2b0
src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
@@ -18,10 +18,15 @@
import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover;
import com.ruoyi.approve.service.ApprovalTemplateNodeService;
import com.ruoyi.approve.service.ApprovalTemplateService;
import com.ruoyi.basic.dto.StorageBlobDTO;
import com.ruoyi.basic.enums.ApplicationTypeEnum;
import com.ruoyi.basic.enums.RecordTypeEnum;
import com.ruoyi.basic.utils.FileUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.Comparator;
@@ -43,6 +48,7 @@
    private final ApprovalTemplateMapper approvalTemplateMapper;
    private final ApprovalTemplateNodeService approvalTemplateNodeService;
    private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
    private final FileUtil fileUtil;
    @Override
    public IPage<ApprovalTemplateVo> listPage(Page<ApprovalTemplateVo> page, ApprovalTemplateDto approvalTemplateDto) {
@@ -63,6 +69,11 @@
                new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()
                        .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId())
        );
        // 保存附件
        List<StorageBlobDTO> storageBlobDTOs = approvalTemplateDto.getStorageBlobDTOs();
        if (!CollectionUtils.isEmpty(storageBlobDTOs)) {
            fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId(), storageBlobDTOs);
        }
        return approvalTemplateNodeService.saveApprovalTemplateNode(
                approvalTemplateDto.getId(),
                approvalTemplateDto.getNodes()
@@ -80,6 +91,16 @@
                new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()
                        .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId())
        );
        // 保存附件(会先删除旧附件)
        List<StorageBlobDTO> storageBlobDTOs = approvalTemplateDto.getStorageBlobDTOs();
        if (!CollectionUtils.isEmpty(storageBlobDTOs)) {
            fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId(), storageBlobDTOs);
        } else {
            // 如果前端传空数组,删除旧附件
            fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(
                    ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId()
            );
        }
        return approvalTemplateNodeService.saveApprovalTemplateNode(
                approvalTemplateDto.getId(),
                approvalTemplateDto.getNodes()
@@ -162,6 +183,25 @@
        return buildTemplateVo(template, nodeMap, approverMap);
    }
    @Override
    public ApprovalTemplateVo getEnabledTemplateByBusinessType(Long businessType) {
        if (businessType == null) {
            return null;
        }
        ApprovalTemplate template = this.getOne(
                new LambdaQueryWrapper<ApprovalTemplate>()
                        .eq(ApprovalTemplate::getDeleted, 0)
                        .eq(ApprovalTemplate::getEnabled, 1)
                        .eq(ApprovalTemplate::getBusinessType, businessType)
                        .orderByDesc(ApprovalTemplate::getId)
                        .last("limit 1")
        );
        if (template == null) {
            return null;
        }
        return getApprovalTemplateVoById(template.getId());
    }
    /**
     * 批量填充模板节点及节点审批人,避免循环查库。
     */
@@ -221,6 +261,12 @@
                .collect(Collectors.toList());
        templateVo.setNodes(nodeVos);
        // 查询附件
        templateVo.setStorageBlobDTOs(
                fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(
                        ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, template.getId()
                )
        );
        return templateVo;
    }