|
@@ -3,6 +3,7 @@ package com.hys.app.service.erp.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.io.IoUtil;
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.poi.excel.ExcelUtil;
|
|
|
import cn.hutool.poi.excel.ExcelWriter;
|
|
@@ -19,6 +20,7 @@ import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
|
|
|
import com.hys.app.framework.exception.ServiceException;
|
|
|
import com.hys.app.framework.rabbitmq.MessageSender;
|
|
|
import com.hys.app.framework.rabbitmq.MqMessage;
|
|
|
+import com.hys.app.framework.util.BeanUtils;
|
|
|
import com.hys.app.framework.util.CurrencyUtil;
|
|
|
import com.hys.app.framework.util.JsonUtil;
|
|
|
import com.hys.app.framework.util.PageConvert;
|
|
@@ -32,9 +34,7 @@ import com.hys.app.model.erp.dos.*;
|
|
|
import com.hys.app.model.erp.dto.*;
|
|
|
import com.hys.app.model.erp.dto.message.WarehouseEntryAuditPassMessage;
|
|
|
import com.hys.app.model.erp.enums.*;
|
|
|
-import com.hys.app.model.erp.vo.WarehouseEntryAllowable;
|
|
|
-import com.hys.app.model.erp.vo.WarehouseEntryStatistics;
|
|
|
-import com.hys.app.model.erp.vo.WarehouseEntryVO;
|
|
|
+import com.hys.app.model.erp.vo.*;
|
|
|
import com.hys.app.model.goods.dos.CategoryDO;
|
|
|
import com.hys.app.model.system.vo.SiteSetting;
|
|
|
import com.hys.app.service.base.service.SettingManager;
|
|
@@ -89,6 +89,9 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
private OrderItemManager orderItemManager;
|
|
|
private RedisTemplate redisTemplate;
|
|
|
private AreaStockManager areaStockManager;
|
|
|
+ private OrderReturnItemManager orderReturnItemManager;
|
|
|
+ private OrderReturnManager orderReturnManager;
|
|
|
+ private StockTransferProductManager stockTransferProductManager;
|
|
|
|
|
|
|
|
|
@Override
|
|
@@ -159,6 +162,8 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
|
|
|
WarehouseEntryProductDO productDO = BeanUtil.copyProperties(dto, WarehouseEntryProductDO.class);
|
|
|
productDO.setProductId(dto.getProductId());
|
|
|
+ productDO.setEntryNum(productDO.getEntryNum() + productDO.getNum());
|
|
|
+ productDO.setNotEntryNum(productDO.getOrderNum() - productDO.getEntryNum());
|
|
|
productDO.setWarehouseEntryId(warehouseEntryDO.getId());
|
|
|
productList.add(productDO);
|
|
|
}
|
|
@@ -166,7 +171,6 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
//保存子表和序列号的关系
|
|
|
warehouseEntryDTO.setId(warehouseEntryDO.getId());
|
|
|
saveSnCode(warehouseEntryDTO.getId(), productList);
|
|
|
-
|
|
|
if ("submit".equals(warehouseEntryDTO.getSaveOrSubmit())) {
|
|
|
updateStock(warehouseEntryDTO, getById(warehouseEntryDO.getId()), productList);
|
|
|
}
|
|
@@ -187,16 +191,6 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- //如果是调拨单得先出库才能入库,入库完之后改变调拨单得状态
|
|
|
- if (WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDO.getType())) {
|
|
|
- WarehouseOutDO outDO = warehouseOutMapper.selectOne(new LambdaQueryWrapper<WarehouseOutDO>().eq(WarehouseOutDO::getOrderIdList, warehouseEntryDO.getOrderId()).last("limit 1"));
|
|
|
- if ("N".equals(outDO.getHasSubmit())) {
|
|
|
- throw new ServiceException("商品还未调拨出库");
|
|
|
- }
|
|
|
- StockTransferDO aDo = stockTransferMapper.selectById(warehouseEntryDO.getOrderId());
|
|
|
- aDo.setStatus(TransferTypeEnum.HAS_TRANSFER);
|
|
|
- stockTransferMapper.updateById(aDo);
|
|
|
- }
|
|
|
|
|
|
List<Long> collect = warehouseEntryDTO.getProductList().stream().map(WarehouseEntryProductDTO::getProductId).collect(Collectors.toList());
|
|
|
List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
|
|
@@ -210,20 +204,21 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
dto.setNum(productDO.getNum());
|
|
|
arrayList.add(dto);
|
|
|
}
|
|
|
- productStockManager.updateActualStock(arrayList,null);
|
|
|
- if (WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType())) {
|
|
|
- arrayList.forEach(item ->item.setNum(-item.getNum()));
|
|
|
- productStockManager.updateTransitStock(arrayList);
|
|
|
+ productStockManager.updateActualStock(arrayList, null);
|
|
|
+
|
|
|
+ //如果不是调拨入库,售后入库,调拨入库直接更爱入库单状态
|
|
|
+ if (!WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType()) &&
|
|
|
+ !WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType()) &&
|
|
|
+ !WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDTO.getType())) {
|
|
|
+ //入库之后数据不能被操作
|
|
|
+ warehouseEntryDO.setHasSubmit("Y");
|
|
|
+ updateById(warehouseEntryDO);
|
|
|
}
|
|
|
- //入库之后数据不能被操作
|
|
|
- warehouseEntryDO.setHasSubmit("Y");
|
|
|
- updateById(warehouseEntryDO);
|
|
|
-
|
|
|
+ //如果有序列号更爱序列号的使用状态
|
|
|
List<ItemSnCodeDO> list1 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, warehouseEntryDO.getId()));
|
|
|
if (CollUtil.isNotEmpty(list1)) {
|
|
|
List<Long> collect1 = list1.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList());
|
|
|
List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, collect1));
|
|
|
-
|
|
|
//更爱序列号状态
|
|
|
for (GoodsSnDO aDo : list) {
|
|
|
aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
|
|
@@ -232,39 +227,65 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
}
|
|
|
goodsSnManager.updateBatchById(list);
|
|
|
}
|
|
|
- //如果是租赁订单
|
|
|
+
|
|
|
+ //所欲已入库的商品
|
|
|
+ List<WarehouseEntryProductDO> entryProductDOS = warehouseEntryProductManager.list(new LambdaQueryWrapper<WarehouseEntryProductDO>()
|
|
|
+ .eq(WarehouseEntryProductDO::getScanOrderId, warehouseEntryDO.getOrderId()));
|
|
|
+
|
|
|
+ //售后订单如果是租赁订单 扣减在途库存 。判断更改售后订单的状态,入库单的状态
|
|
|
if (WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType())) {
|
|
|
- OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
|
|
|
- List<OrderItemDO> list = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, aDo.getId()));
|
|
|
-
|
|
|
- List<WarehouseEntryDO> entryDOS = list(new LambdaQueryWrapper<WarehouseEntryDO>()
|
|
|
- .eq(WarehouseEntryDO::getHasSubmit, "Y")
|
|
|
- .eq(WarehouseEntryDO::getOrderId, aDo.getId())
|
|
|
- .eq(WarehouseEntryDO::getType, WarehouseEntyrTypeEnum.HAIL_ENTRY));
|
|
|
- List<Long> collected = entryDOS.stream().map(WarehouseEntryDO::getId).collect(Collectors.toList());
|
|
|
- //todo 后面报失 租转买的商品须累加
|
|
|
- List<WarehouseEntryProductDO> doList = warehouseEntryProductManager.list(new LambdaQueryWrapper<WarehouseEntryProductDO>()
|
|
|
- .in(WarehouseEntryProductDO::getWarehouseEntryId, collected));
|
|
|
- List<OrderItemDO> objects = new ArrayList<>();
|
|
|
- for (OrderItemDO itemDO : list) {
|
|
|
- WarehouseEntryProductDTO warehouseEntryProductDTO = warehouseEntryDTO.getProductList().stream().filter(item -> item.getProductId().equals(itemDO.getProductId())).findFirst().get();
|
|
|
- itemDO.setStockNum(itemDO.getStockNum()-warehouseEntryProductDTO.getNum());
|
|
|
- if (itemDO.getStockNum() <= 0){
|
|
|
- itemDO.setHasReturn(1);
|
|
|
- }
|
|
|
-// Optional<WarehouseEntryProductDO> first = doList.stream().filter(item -> item.getScanOrderItemId().equals(itemDO.getId())).findFirst();
|
|
|
-// if (first.isPresent()) {
|
|
|
-// if (first.get().getNum() == itemDO.getNum()) {
|
|
|
-// objects.add(itemDO);
|
|
|
-// }
|
|
|
-// }
|
|
|
- }
|
|
|
- orderItemManager.updateBatchById(list);
|
|
|
- //如果入库单的所有详细累加起来等于订单的详细 则该订单改为已完成
|
|
|
- long count = list.stream().filter(item -> item.getHasReturn() == 1).count();
|
|
|
- if (list.size() == count) {
|
|
|
+ //扣减在途库存
|
|
|
+ arrayList.forEach(item -> item.setNum(-item.getNum()));
|
|
|
+ productStockManager.updateTransitStock(arrayList);
|
|
|
+ long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
|
|
|
+ if (count == 0) {
|
|
|
+ OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
|
|
|
aDo.setStatus(SaleOrderStatusEnum.ORDER_END);
|
|
|
orderManager.updateById(aDo);
|
|
|
+ warehouseEntryDO.setHasSubmit("Y");
|
|
|
+ updateById(warehouseEntryDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //如果是租赁订单 扣减在途库存 判断更改订单的状态,入库单的状态
|
|
|
+ if (WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType())) {
|
|
|
+ OrderReturnDO orderReturnDO = orderReturnManager.getById(warehouseEntryDTO.getOrderId());
|
|
|
+
|
|
|
+ OrderDO aDo = orderManager.getById(orderReturnDO.getOrderId());
|
|
|
+ if (OrderTypeEnum.TO_C.equals(aDo.getType())) {
|
|
|
+ //若果售后订单类型是租赁订单更改在途库存状态
|
|
|
+ arrayList.forEach(item -> item.setNum(-item.getNum()));
|
|
|
+ productStockManager.updateTransitStock(arrayList);
|
|
|
+ }
|
|
|
+
|
|
|
+ long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
|
|
|
+ if (count == 0) {
|
|
|
+ orderReturnDO.setStatus(ReturnOrderStatusEnum.SALE_AFTER_END);
|
|
|
+ orderReturnManager.updateById(orderReturnDO);
|
|
|
+ warehouseEntryDO.setHasSubmit("Y");
|
|
|
+ updateById(warehouseEntryDO);
|
|
|
+ }
|
|
|
+ //如果这个订单没有正在进行中的守护订单,把订单的状态改为售后完成状态
|
|
|
+ long count1 = orderReturnManager.count(new LambdaQueryWrapper<OrderReturnDO>()
|
|
|
+ .eq(OrderReturnDO::getStatus, ReturnOrderStatusEnum.SALE_AFTER_ING).eq(OrderReturnDO::getOrderId, aDo.getId()));
|
|
|
+ if (count1 <= 0) {
|
|
|
+ aDo.setStatus(SaleOrderStatusEnum.SALE_AFTER_END);
|
|
|
+ orderManager.updateById(aDo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果是调拨单得先出库才能入库,全部入库更改入库单的状态,调拨单得状态
|
|
|
+ if (WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDO.getType())) {
|
|
|
+ WarehouseOutDO outDO = warehouseOutMapper.selectOne(new LambdaQueryWrapper<WarehouseOutDO>().eq(WarehouseOutDO::getOrderIdList, warehouseEntryDO.getOrderId()).last("limit 1"));
|
|
|
+ if ("N".equals(outDO.getHasSubmit())) {
|
|
|
+ throw new ServiceException("商品还未调拨出库");
|
|
|
+ }
|
|
|
+ long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
|
|
|
+ if (count == 0) {
|
|
|
+ StockTransferDO transferDO = stockTransferMapper.selectById(warehouseEntryDTO.getOrderId());
|
|
|
+ transferDO.setStatus(TransferTypeEnum.HAS_TRANSFER);
|
|
|
+ stockTransferMapper.updateById(transferDO);
|
|
|
+ warehouseEntryDO.setHasSubmit("Y");
|
|
|
+ updateById(warehouseEntryDO);
|
|
|
}
|
|
|
}
|
|
|
redisTemplate.delete(warehouseEntryDO.getId().toString());
|
|
@@ -507,22 +528,6 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
if (!OrderTypeEnum.TO_C.equals(aDo.getType())) {
|
|
|
throw new ServiceException("该订单不是租赁订单");
|
|
|
}
|
|
|
- List<OrderItemDO> list = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, warehouseEntryDTO.getOrderId()));
|
|
|
-// List<OrderItemDO> objects = new ArrayList<>();
|
|
|
- warehouseEntryDTO.getProductList().forEach(item -> {
|
|
|
- if (ObjectUtil.isNull(item.getScanOrderItemId())) {
|
|
|
- throw new ServiceException("租赁订单返回的商品必须在租赁订单里面");
|
|
|
- }
|
|
|
- Optional<OrderItemDO> first = list.stream().filter(it -> it.getId().equals(item.getScanOrderItemId())).findFirst();
|
|
|
- if (!first.isPresent()) {
|
|
|
- throw new ServiceException("租赁订单返回的商品必须在租赁订单里面");
|
|
|
- }
|
|
|
-// OrderItemDO orderItemDO = first.get();
|
|
|
-// orderItemDO.setHasReturn(1);
|
|
|
-// objects.add(orderItemDO);
|
|
|
- });
|
|
|
-// //更改订单详情的是否返回 统计在途库存会用到
|
|
|
-// orderItemManager.updateBatchById(objects);
|
|
|
}
|
|
|
|
|
|
//如果是售后订单
|
|
@@ -530,42 +535,16 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
|
|
|
if (ObjectUtil.isNull(warehouseEntryDTO.getOrderId())) {
|
|
|
throw new ServiceException("售后退货:订单不能为空");
|
|
|
}
|
|
|
- OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
|
|
|
- if (ObjectUtil.isNull(aDo)) {
|
|
|
+ OrderReturnDO byId = orderReturnManager.getById(warehouseEntryDTO.getOrderId());
|
|
|
+ if (ObjectUtil.isNull(byId)) {
|
|
|
throw new ServiceException("订单不存在");
|
|
|
}
|
|
|
- if (!SaleOrderStatusEnum.SALE_AFTER_ING.equals(aDo.getStatus()) &&
|
|
|
- !SaleOrderStatusEnum.SALE_AFTER_END.equals(aDo.getStatus()) &&
|
|
|
- !SaleOrderStatusEnum.SALE_AFTER_CANCEL.equals(aDo.getStatus()) ) {
|
|
|
- throw new ServiceException("未发现该订单有退货记录");
|
|
|
- }
|
|
|
- List<OrderItemDO> list = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, warehouseEntryDTO.getOrderId()));
|
|
|
- List<OrderItemDO> objects = new ArrayList<>();
|
|
|
- warehouseEntryDTO.getProductList().forEach(item -> {
|
|
|
- if (ObjectUtil.isNull(item.getScanOrderItemId())) {
|
|
|
- throw new ServiceException("退货商品返回的商品必须在租赁订单里面");
|
|
|
- }
|
|
|
- Optional<OrderItemDO> first = list.stream().filter(it -> it.getId().equals(item.getScanOrderItemId())).findFirst();
|
|
|
- if (!first.isPresent()) {
|
|
|
- throw new ServiceException("退货商品返回的商品必须在租赁订单里面");
|
|
|
- }
|
|
|
- OrderItemDO orderItemDO = first.get();
|
|
|
- int allReturnNum= item.getNum()+orderItemDO.getHasReturnNum();
|
|
|
- if (allReturnNum>orderItemDO.getReturnNum()){
|
|
|
- throw new ServiceException("退货数量不能大于脱货订单的数量");
|
|
|
- }
|
|
|
- orderItemDO.setHasReturnNum(item.getNum()+orderItemDO.getHasReturnNum());
|
|
|
- objects.add(orderItemDO);
|
|
|
- });
|
|
|
- //更改订单详情的是否返回 统计在途库存会用到
|
|
|
- orderItemManager.updateBatchById(objects);
|
|
|
}
|
|
|
|
|
|
WarehouseDO warehouseDO = warehouseManager.getById(warehouseEntryDTO.getWarehouseId());
|
|
|
if (warehouseDO == null) {
|
|
|
throw new ServiceException("仓库不存在");
|
|
|
}
|
|
|
-
|
|
|
for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
|
|
|
ProductDO productDO = productManager.getById(dto.getProductId());
|
|
|
if (CollUtil.isNotEmpty(dto.getSnCodeList())) {
|