|
@@ -22,6 +22,7 @@ import com.hys.app.model.erp.dto.OrderQueryParams;
|
|
|
import com.hys.app.model.erp.dto.WarehouseOutShipDTO;
|
|
|
import com.hys.app.model.erp.enums.*;
|
|
|
import com.hys.app.model.erp.vo.GoodsVO;
|
|
|
+import com.hys.app.model.erp.vo.OrderItemVO;
|
|
|
import com.hys.app.model.erp.vo.OrderVO;
|
|
|
import com.hys.app.model.erp.vo.ProductVO;
|
|
|
import com.hys.app.service.erp.*;
|
|
@@ -34,6 +35,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -54,6 +56,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
private WarehouseOutMapper warehouseOutMapper;
|
|
|
private WarehouseOutItemManager warehouseOutItemManager;
|
|
|
private ProductManager productManager;
|
|
|
+ private OrderSendManager orderSendManager;
|
|
|
|
|
|
@Override
|
|
|
public WebPage<OrderVO> list(OrderQueryParams queryParams) {
|
|
@@ -82,22 +85,20 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
return orderDO.getId();
|
|
|
}
|
|
|
|
|
|
- private void checkStock(Long warehouseId, List<OrderItemDO> itemList) {
|
|
|
- //订单后面需要发货订单的数量不等你超过可用库存的数量
|
|
|
- List<Long> productId = itemList.stream().map(OrderItemDO::getProductId).collect(Collectors.toList());
|
|
|
- List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
- .eq(ProductStockDO::getWarehouseId, warehouseId)
|
|
|
- .in(ProductStockDO::getProductId, productId));
|
|
|
- for (ProductStockDO stockDO : stockDOList) {
|
|
|
- OrderItemDO dto = itemList.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get();
|
|
|
- if (dto.getNum() > stockDO.getUsableStock()) {
|
|
|
- throw new ServiceException(dto.getProductId() + "的可用库存数量不足");
|
|
|
+ private void checkStock(List<Long> warehouseId, List<OrderItemDO> itemList) {
|
|
|
+
|
|
|
+ for (OrderItemDO aDo : itemList) {
|
|
|
+ ProductStockDO byId = productStockManager.getById(aDo.getProductStockId());
|
|
|
+ if (aDo.getNum() > byId.getUsableStock()) {
|
|
|
+ throw new ServiceException(aDo.getProductId() + "的可用库存数量不足");
|
|
|
}
|
|
|
- stockDO.setUsableStock(stockDO.getUsableStock() - dto.getNum());
|
|
|
+ byId.setUsableStock(byId.getUsableStock() - aDo.getNum());
|
|
|
+ productStockManager.updateById(byId);
|
|
|
}
|
|
|
- productStockManager.updateBatchById(stockDOList);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void edit(OrderDTO orderDTO) {
|
|
@@ -128,14 +129,12 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
List<OrderItemDTO> itemList = BeanUtils.toBean(list, OrderItemDTO.class);
|
|
|
//所有的商品信息
|
|
|
List<ProductDO> productDOList = productManager.list(new LambdaQueryWrapper<ProductDO>().in(ProductDO::getId, goodIdlist));
|
|
|
- List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
|
- .eq(ProductStockDO::getWarehouseId, orderDO.getWarehouseId()).in(ProductStockDO::getProductId, goodIdlist));
|
|
|
for (OrderItemDTO dto : itemList) {
|
|
|
ProductVO productVO = BeanUtil.copyProperties(productDOList.stream().filter(item -> item.getId().equals(dto.getProductId())).findFirst().get(), ProductVO.class);
|
|
|
dto.setProductVO(productVO);
|
|
|
GoodsVO goodsVO = BeanUtil.copyProperties(goodsMapper.selectById(productVO.getGoodsId()), GoodsVO.class);
|
|
|
dto.setGoodsVO(goodsVO);
|
|
|
- dto.setUsableStock(stockDOList.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get().getUsableStock());
|
|
|
+ dto.setUsableStock(productStockManager.getById(dto.getProductStockId()).getUsableStock());
|
|
|
}
|
|
|
orderVO.setItemList(itemList);
|
|
|
return orderVO;
|
|
@@ -163,47 +162,55 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public void submit(Long id) {
|
|
|
OrderDO aDo = getById(id);
|
|
|
+ List<OrderItemDO> dos = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, id));
|
|
|
+ Set<Long> set = dos.stream().map(OrderItemDO::getWarehouseId).collect(Collectors.toSet());
|
|
|
+ for (Long warehouseId : set) {
|
|
|
+ OrderSendDO orderSendDO = new OrderSendDO();
|
|
|
+ orderSendDO.setOrderId(id);
|
|
|
+ orderSendDO.setWarehouseId(warehouseId);
|
|
|
+ orderSendDO.setOrderType(aDo.getType());
|
|
|
+ orderSendDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.OrderSend, 86L));
|
|
|
+ orderSendManager.save(orderSendDO);
|
|
|
+ List<OrderItemDO> collect = dos.stream().filter(item -> item.getWarehouseId().equals(warehouseId)).collect(Collectors.toList());
|
|
|
+ collect.forEach(item -> item.setOrderSendId(orderSendDO.getId()));
|
|
|
+ }
|
|
|
+ orderItemManager.updateBatchById(dos);
|
|
|
if (!SaleOrderStatusEnum.TO_BE_COMMIT.equals(aDo.getStatus())) {
|
|
|
- throw new ServiceException("该商品已确认");
|
|
|
+ throw new ServiceException("该订单已确认");
|
|
|
}
|
|
|
aDo.setStatus(SaleOrderStatusEnum.TO_BE_SEND);
|
|
|
updateById(aDo);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public IPage<OrderVO> hasSendOrder(OrderQueryParams queryParams) {
|
|
|
- Page<OrderDO> page = new Page<>(queryParams.getPageNo(), queryParams.getPageSize());
|
|
|
- LambdaQueryWrapper<OrderDO> wrapper = new LambdaQueryWrapper<OrderDO>()
|
|
|
- .eq(ObjectUtil.isNotNull(queryParams.getWarehouseId()), OrderDO::getWarehouseId, queryParams.getWarehouseId())
|
|
|
- .eq(StrUtil.isNotEmpty(queryParams.getSn()), OrderDO::getSn, queryParams.getSn());
|
|
|
+ public IPage<OrderSendDO> hasSendOrder(OrderQueryParams queryParams) {
|
|
|
+ Page<OrderSendDO> page = new Page<>(queryParams.getPageNo(), queryParams.getPageSize());
|
|
|
+ LambdaQueryWrapper<OrderSendDO> wrapper = new LambdaQueryWrapper<OrderSendDO>()
|
|
|
+ .eq(ObjectUtil.isNotNull(queryParams.getWarehouseId()), OrderSendDO::getWarehouseId, queryParams.getWarehouseId())
|
|
|
+ .eq(StrUtil.isNotEmpty(queryParams.getSn()), OrderSendDO::getSn, queryParams.getSn());
|
|
|
switch (queryParams.getSelectType()) {
|
|
|
case "to_be_send":
|
|
|
- wrapper.in(OrderDO::getStatus, SaleOrderStatusEnum.TO_BE_SEND.getValue());
|
|
|
+ wrapper.in(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND.getValue());
|
|
|
break;
|
|
|
case "sending":
|
|
|
- wrapper.notIn(OrderDO::getStatus, ListUtil.toList(SaleOrderStatusEnum.TO_BE_COMMIT.getValue(), SaleOrderStatusEnum.TO_BE_SEND.getValue()));
|
|
|
+ wrapper.ne(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND.getValue());
|
|
|
break;
|
|
|
}
|
|
|
- Page<OrderDO> doPage = page(page, wrapper);
|
|
|
- IPage<OrderVO> voPage = new Page<>(queryParams.getPageNo(), queryParams.getPageSize());
|
|
|
- voPage.setSize(doPage.getSize());
|
|
|
- voPage.setPages(doPage.getPages());
|
|
|
- voPage.setRecords(BeanUtils.toBean(doPage.getRecords(), OrderVO.class));
|
|
|
- voPage.setTotal(doPage.getTotal());
|
|
|
- return voPage;
|
|
|
+ Page<OrderSendDO> paged = orderSendManager.page(page, wrapper);
|
|
|
+ paged.getRecords().forEach(item -> item.setOrderVo(getById(item.getOrderId())));
|
|
|
+ return paged;
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
- public void orderSend(Long orderId, AddressDTO addressDTO) {
|
|
|
- OrderDO aDo = getById(orderId);
|
|
|
- aDo.setSendAddress(addressDTO.getSendAddress());
|
|
|
- aDo.setReceiverAddress(addressDTO.getReceiveAddress());
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void orderSend(Long sendOrderId) {
|
|
|
+ OrderSendDO aDo = orderSendManager.getById(sendOrderId);
|
|
|
//根据订单查找到这个订单的所有货物扣减库存
|
|
|
- List<OrderItemDO> orderItemDOS = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderId));
|
|
|
+ List<OrderItemDO> orderItemDOS = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderSendId, sendOrderId));
|
|
|
List<Long> productId = orderItemDOS.stream().map(OrderItemDO::getProductId).collect(Collectors.toList());
|
|
|
//查找这些商品在指定仓库的库存,减去对应数量
|
|
|
List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
@@ -212,12 +219,12 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
Integer num = orderItemDOS.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get().getNum();
|
|
|
|
|
|
if (num < stockDO.getUsableStock()) {
|
|
|
- if (OrderTypeEnum.TO_B.equals(aDo.getType())) {
|
|
|
+ if (OrderTypeEnum.TO_B.equals(aDo.getOrderType())) {
|
|
|
//扣减可用库存
|
|
|
// stockDO.setUsableStock(stockDO.getUsableStock() - num);
|
|
|
//扣减实际库存
|
|
|
stockDO.setActualStock(stockDO.getActualStock() - num);
|
|
|
- } else if (OrderTypeEnum.TO_C.equals(aDo.getType())) {
|
|
|
+ } else if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
|
|
|
//扣减可用库存
|
|
|
stockDO.setActualStock(stockDO.getUsableStock() - num);
|
|
|
//增加在途库存
|
|
@@ -231,7 +238,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
//生成出库单
|
|
|
WarehouseOutDO outDO = new WarehouseOutDO();
|
|
|
outDO.setType(WarehouseOutTypeEnum.BORROW_OUT);
|
|
|
- outDO.setOrderIdList(orderId);
|
|
|
+ outDO.setOrderIdList(sendOrderId);
|
|
|
outDO.setWarehouseId(aDo.getWarehouseId());
|
|
|
outDO.setNotes("发货单生成的出货单");
|
|
|
outDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseOut, 66L));
|
|
@@ -242,13 +249,25 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
|
|
|
warehouseOutItemManager.saveBatch(beanList);
|
|
|
//更改订单状态56789=m+
|
|
|
|
|
|
- if (SaleOrderStatusEnum.TO_BE_SEND.equals(aDo.getStatus())) {
|
|
|
- aDo.setStatus(SaleOrderStatusEnum.SENDING);
|
|
|
- aDo.setWarehouseOutId(outDO.getId());
|
|
|
- updateById(aDo);
|
|
|
- } else {
|
|
|
- throw new ServiceException("订单状态错误,待发货的订单才能发货");
|
|
|
+ aDo.setStatus(SaleOrderSendStatusEnum.SENDING);
|
|
|
+ aDo.setWarehouseOutId(outDO.getId());
|
|
|
+ orderSendManager.updateById(aDo);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public OrderSendDO getSendOrderDetail(String id) {
|
|
|
+ OrderSendDO byId = orderSendManager.getById(id);
|
|
|
+ OrderDO aDo = getById(byId.getOrderId());
|
|
|
+ List<OrderItemDO> dos = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderSendId, id));
|
|
|
+ List<OrderItemVO> bean = BeanUtils.toBean(dos, OrderItemVO.class);
|
|
|
+ for (OrderItemVO itemDO : bean) {
|
|
|
+ itemDO.setProductVO(productManager.getById(itemDO.getProductId()));
|
|
|
+ itemDO.setGoodsVO(BeanUtil.copyProperties(goodsMapper.selectById(itemDO.getGoodsId()), GoodsVO.class));
|
|
|
+ itemDO.setUseAbleStock(productStockManager.getById(itemDO.getProductStockId()).getUsableStock());
|
|
|
}
|
|
|
+ byId.setOrderVo(aDo);
|
|
|
+ byId.setOrderItemVOS(bean);
|
|
|
+ return byId;
|
|
|
}
|
|
|
}
|
|
|
|