| package com.ruoyi.system.service.impl; | 
|   | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import com.ruoyi.common.exception.ServiceException; | 
| import com.ruoyi.system.constants.ApprovalApplicationCodePrefix; | 
| import com.ruoyi.system.dto.asset.OaApprovalApplicationPurchaseDTO; | 
| import com.ruoyi.system.emums.ApprovalStatusEnum; | 
| import com.ruoyi.system.emums.ApprovalTypeEnum; | 
| import com.ruoyi.system.mapper.OaApprovalApplicationPurchaseMapper; | 
| import com.ruoyi.system.model.OaApprovalApplicationPurchase; | 
| import com.ruoyi.system.model.OaApprovalApplicationPurchaseItem; | 
| import com.ruoyi.system.model.OaApprovalApplications; | 
| import com.ruoyi.system.model.OaApprovalFlowNode; | 
| import com.ruoyi.system.service.OaApprovalApplicationPurchaseItemService; | 
| import com.ruoyi.system.service.OaApprovalApplicationPurchaseService; | 
| import com.ruoyi.system.service.OaApprovalApplicationsService; | 
| import com.ruoyi.system.service.OaApprovalFlowNodeService; | 
| import com.ruoyi.system.service.OaApprovalTodoService; | 
| import lombok.RequiredArgsConstructor; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
| import org.springframework.util.CollectionUtils; | 
|   | 
| import java.util.List; | 
|   | 
| /** | 
|  * <p> | 
|  * 采购申请详情 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author WuGuanFengYue | 
|  * @since 2025-09-15 | 
|  */ | 
| @Service | 
| @RequiredArgsConstructor | 
| public class OaApprovalApplicationPurchaseServiceImpl extends ServiceImpl<OaApprovalApplicationPurchaseMapper, OaApprovalApplicationPurchase> implements OaApprovalApplicationPurchaseService { | 
|   | 
|     private final OaApprovalApplicationsService oaApprovalApplicationsService; | 
|     private final OaApprovalApplicationPurchaseItemService oaApprovalApplicationPurchaseItemService; | 
|     private final OaApprovalFlowNodeService oaApprovalFlowNodeService; | 
|     private final OaApprovalTodoService oaApprovalTodoService; | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void submit(OaApprovalApplicationPurchaseDTO dto) { | 
|         // 1. 保存审批申请主表数据 | 
|         OaApprovalApplications applications = buildOaApprovalApplications(dto); | 
|          | 
|         // 2. 如果是提交操作,获取流程节点并创建待办 | 
|         OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.PURCHASE.getCode()); | 
|         applications.setCurrentFlowNodeId(firstFlowNode.getId()); | 
|         oaApprovalApplicationsService.save(applications); | 
|   | 
|         // 3. 创建待办事项记录(公共服务) | 
|         oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId()); | 
|   | 
|         // 4.保存采购资产明细数据 | 
|         List<OaApprovalApplicationPurchaseItem> items = buildOaApprovalApplicationPurchaseItems(dto, applications.getId()); | 
|         oaApprovalApplicationPurchaseItemService.saveBatch(items); | 
|   | 
|         // 5. 保存采购申请详情数据 | 
|         OaApprovalApplicationPurchase purchase = buildOaApprovalApplicationPurchase(dto, applications.getId()); | 
|         save(purchase); | 
|     } | 
|     /** | 
|      * 获取第一个流程节点 | 
|      */ | 
|     private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) { | 
|         // 1. 查询审批流程配置 | 
|         List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery() | 
|                 .eq(OaApprovalFlowNode::getApprovalId, approvalId) | 
|                 .eq(OaApprovalFlowNode::getStatus, 1) // 启用状态 | 
|                 .orderByAsc(OaApprovalFlowNode::getSortOrder) | 
|                 .list(); | 
|   | 
|         if (CollectionUtils.isEmpty(flowNodes)) { | 
|             throw new ServiceException("未找到有效的审批流程配置"); | 
|         } | 
|   | 
|         // 2. 获取第一个流程节点 | 
|         return flowNodes.get(0); | 
|     } | 
|   | 
|     /** | 
|      * 构建审批申请主表数据 | 
|      */ | 
|     private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) { | 
|         OaApprovalApplications applications = new OaApprovalApplications(); | 
|         applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(ApprovalApplicationCodePrefix.ASSET_PURCHASE)); | 
|         applications.setApprovalId(ApprovalTypeEnum.PURCHASE.getCode()); | 
|         applications.setApplicantUserId(dto.getApplicantUserId()); | 
|         applications.setApplicantName(dto.getApplicantName()); | 
|         applications.setDeptId(dto.getDeptId()); | 
|         applications.setDeptName(dto.getDeptName()); | 
|         applications.setApplicationDate(dto.getApplicationDate()); | 
|         applications.setApplicationReason(dto.getApplicationReason()); | 
|         applications.setAttachmentUrl(dto.getAttachmentUrl()); | 
|         applications.setDisabled(0); // 未删除 | 
|         applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode()); | 
|         return applications; | 
|     } | 
|   | 
|     /** | 
|      * 构建采购申请详情数据 | 
|      */ | 
|     private OaApprovalApplicationPurchase buildOaApprovalApplicationPurchase(OaApprovalApplicationPurchaseDTO dto, Integer applicationId) { | 
|         OaApprovalApplicationPurchase purchase = new OaApprovalApplicationPurchase(); | 
|         purchase.setApprovalApplicationId(applicationId); | 
|         // 使用事项标题,而非采购说明 | 
|         purchase.setTitle(dto.getTitle()); | 
|         // 表结构中无 application_date 字段,此处不再设置 | 
|         purchase.setAssetTypeId(dto.getAssetTypeId()); | 
|         purchase.setTotalAmount(dto.getTotalAmount()); | 
|   | 
|         return purchase; | 
|     } | 
|   | 
|     /** | 
|      * 构建采购资产明细数据 | 
|      */ | 
|     private List<OaApprovalApplicationPurchaseItem> buildOaApprovalApplicationPurchaseItems(OaApprovalApplicationPurchaseDTO dto, Integer applicationId) { | 
|         return dto.getPurchaseItems().stream() | 
|                 .map(item -> { | 
|                     OaApprovalApplicationPurchaseItem purchaseItem = new OaApprovalApplicationPurchaseItem(); | 
|                     purchaseItem.setApprovalApplicationId(applicationId); | 
|                     purchaseItem.setAssetName(item.getAssetName()); | 
|                     purchaseItem.setAssetTypeId(item.getAssetTypeId()); | 
|                     purchaseItem.setSpec(item.getSpec()); | 
|                     purchaseItem.setUnit(item.getUnit()); | 
|                     purchaseItem.setQuantity(item.getQuantity()); | 
|                     purchaseItem.setPrice(item.getPrice()); | 
|                     purchaseItem.setTotalAmount(item.getTotalAmount()); | 
|                     return purchaseItem; | 
|                 }) | 
|                 .collect(java.util.stream.Collectors.toList()); | 
|     } | 
| } |