| | |
| | | purchaseRequest.setTotalCount(getSumValue(requestItems, ErpPurchaseRequestItemDO::getCount, BigDecimal::add)); |
| | | purchaseRequest.setTotalProductPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | purchaseRequest.setTotalTaxPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | purchaseRequest.setTotalPrice(purchaseRequest.getTotalProductPrice().add(purchaseRequest.getTotalTaxPrice())); |
| | | // 单价为含税单价:价税合计 = 单价 * 数量,税额已包含在单价中,不再额外加税 |
| | | purchaseRequest.setTotalPrice(purchaseRequest.getTotalProductPrice()); |
| | | // 计算优惠价格 |
| | | if (purchaseRequest.getDiscountPercent() == null) { |
| | | purchaseRequest.setDiscountPercent(BigDecimal.ZERO); |
| | |
| | | if (item.getProductPrice() != null && item.getCount() != null) { |
| | | item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); |
| | | if (item.getTaxPercent() != null) { |
| | | item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent())); |
| | | // 单价为含税单价:税额从价税合计中反算,而不是在合计上再加税 |
| | | item.setTaxPrice(MoneyUtils.taxPriceIncluded(item.getTotalPrice(), item.getTaxPercent())); |
| | | } |
| | | } |
| | | })); |
| | |
| | | } |
| | | |
| | | // 3. 创建 BPM 流程实例 |
| | | // 全局免审批:业务校验通过后直接执行审批通过逻辑,无需流程模型。 |
| | | if (processInstanceApi.isGlobalAutoApprove()) { |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setStatus(ErpPurchaseRequestStatusEnum.PROCESS.getStatus()) |
| | | .setProcessInstanceId("")); |
| | | updatePurchaseRequestAuditStatus(id, cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.APPROVE.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | String processInstanceId = processInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | |
| | | if (purchaseRequest.getOrderId() != null) { |
| | | throw exception(PURCHASE_REQUEST_ORDER_EXISTS); |
| | | } |
| | | // 3. 校验供应商 |
| | | supplierService.validateSupplier(supplierId); |
| | | // 3. 供应商以采购申请单为准:申请提交时已经选过供应商,生成订单不再要求重新选择 |
| | | // 兼容旧调用方仍显式传 supplierId 的情况,传了则以传入值为准 |
| | | Long targetSupplierId = supplierId != null ? supplierId : purchaseRequest.getSupplierId(); |
| | | if (targetSupplierId == null) { |
| | | throw exception(PURCHASE_REQUEST_SUPPLIER_REQUIRED); |
| | | } |
| | | supplierService.validateSupplier(targetSupplierId); |
| | | |
| | | // 4. 设置供应商并生成订单 |
| | | purchaseRequest.setSupplierId(supplierId); |
| | | purchaseRequest.setSupplierId(targetSupplierId); |
| | | return doGeneratePurchaseOrder(purchaseRequest); |
| | | } |
| | | |
| | |
| | | // 3. 创建采购订单 |
| | | ErpPurchaseOrderDO purchaseOrder = new ErpPurchaseOrderDO(); |
| | | purchaseOrder.setNo(orderNo); |
| | | purchaseOrder.setStatus(ErpAuditStatus.APPROVE.getStatus()); // 采购订单直接为已审核状态 |
| | | // 生成后为草稿:采购申请与采购台账字段不完全一致(付款日期、采购类型、付款方式等), |
| | | // 需要业务在采购台账里补充完整后再提交审批 |
| | | purchaseOrder.setStatus(ErpAuditStatus.DRAFT.getStatus()); |
| | | purchaseOrder.setSupplierId(purchaseRequest.getSupplierId()); |
| | | purchaseOrder.setOrderTime(purchaseRequest.getRequestTime()); |
| | | purchaseOrder.setTotalCount(purchaseRequest.getTotalCount()); |
| | |
| | | orderItem.setTaxPrice(item.getTaxPrice()); |
| | | orderItem.setRemark(item.getRemark()); |
| | | orderItem.setInCount(BigDecimal.ZERO); |
| | | orderItem.setQcCheckFlag(item.getQcCheckFlag() != null ? item.getQcCheckFlag() : false); |
| | | // 是否质检与采购申请保持一致:明细未明确标记时默认为「是」(历史申请单可能为 null) |
| | | orderItem.setQcCheckFlag(item.getQcCheckFlag() != null ? item.getQcCheckFlag() : true); |
| | | return orderItem; |
| | | }); |
| | | purchaseOrderItemMapper.insertBatch(orderItems); |
| | |
| | | // 5. 更新采购申请的订单信息 |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setSupplierId(purchaseRequest.getSupplierId()) |
| | | .setOrderId(purchaseOrder.getId()) |
| | | .setOrderNo(orderNo)); |
| | | |