24282 2 år sedan
förälder
incheckning
c055394f3d
37 ändrade filer med 833 tillägg och 152 borttagningar
  1. 1 1
      hx-common/code-generator/src/main/java/com/fjhx/modular/Victoriatourist.java
  2. 8 0
      hx-service-api/syringe-management-api/src/main/java/com/fjhx/params/production/ProductionLineEx.java
  3. 8 0
      hx-service-api/syringe-management-api/src/main/java/com/fjhx/params/production/ProductionLineVo.java
  4. 1 6
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/product/ProductCombination.java
  5. 0 2
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/ManualVo.java
  6. 58 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/StockCombination.java
  7. 5 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/InTypeEnum.java
  8. 4 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/OutTypeEnum.java
  9. 2 2
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/order/IssueVo.java
  10. 37 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/AddProductCombinationDto.java
  11. 1 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/ChangeProduct.java
  12. 24 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/GetQuantityByWarehouseIdDto.java
  13. 1 1
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/InStockAdd.java
  14. 22 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeDetailsDto.java
  15. 1 25
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeDto.java
  16. 17 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationEx.java
  17. 11 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationPageDto.java
  18. 90 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationPageVo.java
  19. 17 0
      hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationVo.java
  20. 25 2
      hx-service/syringe-management/src/main/java/com/fjhx/service/production/impl/ProductionLineServiceImpl.java
  21. 8 4
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/ManualInStockController.java
  22. 8 3
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/ManualOutStockController.java
  23. 81 0
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/StockCombinationController.java
  24. 0 1
      hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/StockController.java
  25. 22 0
      hx-service/victoriatourist/src/main/java/com/fjhx/mapper/stock/StockCombinationMapper.java
  26. 22 0
      hx-service/victoriatourist/src/main/java/com/fjhx/mapper/stock/StockCombinationMapper.xml
  27. 5 5
      hx-service/victoriatourist/src/main/java/com/fjhx/service/logistics/impl/LogisticsInfoServiceImpl.java
  28. 7 7
      hx-service/victoriatourist/src/main/java/com/fjhx/service/order/impl/OrderDetailsServiceImpl.java
  29. 6 6
      hx-service/victoriatourist/src/main/java/com/fjhx/service/quality/impl/QualityDetailsServiceImpl.java
  30. 26 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockCombinationService.java
  31. 2 2
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockJournalService.java
  32. 1 1
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockService.java
  33. 199 0
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockCombinationServiceImpl.java
  34. 32 16
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockJournalServiceImpl.java
  35. 46 38
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockServiceImpl.java
  36. 14 14
      hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockTransferServiceImpl.java
  37. 21 13
      hx-service/victoriatourist/src/main/java/com/fjhx/uitl/code/CodeEnum.java

+ 1 - 1
hx-common/code-generator/src/main/java/com/fjhx/modular/Victoriatourist.java

@@ -12,7 +12,7 @@ public class Victoriatourist {
         CodeGenerator.MODULAR_NAME = "victoriatourist";
 
         // 需要生成的表名称,多表用,隔开
-        CodeGenerator.INCLUDE = "quality_details";
+        CodeGenerator.INCLUDE = "stock_combination";
 
         // mysql连接
         CodeGenerator.MYSQL_URL = "36.134.91.96:17330";

+ 8 - 0
hx-service-api/syringe-management-api/src/main/java/com/fjhx/params/production/ProductionLineEx.java

@@ -1,9 +1,12 @@
 package com.fjhx.params.production;
 
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.production.ProductionLine;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 生产线
  *
@@ -19,4 +22,9 @@ public class ProductionLineEx extends ProductionLine {
      */
     private String productionWorkshopName;
 
+    /**
+     * 文件信息
+     */
+    private List<FileInfo> fileInfoList;
+
 }

+ 8 - 0
hx-service-api/syringe-management-api/src/main/java/com/fjhx/params/production/ProductionLineVo.java

@@ -1,9 +1,12 @@
 package com.fjhx.params.production;
 
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.production.ProductionLine;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 生产线
  *
@@ -14,4 +17,9 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class ProductionLineVo extends ProductionLine {
 
+    /**
+     * 文件信息
+     */
+    private List<FileInfo> fileInfoList;
+
 }

+ 1 - 6
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/product/ProductCombination.java

@@ -1,12 +1,9 @@
 package com.fjhx.entity.product;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -24,7 +21,6 @@ import java.math.BigDecimal;
 @EqualsAndHashCode(callSuper = true)
 public class ProductCombination extends BaseEntity {
 
-
     /**
      * 产品id
      */
@@ -47,5 +43,4 @@ public class ProductCombination extends BaseEntity {
     @TableLogic
     private Integer delFlag;
 
-
 }

+ 0 - 2
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/ManualVo.java

@@ -1,10 +1,8 @@
 package com.fjhx.entity.stock;
 
 import com.fjhx.params.stock.ChangeProduct;
-import com.fjhx.params.stock.StockChangeVo;
 import lombok.Data;
 
-import java.math.BigDecimal;
 import java.util.List;
 
 @Data

+ 58 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/stock/StockCombination.java

@@ -0,0 +1,58 @@
+package com.fjhx.entity.stock;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fjhx.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 产品组合记录
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockCombination extends BaseEntity {
+
+    /**
+     * 产品组合id
+     */
+    @NotNull(message = "组合产品id不能为空")
+    private Long productId;
+
+    /**
+     * 组合后放置仓库id
+     */
+    @NotNull(message = "组合后放置仓库id不能为空")
+    private Long combinationWarehouseId;
+
+    /**
+     * 半成品所在仓库id
+     */
+    @NotNull(message = "半成品所在仓库id不能为空")
+    private Long sourceWarehouseId;
+
+    /**
+     * 组合数量
+     */
+    @NotNull(message = "组合数量不能为空")
+    @Min(value = 1, message = "组合数量必须大于0")
+    private Integer combinationQuantity;
+
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer delFlag;
+
+
+}

+ 5 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/InTypeEnum.java

@@ -12,12 +12,16 @@ import java.util.Map;
  */
 @Getter
 public enum InTypeEnum {
-    // business_id = logistics_details表id
+    // business_id = logistics_details  id
     PURCHASE(1, "采购入库"),
 
     MANUAL(2, "手动入库"),
 
     TRANSFER(7, "调仓入库"),
+
+    // business_id = stock_combination 表 id
+    COMBINATION(9, "组合入库"),
+
     ;
 
     private final int key;

+ 4 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/enums/stock/OutTypeEnum.java

@@ -31,9 +31,12 @@ public enum OutTypeEnum {
 
     TRANSFER(7, "调仓出库"),
 
-    // business_id = quality_detailsid
+    // business_id = quality_detailsid
     UNQUALIFIED_QUALITY_INSPECTION(8, "质检不合格出库"),
 
+    // business_id = stock_combination 表 id
+    COMBINATION(9, "组合出库"),
+
     ;
 
     private final int key;

+ 2 - 2
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/order/IssueVo.java

@@ -1,7 +1,7 @@
 package com.fjhx.params.order;
 
 import com.fjhx.enums.stock.OutTypeEnum;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -41,7 +41,7 @@ public class IssueVo {
     private List<IssueDetails> orderDetailsList;
 
     @Data
-    public static class IssueDetails implements StockChangeVo.ChangeDetails {
+    public static class IssueDetails implements StockChangeDto.ChangeDetails {
 
         private Long orderDetailsId;
         private Long productId;

+ 37 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/AddProductCombinationDto.java

@@ -0,0 +1,37 @@
+package com.fjhx.params.stock;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class AddProductCombinationDto {
+
+    /**
+     * 组合产品id
+     */
+    @NotNull(message = "组合产品id不能为空")
+    private Long productId;
+
+    /**
+     * 组合放置仓库id
+     */
+    @NotNull(message = "组合后放置仓库id不能为空")
+    private Long combinationWarehouseId;
+
+    /**
+     * 来源所在仓库id
+     */
+    @NotNull(message = "半成品所在仓库id不能为空")
+    private Long sourceWarehouseId;
+
+    /**
+     * 组合数量
+     */
+    @NotNull(message = "组合数量不能为空")
+    private BigDecimal combinationQuantity;
+
+}

+ 1 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/ChangeProduct.java

@@ -5,7 +5,7 @@ import lombok.Data;
 import java.math.BigDecimal;
 
 @Data
-public class ChangeProduct implements StockChangeVo.ChangeDetails {
+public class ChangeProduct implements StockChangeDto.ChangeDetails {
 
     /**
      * 产品id

+ 24 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/GetQuantityByWarehouseIdDto.java

@@ -0,0 +1,24 @@
+package com.fjhx.params.stock;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@Setter
+public class GetQuantityByWarehouseIdDto {
+
+    /**
+     * 产品组合id
+     */
+    @NotNull(message = "组合产品id不能为空")
+    private Long productId;
+
+    /**
+     * 半成品所在仓库id
+     */
+    @NotNull(message = "半成品所在仓库id不能为空")
+    private Long sourceWarehouseId;
+
+}

+ 1 - 1
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/InStockAdd.java

@@ -19,7 +19,7 @@ public class InStockAdd {
     private List<InStockAddDetails> list;
 
     @Data
-    public static class InStockAddDetails implements StockChangeVo.ChangeDetails {
+    public static class InStockAddDetails implements StockChangeDto.ChangeDetails {
 
         /**
          * 业务ID

+ 22 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeDetailsDto.java

@@ -0,0 +1,22 @@
+package com.fjhx.params.stock;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class StockChangeDetailsDto implements StockChangeDto.ChangeDetails {
+
+    /**
+     * 产品id
+     */
+    private Long goodsId;
+
+    /**
+     * 变更数量
+     */
+    private BigDecimal changeQuantity;
+
+}

+ 1 - 25
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeVo.java → hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockChangeDto.java

@@ -1,36 +1,12 @@
 package com.fjhx.params.stock;
 
-import com.fjhx.entity.stock.ManualVo;
-import com.fjhx.enums.stock.InTypeEnum;
-import com.fjhx.enums.stock.OutTypeEnum;
 import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.List;
 
 @Data
-public class StockChangeVo {
-
-    public StockChangeVo() {
-
-    }
-
-    public StockChangeVo(ManualVo manualVo) {
-        defaultWarehouseId = manualVo.getWarehouseId();
-        defaultRemarks = manualVo.getRemarks();
-        typeEnum = OutTypeEnum.getEnumByKey(manualVo.getType());
-        changeDetailsList = manualVo.getChangeProductList();
-    }
-
-    /**
-     * 手动入库 初始
-     */
-    public StockChangeVo(ManualInStockVo entity) {
-        defaultWarehouseId = entity.getWarehouseId();
-        defaultRemarks = entity.getRemarks();
-        typeEnum = InTypeEnum.MANUAL;
-        changeDetailsList = entity.getChangeProductList();
-    }
+public class StockChangeDto {
 
     /**
      * 默认业务ID

+ 17 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.stock.StockCombination;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 产品组合记录
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockCombinationEx extends StockCombination {
+
+}

+ 11 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationPageDto.java

@@ -0,0 +1,11 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.base.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class StockCombinationPageDto extends BaseSelectDto {
+
+}

+ 90 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationPageVo.java

@@ -0,0 +1,90 @@
+package com.fjhx.params.stock;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Getter
+@Setter
+public class StockCombinationPageVo {
+
+    /**
+     * 产品组合编码
+     *
+     * @table product_info
+     * @field code
+     */
+    private String productCode;
+
+    /**
+     * 产品组合名称
+     *
+     * @table product_info
+     * @field name
+     */
+    private String productName;
+
+    /**
+     * 规格
+     *
+     * @table product_info
+     * @field specs
+     */
+    private String productSpecs;
+
+    /**
+     * 单位
+     *
+     * @table product_info
+     * @field unit
+     */
+    private String productUnit;
+
+    /**
+     * 组合后放置仓库
+     *
+     * @table warehouse
+     * @field name
+     */
+    private String sourceWarehouseName;
+
+    /**
+     * 半成品所在仓库
+     *
+     * @table warehouse
+     * @field name
+     */
+    private String combinationWarehouseName;
+
+    /**
+     * 组合数量
+     *
+     * @table stock_combination
+     * @field combination_quantity
+     */
+    private BigDecimal combinationQuantity;
+
+    /**
+     * 操作人id
+     *
+     * @table stock_combination
+     * @field create_user
+     */
+    private Long createUser;
+
+    /**
+     * 操作人名称
+     */
+    private String createUserName;
+
+    /**
+     * 操作时间
+     *
+     * @table stock_combination
+     * @field create_time
+     */
+    private Date createTime;
+
+}

+ 17 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/params/stock/StockCombinationVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.stock.StockCombination;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 产品组合记录
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockCombinationVo extends StockCombination {
+
+}

+ 25 - 2
hx-service/syringe-management/src/main/java/com/fjhx/service/production/impl/ProductionLineServiceImpl.java

@@ -3,15 +3,20 @@ package com.fjhx.service.production.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseIdEntity;
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.production.ProductionLine;
+import com.fjhx.mapper.production.ProductionLineMapper;
 import com.fjhx.params.production.ProductionLineEx;
 import com.fjhx.params.production.ProductionLineVo;
-import com.fjhx.mapper.production.ProductionLineMapper;
 import com.fjhx.service.production.ProductionLineService;
+import com.fjhx.utils.FileClientUtil;
 import com.fjhx.utils.WrapperUtil;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -32,22 +37,40 @@ public class ProductionLineServiceImpl extends ServiceImpl<ProductionLineMapper,
                 .keyword("pl.name") // 生产线名称
                 .createTimeDesc("pl")
                 .getWrapper();
-        return baseMapper.getPage(createPage(condition), wrapper);
+        Page<ProductionLineEx> page = baseMapper.getPage(createPage(condition), wrapper);
+
+        List<ProductionLineEx> records = page.getRecords();
+        if (records.size() == 0) {
+            return page;
+        }
+
+        List<Long> productionLineIdList = records.stream().map(BaseIdEntity::getId).collect(Collectors.toList());
+
+        Map<Long, List<FileInfo>> fileInfoListMap = FileClientUtil.getFileInfoListMap(productionLineIdList);
+        for (ProductionLineEx productionLineEx : records) {
+            productionLineEx.setFileInfoList(fileInfoListMap.get(productionLineEx.getId()));
+        }
+
+        return page;
     }
 
     @Override
     public void add(ProductionLineVo productionLineVo) {
         save(productionLineVo);
+        FileClientUtil.bindingFile(productionLineVo.getId(), productionLineVo.getFileInfoList());
     }
 
     @Override
     public void edit(ProductionLineVo productionLineVo) {
         updateById(productionLineVo);
+        FileClientUtil.againBindingFile(productionLineVo.getId(), productionLineVo.getFileInfoList());
     }
 
     @Override
     public void delete(ProductionLineVo productionLineVo) {
         removeById(productionLineVo.getId());
+        FileClientUtil.relieveBindingFile(productionLineVo.getId());
+
     }
 
 }

+ 8 - 4
hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/ManualInStockController.java

@@ -2,11 +2,10 @@ package com.fjhx.controller.stock;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.base.Condition;
-import com.fjhx.entity.logistics.LogisticsInfo;
 import com.fjhx.entity.stock.StockJournal;
 import com.fjhx.enums.stock.InTypeEnum;
 import com.fjhx.params.stock.ManualInStockVo;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.service.stock.StockJournalService;
 import com.fjhx.service.stock.StockService;
 import org.springblade.core.tool.api.R;
@@ -43,8 +42,13 @@ public class ManualInStockController {
 
     @PostMapping("/add")
     public R add(@RequestBody ManualInStockVo entity) {
-        StockChangeVo vo = new StockChangeVo(entity);
-        stockService.changeQuantity(vo);
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultWarehouseId(entity.getWarehouseId());
+        stockChangeDto.setDefaultRemarks(entity.getRemarks());
+        stockChangeDto.setTypeEnum(InTypeEnum.MANUAL);
+        stockChangeDto.setChangeDetailsList(entity.getChangeProductList());
+
+        stockService.changeQuantity(stockChangeDto);
         return R.success();
     }
 

+ 8 - 3
hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/ManualOutStockController.java

@@ -3,7 +3,8 @@ package com.fjhx.controller.stock;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.base.Condition;
 import com.fjhx.entity.stock.ManualVo;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.enums.stock.OutTypeEnum;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.service.stock.StockJournalService;
 import com.fjhx.service.stock.StockService;
 import org.springblade.core.tool.api.R;
@@ -30,9 +31,13 @@ public class ManualOutStockController {
 
     @PostMapping("/add")
     public R add(@RequestBody ManualVo manualVo) {
-        StockChangeVo stockChangeVo = new StockChangeVo(manualVo);
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultWarehouseId(manualVo.getWarehouseId());
+        stockChangeDto.setDefaultRemarks(manualVo.getRemarks());
+        stockChangeDto.setTypeEnum(OutTypeEnum.getEnumByKey(manualVo.getType()));
+        stockChangeDto.setChangeDetailsList(manualVo.getChangeProductList());
 
-        stockService.changeQuantity(stockChangeVo);
+        stockService.changeQuantity(stockChangeDto);
         return R.success();
     }
 

+ 81 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/StockCombinationController.java

@@ -0,0 +1,81 @@
+package com.fjhx.controller.stock;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.BaseIdEntity;
+import com.fjhx.constants.StatusConstant;
+import com.fjhx.entity.product.ProductInfo;
+import com.fjhx.entity.stock.StockCombination;
+import com.fjhx.params.stock.GetQuantityByWarehouseIdDto;
+import com.fjhx.params.stock.StockCombinationPageDto;
+import com.fjhx.params.stock.StockCombinationPageVo;
+import com.fjhx.service.product.ProductInfoService;
+import com.fjhx.service.stock.StockCombinationService;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 产品组合记录 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+@RestController
+@RequestMapping("/stockCombination")
+public class StockCombinationController {
+
+    @Autowired
+    private StockCombinationService stockCombinationService;
+
+    @Autowired
+    private ProductInfoService productInfoService;
+
+    /**
+     * 产品组合分页
+     */
+    @PostMapping("/page")
+    public R page(@RequestBody StockCombinationPageDto dto) {
+        Page<StockCombinationPageVo> result = stockCombinationService.getPage(dto);
+        return R.success(result);
+    }
+
+    /**
+     * 添加组合
+     */
+    @PostMapping("/add")
+    public R add(@Validated @RequestBody StockCombination stockCombination) {
+        stockCombinationService.add(stockCombination);
+        return R.success();
+    }
+
+    /**
+     * 获取可组合数量
+     */
+    @PostMapping("/getQuantityByWarehouseId")
+    public R getQuantityByWarehouseId(@Validated @RequestBody GetQuantityByWarehouseIdDto getQuantityByWarehouseIdDto) {
+        int quantity = stockCombinationService.getQuantityByWarehouseId(getQuantityByWarehouseIdDto);
+        return R.success(quantity);
+    }
+
+    /**
+     * 获取组合名称列表
+     */
+    @PostMapping("/getCombinationList")
+    public R getCombinationList() {
+        List<Map<String, Object>> result = productInfoService.listMaps(q -> q
+                .select(BaseIdEntity::getId, ProductInfo::getName)
+                .eq(ProductInfo::getCombination, StatusConstant.YES));
+        return R.success(result);
+    }
+
+}
+

+ 0 - 1
hx-service/victoriatourist/src/main/java/com/fjhx/controller/stock/StockController.java

@@ -92,6 +92,5 @@ public class StockController {
         return R.success(result);
     }
 
-
 }
 

+ 22 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/stock/StockCombinationMapper.java

@@ -0,0 +1,22 @@
+package com.fjhx.mapper.stock;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.stock.StockCombination;
+import com.fjhx.params.stock.StockCombinationPageVo;
+import com.fjhx.utils.wrapperUtil.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 产品组合记录 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+public interface StockCombinationMapper extends BaseMapper<StockCombination> {
+
+    Page<StockCombinationPageVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<Object> wrapper);
+
+}

+ 22 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/stock/StockCombinationMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.mapper.stock.StockCombinationMapper">
+
+    <select id="getPage" resultType="com.fjhx.params.stock.StockCombinationPageVo">
+        select sc.combination_quantity combinationQuantity,
+               sc.create_user          createUser,
+               sc.create_time          createTime,
+               pi.code                 productCode,
+               pi.name                 productName,
+               pi.specs                productSpecs,
+               pi.unit                 productUnit,
+               wo.name                 sourceWarehouseName,
+               wi.name                 combinationWarehouseName
+        from stock_combination sc
+                 left join product_info pi on pi.id = sc.product_id
+                 left join warehouse wo on wo.id = sc.source_warehouse_id
+                 left join warehouse wi on wi.id = sc.combination_warehouse_id
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 5 - 5
hx-service/victoriatourist/src/main/java/com/fjhx/service/logistics/impl/LogisticsInfoServiceImpl.java

@@ -22,7 +22,7 @@ import com.fjhx.mapper.logistics.LogisticsInfoMapper;
 import com.fjhx.params.logistics.DeliverDetailsVo;
 import com.fjhx.params.logistics.LogisticsInfoVo;
 import com.fjhx.params.stock.InStockAdd;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.service.apply.ApplyPurchaseService;
 import com.fjhx.service.logistics.LogisticsDetailsService;
 import com.fjhx.service.logistics.LogisticsInfoService;
@@ -333,10 +333,10 @@ public class LogisticsInfoServiceImpl extends ServiceImpl<LogisticsInfoMapper, L
         List<InStockAdd.InStockAddDetails> list = inStockAdd.getList();
         Long logisticsInfoId = inStockAdd.getLogisticsInfoId();
 
-        StockChangeVo stockChangeVo = new StockChangeVo();
-        stockChangeVo.setTypeEnum(InTypeEnum.PURCHASE);
-        stockChangeVo.setChangeDetailsList(list);
-        List<StockJournal> stockJournals = stockService.changeQuantity(stockChangeVo);
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setTypeEnum(InTypeEnum.PURCHASE);
+        stockChangeDto.setChangeDetailsList(list);
+        List<StockJournal> stockJournals = stockService.changeQuantity(stockChangeDto);
 
         // 修改入库数量
         Map<Long, BigDecimal> collect = list.stream().collect(Collectors.toMap(

+ 7 - 7
hx-service/victoriatourist/src/main/java/com/fjhx/service/order/impl/OrderDetailsServiceImpl.java

@@ -14,7 +14,7 @@ import com.fjhx.params.order.IssueVo;
 import com.fjhx.params.order.OrderDetailsEx;
 import com.fjhx.params.order.OrderDetailsVo;
 import com.fjhx.params.stock.ChangeProduct;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.params.stock.StockTransferAddVo;
 import com.fjhx.service.logistics.LogisticsInfoService;
 import com.fjhx.service.order.OrderDetailsService;
@@ -187,11 +187,11 @@ public class OrderDetailsServiceImpl extends ServiceImpl<OrderDetailsMapper, Ord
         logisticsInfoService.save(logisticsInfo);
 
         // 变更库存添加流水记录
-        StockChangeVo stockChangeVo = new StockChangeVo();
-        stockChangeVo.setDefaultBusinessId(orderId);
-        stockChangeVo.setDefaultWarehouseId(issueVo.getWarehouseId());
-        stockChangeVo.setTypeEnum(issueVo.getOutTypeEnum());
-        stockChangeVo.setChangeDetailsList(orderDetailsList);
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultBusinessId(orderId);
+        stockChangeDto.setDefaultWarehouseId(issueVo.getWarehouseId());
+        stockChangeDto.setTypeEnum(issueVo.getOutTypeEnum());
+        stockChangeDto.setChangeDetailsList(orderDetailsList);
 
         // 京东出库新增调仓
         if (issueVo.getOutTypeEnum().equals(OutTypeEnum.JD)) {
@@ -215,7 +215,7 @@ public class OrderDetailsServiceImpl extends ServiceImpl<OrderDetailsMapper, Ord
             stockTransferService.add(stockTransferAddVo);
         }
 
-        stockService.changeQuantity(stockChangeVo);
+        stockService.changeQuantity(stockChangeDto);
     }
 
 }

+ 6 - 6
hx-service/victoriatourist/src/main/java/com/fjhx/service/quality/impl/QualityDetailsServiceImpl.java

@@ -13,7 +13,7 @@ import com.fjhx.enums.stock.QualityStatusEnum;
 import com.fjhx.mapper.quality.QualityDetailsMapper;
 import com.fjhx.params.quality.QualityDetailsVo;
 import com.fjhx.params.stock.InStockAdd;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.service.quality.QualityDetailsService;
 import com.fjhx.service.quality.QualityInfoService;
 import com.fjhx.service.stock.StockService;
@@ -126,11 +126,11 @@ public class QualityDetailsServiceImpl extends ServiceImpl<QualityDetailsMapper,
 
         // 质检不合格数量走出库,减少锁定库存
         if (list.size() > 0) {
-            StockChangeVo stockChangeVo = new StockChangeVo();
-            stockChangeVo.setTypeEnum(OutTypeEnum.UNQUALIFIED_QUALITY_INSPECTION);
-            stockChangeVo.setDefaultRemarks("质检不合格出库");
-            stockChangeVo.setChangeDetailsList(list);
-            stockService.changeQuantity(stockChangeVo);
+            StockChangeDto stockChangeDto = new StockChangeDto();
+            stockChangeDto.setTypeEnum(OutTypeEnum.UNQUALIFIED_QUALITY_INSPECTION);
+            stockChangeDto.setDefaultRemarks("质检不合格出库");
+            stockChangeDto.setChangeDetailsList(list);
+            stockService.changeQuantity(stockChangeDto);
         }
 
         // 质检合格减少锁定库存,增加库存

+ 26 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockCombinationService.java

@@ -0,0 +1,26 @@
+package com.fjhx.service.stock;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.BaseService;
+import com.fjhx.entity.stock.StockCombination;
+import com.fjhx.params.stock.GetQuantityByWarehouseIdDto;
+import com.fjhx.params.stock.StockCombinationPageDto;
+import com.fjhx.params.stock.StockCombinationPageVo;
+
+/**
+ * <p>
+ * 产品组合记录 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+public interface StockCombinationService extends BaseService<StockCombination> {
+
+    Page<StockCombinationPageVo> getPage(StockCombinationPageDto dto);
+
+    void add(StockCombination stockCombination);
+
+    int getQuantityByWarehouseId(GetQuantityByWarehouseIdDto getQuantityByWarehouseIdDto);
+
+}

+ 2 - 2
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockJournalService.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.base.BaseService;
 import com.fjhx.base.Condition;
 import com.fjhx.entity.stock.StockJournal;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.params.stock.StockJournalVo;
 
 import java.util.List;
@@ -28,7 +28,7 @@ public interface StockJournalService extends BaseService<StockJournal> {
 
     void delete(StockJournalVo stockJournalVo);
 
-    List<StockJournal> addJournal(StockChangeVo stockChangeVo);
+    List<StockJournal> addJournal(StockChangeDto stockChangeDto);
 
     /**
      * 获取手动出库分页

+ 1 - 1
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/StockService.java

@@ -28,7 +28,7 @@ public interface StockService extends BaseService<Stock> {
 
     void delete(StockVo stockVo);
 
-    List<StockJournal> changeQuantity(StockChangeVo stockChangeVo);
+    List<StockJournal> changeQuantity(StockChangeDto stockChangeDto);
 
     Page<Map<String, Object>> pageByWarehouseId(Condition condition);
 

+ 199 - 0
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockCombinationServiceImpl.java

@@ -0,0 +1,199 @@
+package com.fjhx.service.stock.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.entity.product.ProductCombination;
+import com.fjhx.entity.product.ProductInfo;
+import com.fjhx.entity.stock.Stock;
+import com.fjhx.entity.stock.StockCombination;
+import com.fjhx.enums.stock.InTypeEnum;
+import com.fjhx.enums.stock.OutTypeEnum;
+import com.fjhx.mapper.stock.StockCombinationMapper;
+import com.fjhx.params.stock.*;
+import com.fjhx.service.product.ProductCombinationService;
+import com.fjhx.service.stock.StockCombinationService;
+import com.fjhx.service.stock.StockService;
+import com.fjhx.utils.Assert;
+import com.fjhx.utils.UserClientUtil;
+import com.fjhx.utils.wrapperUtil.IWrapper;
+import com.fjhx.utils.wrapperUtil.KeywordData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 产品组合记录 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-16
+ */
+@Service
+public class StockCombinationServiceImpl extends ServiceImpl<StockCombinationMapper, StockCombination> implements StockCombinationService {
+
+    @Autowired
+    private ProductCombinationService productCombinationService;
+
+    @Autowired
+    private StockService stockService;
+
+
+    @Override
+    public Page<StockCombinationPageVo> getPage(StockCombinationPageDto dto) {
+
+        // 拼接查询条件
+        IWrapper<Object> wrapper = IWrapper.getWrapper(dto)
+                .keyword(
+                        new KeywordData("pi", ProductInfo::getCode),
+                        new KeywordData("pi", ProductInfo::getName)
+                )
+                .orderByDesc("sc", StockCombination::getCreateTime);
+
+        // 查询产品组合记录分页
+        Page<StockCombinationPageVo> page = baseMapper.getPage(dto.getPage(), wrapper);
+
+        // 赋值创作人名称
+        List<StockCombinationPageVo> records = page.getRecords();
+        if (records.size() == 0) {
+            return page;
+        }
+
+        Map<Long, String> userNameMap = UserClientUtil.getUserNameMap(records, StockCombinationPageVo::getCreateUser);
+        for (StockCombinationPageVo stockCombinationPageVo : records) {
+            stockCombinationPageVo.setCreateUserName(userNameMap.get(stockCombinationPageVo.getCreateUser()));
+        }
+
+        return page;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(StockCombination stockCombination) {
+
+        // 赋值产品组合记录id
+        stockCombination.setId(IdWorker.getId());
+
+        // 查询组合包涵产品id以和所需数量
+        List<ProductCombination> productCombinationList = getCombinationListByProductId(stockCombination.getProductId());
+
+        // 产品出库
+        productDelivery(stockCombination, productCombinationList);
+
+        // 组合入库
+        combinedStorage(stockCombination);
+
+        // 保存入库明细
+        save(stockCombination);
+
+    }
+
+    @Override
+    public int getQuantityByWarehouseId(GetQuantityByWarehouseIdDto dto) {
+
+        // 查询组合包涵产品id以和所需数量
+        List<ProductCombination> productCombinationList = getCombinationListByProductId(dto.getProductId());
+
+        // 获取关联产品id
+        List<Long> linkProductIdList = productCombinationList.stream()
+                .map(ProductCombination::getLinkProductId).collect(Collectors.toList());
+
+        // 获取指定仓库指定产品库存数量
+        Map<Long, BigDecimal> kv = stockService.getKV(Stock::getGoodsId, Stock::getQuantity, q -> q
+                .eq(Stock::getWarehouseId, dto.getSourceWarehouseId())
+                .in(Stock::getGoodsId, linkProductIdList));
+
+        Integer quantity = null;
+
+        for (ProductCombination productCombination : productCombinationList) {
+
+            // 产品库存数量
+            BigDecimal stockQuantity = kv.get(productCombination.getProductId());
+            if (Objects.isNull(stockQuantity)) {
+                return 0;
+            }
+
+            // 最多组合几份
+            int max = stockQuantity.divide(productCombination.getLinkQuantity(), 0, RoundingMode.FLOOR).intValue();
+            if (max == 0) {
+                return 0;
+            }
+            if (quantity == null || max < quantity) {
+                quantity = max;
+            }
+
+        }
+
+        return ObjectUtil.defaultIfNull(quantity, 0);
+    }
+
+    /**
+     * 查询组合包涵产品id以和数量
+     */
+    private List<ProductCombination> getCombinationListByProductId(Long productId) {
+        List<ProductCombination> list = productCombinationService.list(q -> q
+                .select(ProductCombination::getLinkProductId, ProductCombination::getLinkQuantity)
+                .eq(ProductCombination::getProductId, productId));
+        Assert.gtZero(list.size(), "没有找到产品组合");
+        return list;
+    }
+
+    /**
+     * 产品出库
+     */
+    private void productDelivery(StockCombination stockCombination, List<ProductCombination> productCombinationList) {
+        // 赋值变更明细
+        List<StockChangeDetailsDto> stockChangeDetailsDtoList = productCombinationList.stream().map(item -> {
+            BigDecimal changeQuantity = item.getLinkQuantity().multiply(BigDecimal.valueOf(stockCombination.getCombinationQuantity()));
+
+            StockChangeDetailsDto stockChangeDetailsDto = new StockChangeDetailsDto();
+            stockChangeDetailsDto.setGoodsId(item.getLinkProductId());
+            stockChangeDetailsDto.setChangeQuantity(changeQuantity);
+            return stockChangeDetailsDto;
+
+        }).collect(Collectors.toList());
+
+        // 赋值库存变更参数
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultBusinessId(stockCombination.getId());
+        stockChangeDto.setDefaultWarehouseId(stockCombination.getSourceWarehouseId());
+        stockChangeDto.setTypeEnum(OutTypeEnum.COMBINATION);
+        stockChangeDto.setChangeDetailsList(stockChangeDetailsDtoList);
+
+        // 保存变更明细
+        stockService.changeQuantity(stockChangeDto);
+    }
+
+    /**
+     * 组合入库
+     */
+    private void combinedStorage(StockCombination stockCombination) {
+
+        // 赋值变更明细
+        StockChangeDetailsDto stockChangeDetailsDto = new StockChangeDetailsDto();
+        stockChangeDetailsDto.setGoodsId(stockCombination.getProductId());
+        stockChangeDetailsDto.setChangeQuantity(BigDecimal.valueOf(stockCombination.getCombinationQuantity()));
+
+        // 赋值库存变更参数
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultBusinessId(stockCombination.getId());
+        stockChangeDto.setDefaultWarehouseId(stockCombination.getCombinationWarehouseId());
+        stockChangeDto.setTypeEnum(InTypeEnum.COMBINATION);
+        stockChangeDto.setChangeDetailsList(Collections.singletonList(stockChangeDetailsDto));
+
+        // 保存变更明细
+        stockService.changeQuantity(stockChangeDto);
+
+    }
+
+}

+ 32 - 16
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockJournalServiceImpl.java

@@ -10,7 +10,7 @@ import com.fjhx.entity.stock.StockJournal;
 import com.fjhx.enums.stock.InTypeEnum;
 import com.fjhx.enums.stock.OutTypeEnum;
 import com.fjhx.mapper.stock.StockJournalMapper;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.params.stock.StockJournalVo;
 import com.fjhx.service.stock.StockJournalService;
 import com.fjhx.service.stock.StockService;
@@ -88,9 +88,9 @@ public class StockJournalServiceImpl extends ServiceImpl<StockJournalMapper, Sto
      *
      * @return
      */
-    public List<StockJournal> addJournal(StockChangeVo stockChangeVo) {
-        List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
-        Enum<?> typeEnum = stockChangeVo.getTypeEnum();
+    public List<StockJournal> addJournal(StockChangeDto stockChangeDto) {
+        List<? extends StockChangeDto.ChangeDetails> changeDetailsList = stockChangeDto.getChangeDetailsList();
+        Enum<?> typeEnum = stockChangeDto.getTypeEnum();
 
         // 添加入库明细
         List<StockJournal> stockJournalList = new ArrayList<>();
@@ -99,6 +99,7 @@ public class StockJournalServiceImpl extends ServiceImpl<StockJournalMapper, Sto
 
             String code = null;
 
+            // 生成入库单号
             if (typeEnum instanceof InTypeEnum) {
                 switch ((InTypeEnum) typeEnum) {
                     case PURCHASE:
@@ -107,28 +108,42 @@ public class StockJournalServiceImpl extends ServiceImpl<StockJournalMapper, Sto
                     case MANUAL:
                         code = CodeEnum.IN_JOURNAL.getCode();
                         break;
+                    case TRANSFER:
+                        code = CodeEnum.TRANSFER_IN_JOURNAL.getCode();
+                        break;
+                    case COMBINATION:
+                        code = CodeEnum.C_IN_JOURNAL.getCode();
+                        break;
                 }
-            } else {
+            }
+            // 生成出库单号
+            else {
                 switch ((OutTypeEnum) typeEnum) {
+                    case PURCHASE:
+                        code = CodeEnum.S_OUT_JOURNAL.getCode();
+                        break;
+                    case JD:
+                        code = CodeEnum.JD_OUT_JOURNAL.getCode();
+                        break;
                     case PICKING:
                     case SALE:
                     case RETURN_GOODS:
                     case SCRAP:
                         code = CodeEnum.OUT_JOURNAL.getCode();
                         break;
-                    case PURCHASE:
-                        code = CodeEnum.S_OUT_JOURNAL.getCode();
-                        break;
-                    case JD:
-                        code = CodeEnum.JD_OUT_JOURNAL.getCode();
+                    case TRANSFER:
+                        code = CodeEnum.TRANSFER_OUT_JOURNAL.getCode();
                         break;
                     case UNQUALIFIED_QUALITY_INSPECTION:
-                        code = CodeEnum.BS.getCode();
+                        code = CodeEnum.BS_OUT_JOURNAL.getCode();
+                        break;
+                    case COMBINATION:
+                        code = CodeEnum.C_OUT_JOURNAL.getCode();
                         break;
                 }
             }
 
-            for (StockChangeVo.ChangeDetails changeDetails : changeDetailsList) {
+            for (StockChangeDto.ChangeDetails changeDetails : changeDetailsList) {
 
                 // 变更数量
                 BigDecimal changeQuantity = changeDetails.getChangeQuantity();
@@ -137,14 +152,14 @@ public class StockJournalServiceImpl extends ServiceImpl<StockJournalMapper, Sto
                     continue;
                 }
 
-                // 业务id
-                Long businessId = ObjectUtil.defaultIfNull(changeDetails.getBusinessId(), stockChangeVo.getDefaultBusinessId());
                 // 产品id
                 Long goodsId = changeDetails.getGoodsId();
+                // 业务id
+                Long businessId = ObjectUtil.defaultIfNull(changeDetails.getBusinessId(), stockChangeDto.getDefaultBusinessId());
                 // 仓库id
-                Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
+                Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeDto.getDefaultWarehouseId());
                 // 备注
-                String remarks = ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeVo.getDefaultRemarks());
+                String remarks = ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeDto.getDefaultRemarks());
 
                 // 获取加权平均单价
                 Stock stock = stockService.getOne(q -> q.eq(Stock::getWarehouseId, warehouseId).eq(Stock::getGoodsId, goodsId));
@@ -153,6 +168,7 @@ public class StockJournalServiceImpl extends ServiceImpl<StockJournalMapper, Sto
                     weightingAveragePrice = ObjectUtil.defaultIfNull(stock.getWeightingAveragePrice(), BigDecimal.ZERO);
                 }
 
+                // 赋值出入库类型
                 StockJournal stockJournal = new StockJournal();
                 if (typeEnum instanceof InTypeEnum) {
                     stockJournal.setType(StockJournalTypeConstant.IN);

+ 46 - 38
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockServiceImpl.java

@@ -27,7 +27,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -75,17 +78,21 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public List<StockJournal> changeQuantity(StockChangeVo stockChangeVo) {
-        Assert.notEmpty(stockChangeVo.getChangeDetailsList(), "变更数量列表为空");
+    public List<StockJournal> changeQuantity(StockChangeDto stockChangeDto) {
+
+        Assert.notEmpty(stockChangeDto.getChangeDetailsList(), "库存变更数量列表不能为空");
+
         // 合并变更数量
-        Map<String, Stock> map = mergeChangeQuantity(stockChangeVo);
+        Map<String, Stock> map = mergeChangeQuantity(stockChangeDto);
         if (map.size() == 0) {
             return new ArrayList<>();
         }
+
         // 变更数量
-        ChangeQuantity(map, stockChangeVo.getTypeEnum());
+        ChangeQuantity(map, stockChangeDto.getTypeEnum());
+
         // 添加流水记录
-        return stockJournalService.addJournal(stockChangeVo);
+        return stockJournalService.addJournal(stockChangeDto);
     }
 
     @Override
@@ -164,13 +171,13 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
     /**
      * 合并变更数量(如果同一种物品在出入库一个仓库,则合并数量)
      */
-    private Map<String, Stock> mergeChangeQuantity(StockChangeVo stockChangeVo) {
+    private Map<String, Stock> mergeChangeQuantity(StockChangeDto stockChangeDto) {
 
-        List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
-        Enum<?> typeEnum = stockChangeVo.getTypeEnum();
+        List<? extends StockChangeDto.ChangeDetails> changeDetailsList = stockChangeDto.getChangeDetailsList();
+        Enum<?> typeEnum = stockChangeDto.getTypeEnum();
 
         Map<String, Stock> map = new HashMap<>();
-        for (StockChangeVo.ChangeDetails changeDetails : changeDetailsList) {
+        for (StockChangeDto.ChangeDetails changeDetails : changeDetailsList) {
             // 变更数量
             BigDecimal changeQuantity = changeDetails.getChangeQuantity();
             // 变更数量小于等于0,则跳过
@@ -178,7 +185,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 continue;
             }
             // 仓库id
-            Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
+            Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeDto.getDefaultWarehouseId());
             // 物品id
             Long goodsId = changeDetails.getGoodsId();
             // 生成mapKey
@@ -188,25 +195,21 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 stock = new Stock();
                 stock.setWarehouseId(warehouseId);
                 stock.setGoodsId(goodsId);
-                // 如果是采购入库或质检不合格出库,添加冻结数量
-                if (typeEnum.equals(InTypeEnum.PURCHASE) || typeEnum.equals(OutTypeEnum.UNQUALIFIED_QUALITY_INSPECTION)) {
-                    stock.setFrozenQuantity(changeQuantity);
-                }
-                // 否则添加库存数量
-                else {
-                    stock.setQuantity(changeQuantity);
-                }
+                stock.setQuantity(BigDecimal.ZERO);
+                stock.setFrozenQuantity(BigDecimal.ZERO);
+                stock.setWeightingAveragePrice(BigDecimal.ZERO);
                 map.put(key, stock);
-            } else {
-                // 如果是采购入库或质检不合格出库,添加冻结数量
-                if (typeEnum.equals(InTypeEnum.PURCHASE) || typeEnum.equals(OutTypeEnum.UNQUALIFIED_QUALITY_INSPECTION)) {
-                    stock.setFrozenQuantity(stock.getFrozenQuantity().add(changeQuantity));
-                }
-                // 否则添加库存数量
-                else {
-                    stock.setQuantity(stock.getQuantity().add(changeQuantity));
-                }
             }
+
+            // 如果是采购入库或质检不合格出库,添加冻结数量
+            if (typeEnum.equals(InTypeEnum.PURCHASE) || typeEnum.equals(OutTypeEnum.UNQUALIFIED_QUALITY_INSPECTION)) {
+                stock.setFrozenQuantity(changeQuantity);
+            }
+            // 否则添加库存数量
+            else {
+                stock.setQuantity(changeQuantity);
+            }
+
         }
         return map;
     }
@@ -215,29 +218,34 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
      * 变更库存数量
      */
     private synchronized void ChangeQuantity(Map<String, Stock> map, Enum<?> typeEnum) {
-        Set<String> keySet = map.keySet();
+        // 获取产品库存
+        List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", map.keySet()));
 
-        List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", keySet));
+        // 遍历库存
         for (Stock oldStock : list) {
             Stock newStock = map.get(oldStock.getGoodsId().toString() + oldStock.getWarehouseId().toString());
-
             newStock.setId(oldStock.getId());
+
             // 入库逻辑
             if (typeEnum instanceof InTypeEnum) {
-                // 采购入库,增加锁定库存
+                // 采购入库,统计锁定库存
                 if (typeEnum.equals(InTypeEnum.PURCHASE)) {
                     newStock.setFrozenQuantity(oldStock.getFrozenQuantity().add(newStock.getFrozenQuantity()));
                 }
-                // 其他入库,增加库存
+                // 其他入库,统计库存
                 else {
                     newStock.setQuantity(oldStock.getQuantity().add(newStock.getQuantity()));
                 }
-            } else {
-                // 质检不合格出库,扣减锁定库存
+            }
+            // 出库逻辑
+            else {
+                // 质检不合格出库,统计锁定库存
                 if (typeEnum.equals(OutTypeEnum.UNQUALIFIED_QUALITY_INSPECTION)) {
-                    newStock.setFrozenQuantity(oldStock.getFrozenQuantity().subtract(newStock.getFrozenQuantity()));
+                    BigDecimal subtract = oldStock.getFrozenQuantity().subtract(newStock.getFrozenQuantity());
+                    Assert.eqTrue(subtract.compareTo(BigDecimal.ZERO) < 0, "产品锁定库存不足,出库失败");
+                    newStock.setFrozenQuantity(subtract);
                 }
-                // 其他出库,扣减库存
+                // 其他出库,统计库存
                 else {
                     BigDecimal subtract = oldStock.getQuantity().subtract(newStock.getQuantity());
                     Assert.eqTrue(subtract.compareTo(BigDecimal.ZERO) < 0, "产品库存不足,出库失败");
@@ -245,7 +253,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 }
             }
         }
-        saveOrUpdateBatch(new ArrayList<>(map.values()));
+        saveOrUpdateBatch(map.values());
     }
 
 }

+ 14 - 14
hx-service/victoriatourist/src/main/java/com/fjhx/service/stock/impl/StockTransferServiceImpl.java

@@ -12,7 +12,7 @@ import com.fjhx.enums.stock.InTypeEnum;
 import com.fjhx.enums.stock.OutTypeEnum;
 import com.fjhx.mapper.stock.StockTransferMapper;
 import com.fjhx.params.stock.ChangeProduct;
-import com.fjhx.params.stock.StockChangeVo;
+import com.fjhx.params.stock.StockChangeDto;
 import com.fjhx.params.stock.StockTransferAddVo;
 import com.fjhx.service.stock.StockService;
 import com.fjhx.service.stock.StockTransferService;
@@ -111,12 +111,12 @@ public class StockTransferServiceImpl extends ServiceImpl<StockTransferMapper, S
             return;
         }
 
-        StockChangeVo stockChangeVo = new StockChangeVo();
-        stockChangeVo.setDefaultWarehouseId(stockTransferAddVo.getOutWarehouseId());
-        stockChangeVo.setDefaultRemarks(stockTransferAddVo.getRemark());
-        stockChangeVo.setTypeEnum(OutTypeEnum.TRANSFER);
-        stockChangeVo.setChangeDetailsList(changeProductList);
-        stockService.changeQuantity(stockChangeVo);
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultWarehouseId(stockTransferAddVo.getOutWarehouseId());
+        stockChangeDto.setDefaultRemarks(stockTransferAddVo.getRemark());
+        stockChangeDto.setTypeEnum(OutTypeEnum.TRANSFER);
+        stockChangeDto.setChangeDetailsList(changeProductList);
+        stockService.changeQuantity(stockChangeDto);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -137,13 +137,13 @@ public class StockTransferServiceImpl extends ServiceImpl<StockTransferMapper, S
         changeProduct.setProductId(byId.getProductId());
         changeProduct.setQuantity(inQuantity);
 
-        StockChangeVo stockChangeVo = new StockChangeVo();
-        stockChangeVo.setDefaultBusinessId(byId.getId());
-        stockChangeVo.setDefaultWarehouseId(byId.getInWarehouseId());
-        stockChangeVo.setDefaultRemarks(byId.getRemark());
-        stockChangeVo.setTypeEnum(InTypeEnum.TRANSFER);
-        stockChangeVo.setChangeDetailsList(Collections.singletonList(changeProduct));
-        stockService.changeQuantity(stockChangeVo);
+        StockChangeDto stockChangeDto = new StockChangeDto();
+        stockChangeDto.setDefaultBusinessId(byId.getId());
+        stockChangeDto.setDefaultWarehouseId(byId.getInWarehouseId());
+        stockChangeDto.setDefaultRemarks(byId.getRemark());
+        stockChangeDto.setTypeEnum(InTypeEnum.TRANSFER);
+        stockChangeDto.setChangeDetailsList(Collections.singletonList(changeProduct));
+        stockService.changeQuantity(stockChangeDto);
     }
 
 }

+ 21 - 13
hx-service/victoriatourist/src/main/java/com/fjhx/uitl/code/CodeEnum.java

@@ -37,32 +37,40 @@ public enum CodeEnum {
     PRODUCT_FINISHED("PF", null, "code", 5, ProductInfoService.class),
     // 产品_半成品
     PRODUCT_PARTIALLY_PREPARED("PP", null, "code", 5, ProductInfoService.class),
-    //采购
+    // 采购
     PURCHASE("PO", "yyyyMM-", "code", 5, PurchaseService.class),
-    //客户
+    // 客户
     CUSTOMER("C", null, "code", 5, CustomerInfoService.class),
-    //销售订单
+    // 销售订单
     ORDER_SALES("SO", null, "code", 5, OrderInfoService.class),
     // 京东订单
     ORDER_JD("JD", null, "code", 5, OrderInfoService.class),
 
-    // 手动出库流水单号
-    OUT_JOURNAL("O", "yyyyMM-", "code", 5, StockJournalService.class),
-    // 京东出库流水单号
-    JD_OUT_JOURNAL("JDO", "yyyyMM-", "code", 5, StockJournalService.class),
     // 销售出库流水单号
     S_OUT_JOURNAL("SO", "yyyyMM-", "code", 5, StockJournalService.class),
-    // 质检不合格出库单
-    BS("BS", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 京东出库流水单号
+    JD_OUT_JOURNAL("JDO", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 手动出库流水单号
+    OUT_JOURNAL("O", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 调仓出库流水单号
+    TRANSFER_OUT_JOURNAL("TO", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 质检不合格出库单号
+    BS_OUT_JOURNAL("BSO", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 产品组合出库单号
+    C_OUT_JOURNAL("CO", "yyyyMM-", "code", 5, StockJournalService.class),
 
+    // 采购入库流水单号
+    IN_PURCHASE("POI", "yyyyMM-", "code", 5, StockJournalService.class),
     // 手动入库流水单号
     IN_JOURNAL("I", "yyyyMM-", "code", 5, StockJournalService.class),
-    // 京东入库流水单号,
-    JD_IN_JOURNAL("JDI", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 调仓入库流水单号
+    TRANSFER_IN_JOURNAL("TI", "yyyyMM-", "code", 5, StockJournalService.class),
     // 销售入库流水单号
     S_IN_JOURNAL("SI", "yyyyMM-", "code", 5, StockJournalService.class),
-    // 采购入库流水单号
-    IN_PURCHASE("POI", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 京东入库流水单号,
+    JD_IN_JOURNAL("JDI", "yyyyMM-", "code", 5, StockJournalService.class),
+    // 产品组合入库单号
+    C_IN_JOURNAL("CI", "yyyyMM-", "code", 5, StockJournalService.class),
 
     // 盘点单号
     CHECK_CODE("CK", "yyyyMM-", "code", 5, CheckInfoService.class),