package cn.iocoder.yudao.module.erp.api.purchase;
|
|
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.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.math.BigDecimal;
|
import java.util.Collections;
|
import java.util.List;
|
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED;
|
|
/**
|
* ERP 采购订单 API 实现类
|
*
|
* @author 超级管理员
|
*/
|
@RestController
|
@RequestMapping(ErpPurchaseOrderApi.PREFIX)
|
@Validated
|
public class ErpPurchaseOrderApiImpl implements ErpPurchaseOrderApi {
|
|
@Resource
|
private ErpPurchaseOrderService purchaseOrderService;
|
|
@Resource
|
private ErpPurchaseOrderItemMapper purchaseOrderItemMapper;
|
|
@Resource
|
private cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper purchaseOrderMapper;
|
|
@Override
|
public CommonResult<ErpPurchaseOrderRespDTO> getPurchaseOrder(Long id) {
|
ErpPurchaseOrderDO order = purchaseOrderService.getPurchaseOrder(id);
|
return success(BeanUtils.toBean(order, ErpPurchaseOrderRespDTO.class));
|
}
|
|
@Override
|
public CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderListBySupplierId(Long supplierId) {
|
if (supplierId == null) {
|
return success(Collections.emptyList());
|
}
|
// 查询已审核状态的采购订单
|
List<ErpPurchaseOrderDO> orders = purchaseOrderService.getPurchaseOrderListBySupplierIdAndStatus(
|
supplierId, ErpAuditStatus.APPROVE.getStatus());
|
return success(BeanUtils.toBean(orders, ErpPurchaseOrderRespDTO.class));
|
}
|
|
@Override
|
public CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderList(List<Long> ids) {
|
if (ids == null || ids.isEmpty()) {
|
return success(Collections.emptyList());
|
}
|
List<ErpPurchaseOrderDO> orders = purchaseOrderService.getPurchaseOrderList(ids);
|
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> updateOrderItemReturnCount(Long orderItemId, BigDecimal returnCount) {
|
if (orderItemId == null || returnCount == null) {
|
return success(false);
|
}
|
ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(orderItemId);
|
if (item == null) {
|
return success(false);
|
}
|
// 累加退货数量
|
BigDecimal oldReturnCount = item.getReturnCount() != null ? item.getReturnCount() : BigDecimal.ZERO;
|
BigDecimal newReturnCount = oldReturnCount.add(returnCount);
|
BigDecimal inCount = item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO;
|
if (returnCount.compareTo(BigDecimal.ZERO) <= 0 || newReturnCount.compareTo(inCount) > 0) {
|
throw exception(PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED,
|
"产品ID:" + item.getProductId(), inCount);
|
}
|
purchaseOrderItemMapper.updateById(new ErpPurchaseOrderItemDO()
|
.setId(orderItemId)
|
.setReturnCount(newReturnCount));
|
// 同步更新订单级退货数量:按订单下所有明细的退货数量求和,避免只传单条把其它行清零
|
BigDecimal totalReturnCount = purchaseOrderItemMapper.selectListByOrderId(item.getOrderId()).stream()
|
.map(orderItem -> orderItem.getReturnCount() != null ? orderItem.getReturnCount() : BigDecimal.ZERO)
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
purchaseOrderMapper.updateById(new ErpPurchaseOrderDO()
|
.setId(item.getOrderId())
|
.setReturnCount(totalReturnCount));
|
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) {
|
return success(purchaseOrderService.createPurchaseOrder(buildSaveReqVO(createReqDTO)));
|
}
|
|
@Override
|
public CommonResult<Long> createPurchaseOrderDraft(ErpPurchaseOrderCreateReqDTO createReqDTO) {
|
return success(purchaseOrderService.createPurchaseOrder(buildSaveReqVO(createReqDTO), false));
|
}
|
|
private ErpPurchaseOrderSaveReqVO buildSaveReqVO(ErpPurchaseOrderCreateReqDTO createReqDTO) {
|
ErpPurchaseOrderSaveReqVO saveReqVO = BeanUtils.toBean(createReqDTO, ErpPurchaseOrderSaveReqVO.class);
|
if (createReqDTO.getItems() != null) {
|
saveReqVO.setItems(BeanUtils.toBean(createReqDTO.getItems(), ErpPurchaseOrderSaveReqVO.Item.class));
|
}
|
return 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));
|
}
|
|
}
|