package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO; import com.ruoyi.system.emums.ApprovalStatusEnum; import com.ruoyi.system.emums.ApprovalTypeEnum; import com.ruoyi.system.mapper.OaApprovalApplicationAssetMapper; import com.ruoyi.system.model.OaApprovalApplicationAsset; import com.ruoyi.system.model.OaApprovalApplicationAssetItem; import com.ruoyi.system.model.OaApprovalApplications; import com.ruoyi.system.model.OaApprovalFlowNode; import com.ruoyi.system.service.OaApprovalApplicationAssetItemService; import com.ruoyi.system.service.OaApprovalApplicationAssetService; 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.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; /** *

* 资产领用单明细表 服务实现类 *

* * @author WuGuanFengYue * @since 2025-09-15 */ @Service @RequiredArgsConstructor public class OaApprovalApplicationAssetServiceImpl extends ServiceImpl implements OaApprovalApplicationAssetService { private final OaApprovalApplicationsService oaApprovalApplicationsService; private final OaApprovalFlowNodeService oaApprovalFlowNodeService; private final OaApprovalTodoService oaApprovalTodoService; private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService; @Override @Transactional(rollbackFor = Exception.class) public void submitReceive(OaApprovalApplicationAssetReceiveDTO dto) { if (CollectionUtils.isEmpty(dto.getAssetItems())) { throw new ServiceException("领用资产列表不能为空"); } // 1. 构建并保存审批主表 OaApprovalApplications applications = buildOaApprovalApplications(dto); // 2. 获取流程首节点,设置当前节点,并保存 OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.GRAB.getCode()); applications.setCurrentFlowNodeId(firstFlowNode.getId()); oaApprovalApplicationsService.save(applications); // 3. 创建待办 oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId()); // 4. 保存领用明细 OaApprovalApplicationAsset detail = buildOaApprovalApplicationAsset(dto, applications.getId()); this.save(detail); // 5. 保存关联的资产项 List items = dto.getAssetItems().stream() .map(i -> { OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem(); item.setApprovalApplicationId(applications.getId()); item.setAssetMainId(i.getAssetMainId()); return item; }) .collect(Collectors.toList()); oaApprovalApplicationAssetItemService.saveBatch(items); } private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) { List flowNodes = oaApprovalFlowNodeService.lambdaQuery() .eq(OaApprovalFlowNode::getApprovalId, approvalId) .eq(OaApprovalFlowNode::getStatus, 1) .orderByAsc(OaApprovalFlowNode::getSortOrder) .list(); if (CollectionUtils.isEmpty(flowNodes)) { throw new ServiceException("未找到有效的审批流程配置"); } return flowNodes.get(0); } private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationAssetReceiveDTO dto) { OaApprovalApplications applications = new OaApprovalApplications(); applications.setApplicationCode(generateApplicationCode()); applications.setApprovalId(ApprovalTypeEnum.GRAB.getCode()); applications.setApplicantUserId(dto.getApplicantUserId()); applications.setApplicantName(dto.getApplicantName()); applications.setDeptId(dto.getDeptId()); applications.setDeptName(dto.getDeptName()); applications.setApplicationDate(dto.getOperateTime()); applications.setApplicationReason(dto.getApplicationReason()); applications.setAttachmentUrl(dto.getAttachmentUrl()); applications.setDisabled(0); applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode()); return applications; } private OaApprovalApplicationAsset buildOaApprovalApplicationAsset(OaApprovalApplicationAssetReceiveDTO dto, Integer applicationId) { OaApprovalApplicationAsset asset = new OaApprovalApplicationAsset(); asset.setApprovalApplicationId(applicationId); asset.setTitle(dto.getTitle()); asset.setAssetTypeId(dto.getAssetTypeId()); asset.setOperateTime(dto.getOperateTime()); asset.setExpectReturnDate(dto.getExpectReturnDate()); asset.setType(Boolean.FALSE); // 0-领用 return asset; } /** * 生成申请单号:LY + yyyyMMdd + 3位序号 */ private String generateApplicationCode() { String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); String prefix = "LY" + dateStr; Long count = oaApprovalApplicationsService.lambdaQuery() .like(OaApprovalApplications::getApplicationCode, prefix) .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay()) .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay()) .count(); int sequence = (count != null ? count.intValue() : 0) + 1; String sequenceStr = String.format("%03d", sequence); return prefix + sequenceStr; } }