19 小时以前 f61043f70c126c4b464a4ebc7dd635fcf7b679df
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -25,6 +25,7 @@
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import jakarta.annotation.Resource;
@@ -81,6 +82,8 @@
    private AdminUserApi adminUserApi;
    @Resource
    private DeptApi deptApi;
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -111,7 +114,11 @@
        calculateTotalPrice(purchaseRequest, requestItems);
        purchaseRequestMapper.insert(purchaseRequest);
        // 6. 插入申请明细
        // 6. 绑定附件
        storageAttachmentApi.bindAttachments("file", "erp_purchase_request",
                purchaseRequest.getId(), createReqVO.getBlobIds());
        // 7. 插入申请明细
        requestItems.forEach(o -> o.setRequestId(purchaseRequest.getId()));
        purchaseRequestItemMapper.insertBatch(requestItems);
@@ -137,6 +144,13 @@
        // 5. 更新申请明细
        updatePurchaseRequestItemList(updateReqVO.getId(), requestItems);
        // 6. 更新附件
        if (updateReqVO.getBlobIds() != null) {
            storageAttachmentApi.deleteAttachmentsByRecord("erp_purchase_request", updateReqVO.getId());
            storageAttachmentApi.bindAttachments("file", "erp_purchase_request",
                    updateReqVO.getId(), updateReqVO.getBlobIds());
        }
    }
    private void calculateTotalPrice(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) {
@@ -195,6 +209,7 @@
        });
        purchaseRequests.forEach(purchaseRequest -> {
            storageAttachmentApi.deleteAttachmentsByRecord("erp_purchase_request", purchaseRequest.getId());
            purchaseRequestMapper.deleteById(purchaseRequest.getId());
            purchaseRequestItemMapper.deleteByRequestId(purchaseRequest.getId());
        });
@@ -309,6 +324,19 @@
            purchaseRequestMapper.updateById(new ErpPurchaseRequestDO()
                    .setId(id).setStatus(newStatus));
        }
        // 3. 审批通过且有供应商,自动生成采购订单
        if (ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(newStatus)
                && purchaseRequest.getSupplierId() != null
                && purchaseRequest.getOrderId() == null) {
            try {
                Long orderId = doGeneratePurchaseOrder(purchaseRequest);
                log.info("[updatePurchaseRequestAuditStatus] 采购申请({}) 自动生成采购订单({})", id, orderId);
            } catch (Exception e) {
                log.error("[updatePurchaseRequestAuditStatus] 采购申请({}) 自动生成采购订单失败", id, e);
                // 不抛出异常,避免影响状态更新
            }
        }
    }
    @Override
@@ -326,23 +354,37 @@
        // 3. 校验供应商
        supplierService.validateSupplier(supplierId);
        // 4. 获取申请明细
        // 4. 设置供应商并生成订单
        purchaseRequest.setSupplierId(supplierId);
        return doGeneratePurchaseOrder(purchaseRequest);
    }
    /**
     * 执行生成采购订单
     *
     * @param purchaseRequest 采购申请(需包含 supplierId)
     * @return 采购订单 ID
     */
    private Long doGeneratePurchaseOrder(ErpPurchaseRequestDO purchaseRequest) {
        Long id = purchaseRequest.getId();
        // 1. 获取申请明细
        List<ErpPurchaseRequestItemDO> requestItems = purchaseRequestItemMapper.selectListByRequestId(id);
        if (CollUtil.isEmpty(requestItems)) {
            throw exception(PURCHASE_REQUEST_NOT_EXISTS);
        }
        // 5. 生成采购订单号
        // 2. 生成采购订单号
        String orderNo = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX);
        if (purchaseOrderMapper.selectByNo(orderNo) != null) {
            throw exception(PURCHASE_ORDER_NO_EXISTS);
        }
        // 6. 创建采购订单
        // 3. 创建采购订单
        ErpPurchaseOrderDO purchaseOrder = new ErpPurchaseOrderDO();
        purchaseOrder.setNo(orderNo);
        purchaseOrder.setStatus(ErpAuditStatus.APPROVE.getStatus()); // 采购订单直接为已审核状态
        purchaseOrder.setSupplierId(supplierId);
        purchaseOrder.setSupplierId(purchaseRequest.getSupplierId());
        purchaseOrder.setOrderTime(purchaseRequest.getRequestTime());
        purchaseOrder.setTotalCount(purchaseRequest.getTotalCount());
        purchaseOrder.setTotalPrice(purchaseRequest.getTotalPrice());
@@ -350,15 +392,17 @@
        purchaseOrder.setTotalTaxPrice(purchaseRequest.getTotalTaxPrice());
        purchaseOrder.setDiscountPercent(purchaseRequest.getDiscountPercent());
        purchaseOrder.setDiscountPrice(purchaseRequest.getDiscountPrice());
        purchaseOrder.setDepositPrice(purchaseRequest.getDepositPrice() != null ? purchaseRequest.getDepositPrice() : BigDecimal.ZERO);
        purchaseOrder.setRemark(purchaseRequest.getRemark());
        purchaseOrder.setInCount(BigDecimal.ZERO);
        purchaseOrder.setInStatus(0);
        purchaseOrderMapper.insert(purchaseOrder);
        // 7. 创建采购订单明细
        // 4. 创建采购订单明细
        List<ErpPurchaseOrderItemDO> orderItems = convertList(requestItems, item -> {
            ErpPurchaseOrderItemDO orderItem = new ErpPurchaseOrderItemDO();
            orderItem.setOrderId(purchaseOrder.getId());
            orderItem.setRequestItemId(item.getId()); // 关联采购申请明细
            orderItem.setProductId(item.getProductId());
            orderItem.setProductUnitId(item.getProductUnitId());
            orderItem.setProductPrice(item.getProductPrice());
@@ -368,12 +412,12 @@
            orderItem.setTaxPrice(item.getTaxPrice());
            orderItem.setRemark(item.getRemark());
            orderItem.setInCount(BigDecimal.ZERO);
            orderItem.setQcCheckFlag(false); // 默认不需要质检
            orderItem.setQcCheckFlag(item.getQcCheckFlag() != null ? item.getQcCheckFlag() : false);
            return orderItem;
        });
        purchaseOrderItemMapper.insertBatch(orderItems);
        // 8. 更新采购申请的订单信息
        // 5. 更新采购申请的订单信息
        purchaseRequestMapper.updateById(new ErpPurchaseRequestDO()
                .setId(id)
                .setOrderId(purchaseOrder.getId())