huanglizhi 1 год назад
Родитель
Сommit
c03c86f58f
25 измененных файлов с 509 добавлено и 75 удалено
  1. 7 0
      module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsSnController.java
  2. 9 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/OrderController.java
  3. 14 0
      module-erp/src/main/java/com/hys/app/mapper/erp/LockedStockDetailMapper.java
  4. 1 0
      module-erp/src/main/java/com/hys/app/mapper/goods/GoodsSnMapper.java
  5. 58 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/LockedStockDetailDO.java
  6. 2 5
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderDO.java
  7. 2 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendDO.java
  8. 4 4
      module-erp/src/main/java/com/hys/app/model/erp/dos/ProductStockDO.java
  9. 3 2
      module-erp/src/main/java/com/hys/app/model/erp/dto/OrderDTO.java
  10. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutProductDTO.java
  11. 36 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/DetailOrderTypeEnum.java
  12. 36 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/OrderSendTypeEnum.java
  13. 0 3
      module-erp/src/main/java/com/hys/app/model/erp/vo/OrderVO.java
  14. 8 0
      module-erp/src/main/java/com/hys/app/service/erp/GoodsSnManager.java
  15. 25 0
      module-erp/src/main/java/com/hys/app/service/erp/LockedStockDetailManager.java
  16. 10 1
      module-erp/src/main/java/com/hys/app/service/erp/OrderManager.java
  17. 20 1
      module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsSnManagerImpl.java
  18. 68 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/LockedStockDetailManagerImpl.java
  19. 73 19
      module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java
  20. 32 14
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockDamageReportManagerImpl.java
  21. 36 18
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockTransferManagerImpl.java
  22. 13 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseOutManagerImpl.java
  23. 21 7
      module-erp/src/main/java/com/hys/app/service/kuaidiniao/KuaiDiNiaoServiceImpl.java
  24. 6 0
      module-erp/src/main/java/com/hys/app/service/kuaidiniao/entity/AddressDTO.java
  25. 22 0
      module-erp/src/main/java/com/hys/app/service/kuaidiniao/entity/PreOrderModelDTO.java

+ 7 - 0
module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsSnController.java

@@ -47,6 +47,13 @@ public class GoodsSnController {
         goodsSnManager.createSnCode(goodsDTO);
     }
 
+    @ApiOperation(value = "添加")
+    @PostMapping("/updateSnCode/{id}/{snCode}")
+    @Log(client = LogClient.admin, detail = "新增序列号")
+    public void updateSnCode(@PathVariable Long id, @PathVariable String snCode) {
+        goodsSnManager.updateSnCode(id,snCode);
+    }
+
 
     @ApiOperation(value = "获取详情")
     @GetMapping("/getDetail/{id}")

+ 9 - 1
module-erp/src/main/java/com/hys/app/controller/erp/use/OrderController.java

@@ -17,6 +17,7 @@ import com.hys.app.model.support.validator.annotation.Log;
 import com.hys.app.service.erp.OrderManager;
 import com.hys.app.service.kuaidiniao.entity.AddressDTO;
 import com.hys.app.service.kuaidiniao.entity.PreOrderModel;
+import com.hys.app.service.kuaidiniao.entity.PreOrderModelDTO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -89,10 +90,17 @@ public class OrderController {
     @ApiOperation(value = "发货")
     @PostMapping("/orderSend/{orderSendId}")
     @Log(client = LogClient.admin, detail = "销售列表发货")
-    public void orderSend(@PathVariable(value = "orderSendId") Long orderSendId,@RequestBody OrderSendDO orderSendDO) {
+    public void orderSend(@PathVariable(value = "orderSendId") Long orderSendId,@RequestBody PreOrderModelDTO orderSendDO) {
          orderManager.orderSend(orderSendId,orderSendDO);
     }
 
+    @ApiOperation(value = "保存发货单")
+    @PostMapping("/saveOrderSend/{orderSendId}")
+    @Log(client = LogClient.admin, detail = "销售列表发货")
+    public void saveOrderSend(@PathVariable(value = "orderSendId") Long orderSendId,@RequestBody PreOrderModelDTO orderSendDO) {
+        orderManager.saveOrderSend(orderSendId,orderSendDO);
+    }
+
 
     @ApiOperation(value = "已发货分页列表")
     @GetMapping("saleOrder/list")

+ 14 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/LockedStockDetailMapper.java

@@ -0,0 +1,14 @@
+package com.hys.app.mapper.erp;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.LockedStockDetailDO;
+
+/**
+ * 商品库存的Mapper
+ *
+ * @author 张崧
+ * @since 2023-12-07 10:08:44
+ */
+public interface LockedStockDetailMapper extends BaseMapperX<LockedStockDetailDO> {
+}
+

+ 1 - 0
module-erp/src/main/java/com/hys/app/mapper/goods/GoodsSnMapper.java

@@ -23,6 +23,7 @@ public interface GoodsSnMapper extends BaseMapperX<GoodsSnDO> {
     default WebPage<GoodsSnDO> selectPage(GoodsSnQueryParams params) {
         return lambdaQuery()
                 .likeIfPresent(GoodsSnDO::getSnCode, params.getSnCode())
+                .likeIfPresent(GoodsSnDO::getSku, params.getSku())
                 .eqIfPresent(GoodsSnDO::getStatus, params.getStatus())
                 .orderByDesc(GoodsSnDO::getId)
                 .page(params);

+ 58 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/LockedStockDetailDO.java

@@ -0,0 +1,58 @@
+package com.hys.app.model.erp.dos;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.model.erp.enums.DetailOrderTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 商品库存实体类
+ *
+ * @author 张崧
+ * @since 2023-12-07 10:08:44
+ */
+@TableName("erp_locked_stock_detail")
+@Data
+public class LockedStockDetailDO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(name = "id", value = "id")
+    private Long id;
+
+    @ApiModelProperty(name = "product_stock_id", value = "库存id")
+    private Long productStockId;
+
+    @ApiModelProperty(name = "order_id", value = "单据id")
+    private Long orderId;
+
+    @ApiModelProperty(name = "order_id", value = "商品详情id")
+    private Long orderItemId;
+
+    @ApiModelProperty(name = "order_type", value = "单据类型")
+    private DetailOrderTypeEnum orderType;
+
+    @ApiModelProperty(name = "locked_num", value = "锁定数量")
+    private Integer lockedNum;
+
+    @ApiModelProperty(name = "locked_time", value = "锁定时间")
+    private Date lockedTime;
+
+    @ApiModelProperty(name = "status", value = "状态未解锁")
+    private Boolean status = false;
+
+    @ApiModelProperty(name = "locked_num", value = "最后解锁时间")
+    private Integer unLockedNum;
+
+    @ApiModelProperty(name = "locked_time", value = "解锁数量")
+    private Date unLockedTime;
+}

+ 2 - 5
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderDO.java

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.hys.app.framework.database.mybatisplus.base.BaseDO;
-import com.hys.app.model.erp.enums.OrderDeliveryType;
-import com.hys.app.model.erp.enums.OrderStatusEnum;
-import com.hys.app.model.erp.enums.OrderTypeEnum;
-import com.hys.app.model.erp.enums.SaleOrderStatusEnum;
+import com.hys.app.model.erp.enums.*;
 import com.hys.app.service.kuaidiniao.entity.KdGood;
 import com.hys.app.service.kuaidiniao.entity.ReceiverSender;
 import io.swagger.annotations.ApiModelProperty;
@@ -121,7 +118,7 @@ public class OrderDO extends BaseDO {
     // ================== 配送相关 ==================
 
     @ApiModelProperty(name = "send_type", value = "配送方式")
-    private String sendType;
+    private OrderSendTypeEnum sendType;
 
     @ApiModelProperty(name = "store_id", value = "自提门店id")
     private Long storeId;

+ 2 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendDO.java

@@ -249,4 +249,6 @@ public class OrderSendDO extends BaseDO {
     @TableField(exist = false)
     private WarehouseDO warehouseVO;
 
+   private Integer selfPickupNum;
+
 }

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

@@ -74,17 +74,17 @@ public class ProductStockDO implements Serializable  {
     private Integer actualStock =0;
 
     @ApiModelProperty(name = "usable_stock", value = "可用库存")
-    private Integer usableStock;
+    private Integer usableStock =0;
 
     @ApiModelProperty(name = "transit_Stock", value = "在途库存")
-    private Integer transitStock;
+    private Integer transitStock =0;
 
     @ApiModelProperty(name = "warning_stock", value = "预警库存")
-    private Integer warningStock;
+    private Integer warningStock =0;
 
 
     @ApiModelProperty(name = "locked_stock", value = "预警库存")
-    private Integer lockedStock;
+    private Integer lockedStock =0;
 
     public ProductStockDO(Long warehouseId, Long goodsId, Long productId, Integer num) {
         this.setWarehouseId(warehouseId);

+ 3 - 2
module-erp/src/main/java/com/hys/app/model/erp/dto/OrderDTO.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.hys.app.model.erp.dos.*;
 import com.hys.app.model.erp.enums.OrderPaymentStatusEnum;
+import com.hys.app.model.erp.enums.OrderSendTypeEnum;
 import com.hys.app.model.erp.enums.OrderTypeEnum;
 import com.hys.app.model.goods.dos.BrandDO;
 import com.hys.app.model.goods.dos.CategoryDO;
@@ -77,7 +78,7 @@ public class OrderDTO {
 //    private OrderDeliveryType deliveryType;
 
     @ApiModelProperty(name = "send_type", value = "配送方式")
-    private String sendType;
+    private OrderSendTypeEnum sendType;
 
     @ApiModelProperty(name = "item_list", value = "订单项列表")
     @NotEmpty(message = "订单项不能为空")
@@ -105,7 +106,7 @@ public class OrderDTO {
     private String address;
 
     @ApiModelProperty(name = "province_city_area", value = "地址不能为空")
-    @NotBlank(message = "地址不能为空")
+//    @NotBlank(message = "地址不能为空")
     private String provinceCityArea;
 
     @ApiModelProperty(name = "end_time", value = "开始时间")

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

@@ -43,6 +43,9 @@ public class WarehouseOutProductDTO {
     @ApiModelProperty(name = "usable_stock", value = "可用库存")
     private Integer usableStock;
 
+    @ApiModelProperty(name = "usable_stock", value = "可用库存")
+    private Integer actualStock;
+
     @ApiModelProperty(name = "good_id", value = "商品id")
     private Long goodsId;
 

+ 36 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/DetailOrderTypeEnum.java

@@ -0,0 +1,36 @@
+package com.hys.app.model.erp.enums;
+
+import lombok.Getter;
+
+/**
+ * 订单状态枚举
+ *
+ * @author 张崧
+ * @since 2024-01-25
+ */
+@Getter
+public enum DetailOrderTypeEnum {
+
+    ORDER("ORDER", "订单"),
+    INVENTORY("INVENTORY", "调拨"),
+    DAMAGE("DAMAGE", "报损");
+
+    DetailOrderTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    private final String value;
+
+    private final String label;
+
+
+}

+ 36 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/OrderSendTypeEnum.java

@@ -0,0 +1,36 @@
+package com.hys.app.model.erp.enums;
+
+import lombok.Getter;
+
+/**
+ * 订单状态枚举
+ *
+ * @author 张崧
+ * @since 2024-01-25
+ */
+@Getter
+public enum OrderSendTypeEnum {
+
+    EXPRESS_DELIVERY("EXPRESS_DELIVERY", "快递"),
+    INTRA_CITY_SERVICE("INTRA_CITY_SERVICE", "同城配送"),
+    SELF_PICKUP("SELF_PICKUP", "自提");
+
+    OrderSendTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    private final String value;
+
+    private final String label;
+
+
+}

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

@@ -67,9 +67,6 @@ public class OrderVO extends OrderDO {
     @ApiModelProperty(name = "remark", value = "备注")
     private String remark;
 
-    @ApiModelProperty(name = "send_type", value = "配送方式")
-    private String sendType;
-
     @ApiModelProperty(name = "item_list", value = "订单项列表")
     @Valid
     private List<OrderItemDTO> itemList;

+ 8 - 0
module-erp/src/main/java/com/hys/app/service/erp/GoodsSnManager.java

@@ -51,5 +51,13 @@ public interface GoodsSnManager extends BaseService<GoodsSnDO> {
      * @param goodsDTO
      */
     void createSnCode(GoodsSnDTO goodsDTO);
+
+    /**
+     * 单挑修改序列号
+     *
+     * @param id
+     * @param snCode
+     */
+    void updateSnCode(Long id, String snCode);
 }
 

+ 25 - 0
module-erp/src/main/java/com/hys/app/service/erp/LockedStockDetailManager.java

@@ -0,0 +1,25 @@
+package com.hys.app.service.erp;
+
+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.WarehouseEntryDO;
+import com.hys.app.model.erp.dto.WarehouseEntryDTO;
+import com.hys.app.model.erp.dto.WarehouseEntryQueryParams;
+import com.hys.app.model.erp.dto.WarehouseEntryStatisticsParam;
+import com.hys.app.model.erp.enums.WarehouseEntryStatusEnum;
+import com.hys.app.model.erp.vo.WarehouseEntryVO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 入库单业务层接口
+ *
+ * @author 张崧
+ * @since 2023-12-05 11:25:07
+ */
+public interface LockedStockDetailManager extends BaseService<LockedStockDetailDO> {
+
+}
+

+ 10 - 1
module-erp/src/main/java/com/hys/app/service/erp/OrderManager.java

@@ -15,6 +15,7 @@ import com.hys.app.model.erp.vo.OrderVO;
 import com.hys.app.model.erp.vo.ProductVO;
 import com.hys.app.service.kuaidiniao.entity.AddressDTO;
 import com.hys.app.service.kuaidiniao.entity.PreOrderModel;
+import com.hys.app.service.kuaidiniao.entity.PreOrderModelDTO;
 import com.hys.app.service.kuaidiniao.entity.resReturnBackBase;
 
 import java.util.List;
@@ -92,7 +93,7 @@ public interface OrderManager extends BaseService<OrderDO> {
      *
      * @param orderId
      */
-    void orderSend(Long orderId,OrderSendDO orderSendDO);
+    void orderSend(Long orderId, PreOrderModelDTO orderSendDO);
 
     /**
      * 获取发货单详情
@@ -113,5 +114,13 @@ public interface OrderManager extends BaseService<OrderDO> {
      * @return
      */
     resReturnBackBase toBeSendOrder(BaseQueryParam queryParam);
+
+    /**
+     * 保存发货单
+     *
+     * @param orderSendId
+     * @param orderSendDO
+     */
+    void saveOrderSend(Long orderSendId, PreOrderModelDTO orderSendDO);
 }
 

+ 20 - 1
module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsSnManagerImpl.java

@@ -75,6 +75,7 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
 
         return webPage1;
     }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void add(GoodsSnDTO goodsSnDTO) {
@@ -101,6 +102,7 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
         }
         super.saveBatch(list);
     }
+
     /**
      * 生成规则:序号号=商品编号+当前生成时间+4位自然序号
      * 注意:单次生成数量不得超过9999
@@ -115,6 +117,7 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
         Random random = new Random();
         return goodsVO.getSn() + sf.format(date) + (random.nextInt(9000) + 1000);
     }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void edit(GoodsSnDTO goodsSnDTO) {
@@ -125,12 +128,14 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
         GoodsSnDO goodsSnDO = converter.convert(goodsSnDTO);
         super.updateById(goodsSnDO);
     }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void delete(Long id) {
         // 删除商品
         removeById(id);
     }
+
     @Override
     public Page<ProductVO> getSnProduct(GoodsSnQueryParams queryParams) {
         Page<ProductDO> page = productManager.page(new Page<>(queryParams.getPageNo(), queryParams.getPageSize()), new LambdaQueryWrapper<ProductDO>()
@@ -139,10 +144,11 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
 
         Page<ProductVO> convert = productConverter.convert(page);
         for (ProductVO record : convert.getRecords()) {
-            record.setGoodsVo(BeanUtil.copyProperties(goodsManager.getById(record.getGoodsId()),GoodsVO.class));
+            record.setGoodsVo(BeanUtil.copyProperties(goodsManager.getById(record.getGoodsId()), GoodsVO.class));
         }
         return convert;
     }
+
     @Override
     public void createSnCode(GoodsSnDTO goodsDTO) {
         ProductDO byId = productManager.getById(goodsDTO.getProductId());
@@ -160,6 +166,18 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
         }
         saveBatch(list);
     }
+
+    @Override
+    public void updateSnCode(Long id, String snCode) {
+        GoodsSnDO snDO = getById(id);
+        long count = count(new LambdaQueryWrapper<GoodsSnDO>().eq(GoodsSnDO::getSnCode, snCode).ne(GoodsSnDO::getId, id));
+        if (count > 0) {
+            throw new ServiceException("序列号重复:" + snCode);
+        }
+        snDO.setSnCode(snCode);
+        updateById(snDO);
+    }
+
     @Override
     public GoodsSnVO getDetail(Long id) {
         GoodsSnDO goodsSnDO = getById(id);
@@ -168,6 +186,7 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
         goodsSnVO.setProductVO(productManager.getById(goodsSnDO.getProductId()));
         return goodsSnVO;
     }
+
     @Override
     public WebPage<GoodsSnVO> list(GoodsSnQueryParams queryParams) {
         WebPage<GoodsSnDO> webPage = baseMapper.selectPage(queryParams);

+ 68 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/LockedStockDetailManagerImpl.java

@@ -0,0 +1,68 @@
+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.ObjectUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.converter.erp.ProcurementContractProductConverter;
+import com.hys.app.converter.erp.WarehouseEntryConverter;
+import com.hys.app.converter.erp.WarehouseEntryProductConverter;
+import com.hys.app.framework.context.user.AdminUserContext;
+import com.hys.app.framework.database.WebPage;
+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.CurrencyUtil;
+import com.hys.app.framework.util.JsonUtil;
+import com.hys.app.framework.util.PageConvert;
+import com.hys.app.mapper.erp.LockedStockDetailMapper;
+import com.hys.app.mapper.erp.StockTransferMapper;
+import com.hys.app.mapper.erp.WarehouseEntryMapper;
+import com.hys.app.mapper.erp.WarehouseOutMapper;
+import com.hys.app.mapper.goods.GoodsMapper;
+import com.hys.app.model.base.SettingGroup;
+import com.hys.app.model.base.rabbitmq.AmqpExchange;
+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.goods.dos.CategoryDO;
+import com.hys.app.model.system.vo.SiteSetting;
+import com.hys.app.service.base.service.SettingManager;
+import com.hys.app.service.erp.*;
+import com.hys.app.service.goods.CategoryManager;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.hys.app.framework.util.CollectionUtils.convertMap;
+
+/**
+ * 入库单业务层实现
+ *
+ * @author 张崧
+ * @since 2023-12-05 11:25:07
+ */
+@Service
+@AllArgsConstructor
+public class LockedStockDetailManagerImpl extends BaseServiceImpl<LockedStockDetailMapper, LockedStockDetailDO> implements LockedStockDetailManager {
+
+}
+

+ 73 - 19
module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java

@@ -27,15 +27,14 @@ import com.hys.app.model.goods.dos.GoodsGalleryDO;
 import com.hys.app.service.erp.*;
 import com.hys.app.service.goods.GoodsGalleryManager;
 import com.hys.app.service.kuaidiniao.GaoDeUtil;
+import com.hys.app.service.kuaidiniao.entity.PreOrderModelDTO;
 import com.hys.app.service.kuaidiniao.entity.resReturnBackBase;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -58,10 +57,10 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     private ProductManager productManager;
     private OrderSendManager orderSendManager;
     private OrderSendItemManager orderSendItemManager;
-    private GoodsGalleryManager goodsGalleryManager;
     private WarehouseManager warehouseManager;
     private ItemSnCodeManager itemSnCodeManager;
     private GoodsSnManager goodsSnManager;
+    private LockedStockDetailManager lockedStockDetailManager;
 
     @Override
     public WebPage<OrderVO> list(OrderQueryParams queryParams) {
@@ -192,6 +191,8 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         List<Long> collect = dos2.stream().map(OrderItemDO::getProductStockId).collect(Collectors.toList());
         List<ProductStockDO> list = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect));
         List<StockDTO> arrayList = new ArrayList<>();
+        //保存凍結库存明细
+        List<LockedStockDetailDO> detailDOS = new ArrayList<>();
         for (OrderItemDO orderItemDO : dos2) {
             StockDTO stockDTO = new StockDTO();
             ProductStockDO byId = list.stream().filter(item -> item.getId().equals(orderItemDO.getProductStockId())).findFirst().get();
@@ -203,7 +204,16 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
             stockDTO.setId(byId.getId());
             stockDTO.setNum(orderItemDO.getNum());
             arrayList.add(stockDTO);
+            LockedStockDetailDO detailDO = new LockedStockDetailDO();
+            detailDO.setProductStockId(orderItemDO.getProductStockId());
+            detailDO.setOrderId(id);
+            detailDO.setOrderItemId(orderItemDO.getId());
+            detailDO.setOrderType(DetailOrderTypeEnum.ORDER);
+            detailDO.setLockedNum(orderItemDO.getNum());
+            detailDO.setLockedTime(new Date());
+            detailDOS.add(detailDO);
         }
+        lockedStockDetailManager.saveBatch(detailDOS);
         productStockManager.updateLockedStock(arrayList);
         aDo.setStatus(SaleOrderStatusEnum.TO_BE_SEND);
         updateById(aDo);
@@ -211,6 +221,10 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
 
     private void savaSendOrder(OrderDO aDo, Long warehouseId, List<OrderItemDO> dos, Boolean subtractStock) {
         OrderSendDO orderSendDO = new OrderSendDO();
+        if (OrderSendTypeEnum.SELF_PICKUP.equals(aDo.getSendType())) {
+            Random random = new Random();
+            orderSendDO.setSelfPickupNum(100000 + random.nextInt(900000));
+        }
         orderSendDO.setOrderId(aDo.getId());
         orderSendDO.setSubtractStock(subtractStock);
         orderSendDO.setWarehouseId(warehouseId);
@@ -237,10 +251,10 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
                 .eq(StrUtil.isNotEmpty(queryParams.getSn()), OrderSendDO::getSn, queryParams.getSn());
         switch (queryParams.getSelectType()) {
             case "to_be_send":
-                wrapper.in(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND.getValue());
+                wrapper.in(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND);
                 break;
             case "sending":
-                wrapper.ne(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND.getValue());
+                wrapper.ne(OrderSendDO::getStatus, SaleOrderSendStatusEnum.TO_BE_SEND);
                 break;
         }
         Page<OrderSendDO> paged = orderSendManager.page(page, wrapper);
@@ -251,13 +265,14 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void orderSend(Long sendOrderId, OrderSendDO orderSendDO) {
+    public void orderSend(Long sendOrderId, PreOrderModelDTO orderSendDO) {
         OrderSendDO aDo = orderSendManager.getById(sendOrderId);
         OrderDO orderDO = getById(aDo.getOrderId());
+        converter.copyProperties(aDo, orderSendDO, orderSendDO.getReceiver(), orderSendDO.getSender());
         //根据订单查找到这个订单的所有货物扣减库存
         List<OrderSendItemVO> list = orderSendDO.getOrderItemVOS();
         List<OrderSendItemDO> selectList = orderSendItemManager.list(new LambdaQueryWrapper<OrderSendItemDO>().eq(OrderSendItemDO::getSendOrderId, sendOrderId));
-        if (list.size() != selectList.size()){
+        if (list.size() != selectList.size()) {
             throw new ServiceException("发货商品不能修改");
         }
         for (OrderSendItemDO itemDO : selectList) {
@@ -273,13 +288,22 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         //查找这些商品在指定仓库的库存,减去对应数量
         List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
                 .eq(ProductStockDO::getWarehouseId, aDo.getWarehouseId()).in(ProductStockDO::getProductId, productId));
+        List<StockDTO> arrayList = new ArrayList<>();
         for (ProductStockDO stockDO : stockDOList) {
             Integer num = list.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get().getNum();
-            stockDO.setActualStock(stockDO.getActualStock() - num);
-            if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
-                //如果是出租商品增加在途库存
-                stockDO.setTransitStock(stockDO.getTransitStock() + num);
-            }
+            StockDTO dto = new StockDTO();
+            dto.setId(stockDO.getId());
+            dto.setNum(-num);
+            arrayList.add(dto);
+        }
+        //更爱可用库存实际库存冻结库存
+        productStockManager.updateActualStock(arrayList, null);
+        productStockManager.updateLockedStock(arrayList);
+        //更改在途库存
+        if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
+            //如果是出租商品增加在途库存
+            arrayList.forEach(item -> item.setNum(-item.getNum()));
+            productStockManager.updateTransitStock(arrayList);
         }
         productStockManager.updateBatchById(stockDOList);
         //生成出库单
@@ -354,7 +378,10 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
             }
         });
         warehouseOutItemManager.saveBatch(beanList);
-
+        //先删除序列号和子表的关系(发货单可能保存过)
+        itemSnCodeManager.remove(new LambdaQueryWrapper<ItemSnCodeDO>()
+                .eq(ItemSnCodeDO::getType, "send")
+                .eq(ItemSnCodeDO::getEntryOutHouseId, sendOrderId));
         //保存序列号和子表的关系
         itemSnCodeManager.saveBatch(itemSnCodeDOS);
         //更改发货单状态
@@ -400,7 +427,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
 
         if (SaleOrderStatusEnum.SALE_AFTER_ING.equals(orderDO.getStatus()) ||
                 SaleOrderStatusEnum.SALE_AFTER_END.equals(orderDO.getStatus()) ||
-                SaleOrderStatusEnum.SALE_AFTER_CANCEL.equals(orderDO.getStatus()) ){
+                SaleOrderStatusEnum.SALE_AFTER_CANCEL.equals(orderDO.getStatus())) {
             orderVO.setScanOrderType("saleAfter");
             scanOrder(orderVO);
         }
@@ -411,10 +438,11 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         }
         return orderVO;
     }
-    private void scanOrder(OrderVO orderVO){
+
+    private void scanOrder(OrderVO orderVO) {
         List<OrderItemDO> list = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>()
                 .eq(OrderItemDO::getOrderId, orderVO.getId())
-                .eq(orderVO.getScanOrderType().equals("saleAfter"),OrderItemDO::getHasSaleAfter,true));
+                .eq(orderVO.getScanOrderType().equals("saleAfter"), OrderItemDO::getHasSaleAfter, true));
         List<Long> goodIdlist = list.stream().map(OrderItemDO::getProductId).collect(Collectors.toList());
         // 查询订单项
         List<OrderItemDTO> itemList = BeanUtils.toBean(list, OrderItemDTO.class);
@@ -431,7 +459,6 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     }
 
 
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void extension(Long orderId, OrderDTO orderDTO) {
@@ -492,5 +519,32 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
 
         return null;
     }
+
+    @Override
+    public void saveOrderSend(Long orderSendId, PreOrderModelDTO orderSendDO) {
+        OrderSendDO aDo = orderSendManager.getById(orderSendId);
+        converter.copyProperties(aDo, orderSendDO, orderSendDO.getReceiver(), orderSendDO.getSender());
+        orderSendManager.updateById(aDo);
+        List<ItemSnCodeDO> itemSnCodeDOS = new ArrayList<>();
+        if (CollUtil.isNotEmpty(orderSendDO.getOrderItemVOS())) {
+            for (OrderSendItemVO orderItemVO : orderSendDO.getOrderItemVOS()) {
+                //判断发货数量是不是和明细数量一致,不一样不让保存
+                ProductDO byId = productManager.getById(orderItemVO.getProductId());
+                if (CollUtil.isNotEmpty(orderItemVO.getSnCodeList())) {
+                    for (GoodsSnDO snDO : orderItemVO.getSnCodeList()) {
+                        //出库明细和序列号的关系
+                        ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
+                        itemSnCodeDO.setItemId(orderItemVO.getId());
+                        itemSnCodeDO.setEntryOutHouseId(orderSendId);
+                        itemSnCodeDO.setType("send");
+                        itemSnCodeDO.setSnCodeId(snDO.getId());
+                        itemSnCodeDOS.add(itemSnCodeDO);
+                    }
+                }
+            }
+        }
+        //保存序列号和子表的关系
+        itemSnCodeManager.saveBatch(itemSnCodeDOS);
+    }
 }
 

+ 32 - 14
module-erp/src/main/java/com/hys/app/service/erp/impl/StockDamageReportManagerImpl.java

@@ -38,10 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -64,6 +61,7 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
     private ProductManager productManager;
     private WarehouseOutMapper warehouseOutMapper;
     private WarehouseOutItemManager warehouseOutItemManager;
+    private LockedStockDetailManager lockedStockDetailManager;
 
     /**
      * 查询库存报损单分页列表数据
@@ -92,20 +90,40 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
         List<ProductStockDO> list = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
                 .eq(ProductStockDO::getWarehouseId, stockDamageReportDTO.getWarehouseId())
                 .in(ProductStockDO::getProductId, collect));
-        for (StockDamageReportProductDTO dto : stockDamageReportDTO.getProductList()) {
-            ProductStockDO aDo = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
-            if (aDo.getUsableStock() < dto.getReportNum()) {
-                throw new ServiceException("报损数量不能能大于可用库存数量");
-            }
-        }
         StockDamageReport report = BeanUtil.copyProperties(stockDamageReportDTO, StockDamageReport.class);
         //生成库存报损单编号
         String sn = noGenerateManager.generate(NoBusinessTypeEnum.StockDamageReport);
         report.setSn(sn);
-        this.save(report);
-        //保存库存报损单商品信息
-        this.stockDamageReportProductManager.saveProduct(report.getId(), stockDamageReportDTO.getProductList());
-        //生成出库单信息
+        save(report);
+
+        List<StockDamageReportProduct> bean = BeanUtils.toBean(stockDamageReportDTO.getProductList(), StockDamageReportProduct.class);
+        bean.forEach(item ->item.setReportId(report.getId()));
+        stockDamageReportProductManager.saveBatch(bean);
+
+
+        List<StockDTO> arrayList = new ArrayList<>();
+        //保存凍結库存明细
+        List<LockedStockDetailDO> detailDOS = new ArrayList<>();
+        for (StockDamageReportProduct dto : bean) {
+            ProductStockDO aDo = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
+            if (aDo.getActualStock() < dto.getReportNum()) {
+                throw new ServiceException("报损数量不能能大于可用库存数量");
+            }
+            StockDTO stockDTO = new StockDTO();
+            stockDTO.setId(report.getId());
+            stockDTO.setNum(dto.getReportNum());
+            arrayList.add(stockDTO);
+            LockedStockDetailDO detailDO = new LockedStockDetailDO();
+            detailDO.setProductStockId(dto.getProductStockId());
+            detailDO.setOrderId(report.getId());
+            detailDO.setOrderItemId(dto.getId());
+            detailDO.setOrderType(DetailOrderTypeEnum.DAMAGE);
+            detailDO.setLockedNum(dto.getReportNum());
+            detailDO.setLockedTime(new Date());
+            detailDOS.add(detailDO);
+        }
+        lockedStockDetailManager.saveBatch(detailDOS);
+        productStockManager.updateLockedStock(arrayList);
         //生成出库单
         WarehouseOutDO outDO = new WarehouseOutDO();
         outDO.setType(WarehouseOutTypeEnum.DAMAGE_OUT);

+ 36 - 18
module-erp/src/main/java/com/hys/app/service/erp/impl/StockTransferManagerImpl.java

@@ -36,10 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -67,6 +64,7 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
     private WarehouseOutItemManager warehouseOutItemManager;
     private WarehouseEntryManager warehouseEntryManager;
     private WarehouseEntryProductManager warehouseEntryProductManager;
+    private LockedStockDetailManager lockedStockDetailManager;
 
     @Override
     public WebPage<StockTransferVO> list(StockTransferQueryParams queryParams) {
@@ -78,26 +76,46 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
     @Transactional(rollbackFor = Exception.class)
     public void add(StockTransferDTO stockTransferDTO) {
         stockTransferDTO.isSameWarehouse();
+        // 保存调拨单
+        StockTransferDO aDo = BeanUtil.copyProperties(stockTransferDTO, StockTransferDO.class);
+        aDo.setSn(noGenerateManager.generate(NoBusinessTypeEnum.StockTransfer, 78L));
+        save(aDo);
+        // 保存调拨单明细
+        List<StockTransferProductDO> doList = BeanUtils.toBean(stockTransferDTO.getProductList(), StockTransferProductDO.class);
+        doList.forEach(item -> item.setStockTransferId(aDo.getId()));
+        stockTransferProductManager.saveBatch(doList);
+
 
         List<Long> collect = stockTransferDTO.getProductList().stream().map(StockTransferProductDTO::getProductId).collect(Collectors.toList());
         //需要调出的仓库商品库存
         List<ProductStockDO> listOut = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
                 .eq(ProductStockDO::getWarehouseId, stockTransferDTO.getOutWarehouseId())
                 .in(ProductStockDO::getProductId, collect));
+        List<StockDTO> arrayList = new ArrayList<>();
+        //保存凍結库存明细
+        List<LockedStockDetailDO> detailDOS = new ArrayList<>();
         for (ProductStockDO aDoOut : listOut) {
-            Integer num = stockTransferDTO.getProductList().stream().filter(item -> item.getProductId().equals(aDoOut.getProductId())).findFirst().get().getNum();
-            if (aDoOut.getUsableStock() < num) {
-                throw new ServiceException(num + "的库存数量少于调拨出的库存数量");
+            StockTransferProductDO productDTO = doList.stream().filter(item -> item.getProductId().equals(aDoOut.getProductId())).findFirst().get();
+            if (aDoOut.getActualStock() < productDTO.getNum()) {
+                throw new ServiceException(productDTO.getNum() + "的库存数量少于调拨出的库存数量");
             }
+            StockDTO dto = new StockDTO();
+            dto.setId(aDoOut.getId());
+            dto.setNum(productDTO.getNum());
+            arrayList.add(dto);
+            LockedStockDetailDO detailDO = new LockedStockDetailDO();
+            detailDO.setProductStockId(aDoOut.getId());
+            detailDO.setOrderId(aDo.getId());
+            detailDO.setOrderItemId(aDoOut.getId());
+            detailDO.setOrderType(DetailOrderTypeEnum.INVENTORY);
+            detailDO.setLockedNum(productDTO.getNum());
+            detailDO.setLockedTime(new Date());
+            detailDOS.add(detailDO);
         }
-        // 保存调拨单
-        StockTransferDO aDo = BeanUtil.copyProperties(stockTransferDTO, StockTransferDO.class);
-        aDo.setSn(noGenerateManager.generate(NoBusinessTypeEnum.StockTransfer, 78L));
-        save(aDo);
-        // 保存调拨单明细
-        List<StockTransferProductDO> doList = BeanUtils.toBean(stockTransferDTO.getProductList(), StockTransferProductDO.class);
-        doList.forEach(item -> item.setStockTransferId(aDo.getId()));
-        stockTransferProductManager.saveBatch(doList);
+        lockedStockDetailManager.saveBatch(detailDOS);
+        productStockManager.updateLockedStock(arrayList);
+
+
         //生成出库单
         WarehouseOutDO outDO = new WarehouseOutDO();
         outDO.setType(WarehouseOutTypeEnum.TRANSFER_OUT);
@@ -108,14 +126,14 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
         warehouseOutMapper.insert(outDO);
         //保存出库单明细
         List<WarehouseOutItemDO> beanList = BeanUtils.toBean(doList, WarehouseOutItemDO.class);
-        beanList.forEach(item ->{
+        beanList.forEach(item -> {
             item.setWarehouseOutId(outDO.getId());
             Integer num = doList.stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getNum();
             item.setOutNum(num);
         });
         warehouseOutItemManager.saveBatch(beanList);
         //生成入库单
-        WarehouseEntryDO warehouseEntryDO =new WarehouseEntryDO();
+        WarehouseEntryDO warehouseEntryDO = new WarehouseEntryDO();
         warehouseEntryDO.setWarehouseId(stockTransferDTO.getInWarehouseId());
         warehouseEntryDO.setOrderId(aDo.getId());
         warehouseEntryDO.setType(WarehouseEntyrTypeEnum.TRANSFER_ENTRY);
@@ -124,7 +142,7 @@ public class StockTransferManagerImpl extends BaseServiceImpl<StockTransferMappe
         warehouseEntryManager.save(warehouseEntryDO);
         // 保存入库单商品明细
         List<WarehouseEntryProductDO> productList = BeanUtils.toBean(stockTransferDTO.getProductList(), WarehouseEntryProductDO.class);
-        productList.forEach(item ->{
+        productList.forEach(item -> {
             item.setWarehouseEntryId(warehouseEntryDO.getId());
             Integer num = doList.stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getNum();
             item.setNum(num);

+ 13 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseOutManagerImpl.java

@@ -85,6 +85,7 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
     private GoodsSnManager goodsSnManager;
     private StockDamageReportManager stockDamageReportManager;
     private GoodsGalleryManager goodsGalleryManager;
+    private LockedStockDetailManager lockedStockDetailManager;
 
     @Override
     public WebPage<WarehouseOutVO> list(WarehouseOutQueryParams queryParams) {
@@ -164,7 +165,18 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         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) {
+            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()));
+            }
+
+
+
             WarehouseOutProductDTO productDO = warehouseOutDTO.getProductList().stream().filter(item -> item.getProductId().equals(aDo.getProductId())).findFirst().get();
             StockDTO dto = new StockDTO();
             dto.setId(aDo.getId());
@@ -240,6 +252,7 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
             }
 
             dto.setUsableStock(stockDOList.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get().getUsableStock());
+            dto.setActualStock(stockDOList.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get().getActualStock());
             dto.setGoodsVO(BeanUtil.copyProperties(goodsDO, GoodsVO.class));
         }
         outVO.setProductList(productList);

+ 21 - 7
module-erp/src/main/java/com/hys/app/service/kuaidiniao/KuaiDiNiaoServiceImpl.java

@@ -1,6 +1,7 @@
 package com.hys.app.service.kuaidiniao;
 
 import cn.hutool.core.codec.Base64;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
@@ -12,13 +13,17 @@ import com.hys.app.converter.erp.OrderConverter;
 import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.util.ScriptUtil;
-import com.hys.app.model.erp.dos.OrderDO;
-import com.hys.app.model.erp.dos.OrderSendDO;
+import com.hys.app.mapper.goods.ProductMapper;
+import com.hys.app.model.erp.dos.*;
 import com.hys.app.model.erp.enums.OrderTypeEnum;
 import com.hys.app.model.erp.enums.SaleOrderSendStatusEnum;
 import com.hys.app.model.erp.enums.SaleOrderStatusEnum;
+import com.hys.app.model.erp.enums.SnCodeStatusEnum;
+import com.hys.app.model.erp.vo.OrderSendItemVO;
+import com.hys.app.service.erp.ItemSnCodeManager;
 import com.hys.app.service.erp.OrderManager;
 import com.hys.app.service.erp.OrderSendManager;
+import com.hys.app.service.erp.ProductManager;
 import com.hys.app.service.kuaidiniao.entity.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,6 +32,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 @Service
@@ -58,6 +65,13 @@ public class KuaiDiNiaoServiceImpl implements KuaiDiNiaoService {
     @Autowired
     private OrderConverter converter;
 
+    @Autowired
+    private ItemSnCodeManager itemSnCodeManager;
+
+    @Autowired
+    private ProductMapper productMapper;
+
+
     private static final Logger log = LoggerFactory.getLogger(ScriptUtil.class);
 
 
@@ -89,7 +103,7 @@ public class KuaiDiNiaoServiceImpl implements KuaiDiNiaoService {
             //发请求
             String res = HttpUtil.post(url, param);
             Map map = JSON.parseObject(res, Map.class);
-            if (ObjectUtil.isNotNull(map.get("resultCode")) && !(100 == Integer.valueOf(map.get("resultCode").toString()))){
+            if (ObjectUtil.isNotNull(map.get("resultCode")) && !(100 == Integer.valueOf(map.get("resultCode").toString()))) {
                 throw new ServiceException("店铺创建失败" + map.get("reason").toString());
             }
         } catch (Exception e) {
@@ -200,20 +214,20 @@ public class KuaiDiNiaoServiceImpl implements KuaiDiNiaoService {
             case KdConstants.callBackSign:
                 aDo.setSignIn(map);
                 aDo.setStatus(SaleOrderSendStatusEnum.TO_BE_SINGE);
-                if (OrderTypeEnum.TO_B.equals(orderDO.getType())){
+                if (OrderTypeEnum.TO_B.equals(orderDO.getType())) {
                     orderDO.setStatus(SaleOrderStatusEnum.ORDER_END);
                 }
-                if (OrderTypeEnum.TO_C.equals(orderDO.getType())){
+                if (OrderTypeEnum.TO_C.equals(orderDO.getType())) {
                     orderDO.setStatus(SaleOrderStatusEnum.TO_BE_RETURN);
                 }
                 break;
             case KdConstants.callBackSignRefuse:
                 aDo.setSignIn(map);
                 aDo.setStatus(SaleOrderSendStatusEnum.TO_BE_SINGE);
-                if (OrderTypeEnum.TO_B.equals(orderDO.getType())){
+                if (OrderTypeEnum.TO_B.equals(orderDO.getType())) {
                     orderDO.setStatus(SaleOrderStatusEnum.ORDER_END);
                 }
-                if (OrderTypeEnum.TO_C.equals(orderDO.getType())){
+                if (OrderTypeEnum.TO_C.equals(orderDO.getType())) {
                     orderDO.setStatus(SaleOrderStatusEnum.TO_BE_RETURN);
                 }
                 break;

+ 6 - 0
module-erp/src/main/java/com/hys/app/service/kuaidiniao/entity/AddressDTO.java

@@ -1,8 +1,12 @@
 package com.hys.app.service.kuaidiniao.entity;
 
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.hys.app.model.erp.vo.OrderSendItemVO;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 快递鸟  预下单商品接收类
  */
@@ -11,4 +15,6 @@ public class AddressDTO {
 
    private String sendAddress;
    private String receiveAddress;
+
+   private List<OrderSendItemVO> orderItemVOS;
 }

+ 22 - 0
module-erp/src/main/java/com/hys/app/service/kuaidiniao/entity/PreOrderModelDTO.java

@@ -0,0 +1,22 @@
+package com.hys.app.service.kuaidiniao.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.hys.app.model.erp.vo.OrderSendItemVO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import java.util.List;
+
+/**
+ * 预下单参数
+ */
+@Data
+public class PreOrderModelDTO extends PreOrderModel{
+
+    private List<OrderSendItemVO> orderItemVOS;
+
+    @ApiModelProperty(name = "kdn_order_code", value = "快递鸟单号")
+    private String kdnOrderCode;
+}