Kaynağa Gözat

改动过的

huanglizhi 1 yıl önce
ebeveyn
işleme
9cca6c8fb5
20 değiştirilmiş dosya ile 294 ekleme ve 32 silme
  1. 21 6
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseOutManagerController.java
  2. 6 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsSnDO.java
  3. 10 3
      module-erp/src/main/java/com/hys/app/model/erp/dos/LockedStockDetailDO.java
  4. 4 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendItemDO.java
  5. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutItemDO.java
  6. 7 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/StockInventoryDTO.java
  7. 10 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/StockInventoryProductDTO.java
  8. 10 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutProductDTO.java
  9. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/ProductStockV1.java
  10. 6 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/StockInventoryVO.java
  11. 19 1
      module-erp/src/main/java/com/hys/app/service/erp/WarehouseOutManager.java
  12. 21 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java
  13. 4 2
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockDamageReportManagerImpl.java
  14. 78 6
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockInventoryManagerImpl.java
  15. 4 1
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockTransferManagerImpl.java
  16. 1 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseEntryManagerImpl.java
  17. 48 12
      module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseOutManagerImpl.java
  18. 1 0
      module-erp/src/main/resources/mapper/ProductStockMapper.xml
  19. 1 1
      server/src/main/resources/application.yml
  20. 37 0
      sql/clearTable.sql

+ 21 - 6
module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseOutManagerController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
+import com.hys.app.model.erp.dos.LockedStockDetailDO;
 import com.hys.app.model.erp.dto.*;
 import com.hys.app.model.erp.enums.WarehouseOutStatusEnum;
 import com.hys.app.model.erp.vo.GoodsVO;
@@ -53,7 +54,7 @@ public class WarehouseOutManagerController {
     @PostMapping
     @Log(client = LogClient.admin, detail = "创建出库单")
     public Long add(@RequestBody @Valid WarehouseOutDTO warehouseOutDTO) {
-       return warehouseOutManager.add(warehouseOutDTO);
+        return warehouseOutManager.add(warehouseOutDTO);
     }
 
     @ApiOperation(value = "编辑")
@@ -87,20 +88,34 @@ public class WarehouseOutManagerController {
     @GetMapping("/getGoodByWarehouse/warehouseIdAndOrderType/{orderType}/{warehouseIds}")
     @Log(client = LogClient.admin, detail = "根据仓库找到所有sku库存大于0的商品")
     public IPage<ProductStockVO> getGoodByWarehouse(BaseQueryParam queryParam,
-                                              @PathVariable(value = "orderType") String orderType,
-                                              @PathVariable(value = "warehouseIds") String warehouseIds) {
+                                                    @PathVariable(value = "orderType") String orderType,
+                                                    @PathVariable(value = "warehouseIds") String warehouseIds) {
         String[] split = warehouseIds.split(",");
         List<Long> list = new ArrayList<>();
         for (String s : split) {
             list.add(Long.valueOf(s));
         }
-        return warehouseOutManager.getGoodByWarehouse(null,queryParam,orderType,list);
+        return warehouseOutManager.getGoodByWarehouse(null, queryParam, orderType, list);
     }
 
     @ApiOperation(value = "根据仓库找到所有sku库存大于0的商品")
     @GetMapping("/getGoodByWarehouse/{warehouseId}")
-    public IPage<ProductStockVO> getGoodByWarehouse(@PathVariable(value = "warehouseId" )Long warehouseId, BaseQueryParam queryParam) {
-        return warehouseOutManager.getGoodByWarehouse(warehouseId,queryParam,null,null);
+    public IPage<ProductStockVO> getGoodByWarehouse(@PathVariable(value = "warehouseId") Long warehouseId, BaseQueryParam queryParam) {
+        return warehouseOutManager.getGoodByWarehouse(warehouseId, queryParam, null, null);
+    }
+
+
+    @ApiOperation(value = "找到这个仓库所有的商品")
+    @GetMapping("/getGoodByWarehouseInventory/{warehouseId}")
+    public IPage<ProductStockVO> getGoodByWarehouseInventory(@PathVariable(value = "warehouseId") Long warehouseId, BaseQueryParam queryParam) {
+        return warehouseOutManager.getGoodByWarehouseInventory(warehouseId, queryParam);
+    }
+
+
+    @ApiOperation(value = "获取冻结库存")
+    @GetMapping("/getLockedStock")
+    public IPage<LockedStockDetailDO> getLockedStock(BaseQueryParam queryParam) {
+        return warehouseOutManager.getLockedStock(queryParam);
     }
 }
 

+ 6 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsSnDO.java

@@ -46,9 +46,15 @@ public class GoodsSnDO extends BaseDO {
     @ApiModelProperty(name = "status", value = "状态")
     private SnCodeStatusEnum status = SnCodeStatusEnum.NOT_USED;
 
+    @ApiModelProperty(name = "warehouse_id", value = "仓库id")
+    private Long warehouseId;
+
     @ApiModelProperty(name = "entry_house_id", value = "入库单id")
     private Long entryHouseId;
 
+    @ApiModelProperty(name = "inventory_id", value = "盘点单id")
+    private Long inventoryId;
+
     @ApiModelProperty(name = "out_house_id", value = "出库单id")
     private Long outHouseId;
 

+ 10 - 3
module-erp/src/main/java/com/hys/app/model/erp/dos/LockedStockDetailDO.java

@@ -1,6 +1,7 @@
 package com.hys.app.model.erp.dos;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.hys.app.model.erp.enums.DetailOrderTypeEnum;
@@ -50,9 +51,15 @@ public class LockedStockDetailDO implements Serializable {
     @ApiModelProperty(name = "status", value = "状态未解锁")
     private Boolean status = false;
 
-    @ApiModelProperty(name = "locked_num", value = "最后解锁时间")
-    private Integer unLockedNum;
+    @ApiModelProperty(name = "un_locked_num", value = "最后解锁时间")
+    private Integer unLockedNum =0;
 
-    @ApiModelProperty(name = "locked_time", value = "解锁数量")
+    @ApiModelProperty(name = "un_locked_time", value = "解锁数量")
     private Date unLockedTime;
+
+    @TableField(exist = false)
+    private GoodsDO goodsVO;
+
+    @TableField(exist = false)
+    private ProductDO productVO;
 }

+ 4 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendItemDO.java

@@ -33,6 +33,10 @@ public class OrderSendItemDO implements Serializable {
     @ApiModelProperty(name = "order_id", value = "订单id")
     private Long orderId;
 
+    @ApiModelProperty(name = "order_item_id", value = "订单明细id")
+    private Long orderItemId;
+
+
     @ApiModelProperty(name = "goods_id", value = "商品id")
     private Long goodsId;
 

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutItemDO.java

@@ -53,6 +53,9 @@ public class WarehouseOutItemDO implements Serializable {
     @ApiModelProperty(name = "order_id", value = "订单id")
     private Long orderId;
 
+    @ApiModelProperty(name = "order_item_id", value = "订单详情id(不是发货单的)")
+    private Long orderItemId;
+
     @ApiModelProperty(name = "order_sn", value = "订单编号")
     private String orderSn;
 

+ 7 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/StockInventoryDTO.java

@@ -46,6 +46,13 @@ public class StockInventoryDTO implements Serializable {
     @NotNull(message = "盘点人ID不能为空")
     private Long inventoryPersonId;
 
+    /**
+     * 盘点人ID
+     */
+    @ApiModelProperty(name = "creator_id", value = "盘点人ID", required = true)
+    @NotNull(message = "盘点人ID不能为空")
+    private Long creatorId;
+
     /**
      * 库存盘点单产品集合
      */

+ 10 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/StockInventoryProductDTO.java

@@ -1,5 +1,7 @@
 package com.hys.app.model.erp.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.hys.app.model.erp.dos.GoodsSnDO;
 import com.hys.app.model.erp.vo.GoodsVO;
 import com.hys.app.model.erp.vo.ProductVO;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +10,7 @@ import lombok.Data;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 库存盘点单产品实体DTO
@@ -21,6 +24,9 @@ public class StockInventoryProductDTO implements Serializable {
     private static final long serialVersionUID = -6285460490304810323L;
 
 
+    private Long id;
+
+
 
     @ApiModelProperty(name = "goods_id", value = "SKUID", required = true)
     @NotNull(message = "SKUID不能为空")
@@ -33,6 +39,10 @@ public class StockInventoryProductDTO implements Serializable {
     @NotNull(message = "盘点数量不能为空")
     private Integer inventoryNum;
 
+    @ApiModelProperty(name = "sn_code_list", value = "货物信息,最大数量50")
+    @TableField(exist = false)
+    private List<GoodsSnDO> snCodeList;
+
     /**
      * 差异数量
      */

+ 10 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutProductDTO.java

@@ -67,5 +67,15 @@ public class WarehouseOutProductDTO {
     @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
     private Integer scanDiffNum;
 
+    @ApiModelProperty(name = "order_id", value = "订单id")
+    private Long orderId;
+
+    @ApiModelProperty(name = "order_item_id", value = "订单详情id(不是发货单的)")
+    private Long orderItemId;
+
+    @ApiModelProperty(name = "product_stock_id", value = "商品库存id")
+    private Long productStockId;
+
+
 }
 

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/ProductStockV1.java

@@ -80,6 +80,9 @@ public class ProductStockV1  {
     @TableField(exist = false)
     private ProductDO productVO;
 
+    @ApiModelProperty(name = "locked_stock", value = "冻结库存")
+    private String lockedStock;
+
 
 
 

+ 6 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/StockInventoryVO.java

@@ -73,4 +73,10 @@ public class StockInventoryVO implements Serializable {
     @ApiModelProperty(name = "status", value = "状态")
     private DamageinventoryEnum status = DamageinventoryEnum.NOT_HANDLE;
 
+    /**
+     * 盘点人ID
+     */
+    @ApiModelProperty(name = "creator_id", value = "盘点人ID", required = true)
+    @NotNull(message = "盘点人ID不能为空")
+    private Long creatorId;
 }

+ 19 - 1
module-erp/src/main/java/com/hys/app/service/erp/WarehouseOutManager.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.LockedStockDetailDO;
 import com.hys.app.model.erp.dos.WarehouseOutDO;
 import com.hys.app.model.erp.dto.*;
 import com.hys.app.model.erp.enums.WarehouseOutStatusEnum;
@@ -110,11 +111,28 @@ public interface WarehouseOutManager extends BaseService<WarehouseOutDO> {
     void audit(List<Long> ids, WarehouseOutStatusEnum status, String remark);
 
 
-
     /**
      * 根据仓库找到所有库存大于0的商品
+     *
      * @param warehouseId 仓库ID
      */
     IPage<ProductStockVO> getGoodByWarehouse(Long warehouseId, BaseQueryParam queryParam, String orderType, List<Long> warehouseIds);
+
+    /**
+     * 盘点根据仓库找到这个仓库的所有的商品
+     *
+     * @param warehouseId
+     * @param queryParam
+     * @return
+     */
+    IPage<ProductStockVO> getGoodByWarehouseInventory(Long warehouseId, BaseQueryParam queryParam);
+
+    /**
+     * 获取冻结库存
+     *
+     * @param queryParam
+     * @return
+     */
+    IPage<LockedStockDetailDO> getLockedStock(BaseQueryParam queryParam);
 }
 

+ 21 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java

@@ -234,6 +234,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         List<OrderItemDO> collect = dos.stream().filter(item -> item.getWarehouseId().equals(warehouseId)).collect(Collectors.toList());
         List<OrderSendItemDO> itemList = BeanUtils.toBean(collect, OrderSendItemDO.class);
         itemList.forEach(item -> {
+            item.setOrderItemId(item.getId());//订单详情id
             item.setId(null);
             item.setOrderId(aDo.getId());
             item.setSendOrderId(orderSendDO.getId());
@@ -256,6 +257,12 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
             case "sending":
                 wrapper.ne(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND);
                 break;
+            case "to_be_return":
+                wrapper.eq(OrderSendDO::getOrderType, OrderTypeEnum.TO_C);
+                wrapper.and(item->item.eq(OrderSendDO::getStatus, SaleOrderSendStatusEnum.SENDING)
+                        .or()
+                        .eq(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SINGE)   );
+                break;
         }
         Page<OrderSendDO> paged = orderSendManager.page(page, wrapper);
         paged.getRecords().forEach(item -> item.setOrderVo(getById(item.getOrderId())));
@@ -325,7 +332,19 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         List<WarehouseOutItemDO> beanList = BeanUtils.toBean(list, WarehouseOutItemDO.class);
         //保存发货单明细和序列号的关系
         List<GoodsSnDO> snDOS = new ArrayList<>();
+        List<LockedStockDetailDO> detailDOS = new ArrayList<>();
         for (OrderSendItemVO sendItemVO : list) {
+            LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>()
+                    .eq(LockedStockDetailDO::getOrderId, orderDO.getId()).eq(LockedStockDetailDO::getOrderItemId, sendItemVO.getOrderItemId()));
+            if (ObjectUtil.isNull(one)) {
+                throw new ServiceException("未找到冻结记录");
+            }
+            one.setUnLockedTime(new Date());
+            if (one.getLockedNum() == (sendItemVO.getNum()+one.getUnLockedNum())){
+                one.setStatus(true);
+            }
+            one.setUnLockedNum(one.getUnLockedNum() + sendItemVO.getNum());
+            detailDOS.add(one);
             //判断发货数量是不是和明细数量一致,不一样不让保存
             ProductDO byId = productManager.getById(sendItemVO.getProductId());
             if (byId.getHaveSn()) {
@@ -350,6 +369,8 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
                 }
             }
         }
+        //更改冻结库存状态
+        lockedStockDetailManager.updateBatchById(detailDOS);
         //更改序列号的状态
         if (CollUtil.isNotEmpty(snDOS)) {
             //更爱序列号状态

+ 4 - 2
module-erp/src/main/java/com/hys/app/service/erp/impl/StockDamageReportManagerImpl.java

@@ -110,7 +110,7 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
                 throw new ServiceException("报损数量不能能大于可用库存数量");
             }
             StockDTO stockDTO = new StockDTO();
-            stockDTO.setId(report.getId());
+            stockDTO.setId(dto.getProductStockId());
             stockDTO.setNum(dto.getReportNum());
             arrayList.add(stockDTO);
             LockedStockDetailDO detailDO = new LockedStockDetailDO();
@@ -133,8 +133,10 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
         outDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseOut, 66L));
         warehouseOutMapper.insert(outDO);
         //保存出库单明细
-        List<WarehouseOutItemDO> beanList = BeanUtils.toBean(stockDamageReportDTO.getProductList(), WarehouseOutItemDO.class);
+        List<WarehouseOutItemDO> beanList = BeanUtils.toBean(bean, WarehouseOutItemDO.class);
         beanList.forEach(item ->{
+            item.setOrderItemId(item.getId());
+            item.setOrderId(report.getId());
             item.setWarehouseOutId(outDO.getId());
             Integer num = stockDamageReportDTO.getProductList().stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getReportNum();
             item.setOutNum(num);

+ 78 - 6
module-erp/src/main/java/com/hys/app/service/erp/impl/StockInventoryManagerImpl.java

@@ -1,6 +1,7 @@
 package com.hys.app.service.erp.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -14,12 +15,11 @@ import com.hys.app.framework.util.DateUtil;
 import com.hys.app.framework.util.PageConvert;
 import com.hys.app.framework.util.StringUtil;
 import com.hys.app.mapper.erp.StockInventoryMapper;
-import com.hys.app.model.erp.dos.ProductStockDO;
-import com.hys.app.model.erp.dos.StockInventory;
-import com.hys.app.model.erp.dos.StockInventoryProduct;
+import com.hys.app.model.erp.dos.*;
 import com.hys.app.model.erp.dto.*;
 import com.hys.app.model.erp.enums.DamageinventoryEnum;
 import com.hys.app.model.erp.enums.NoBusinessTypeEnum;
+import com.hys.app.model.erp.enums.SnCodeStatusEnum;
 import com.hys.app.model.erp.enums.StockInventoryStatusEnum;
 import com.hys.app.model.erp.vo.GoodsVO;
 import com.hys.app.model.erp.vo.ProductVO;
@@ -54,6 +54,8 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
     private ProductStockManager productStockManager;
     private GoodsManager goodsManager;
     private ProductManager productManager;
+    private ItemSnCodeManager itemSnCodeManager;
+    private GoodsSnManager goodsSnManager;
 
 
     /**
@@ -86,9 +88,51 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
         save(copied);
         List<StockInventoryProduct> list = BeanUtils.toBean(stockInventoryDTO.getProductList(), StockInventoryProduct.class);
         list.forEach(item -> item.setInventoryId(copied.getId()));
-        this.stockInventoryProductManager.saveProduct(copied.getId(), stockInventoryDTO.getProductList());
+        this.stockInventoryProductManager.saveBatch(list);
+        //如果这个商品有序列号补习不全序列号关系
+        for (StockInventoryProductDTO dto : stockInventoryDTO.getProductList()) {
+            StockInventoryProduct product = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
+            dto.setId(product.getId());
+        }
+        saveSnCode(copied.getId(), stockInventoryDTO.getProductList());
+
+    }
+
+    private void saveSnCode(Long stockInventoryId, List<StockInventoryProductDTO> productList) {
+        List<ItemSnCodeDO> itemSnCodeDOS = new ArrayList<>();
+        //如果有序列号,保存序列号和入库单的关系,更爱序列号的状态
+        List<String> arrayList = new ArrayList<>();
+        for (StockInventoryProductDTO aDo : productList) {
+            ProductDO byId = productManager.getById(aDo.getProductId());
+            if (byId.getHaveSn() && CollUtil.isEmpty(aDo.getSnCodeList())){
+                throw new ServiceException("有序列号的商品序列号不能为空");
+            }
+            if (CollUtil.isNotEmpty(aDo.getSnCodeList())) {
+                if (aDo.getInventoryNum() != aDo.getSnCodeList().size()) {
+                    throw new ServiceException("序列号个数和盘点个数不等");
+                }
+                arrayList.addAll(aDo.getSnCodeList().stream().map(GoodsSnDO::getSnCode).collect(Collectors.toList()));
+                aDo.getSnCodeList().forEach(item -> {
+                    ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
+                    itemSnCodeDO.setItemId(aDo.getId());
+                    itemSnCodeDO.setEntryOutHouseId(stockInventoryId);
+                    itemSnCodeDO.setType("inventory");
+                    itemSnCodeDO.setSnCodeId(item.getId());
+                    itemSnCodeDOS.add(itemSnCodeDO);
+                });
+            }
+        }
+        if(CollUtil.isNotEmpty(arrayList)){
+            long count = goodsSnManager.count(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getSnCode, arrayList));
+            if (count != arrayList.size()) {
+                throw new ServiceException("部分序列号不存在");
+            }
+            //保存序列号和子表的关系
+            itemSnCodeManager.saveBatch(itemSnCodeDOS);
+        }
     }
 
+
     @Override
     @Transactional
     public void syncStock(Long id) {
@@ -108,8 +152,31 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
             dto.setNum(product.getInventoryNum());
             listStock.add(dto);
         }
-        productStockManager.updateActualStock(listStock,"inventory");
-
+        productStockManager.updateActualStock(listStock, "inventory");
+        //更新序列号的关系
+        GoodsSnDO snDO = new GoodsSnDO();
+        snDO.setEntryHouseId(null);
+        snDO.setInventoryId(null);
+        snDO.setOutHouseId(null);
+        snDO.setWarehouseId(null);
+        snDO.setStatus(SnCodeStatusEnum.NOT_USED);
+        goodsSnManager.update(snDO, new LambdaQueryWrapper<GoodsSnDO>()
+                .eq(GoodsSnDO::getWarehouseId, stockInventory.getWarehouseId())
+                .in(GoodsSnDO::getProductId, goodsList.stream().map(StockInventoryProduct::getProductId).collect(Collectors.toList())));
+        //找到这个订单关联的所有序列号
+        List<ItemSnCodeDO> listed = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>()
+                .eq(ItemSnCodeDO::getType, "inventory").eq(ItemSnCodeDO::getEntryOutHouseId, id));
+        if (CollUtil.isNotEmpty(listed)){
+            List<GoodsSnDO> goodsSnDOS = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, listed.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList())));
+            //更爱序列号状态
+            for (GoodsSnDO aDo : goodsSnDOS) {
+                aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
+                aDo.setInventoryId(id);
+                aDo.setWarehouseId(stockInventory.getWarehouseId());
+                aDo.setInventoryId(id);
+            }
+            goodsSnManager.updateBatchById(goodsSnDOS);
+        }
     }
 
 
@@ -136,6 +203,11 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
             dto.setProductVO(productVO);
             GoodsVO goodsVO = BeanUtil.copyProperties(goodsManager.getById(productVO.getGoodsId()), GoodsVO.class);
             dto.setUsableStock(aDo.getUsableStock());
+            List<ItemSnCodeDO> list2 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getItemId, dto.getId()));
+            if (CollUtil.isNotEmpty(list2)) {
+                List<Long> collected = list2.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList());
+                dto.setSnCodeList(goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, collected)));
+            }
             dto.setGoodsVO(goodsVO);
         }
         stockInventoryVO.setProductList(beanList);

+ 4 - 1
module-erp/src/main/java/com/hys/app/service/erp/impl/StockTransferManagerImpl.java

@@ -106,7 +106,7 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
             LockedStockDetailDO detailDO = new LockedStockDetailDO();
             detailDO.setProductStockId(aDoOut.getId());
             detailDO.setOrderId(aDo.getId());
-            detailDO.setOrderItemId(aDoOut.getId());
+            detailDO.setOrderItemId(productDTO.getId());
             detailDO.setOrderType(DetailOrderTypeEnum.INVENTORY);
             detailDO.setLockedNum(productDTO.getNum());
             detailDO.setLockedTime(new Date());
@@ -127,9 +127,12 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
         //保存出库单明细
         List<WarehouseOutItemDO> beanList = BeanUtils.toBean(doList, WarehouseOutItemDO.class);
         beanList.forEach(item -> {
+            item.setOrderItemId(item.getId());
+            item.setOrderId(aDo.getId());
             item.setWarehouseOutId(outDO.getId());
             Integer num = doList.stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getNum();
             item.setOutNum(num);
+            item.setId(null);
         });
         warehouseOutItemManager.saveBatch(beanList);
         //生成入库单

+ 1 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseEntryManagerImpl.java

@@ -224,6 +224,7 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
             //更爱序列号状态
             for (GoodsSnDO aDo : list) {
                 aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
+                aDo.setWarehouseId(warehouseEntryDTO.getWarehouseId());
                 aDo.setEntryHouseId(warehouseEntryDO.getId());
             }
             goodsSnManager.updateBatchById(list);

+ 48 - 12
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseOutManagerImpl.java

@@ -161,25 +161,30 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
             stockDamageReportManager.updateById(aDo);
         }
 
-        List<Long> collect = warehouseOutDTO.getProductList().stream().map(WarehouseOutProductDTO::getProductId).collect(Collectors.toList());
-        List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
-                .eq(ProductStockDO::getWarehouseId, warehouseOutDTO.getWarehouseId()).in(ProductStockDO::getProductId, collect));
         List<StockDTO> arrayList = new ArrayList<>();
         //修改凍結库存明细
         List<LockedStockDetailDO> detailDOS = new ArrayList<>();
-        for (ProductStockDO aDo : stockDOList) {
+        for (WarehouseOutItemDO aDo : productList) {
             if (WarehouseOutTypeEnum.SALE_OUT.equals(warehouseOutDO.getType()) ||
                     WarehouseOutTypeEnum.TRANSFER_OUT.equals(warehouseOutDO.getType()) ||
                     WarehouseOutTypeEnum.DAMAGE_OUT.equals(warehouseOutDO.getType()) ||
-                    WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDO.getType())){
-                LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>().eq(LockedStockDetailDO::getOrderId,warehouseOutDO.getOrderId()));
+                    WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDO.getType())) {
+                LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>()
+                        .eq(LockedStockDetailDO::getOrderId, aDo.getOrderId()).eq(LockedStockDetailDO::getOrderItemId, aDo.getOrderItemId()));
+                if (ObjectUtil.isNull(one)) {
+                    throw new ServiceException("未找到冻结记录");
+                }
+                one.setUnLockedTime(new Date());
+                if (one.getLockedNum() == (aDo.getOutNum()+one.getUnLockedNum())){
+                    one.setStatus(true);
+                }
+                one.setUnLockedNum(one.getUnLockedNum() + aDo.getOutNum());
+                detailDOS.add(one);
             }
-
-
-
+            lockedStockDetailManager.updateBatchById(detailDOS);
             WarehouseOutProductDTO productDO = warehouseOutDTO.getProductList().stream().filter(item -> item.getProductId().equals(aDo.getProductId())).findFirst().get();
             StockDTO dto = new StockDTO();
-            dto.setId(aDo.getId());
+            dto.setId(aDo.getProductStockId());
             dto.setNum(-productDO.getOutNum());
             arrayList.add(dto);
         }
@@ -187,8 +192,8 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         productStockManager.updateActualStock(arrayList, null);
         productStockManager.updateLockedStock(arrayList);
         //更改在途库存
-        if (WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDTO.getType())){
-            arrayList.forEach(item ->item.setNum(-item.getNum()));
+        if (WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDTO.getType())) {
+            arrayList.forEach(item -> item.setNum(-item.getNum()));
             productStockManager.updateTransitStock(arrayList);
         }
         //入库之后数据不能被操作
@@ -202,6 +207,7 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
             //更爱序列号状态
             for (GoodsSnDO aDo : list) {
                 aDo.setStatus(SnCodeStatusEnum.OUT_WAREHOUSE);
+                aDo.setWarehouseId(warehouseOutDTO.getWarehouseId());
                 aDo.setOutHouseId(warehouseOutDO.getId());
             }
             goodsSnManager.updateBatchById(list);
@@ -244,6 +250,7 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         for (WarehouseOutProductDTO dto : productList) {
             ProductVO productVO = BeanUtil.copyProperties(list.stream().filter(item -> item.getId().equals(dto.getProductId())).findFirst().get(), ProductVO.class);
             dto.setProductVO(productVO);
+            dto.setGoodsId(productVO.getGoodsId());
             GoodsDO goodsDO = goodsMapper.selectById(productVO.getGoodsId());
             List<ItemSnCodeDO> list2 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getItemId, dto.getId()));
             if (CollUtil.isNotEmpty(list2)) {
@@ -448,5 +455,34 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         }
         return convert;
     }
+
+    @Override
+    public IPage<ProductStockVO> getGoodByWarehouseInventory(Long warehouseId, BaseQueryParam queryParam) {
+        //找出所有上架的商品
+        List<GoodsDO> list = goodsMapper.selectList(new LambdaQueryWrapper<GoodsDO>().eq(GoodsDO::getMarketEnable, true));
+        List<Long> goodsId = list.stream().map(GoodsDO::getId).collect(Collectors.toList());
+        //找到所有的商品
+        Page<ProductStockDO> page = productStockManager.page(new Page<>(queryParam.getPageNo(), queryParam.getPageSize()), new LambdaQueryWrapper<ProductStockDO>()
+                .eq(ProductStockDO::getWarehouseId, warehouseId).in(ProductStockDO::getGoodsId, goodsId));
+        Page<ProductStockVO> convert = productStockConverter.convert(page);
+        for (ProductStockVO record : convert.getRecords()) {
+            record.setGoodsVO(BeanUtil.copyProperties(goodsMapper.selectById(record.getGoodsId()), GoodsVO.class));
+            record.setProductVO(BeanUtil.copyProperties(productManager.getById(record.getProductId()), ProductVO.class));
+            record.setWarehouseVO(warehouseManager.getById(record.getWarehouseId()));
+        }
+        return convert;
+    }
+
+    @Override
+    public IPage<LockedStockDetailDO>
+    getLockedStock(BaseQueryParam queryParam) {
+        Page<LockedStockDetailDO> page = lockedStockDetailManager.page(new Page<>(queryParam.getPageNo(), queryParam.getPageSize()));
+        for (LockedStockDetailDO record : page.getRecords()) {
+            ProductStockDO byId = productStockManager.getById(record.getProductStockId());
+            record.setGoodsVO(goodsMapper.selectById(byId.getGoodsId()));
+            record.setProductVO(productManager.getById(byId.getProductId()));
+        }
+        return page;
+    }
 }
 

+ 1 - 0
module-erp/src/main/resources/mapper/ProductStockMapper.xml

@@ -16,6 +16,7 @@
             ps.usable_stock,
             ps.transit_Stock,
             ps.warning_stock,
+            ps.locked_stock,
             w.id as warehouse_id,
             w.name as warehouse_name,
             g.id as goods_id,

+ 1 - 1
server/src/main/resources/application.yml

@@ -4,7 +4,7 @@ spring:
   application:
     name: erp-server
   profiles:
-    active: test
+    active: local
   jackson:
     property-naming-strategy: SNAKE_CASE
   servlet:

+ 37 - 0
sql/clearTable.sql

@@ -0,0 +1,37 @@
+truncate erp_goods;                         -- 商品
+truncate erp_product_group;                 -- sku分组
+truncate erp_product_stock;                 -- 库存
+truncate erp_product_group_item;            -- sku分组明细
+truncate erp_product;                       -- sku明细
+truncate erp_goods_sn;                      -- 序列号
+truncate erp_locked_stock_detail;           -- 冻结库存明细
+truncate erp_item_sn_code;                  -- 序列号绑定关系
+truncate erp_warehouse;                     -- 仓库
+truncate erp_warehouse_area;                -- 库位
+-- truncate erp_warehouse_area_type;           -- 库位类型
+
+
+truncate erp_order;                         -- 订单
+truncate erp_order_item;                    -- 订单明细
+truncate erp_order_return;                  -- 退货
+truncate erp_order_return_item;             -- 退货明细
+truncate erp_order_send;                    -- 发货
+truncate erp_order_send_item;               -- 发货明细
+truncate erp_warehouse_entry;               -- 入库
+truncate erp_warehouse_entry_product;       -- 入库明细
+truncate erp_warehouse_out;                 -- 出库
+truncate erp_warehouse_out_item;            -- 出库明细
+truncate es_stock_damage_report;            -- 报损
+truncate es_stock_damage_report_product;    -- 报损明细
+truncate es_stock_inventory;                -- 盘点
+truncate es_stock_inventory_product;        -- 盘点明细
+truncate erp_stock_transfer;                -- 调拨
+truncate erp_stock_transfer_product;        -- 调拨明细
+
+
+truncate erp_goods;                         -- 商品
+truncate erp_product_group;                 -- sku分组
+truncate erp_product_stock;                 -- 库存
+truncate erp_goods_sn;                      -- 序列号
+truncate erp_locked_stock_detail;           -- 冻结库存明细
+truncate erp_item_sn_code;                  -- 序列号绑定关系