| | |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService; |
| | | import jakarta.annotation.Resource; |
| | |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * ERP 采购订单 API 实现类 |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @RestController |
| | | @RequestMapping(ErpPurchaseOrderApi.PREFIX) |
| | |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderService purchaseOrderService; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderItemMapper purchaseOrderItemMapper; |
| | | |
| | | @Override |
| | | public CommonResult<ErpPurchaseOrderRespDTO> getPurchaseOrder(Long id) { |
| | |
| | | return success(BeanUtils.toBean(orders, ErpPurchaseOrderRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemList(Long orderId) { |
| | | if (orderId == null) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | List<ErpPurchaseOrderItemDO> items = purchaseOrderService.getPurchaseOrderItemListByOrderId(orderId); |
| | | return success(BeanUtils.toBean(items, ErpPurchaseOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<ErpPurchaseOrderItemRespDTO> getPurchaseOrderItem(Long id) { |
| | | if (id == null) { |
| | | return success(null); |
| | | } |
| | | ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(id); |
| | | return success(BeanUtils.toBean(item, ErpPurchaseOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderItemInCount(Long orderItemId, BigDecimal inCount) { |
| | | if (orderItemId == null || inCount == null) { |
| | | return success(false); |
| | | } |
| | | ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(orderItemId); |
| | | if (item == null) { |
| | | return success(false); |
| | | } |
| | | // 累加入库数量 |
| | | BigDecimal newInCount = (item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO).add(inCount); |
| | | ErpPurchaseOrderItemDO updateItem = new ErpPurchaseOrderItemDO(); |
| | | updateItem.setId(orderItemId); |
| | | updateItem.setInCount(newInCount); |
| | | purchaseOrderItemMapper.updateById(updateItem); |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderInStatus(Long orderId) { |
| | | if (orderId == null) { |
| | | return success(false); |
| | | } |
| | | purchaseOrderService.updatePurchaseOrderInStatus(orderId); |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Long> createPurchaseOrder(ErpPurchaseOrderCreateReqDTO createReqDTO) { |
| | | ErpPurchaseOrderSaveReqVO saveReqVO = BeanUtils.toBean(createReqDTO, ErpPurchaseOrderSaveReqVO.class); |
| | | if (createReqDTO.getItems() != null) { |
| | | saveReqVO.setItems(BeanUtils.toBean(createReqDTO.getItems(), ErpPurchaseOrderSaveReqVO.Item.class)); |
| | | } |
| | | return success(purchaseOrderService.createPurchaseOrder(saveReqVO)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemListBySource(Integer sourceType, Long sourceId) { |
| | | if (sourceType == null || sourceId == null) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | // 1. 按来源查询采购订单 |
| | | List<ErpPurchaseOrderDO> orders = purchaseOrderService.getPurchaseOrderListBySource(sourceType, sourceId); |
| | | if (orders.isEmpty()) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | // 2. 查询所有订单的明细 |
| | | List<Long> orderIds = orders.stream().map(ErpPurchaseOrderDO::getId).toList(); |
| | | List<ErpPurchaseOrderItemDO> items = purchaseOrderItemMapper.selectListByOrderIds(orderIds); |
| | | return success(BeanUtils.toBean(items, ErpPurchaseOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Map<Long, BigDecimal>> getItemAveragePurchasePriceMap(Collection<Long> productIds) { |
| | | if (productIds == null || productIds.isEmpty()) { |
| | | return success(Collections.emptyMap()); |
| | | } |
| | | // 1. 查询已审核采购订单中这些物料的明细 |
| | | List<ErpPurchaseOrderItemDO> items = purchaseOrderItemMapper |
| | | .selectListByApprovedOrderAndProductIds(productIds); |
| | | if (items.isEmpty()) { |
| | | return success(Collections.emptyMap()); |
| | | } |
| | | // 2. 按物料汇总数量和金额,计算加权平均价:SUM(总价) / SUM(数量) |
| | | Map<Long, BigDecimal> totalPriceMap = new HashMap<>(); |
| | | Map<Long, BigDecimal> totalCountMap = new HashMap<>(); |
| | | for (ErpPurchaseOrderItemDO item : items) { |
| | | if (item.getProductId() == null || item.getCount() == null |
| | | || item.getCount().compareTo(BigDecimal.ZERO) <= 0) { |
| | | continue; |
| | | } |
| | | BigDecimal totalPrice = item.getTotalPrice(); |
| | | if (totalPrice == null && item.getProductPrice() != null) { |
| | | totalPrice = item.getProductPrice().multiply(item.getCount()); |
| | | } |
| | | if (totalPrice == null) { |
| | | continue; |
| | | } |
| | | totalPriceMap.merge(item.getProductId(), totalPrice, BigDecimal::add); |
| | | totalCountMap.merge(item.getProductId(), item.getCount(), BigDecimal::add); |
| | | } |
| | | Map<Long, BigDecimal> result = new HashMap<>(totalCountMap.size()); |
| | | totalCountMap.forEach((productId, totalCount) -> { |
| | | BigDecimal totalPrice = totalPriceMap.get(productId); |
| | | if (totalPrice != null && totalCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | result.put(productId, totalPrice.divide(totalCount, 6, RoundingMode.HALF_UP)); |
| | | } |
| | | }); |
| | | return success(result); |
| | | } |
| | | |
| | | } |