src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -11,7 +11,9 @@
import com.ruoyi.approve.bean.vo.ApprovalInstanceVo;
import com.ruoyi.approve.mapper.ApprovalInstanceMapper;
import com.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper;
import com.ruoyi.approve.mapper.FinReimbursementDetailMapper;
import com.ruoyi.approve.mapper.FinReimbursementMapper;
import com.ruoyi.approve.mapper.FinReimbursementTravelMapper;
import com.ruoyi.approve.pojo.*;
import com.ruoyi.approve.service.*;
import com.ruoyi.approve.utils.ApproveProcessConfigNodeUtils;
@@ -94,6 +96,8 @@
    private final EnterpriseNewsMapper enterpriseNewsMapper;
    private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper;
    private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
    private final FinReimbursementDetailMapper finReimbursementDetailMapper;
    private final FinReimbursementTravelMapper finReimbursementTravelMapper;
    @Override
    public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) {
@@ -144,6 +148,13 @@
        approvalInstanceDto.setInstanceNo(instanceNo);
        approvalInstanceDto.setStatus("PENDING");
        approvalInstanceDto.setCurrentLevel(1);
        // 如果前端传了 applicantId 但没传 applicantName,则从用户表查询姓名
        if (approvalInstanceDto.getApplicantId() != null && !StringUtils.hasText(approvalInstanceDto.getApplicantName())) {
            SysUser applicantUser = sysUserMapper.selectUserById(approvalInstanceDto.getApplicantId());
            if (applicantUser != null) {
                approvalInstanceDto.setApplicantName(applicantUser.getNickName());
            }
        }
        boolean saved = this.save(approvalInstanceDto);
        if (!saved) {
            return false;
@@ -184,6 +195,26 @@
        if (ids == null || ids.isEmpty()) {
            return false;
        }
        // 删除关联的业务数据(报销单等)
        List<Long> reimbursementIds = new ArrayList<>();
        List<ApprovalInstance> instances = approvalInstanceMapper.selectBatchIds(ids);
        for (ApprovalInstance instance : instances) {
            if (instance.getBusinessId() != null && instance.getBusinessType() != null) {
                Long businessType = instance.getBusinessType();
                if (TypeEnums.TRAVEL_REIMBURSEMENT_APPROVAL.getCode().equals(businessType)
                        || TypeEnums.EXPENSE_APPROVAL.getCode().equals(businessType)) {
                    reimbursementIds.add(instance.getBusinessId());
                }
            }
        }
        if (!reimbursementIds.isEmpty()) {
            fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.FIN_REIMBURSEMENT, reimbursementIds);
            finReimbursementDetailMapper.delete(Wrappers.<FinReimbursementDetail>lambdaQuery().in(FinReimbursementDetail::getReimbursementId, reimbursementIds));
            finReimbursementTravelMapper.delete(Wrappers.<FinReimbursementTravel>lambdaQuery().in(FinReimbursementTravel::getReimbursementId, reimbursementIds));
            finReimbursementMapper.delete(Wrappers.<FinReimbursement>lambdaQuery().in(FinReimbursement::getId, reimbursementIds));
        }
        fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_INSTANCE, ids);
        int instanceRows = approvalInstanceMapper.update(