Browse Source

Merge remote-tracking branch 'origin/master'

24282 1 năm trước cách đây
mục cha
commit
5e15de8b08
51 tập tin đã thay đổi với 874 bổ sung312 xóa
  1. 2 2
      sd-business/src/main/java/com/sd/business/controller/board/TurnoverRateBoardController.java
  2. 9 0
      sd-business/src/main/java/com/sd/business/controller/order/OrderController.java
  3. 2 3
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java
  4. 1 1
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchasePendingStorageController.java
  5. 56 0
      sd-business/src/main/java/com/sd/business/entity/board/bo/TurnoverRateSalesShipmentStatisticsBo.java
  6. 14 5
      sd-business/src/main/java/com/sd/business/entity/board/dto/TurnoverRateBoardSelectDto.java
  7. 51 2
      sd-business/src/main/java/com/sd/business/entity/board/vo/TurnoverRateStatisticsVo.java
  8. 30 0
      sd-business/src/main/java/com/sd/business/entity/bom/bo/BomSpecOrderConsumptionBo.java
  9. 9 9
      sd-business/src/main/java/com/sd/business/entity/check/dto/CheckImportDataDto.java
  10. 6 0
      sd-business/src/main/java/com/sd/business/entity/in/po/InOutStorage.java
  11. 5 0
      sd-business/src/main/java/com/sd/business/entity/in/vo/InOutStorageBomErpExportVo.java
  12. 1 0
      sd-business/src/main/java/com/sd/business/entity/order/enums/OrderStatusEnum.java
  13. 0 5
      sd-business/src/main/java/com/sd/business/entity/order/po/OrderInfo.java
  14. 0 6
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuVo.java
  15. 18 4
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseArrivalImportDataDto.java
  16. 10 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBoardSelectDto.java
  17. 15 7
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomImportDataDto.java
  18. 0 26
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseImportDataDto.java
  19. 6 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageDto.java
  20. 11 4
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseInTransitBomVo.java
  21. 6 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchasePendingStorageVo.java
  22. 15 0
      sd-business/src/main/java/com/sd/business/entity/sku/po/SkuSpec.java
  23. 0 5
      sd-business/src/main/java/com/sd/business/entity/statement/bo/ExportDocumentByOrderBo.java
  24. 0 5
      sd-business/src/main/java/com/sd/business/entity/statement/vo/DocumentByOrderVo.java
  25. 0 6
      sd-business/src/main/java/com/sd/business/entity/statement/vo/ReconciliationDetailVo.java
  26. 1 1
      sd-business/src/main/java/com/sd/business/entity/warehouse/constant/WarehouseConstant.java
  27. 4 2
      sd-business/src/main/java/com/sd/business/mapper/order/OrderMapper.java
  28. 14 0
      sd-business/src/main/java/com/sd/business/mapper/order/OrderSalesShipmentStatisticsMapper.java
  29. 6 5
      sd-business/src/main/java/com/sd/business/mapper/purchase/PurchaseBomMapper.java
  30. 32 10
      sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java
  31. 0 1
      sd-business/src/main/java/com/sd/business/service/check/impl/CheckServiceImpl.java
  32. 13 1
      sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageBomServiceImpl.java
  33. 4 0
      sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageServiceImpl.java
  34. 13 5
      sd-business/src/main/java/com/sd/business/service/order/OrderService.java
  35. 90 12
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderExchangeServiceImpl.java
  36. 115 29
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderSalesShipmentStatisticsServiceImpl.java
  37. 99 11
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java
  38. 1 1
      sd-business/src/main/java/com/sd/business/service/production/impl/ProductionOrderServiceImpl.java
  39. 3 2
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseBomService.java
  40. 1 2
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java
  41. 61 67
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java
  42. 15 8
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java
  43. 29 42
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java
  44. 0 2
      sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java
  45. 0 1
      sd-business/src/main/java/com/sd/business/strategy/impl/DocumentByOrderExcelExportStrategy.java
  46. 0 1
      sd-business/src/main/java/com/sd/business/strategy/impl/SalesOutWarehouseDetailsExportStrategy.java
  47. 10 5
      sd-business/src/main/resources/mapper/order/OrderMapper.xml
  48. 19 0
      sd-business/src/main/resources/mapper/order/OrderSalesShipmentStatisticsMapper.xml
  49. 0 1
      sd-business/src/main/resources/mapper/order/OrderSkuMapper.xml
  50. 77 13
      sd-business/src/main/resources/mapper/purchase/PurchaseBomMapper.xml
  51. BIN
      sd-starter/src/main/resources/template/inOutStorageDetails.xlsx

+ 2 - 2
sd-business/src/main/java/com/sd/business/controller/board/TurnoverRateBoardController.java

@@ -33,7 +33,7 @@ public class TurnoverRateBoardController {
      * @return
      */
     @PostMapping("/getTurnoverRateStatisticsList")
-    public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(@Validated @RequestBody TurnoverRateBoardSelectDto dto) {
+    public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(@RequestBody TurnoverRateBoardSelectDto dto) {
         return orderSalesShipmentStatisticsService.getTurnoverRateStatisticsList(dto);
     }
 
@@ -42,7 +42,7 @@ public class TurnoverRateBoardController {
      * @return
      */
     @PostMapping("/exportExcel")
-    public void exportExcel(HttpServletResponse response, @Validated @RequestBody TurnoverRateBoardSelectDto dto) {
+    public void exportExcel(HttpServletResponse response, @RequestBody TurnoverRateBoardSelectDto dto) {
         List<TurnoverRateStatisticsVo> list = orderSalesShipmentStatisticsService.getTurnoverRateStatisticsList(dto);
         ExcelUtil.export(response,"库存周转率", "库存周转率数据", list, TurnoverRateStatisticsVo.class);
     }

+ 9 - 0
sd-business/src/main/java/com/sd/business/controller/order/OrderController.java

@@ -10,6 +10,7 @@ import com.sd.business.entity.order.enums.OrderExceptionTypeEnum;
 import com.sd.business.entity.order.vo.CompareVo;
 import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.order.vo.SkuSpecPriceVo;
+import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.service.order.OrderService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -184,4 +185,12 @@ public class OrderController {
         orderService.cancelSuspendOrder(dto.getId());
     }
 
+    /**
+     * 订单删除退料清单
+     */
+    @PostMapping("/returnBomList")
+    public List<OutBomVo> returnBomList(@RequestBody BaseSelectDto dto) {
+        return orderService.returnBomList(dto.getId());
+    }
+
 }

+ 2 - 3
sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java

@@ -103,8 +103,7 @@ public class PurchaseController {
      */
     @PostMapping("/purchaseImport")
     public void purchaseImport(MultipartFile file) {
-        List<PurchaseImportDataDto> list = ExcelUtil.read(file, 0, PurchaseImportDataDto.class);
-        List<PurchaseBomImportDataDto> bomImportDataList = ExcelUtil.read(file, 1, PurchaseBomImportDataDto.class);
-        purchaseService.purchaseImport(list, bomImportDataList);
+        List<PurchaseBomImportDataDto> list = ExcelUtil.read(file, PurchaseBomImportDataDto.class);
+        purchaseService.purchaseImport(list);
     }
 }

+ 1 - 1
sd-business/src/main/java/com/sd/business/controller/purchase/PurchasePendingStorageController.java

@@ -70,7 +70,7 @@ public class PurchasePendingStorageController {
      */
     @PostMapping("/purchaseArrivalImport")
     public PurchasePendingStorageVo purchaseArrivalImport(MultipartFile file) {
-        List<PurchaseArrivalImportDataDto> list = ExcelUtil.read(file, 1, PurchaseArrivalImportDataDto.class);
+        List<PurchaseArrivalImportDataDto> list = ExcelUtil.read(file, PurchaseArrivalImportDataDto.class);
         return purchasePendingStorageService.purchaseArrivalImport(list);
     }
 

+ 56 - 0
sd-business/src/main/java/com/sd/business/entity/board/bo/TurnoverRateSalesShipmentStatisticsBo.java

@@ -0,0 +1,56 @@
+package com.sd.business.entity.board.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class TurnoverRateSalesShipmentStatisticsBo {
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 宽
+     */
+    private BigDecimal width;
+
+    /**
+     * 高
+     */
+    private BigDecimal height;
+
+    /**
+     * 色层 字典:bom_chromatophore
+     */
+    private String chromatophore;
+
+    /**
+     * 90天销售数量
+     */
+    private BigDecimal ninetyDaysSalesQuantity;
+
+    /**
+     * 60天销售数量
+     */
+    private BigDecimal sixtyDaysSalesQuantity;
+
+    /**
+     * 30天销售数量
+     */
+    private BigDecimal thirtyDaysSalesQuantity;
+}

+ 14 - 5
sd-business/src/main/java/com/sd/business/entity/board/dto/TurnoverRateBoardSelectDto.java

@@ -3,7 +3,7 @@ package com.sd.business.entity.board.dto;
 import lombok.Getter;
 import lombok.Setter;
 
-import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
 
 /**
  * 周转率查询入参实体
@@ -16,13 +16,22 @@ import javax.validation.constraints.NotNull;
 public class TurnoverRateBoardSelectDto {
 
     /**
-     * bom分类 1-裸垫,2-裸砖
+     * bom分类 1-瑜伽垫裸垫,2-瑜伽垫裸砖,3-跳绳垫裸垫
      */
     private Integer bomClassify;
 
     /**
-     * 查询天数
+     * 
      */
-    @NotNull(message = "查询天数不能为空")
-    private Integer days;
+    private BigDecimal width;
+
+    /**
+     * 高
+     */
+    private BigDecimal height;
+
+    /**
+     * 色层 字典:bom_chromatophore
+     */
+    private String chromatophore;
 }

+ 51 - 2
sd-business/src/main/java/com/sd/business/entity/board/vo/TurnoverRateStatisticsVo.java

@@ -31,13 +31,62 @@ public class TurnoverRateStatisticsVo {
     private String bomSpecName;
 
     /**
+     * 宽
+     */
+    @ExcelProperty(value = "宽", index = 2)
+    private BigDecimal width;
+
+    /**
+     * 高
+     */
+    @ExcelProperty(value = "高", index = 3)
+    private BigDecimal height;
+
+    /**
+     * 色层 字典:bom_chromatophore
+     */
+    @ExcelProperty(value = "色层", index = 4)
+    private String chromatophore;
+
+    /**
+     * 周转率
+     */
+    @ExcelProperty(value = "30天周转率", index = 5)
+    private BigDecimal turnoverRateThirtyDays;
+
+    /**
+     * 30天销售量
+     */
+    @ExcelProperty(value = "30天销售量", index = 6)
+    private BigDecimal salesQuantityThirtyDays;
+
+    /**
      * 周转率
      */
-    @ExcelProperty(value = "周转率", index = 2)
-    private BigDecimal turnoverRate;
+    @ExcelProperty(value = "60天周转率", index = 7)
+    private BigDecimal turnoverRateSixtyDays;
+
+    /**
+     * 60天销售量
+     */
+    @ExcelProperty(value = "60天销售量", index = 8)
+    private BigDecimal salesQuantitySixtyDays;
+
+    /**
+     * 周转率
+     */
+    @ExcelProperty(value = "90天周转率", index = 9)
+    private BigDecimal turnoverRateNinetyDays;
+
+    /**
+     * 90天销售量
+     */
+    @ExcelProperty(value = "90天销售量", index = 10)
+    private BigDecimal salesQuantityNinetyDays;
 
     /**
      * 库存数量
      */
+    @ExcelProperty(value = "库存数量", index = 11)
     private BigDecimal quantity;
 }

+ 30 - 0
sd-business/src/main/java/com/sd/business/entity/bom/bo/BomSpecOrderConsumptionBo.java

@@ -0,0 +1,30 @@
+package com.sd.business.entity.bom.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * bom订单消耗量
+ */
+@Getter
+@Setter
+public class BomSpecOrderConsumptionBo {
+
+    /**
+     * 订单消耗日期
+     */
+    private Date consumptionDate;
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+}

+ 9 - 9
sd-business/src/main/java/com/sd/business/entity/check/dto/CheckImportDataDto.java

@@ -22,28 +22,28 @@ public class CheckImportDataDto {
      * 仓库名称
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "仓库", index = 0)
+    @ExcelProperty(value = "仓库")
     private String warehouseName;
 
     /**
      * 品名
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "品名", index = 1)
+    @ExcelProperty(value = "品名")
     private String bomSpecName;
 
     /**
      * 品号
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "品号", index = 2)
+    @ExcelProperty(value = "品号")
     private String bomSpecCode;
 
     /**
      * 结存单价
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "结存单价", index = 3)
+    @ExcelProperty(value = "结存单价")
     private BigDecimal balanceUnitPrice;
 
 
@@ -51,34 +51,34 @@ public class CheckImportDataDto {
      * 数量
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "可用库存", index = 4)
+    @ExcelProperty(value = "可用库存")
     private BigDecimal quantity;
 
     /**
      * 锁定库存
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "锁定库存", index = 5)
+    @ExcelProperty(value = "锁定库存")
     private BigDecimal lockQuantity;
 
     /**
      * 结存总价
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "结存总价", index = 6)
+    @ExcelProperty(value = "结存总价")
     private BigDecimal totalPrice;
 
     /**
      * 总库存
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "总库存", index = 7)
+    @ExcelProperty(value = "总库存")
     private BigDecimal totalQuantity;
 
     /**
      * 实际库存
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "实际库存", index = 8)
+    @ExcelProperty(value = "实际库存")
     private BigDecimal realityQuantity;
 }

+ 6 - 0
sd-business/src/main/java/com/sd/business/entity/in/po/InOutStorage.java

@@ -7,6 +7,7 @@ import lombok.Setter;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.util.Date;
 
 /**
  * <p>
@@ -62,6 +63,11 @@ public class InOutStorage extends BasePo {
     private String applicant;
 
     /**
+     * 入库时间
+     */
+    private Date inOutStorageTime;
+
+    /**
      * 备注
      */
     private String remark;

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/in/vo/InOutStorageBomErpExportVo.java

@@ -31,6 +31,11 @@ public class InOutStorageBomErpExportVo {
     private String bomSpecCode;
 
     /**
+     * 特征码
+     */
+    private String featureCode;
+
+    /**
      * 业务单位
      */
     private String pieces;

+ 1 - 0
sd-business/src/main/java/com/sd/business/entity/order/enums/OrderStatusEnum.java

@@ -20,6 +20,7 @@ public enum OrderStatusEnum {
     COMPLETION_PRODUCTION(40, "生产完成"),
     HAVE_BEEN_SHIPPED(50, "已发货"),
     SUSPEND(60, "挂起"),
+    EXCHANGE(90, "已售后"),
 
     ;
 

+ 0 - 5
sd-business/src/main/java/com/sd/business/entity/order/po/OrderInfo.java

@@ -199,11 +199,6 @@ public class OrderInfo extends BasePo {
     private BigDecimal packagingMaterialCost;
 
     /**
-     * 外箱包装费
-     */
-    private BigDecimal outerBoxPackingFee;
-
-    /**
      * 税率
      */
     private BigDecimal taxRate;

+ 0 - 6
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSkuVo.java

@@ -97,10 +97,4 @@ public class OrderSkuVo extends OrderSku {
      * 事业部名称
      */
     private String departmentName;
-
-    /**
-     * 订单外箱包装费
-     */
-    private BigDecimal outerBoxPackingFee;
-
 }

+ 18 - 4
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseArrivalImportDataDto.java

@@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
+
 
 /**
  * 采购到货单导入入参实体
@@ -15,24 +17,36 @@ public class PurchaseArrivalImportDataDto {
     /**
      * 到货单号
      */
-    @ExcelProperty("PURCHASE_ARRIVAL__DOC_NO")
+    @ExcelProperty("到货单号")
     private String arrivalCode;
 
     /**
+     * 到货日期
+     */
+    @ExcelProperty("到货日期")
+    private Date arrivalDate;
+
+    /**
      * 采购合同编号
      */
-    @ExcelProperty("PURCHASE_ORD_DOC_NO")
+    @ExcelProperty("订单单号")
     private String purchaseCode;
 
     /**
+     * 采购合同编号-PUR
+     */
+    @ExcelProperty("备注")
+    private String remarkCode;
+
+    /**
      * bom规格编码
      */
-    @ExcelProperty("ITEM_ID_CODE")
+    @ExcelProperty("品号")
     private String bomSpecCode;
 
     /**
      * 到货数量
      */
-    @ExcelProperty("BUSINESS_QTY")
+    @ExcelProperty("业务数量")
     private String arrivalQuantity;
 }

+ 10 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBoardSelectDto.java

@@ -20,4 +20,14 @@ public class PurchaseBoardSelectDto extends BaseSelectDto {
      * 规格品号
      */
     private String bomSpecCode;
+
+    /**
+     * 排序字段 turnoverRate、predictOutStorageDays、nextDeliveryDays
+     */
+    private String sortField = "turnoverRate";
+
+    /**
+     * 排序方式 1-升序,2-降序
+     */
+    private Integer sortBy;
 }

+ 15 - 7
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomImportDataDto.java

@@ -4,6 +4,8 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
+
 /**
  * E10采购合同bom 导入入参实体
  */
@@ -13,36 +15,42 @@ public class PurchaseBomImportDataDto {
     /**
      * 采购单号
      */
-    @ExcelProperty("PURCHASE_ORDER__DOC_NO")
+    @ExcelProperty("单号")
     private String purchaseCode;
 
     /**
+     * 供应商编码
+     */
+    @ExcelProperty("供应商编号")
+    private String supplierCode;
+
+    /**
      * bom品号
      */
-    @ExcelProperty("ITEM_ID_CODE")
+    @ExcelProperty("品号")
     private String bomSpecCode;
 
     /**
      * 数量
      */
-    @ExcelProperty("BUSINESS_QTY")
+    @ExcelProperty("业务数量")
     private String quantity;
 
     /**
      * 含税单价
      */
-    @ExcelProperty("DISCOUNTED_PRICE")
+    @ExcelProperty("折扣后单价")
     private String unitPrice;
 
     /**
      * 总金额
      */
-    @ExcelProperty("AMOUNT")
+    @ExcelProperty("金额")
     private String totalAmount;
 
     /**
      * 交付日期
      */
-    @ExcelProperty("PLAN_ARRIVAL_DATE")
-    private String deliveryDate;
+    @ExcelProperty("预到货日")
+    private Date deliveryDate;
 }

+ 0 - 26
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseImportDataDto.java

@@ -1,26 +0,0 @@
-package com.sd.business.entity.purchase.dto;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * E10采购合同导入入参实体
- */
-@Getter
-@Setter
-public class PurchaseImportDataDto {
-
-    /**
-     * 采购单号
-     */
-    @ExcelProperty("DOC_NO")
-    private String code;
-
-
-    /**
-     * 供应商编码
-     */
-    @ExcelProperty("SUPPLIER_ID_CODE")
-    private String supplierCode;
-}

+ 6 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageDto.java

@@ -7,6 +7,7 @@ import lombok.Setter;
 
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -20,6 +21,11 @@ import java.util.List;
 public class PurchasePendingStorageDto extends PurchasePendingStorage {
 
     /**
+     * 到货日期
+     */
+    private Date arrivalDate;
+
+    /**
      * 采购待入库详情数据
      */
     @Valid

+ 11 - 4
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseInTransitBomVo.java

@@ -51,28 +51,35 @@ public class PurchaseInTransitBomVo {
     private String purchaseCode;
 
     /**
+     * e10 采购合同编号
+     */
+    @ColumnWidth(20)
+    @ExcelProperty(value = "E10采购合同编号", index = 3)
+    private String purchaseErpCode;
+
+    /**
      * 供应商名称
      */
     @ColumnWidth(20)
-    @ExcelProperty(value = "供应商名称", index = 3)
+    @ExcelProperty(value = "供应商名称", index = 4)
     private String supplierName;
 
     /**
      * 采购数量
      */
-    @ExcelProperty(value = "采购数量", index = 4)
+    @ExcelProperty(value = "采购数量", index = 5)
     private BigDecimal purchaseQuantity;
 
     /**
      * 在途数量
      */
-    @ExcelProperty(value = "在途数量", index = 5)
+    @ExcelProperty(value = "在途数量", index = 6)
     private BigDecimal inTransitQuantity;
 
     /**
      * 交付日期
      */
     @ColumnWidth(20)
-    @ExcelProperty(value = "交付日期", index = 6)
+    @ExcelProperty(value = "交付日期", index = 7)
     private Date deliveryDate;
 }

+ 6 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchasePendingStorageVo.java

@@ -4,6 +4,7 @@ import com.sd.business.entity.purchase.po.PurchasePendingStorage;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -17,6 +18,11 @@ import java.util.List;
 public class PurchasePendingStorageVo extends PurchasePendingStorage {
 
     /**
+     * 到货日期
+     */
+    private Date arrivalDate;
+
+    /**
      * 采购合同编号
      */
     private String purchaseCode;

+ 15 - 0
sd-business/src/main/java/com/sd/business/entity/sku/po/SkuSpec.java

@@ -61,6 +61,21 @@ public class SkuSpec extends BasePo {
     private String erpCode;
 
     /**
+     * e10 特征码
+     */
+    private String featureCode;
+
+    /**
+     * e10 品号
+     */
+    private String erpCodeC2;
+
+    /**
+     * e10 特征码
+     */
+    private String featureCodeC2;
+
+    /**
      * 加工面板 字典:charge_item
      */
     private String machinedPanel;

+ 0 - 5
sd-business/src/main/java/com/sd/business/entity/statement/bo/ExportDocumentByOrderBo.java

@@ -148,9 +148,4 @@ public class ExportDocumentByOrderBo {
      */
     private BigDecimal managementFeeSummary;
 
-    /**
-     * 外箱包装费
-     */
-    private BigDecimal outerBoxPackingFee;
-
 }

+ 0 - 5
sd-business/src/main/java/com/sd/business/entity/statement/vo/DocumentByOrderVo.java

@@ -37,11 +37,6 @@ public class DocumentByOrderVo {
     private Integer placeholder;
 
     /**
-     * 外箱包装费
-     */
-    private BigDecimal outerBoxPackingFee;
-
-    /**
      * 合计
      */
     private BigDecimal total;

+ 0 - 6
sd-business/src/main/java/com/sd/business/entity/statement/vo/ReconciliationDetailVo.java

@@ -70,10 +70,4 @@ public class ReconciliationDetailVo {
      * 管理费
      */
     private BigDecimal managementFee;
-
-    /**
-     * 外箱包装费
-     */
-    private BigDecimal outerBoxPackingFee;
-
 }

+ 1 - 1
sd-business/src/main/java/com/sd/business/entity/warehouse/constant/WarehouseConstant.java

@@ -23,6 +23,6 @@ public interface WarehouseConstant {
     /**
      * 生产次品仓
      */
-    Long PRODUCTION_DEFECTIVE = 1684037092708990977L;
+    Long PRODUCTION_DEFECTIVE = 1684037357424099330L;
 
 }

+ 4 - 2
sd-business/src/main/java/com/sd/business/mapper/order/OrderMapper.java

@@ -3,12 +3,14 @@ package com.sd.business.mapper.order;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.statement.vo.StatementOrderClassifyTotalCountVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * <p>
@@ -30,13 +32,13 @@ public interface OrderMapper extends BaseMapper<OrderInfo> {
      * 获取订单sku 出库数量
      * @return
      */
-    BigDecimal getOrderSkuOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
+    List<BomSpecOrderConsumptionBo> getOrderSkuOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
 
     /**
      * 获取订单sku bom出库数量
      * @return
      */
-    BigDecimal getOrderSkuBomOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
+    List<BomSpecOrderConsumptionBo> getOrderSkuBomOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
 
     /**
      * 获取订单分类数量总计

+ 14 - 0
sd-business/src/main/java/com/sd/business/mapper/order/OrderSalesShipmentStatisticsMapper.java

@@ -2,6 +2,7 @@ package com.sd.business.mapper.order;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo;
 import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
 import com.sd.business.entity.order.vo.OrderSalesShipmentStatisticsVo;
 import org.apache.ibatis.annotations.Param;
@@ -17,5 +18,18 @@ import java.util.List;
  * @since 2023-10-20
  */
 public interface OrderSalesShipmentStatisticsMapper extends BaseMapper<OrderSalesShipmentStatistics> {
+
+    /**
+     * 查询订单销售出库bom总数
+     * @param wrapper
+     * @return
+     */
     List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSalesShipmentStatistics> wrapper);
+
+    /**
+     * 查询近90、60、30天的订单销售出库bom总数
+     * @param wrapper
+     * @return
+     */
+    List<TurnoverRateSalesShipmentStatisticsBo> getTurnoverRateSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSalesShipmentStatistics> wrapper);
 }

+ 6 - 5
sd-business/src/main/java/com/sd/business/mapper/purchase/PurchaseBomMapper.java

@@ -50,20 +50,21 @@ public interface PurchaseBomMapper extends BaseMapper<PurchaseBom> {
      * @param wrapper
      * @return
      */
-    BigDecimal getPurchaseBomInTransitSum(@Param("ew") IWrapper<PurchaseBom> wrapper);
+    List<PurchaseInTransitBomVo> getPurchaseBomInTransitSum(@Param("ew") IWrapper<PurchaseBom> wrapper);
 
     /**
-     * 获取采购bom的到货时间
+     * 采购合同 bom分页
+     * @param page
      * @param wrapper
      * @return
      */
-    List<PurchaseInTransitBomVo> getPurchaseBomDeliveryDate(@Param("ew") IWrapper<PurchaseBom> wrapper);
+    Page<PurchaseBomDetailsVo> getDetailsPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchaseBomDetailsVo> wrapper);
 
     /**
-     * 采购合同 bom分页
+     * 采购看板分页
      * @param page
      * @param wrapper
      * @return
      */
-    Page<PurchaseBomDetailsVo> getDetailsPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchaseBomDetailsVo> wrapper);
+    Page<PurchaseBomBoardVo> getPurchaseBomBoardPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchaseBom> wrapper);
 }

+ 32 - 10
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java

@@ -21,9 +21,11 @@ import com.sd.business.entity.apply.po.ApplyBuyBom;
 import com.sd.business.entity.apply.vo.ApplyBuyBomAccessoryVo;
 import com.sd.business.entity.apply.vo.ApplyBuyBomVo;
 import com.sd.business.entity.apply.vo.ApplyBuyVo;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.constant.DepartmentConstant;
 import com.sd.business.entity.inventory.po.Inventory;
+import com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.apply.ApplyBuyMapper;
 import com.sd.business.service.apply.ApplyBuyBomService;
@@ -210,24 +212,44 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
         List<Long> bomSpecIds = list.stream().map(ApplyBuyBom::getBomSpecId).collect(Collectors.toList());
         Map<Long, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, bomSpecIds));
         Map<Long, BigDecimal> turnoverRateMap = orderSalesShipmentStatisticsService.getTurnoverRateMapByBomSpecIds(bomSpecIds);
+        // 在途数据
+        List<PurchaseInTransitBomVo> purchaseBomInTransitList = purchaseBomService.getPurchaseBomInTransitSum(bomSpecIds);
+        Map<Long, BigDecimal> inTransitMap = purchaseBomInTransitList.stream().collect(Collectors.toMap(PurchaseInTransitBomVo::getBomSpecId, PurchaseInTransitBomVo::getInTransitQuantity));
+
+        // 当月时间
+        Date date = DateUtil.date();
+        // 上上个月时间
+        Date beforeLastMonthDate = DateUtil.offsetMonth(date, -2);
+        Date beforeLastMonthBeginDate = DateUtil.beginOfMonth(beforeLastMonthDate);
+        // 查询近3个月的bom消耗数据
+        List<BomSpecOrderConsumptionBo> orderBomSpecOutStorageList = orderService.getOrderBomSpecOutStorageQuantity(bomSpecIds, beforeLastMonthBeginDate, date);
+        Map<Long, List<BomSpecOrderConsumptionBo>> bomSpecOutStorageMap = orderBomSpecOutStorageList.stream().collect(Collectors.groupingBy(BomSpecOrderConsumptionBo::getBomSpecId));
+
         for (ApplyBuyBom applyBuyBom : list) {
             Long bomSpecId = applyBuyBom.getBomSpecId();
             BomSpec bomSpec = bomSpecMap.get(bomSpecId);
             ApplyBuyBomAccessoryVo vo = new ApplyBuyBomAccessoryVo();
-            // 当月时间
-            Date date = DateUtil.date();
+            List<BomSpecOrderConsumptionBo> bomSpecConsumptionList = bomSpecOutStorageMap.getOrDefault(bomSpecId, Collections.emptyList());
+            // 当月消耗量
             Date currentMonthBeginDate = DateUtil.beginOfMonth(date);
-            BigDecimal currentMonthSalesQuantity = orderService.getOrderBomSpecOutStorageQuantity(bomSpecId, currentMonthBeginDate, date);
-            // 上个月时间
+            BigDecimal currentMonthSalesQuantity = bomSpecConsumptionList.stream()
+                    .filter(item -> currentMonthBeginDate.compareTo(item.getConsumptionDate()) <= 0 && date.compareTo(item.getConsumptionDate()) >= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 上个月消耗量
             Date lastMonthDate = DateUtil.offsetMonth(date, -1);
             Date lastMonthBeginDate = DateUtil.beginOfMonth(lastMonthDate);
             Date lastMonthEndDate = DateUtil.endOfMonth(lastMonthDate);
-            BigDecimal lastMonthSalesQuantity = orderService.getOrderBomSpecOutStorageQuantity(bomSpecId, lastMonthBeginDate, lastMonthEndDate);
-            // 上上个月时间
-            Date beforeLastMonthDate = DateUtil.offsetMonth(date, -2);
-            Date beforeLastMonthBeginDate = DateUtil.beginOfMonth(beforeLastMonthDate);
+            BigDecimal lastMonthSalesQuantity = bomSpecConsumptionList.stream()
+                    .filter(item -> lastMonthBeginDate.compareTo(item.getConsumptionDate()) <= 0 && lastMonthEndDate.compareTo(item.getConsumptionDate()) >= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 上上个月消耗量
             Date beforeLastMonthEndDate = DateUtil.endOfMonth(beforeLastMonthDate);
-            BigDecimal beforeLastMonth00Quantity = orderService.getOrderBomSpecOutStorageQuantity(bomSpecId, beforeLastMonthBeginDate, beforeLastMonthEndDate);
+            BigDecimal beforeLastMonth00Quantity = bomSpecConsumptionList.stream()
+                    .filter(item -> beforeLastMonthBeginDate.compareTo(item.getConsumptionDate()) <= 0 && beforeLastMonthEndDate.compareTo(item.getConsumptionDate()) >= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
             List<Inventory> inventoryList = inventoryService.list(q -> q
                     .eq(Inventory::getBomSpecId, bomSpecId)
                     .eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS)
@@ -235,7 +257,7 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
             // 当前库存数
             BigDecimal inventoryQuantity = ObjectUtil.isEmpty(inventoryList) ? BigDecimal.ZERO : StreamUtil.bigDecimalAdd(inventoryList, Inventory::getQuantity);
             // 在途数量
-            BigDecimal inTransitSum = purchaseBomService.getPurchaseBomInTransitSum(bomSpecId);
+            BigDecimal inTransitSum = inTransitMap.getOrDefault(bomSpecId, BigDecimal.ZERO);
             // 月平均消耗
             BigDecimal averageMonthSales = currentMonthSalesQuantity
                     .add(lastMonthSalesQuantity)

+ 0 - 1
sd-business/src/main/java/com/sd/business/service/check/impl/CheckServiceImpl.java

@@ -110,7 +110,6 @@ public class CheckServiceImpl extends ServiceImpl<CheckMapper, Check> implements
         long checkId = IdWorker.getId();
         checkDto.setId(checkId);
         checkDto.setCode(CodeEnum.CHECK_CODE.getCode());
-        checkDto.setStatus(0);
 
         List<CheckBom> checkBomList = checkDto.getCheckBomList();
         for (CheckBom checkBom : checkBomList) {

+ 13 - 1
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageBomServiceImpl.java

@@ -10,6 +10,7 @@ import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.in.dto.InOutStorageBomDto;
 import com.sd.business.entity.in.dto.InOutStorageBomSelectDto;
+import com.sd.business.entity.in.emums.InDetailTypeEnum;
 import com.sd.business.entity.in.emums.InOutTypeEnum;
 import com.sd.business.entity.in.po.InOutStorage;
 import com.sd.business.entity.in.po.InOutStorageBom;
@@ -99,7 +100,18 @@ public class InOutStorageBomServiceImpl extends ServiceImpl<InOutStorageBomMappe
         List<InOutStorageBomVo> list = page.getRecords();
         // 筛选吊牌、不干胶、彩纸出入库记录
         List<String> bomCodeList = Arrays.asList("40904003", "409001", "40101010");
-        List<InOutStorageBomVo> inOutStorageBomList = list.stream().filter(item -> !bomCodeList.contains(item.getBomSpecCode())).collect(Collectors.toList());
+        List<InOutStorageBomVo> inOutStorageBomList = list.stream()
+                .filter(item -> !bomCodeList.contains(item.getBomSpecCode()))
+                .filter(item -> {
+                    // 导出入库明细,入库类型不为采购入库时。筛选掉采购入库记录
+                    if (ObjectUtil.equals(dto.getType(), InOutTypeEnum.IN.getKey())
+                            && ObjectUtil.notEqual(dto.getDetailType(), InDetailTypeEnum.PURCHASE.getKey())
+                            && ObjectUtil.equals(item.getDetailType(), InDetailTypeEnum.PURCHASE.getKey())) {
+                        return false;
+                    }
+                    return true;
+                })
+                .collect(Collectors.toList());
         // 查询详情信息
         Set<Long> inOutStorageIds = inOutStorageBomList.stream().map(InOutStorageBom::getInOutStorageId).collect(Collectors.toSet());
         if (ObjectUtil.isEmpty(inOutStorageIds)) {

+ 4 - 0
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageServiceImpl.java

@@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -99,6 +100,9 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
             // 更新库存
             inventoryService.out(inOutStorageDto.getDepartmentId(), inOutStorageDto.getWarehouseId(), inOutStorageBomList, inOutStorageDto.getLockStorage());
         }
+        if (inOutStorageDto.getInOutStorageTime() == null) {
+            inOutStorageDto.setInOutStorageTime(new Date());
+        }
 
         // 保存出入库信息
         this.save(inOutStorageDto);

+ 13 - 5
sd-business/src/main/java/com/sd/business/service/order/OrderService.java

@@ -3,6 +3,7 @@ package com.sd.business.service.order;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.order.dto.OrderInfoDto;
 import com.sd.business.entity.order.dto.OrderSelectDto;
 import com.sd.business.entity.order.dto.SkuSpecPriceDto;
@@ -10,9 +11,9 @@ import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.vo.CompareVo;
 import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.order.vo.SkuSpecPriceVo;
+import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.entity.statement.vo.StatementOrderClassifyTotalCountVo;
 
-import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -97,14 +98,14 @@ public interface OrderService extends BaseService<OrderInfo> {
     CompareVo compare(OrderSelectDto dto);
 
     /**
-     * 获取订单bom的出库数
+     * 获取订单bom的出库数
      *
-     * @param bomSpecId bom规格id
+     * @param bomSpecIds bom规格id
      * @param startDate 开始时间
-     * @param endDate 结束时间
+     * @param endDate   结束时间
      * @return
      */
-    BigDecimal getOrderBomSpecOutStorageQuantity(Long bomSpecId, Date startDate, Date endDate);
+    List<BomSpecOrderConsumptionBo> getOrderBomSpecOutStorageQuantity(List<Long> bomSpecIds, Date startDate, Date endDate);
 
     /**
      * 获取万里牛单号
@@ -148,4 +149,11 @@ public interface OrderService extends BaseService<OrderInfo> {
      * @return
      */
     StatementOrderClassifyTotalCountVo getOrderClassifyTotalCount(List<Long> statementIds);
+
+    /**
+     * 订单删除退料清单
+     * @param id
+     * @return
+     */
+    List<OutBomVo> returnBomList(Long id);
 }

+ 90 - 12
sd-business/src/main/java/com/sd/business/service/order/impl/OrderExchangeServiceImpl.java

@@ -1,6 +1,7 @@
 package com.sd.business.service.order.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,18 +17,15 @@ import com.sd.business.entity.department.po.Department;
 import com.sd.business.entity.order.dto.OrderExchangeDto;
 import com.sd.business.entity.order.dto.OrderExchangeSelectDto;
 import com.sd.business.entity.order.enums.OrderClassifyEnum;
-import com.sd.business.entity.order.po.OrderExchange;
-import com.sd.business.entity.order.po.OrderExchangeDetail;
-import com.sd.business.entity.order.po.OrderInfo;
-import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.order.enums.OrderStatusEnum;
+import com.sd.business.entity.order.po.*;
 import com.sd.business.entity.order.vo.OrderExchangeDetailVo;
 import com.sd.business.entity.order.vo.OrderExchangeVo;
+import com.sd.business.entity.statement.dto.StatementOfAccountDto;
 import com.sd.business.mapper.order.OrderExchangeMapper;
-import com.sd.business.service.order.OrderExchangeDetailService;
-import com.sd.business.service.order.OrderExchangeService;
-import com.sd.business.service.order.OrderService;
-import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.order.*;
 import com.sd.business.service.sku.SkuSpecService;
+import com.sd.business.service.statement.StatementOfAccountService;
 import com.sd.business.util.CodeEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -60,6 +58,12 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
     @Autowired
     private OrderService orderService;
 
+    @Autowired
+    private OrderSkuBomService orderSkuBomService;
+
+    @Autowired
+    private StatementOfAccountService statementOfAccountService;
+
     @Override
     public Page<OrderExchangeVo> getPage(OrderExchangeSelectDto dto) {
         IWrapper<OrderExchange> wrapper = getWrapper();
@@ -201,10 +205,54 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
         orderExchangeDetailService.saveBatch(orderExchangeDetailList);
         ObsFileUtil.saveFile(orderExchangeDto.getFileList(), orderExchangeDto.getId());
 
-        // 订单分类修改为售后订单
-        orderService.update(q -> q
-                .set(OrderInfo::getClassify, OrderClassifyEnum.AFTER_SALE_ORDER.getKey())
-                .eq(BaseIdPo::getId, orderExchangeDto.getOrderInfoId()));
+        Map<Long, BigDecimal> exchangeDetailMap = orderExchangeDetailList.stream()
+                .filter(item -> item.getQuantity().compareTo(BigDecimal.ZERO) > 0)
+                .collect(Collectors.toMap(OrderExchangeDetail::getOrderSkuId, OrderExchangeDetail::getQuantity));
+        if (ObjectUtil.isEmpty(exchangeDetailMap)) {
+            return;
+        }
+        // 新增售后订单,分类修改为售后订单
+        OrderInfo orderInfo = orderService.getById(orderExchangeDto.getOrderInfoId());
+        orderInfo.setId(IdWorker.getId());
+        orderInfo.setWlnUid(null);
+        orderInfo.setClassify(OrderClassifyEnum.AFTER_SALE_ORDER.getKey());
+        orderInfo.setStatus(OrderStatusEnum.EXCHANGE.getKey());
+        orderInfo.setTotalAmount(BigDecimal.ZERO);
+        orderInfo.setProductTotalAmount(BigDecimal.ZERO);
+        orderInfo.setCustomProcessingFee(BigDecimal.ZERO);
+        orderInfo.setLssueFee(BigDecimal.ZERO);
+        orderInfo.setDeliveryMaterialsFee(BigDecimal.ZERO);
+        orderInfo.setPackingLabor(BigDecimal.ZERO);
+        orderInfo.setManagementFee(BigDecimal.ZERO);
+        orderInfo.setPackagingMaterialCost(BigDecimal.ZERO);
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(BaseIdPo::getId, exchangeDetailMap.keySet()));
+        Map<Long, Long> orderSkuIdMap = new HashMap<>();
+        for (OrderSku orderSku : orderSkuList) {
+            BigDecimal quantity = exchangeDetailMap.get(orderSku.getId());
+            long orderSkuId = IdWorker.getId();
+            orderSkuIdMap.put(orderSku.getId(), orderSkuId);
+            orderSku.setQuantity(quantity);
+            orderSku.setId(orderSkuId);
+            orderSku.setOrderId(orderInfo.getId());
+            this.addOrderInfoPrice(orderInfo, orderSku);
+        }
+        List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderSkuId, exchangeDetailMap.keySet()));
+        // 替换订单id和订单sku id
+        for (OrderSkuBom orderSkuBom : orderSkuBomList) {
+            orderSkuBom.setId(null);
+            orderSkuBom.setOrderId(orderInfo.getId());
+            orderSkuBom.setOrderSkuId(orderSkuIdMap.get(orderSkuBom.getOrderSkuId()));
+        }
+
+        // 新增订单信息
+        orderService.save(orderInfo);
+        orderSkuService.saveBatch(orderSkuList);
+        orderSkuBomService.saveBatch(orderSkuBomList);
+        // 生成对账单
+        StatementOfAccountDto statement = new StatementOfAccountDto();
+        statement.setDepartmentId(orderInfo.getDepartmentId());
+        statement.setOrderIdList(Collections.singletonList(orderInfo.getId()));
+        statementOfAccountService.add(statement);
     }
 
     @Override
@@ -212,4 +260,34 @@ public class OrderExchangeServiceImpl extends ServiceImpl<OrderExchangeMapper, O
         this.removeById(id);
     }
 
+    /**
+     * 添加订单价格
+     */
+    private void addOrderInfoPrice(OrderInfo orderInfo, OrderSku orderSku) {
+        BigDecimal quantity = orderSku.getQuantity();
+
+        BigDecimal productTotalAmount = quantity.multiply(orderSku.getUnitPrice());
+        BigDecimal customProcessingFee = quantity.multiply(orderSku.getCustomProcessingFee());
+        BigDecimal lssueFee = quantity.multiply(orderSku.getLssueFee());
+        BigDecimal deliveryMaterialsFee = quantity.multiply(orderSku.getDeliveryMaterialsFee());
+        BigDecimal packingLabor = quantity.multiply(orderSku.getPackingLabor());
+        BigDecimal packagingMaterialCost = quantity.multiply(orderSku.getPackagingMaterialCost());
+        BigDecimal managementFee = quantity.multiply(orderSku.getManagementFee());
+        BigDecimal totalAmount = productTotalAmount
+                .add(customProcessingFee)
+                .add(lssueFee)
+                .add(deliveryMaterialsFee)
+                .add(packingLabor)
+                .add(packagingMaterialCost)
+                .add(managementFee);
+
+        orderInfo.setProductTotalAmount(orderInfo.getProductTotalAmount().add(productTotalAmount));
+        orderInfo.setCustomProcessingFee(orderInfo.getCustomProcessingFee().add(customProcessingFee));
+        orderInfo.setLssueFee(orderInfo.getLssueFee().add(lssueFee));
+        orderInfo.setDeliveryMaterialsFee(orderInfo.getDeliveryMaterialsFee().add(deliveryMaterialsFee));
+        orderInfo.setPackingLabor(orderInfo.getPackingLabor().add(packingLabor));
+        orderInfo.setManagementFee(orderInfo.getManagementFee().add(managementFee));
+        orderInfo.setPackagingMaterialCost(orderInfo.getPackagingMaterialCost().add(packagingMaterialCost));
+        orderInfo.setTotalAmount(orderInfo.getTotalAmount().add(totalAmount));
+    }
 }

+ 115 - 29
sd-business/src/main/java/com/sd/business/service/order/impl/OrderSalesShipmentStatisticsServiceImpl.java

@@ -3,10 +3,14 @@ package com.sd.business.service.order.impl;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.tenant.entity.dict.po.DictCommonData;
+import com.fjhx.tenant.service.dict.DictCommonDataService;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo;
 import com.sd.business.entity.board.dto.TurnoverRateBoardSelectDto;
 import com.sd.business.entity.board.vo.TurnoverRateStatisticsVo;
+import com.sd.business.entity.bom.po.Bom;
 import com.sd.business.entity.bom.po.BomClassify;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.constant.DepartmentConstant;
@@ -30,6 +34,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static java.util.Comparator.comparing;
@@ -54,6 +59,9 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
     @Autowired
     private InventoryBackupService inventoryBackupService;
 
+    @Autowired
+    private DictCommonDataService dictCommonDataService;
+
     @Override
     public List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsByDate(OrderSalesShipmentStatisticsDto dto) {
         IWrapper<OrderSalesShipmentStatistics> wrapper = getWrapper();
@@ -72,25 +80,49 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
     @Override
     public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(TurnoverRateBoardSelectDto dto) {
         Date date = new Date();
-        Date beginDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -dto.getDays() - 1));
-        Date endDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -1));
-        OrderSalesShipmentStatisticsDto statisticsDto = new OrderSalesShipmentStatisticsDto();
-        statisticsDto.setBomClassify(dto.getBomClassify());
-        statisticsDto.setBeginDate(beginDate);
-        statisticsDto.setEndDate(endDate);
-        List<OrderSalesShipmentStatisticsVo> statisticsVoList = this.getSalesShipmentStatisticsByDate(statisticsDto);
+        String ninetyDaysDate = DateUtil.format(DateUtil.offsetDay(date, -91), "yyyy-MM-dd");
+        String sixtyDaysDate = DateUtil.format(DateUtil.offsetDay(date, -61), "yyyy-MM-dd");
+        String thirtyDaysDate = DateUtil.format(DateUtil.offsetDay(date, -31), "yyyy-MM-dd");
+        String endDate = DateUtil.format(DateUtil.offsetDay(date, -1), "yyyy-MM-dd");
+
+        IWrapper<OrderSalesShipmentStatistics> wrapper = getWrapper();
+        wrapper.orderByDesc("osss", OrderSalesShipmentStatistics::getId);
+        wrapper.between("osss", OrderSalesShipmentStatistics::getTotalDate, ninetyDaysDate, endDate);
+        if (Objects.equals(dto.getBomClassify(), 1)) {
+            wrapper.eq("bc", BomClassify::getCode, "201.G");
+        } else if (Objects.equals(dto.getBomClassify(), 2)){
+            wrapper.eq("bc", BomClassify::getCode,"202.G");
+        } else if (Objects.equals(dto.getBomClassify(), 3)) {
+            wrapper.eq("bc", BomClassify::getCode,"203.G");
+        }
+        wrapper.ne("bs", BomSpec::getCode, "1010000007");
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.like("bs", BomSpec::getWidth, dto.getWidth());
+        wrapper.like("bs", BomSpec::getHeight, dto.getHeight());
+        wrapper.groupBy("osss.bom_spec_id");
+        List<TurnoverRateSalesShipmentStatisticsBo> statisticsVoList = this.baseMapper.getTurnoverRateSalesShipmentStatisticsList(wrapper);
         if (ObjectUtil.isEmpty(statisticsVoList)) {
             return Collections.emptyList();
         }
-        List<Long> bomSpecIds = statisticsVoList.stream().map(OrderSalesShipmentStatistics::getBomSpecId).collect(Collectors.toList());
+        List<Long> bomSpecIds = statisticsVoList.stream().map(TurnoverRateSalesShipmentStatisticsBo::getBomSpecId).collect(Collectors.toList());
 
-        // 期初库存数据
-        Map<Long, InventoryBackup> beginBackupMap = inventoryBackupService.mapKEntity(InventoryBackup::getBomSpecId, q -> q
-                .eq(InventoryBackup::getBackupDate, beginDate)
+        Map<String, String> bomChromatophoreMap = dictCommonDataService.list(q -> q.eq(DictCommonData::getDictCode, "bom_chromatophore"))
+                .stream().collect(Collectors.toMap(DictCommonData::getDictKey, DictCommonData::getDictValue));
+
+        // 查询前90、60、30天的所有库存数据
+        List<InventoryBackup> inventoryBackupList = inventoryBackupService.list(q -> q
+                .in(InventoryBackup::getBackupDate, ninetyDaysDate, sixtyDaysDate, thirtyDaysDate)
                 .eq(InventoryBackup::getDepartmentId, DepartmentConstant.SD_SPORTS)
                 .eq(InventoryBackup::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
                 .in(InventoryBackup::getBomSpecId, bomSpecIds));
 
+        // 期初库存数据
+        Map<String, Map<Long, InventoryBackup>> beginBackupMap = inventoryBackupList.stream()
+                .collect(
+                        Collectors.groupingBy(
+                                item -> DateUtil.format(item.getBackupDate(), "yyyy-MM-dd"),
+                                Collectors.toMap(InventoryBackup::getBomSpecId, Function.identity())));
+
         // 期末库存数据
         Map<Long, InventoryBackup> endBackupMap = inventoryBackupService.mapKEntity(InventoryBackup::getBomSpecId, q -> q
                 .eq(InventoryBackup::getBackupDate, endDate)
@@ -99,18 +131,37 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                 .in(InventoryBackup::getBomSpecId, bomSpecIds));
 
         List<TurnoverRateStatisticsVo> list = statisticsVoList.stream().map(item -> {
+            Long bomSpecId = item.getBomSpecId();
             // 计算周转率
             // 时间段库存周转天数 = 时间段天数 * (1 / 2) * (期初库存数量+期末库存数量) / 时间段销售量;
             // 库存周转率 = 时间段天数 / 库存周转天数。
             // 获取期初和期末数据
-            InventoryBackup beginBackup = beginBackupMap.get(item.getBomSpecId());
-            InventoryBackup endBackup = endBackupMap.get(item.getBomSpecId());
-            BigDecimal beginQuantity;
+            InventoryBackup beginBackupNinetyDays = beginBackupMap.getOrDefault(ninetyDaysDate, Collections.emptyMap()).get(bomSpecId);
+            InventoryBackup beginBackupSixtyDays = beginBackupMap.getOrDefault(sixtyDaysDate, Collections.emptyMap()).get(bomSpecId);
+            InventoryBackup beginBackupThirtyDays = beginBackupMap.getOrDefault(thirtyDaysDate, Collections.emptyMap()).get(bomSpecId);
+            InventoryBackup endBackup = endBackupMap.get(bomSpecId);
+            // 计算bom近90、60、30天的期初库存数量
+            BigDecimal beginQuantityNinetyDays;
+            BigDecimal beginQuantitySixtyDays;
+            BigDecimal beginQuantityThirtyDays;
             BigDecimal endQuantity;
-            if (beginBackup == null) {
-                beginQuantity = BigDecimal.ZERO;
+            if (beginBackupNinetyDays == null) {
+                beginQuantityNinetyDays = BigDecimal.ZERO;
             } else {
-                beginQuantity = beginBackup.getQuantity().add(beginBackup.getLockQuantity() == null ? BigDecimal.ZERO : beginBackup.getLockQuantity());
+                beginQuantityNinetyDays = beginBackupNinetyDays.getQuantity()
+                        .add(beginBackupNinetyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupNinetyDays.getLockQuantity());
+            }
+            if (beginBackupSixtyDays == null) {
+                beginQuantitySixtyDays = BigDecimal.ZERO;
+            } else {
+                beginQuantitySixtyDays = beginBackupSixtyDays.getQuantity()
+                        .add(beginBackupSixtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupSixtyDays.getLockQuantity());
+            }
+            if (beginBackupThirtyDays == null) {
+                beginQuantityThirtyDays = BigDecimal.ZERO;
+            } else {
+                beginQuantityThirtyDays = beginBackupThirtyDays.getQuantity()
+                        .add(beginBackupThirtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupThirtyDays.getLockQuantity());
             }
             if (endBackup == null) {
                 endQuantity = BigDecimal.ZERO;
@@ -118,28 +169,61 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                 endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
             }
             // 时间段天数
-            BigDecimal days = new BigDecimal(dto.getDays());
-            BigDecimal turnoverRate;
-            if (ObjectUtil.equals(item.getQuantity(), BigDecimal.ZERO)
-                    || ObjectUtil.equals(beginQuantity.add(endQuantity), BigDecimal.ZERO)) {
-                turnoverRate = BigDecimal.ZERO;
+            BigDecimal days;
+            BigDecimal turnoverRateNinetyDays;
+            BigDecimal turnoverRateSixtyDays;
+            BigDecimal turnoverRateThirtyDays;
+            if (ObjectUtil.equals(item.getNinetyDaysSalesQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantityNinetyDays.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRateNinetyDays = BigDecimal.ZERO;
             } else {
-                turnoverRate = days
+                days = new BigDecimal(90);
+                turnoverRateNinetyDays = days
                         .divide(days.multiply(new BigDecimal("0.5"))
-                                        .multiply(beginQuantity.add(endQuantity))
-                                        .divide(item.getQuantity(), 4, RoundingMode.HALF_UP),
+                                        .multiply(beginQuantityNinetyDays.add(endQuantity))
+                                        .divide(item.getNinetyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
                                 4, RoundingMode.HALF_UP);
             }
-            if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO) && ObjectUtil.equals(turnoverRate, BigDecimal.ZERO)) {
+            if (ObjectUtil.equals(item.getSixtyDaysSalesQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantitySixtyDays.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRateSixtyDays = BigDecimal.ZERO;
+            } else {
+                days = new BigDecimal(60);
+                turnoverRateSixtyDays = days
+                        .divide(days.multiply(new BigDecimal("0.5"))
+                                        .multiply(beginQuantitySixtyDays.add(endQuantity))
+                                        .divide(item.getSixtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
+                                4, RoundingMode.HALF_UP);
+            }
+            if (ObjectUtil.equals(item.getThirtyDaysSalesQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantityThirtyDays.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRateThirtyDays = BigDecimal.ZERO;
+            } else {
+                days = new BigDecimal(30);
+                turnoverRateThirtyDays = days
+                        .divide(days.multiply(new BigDecimal("0.5"))
+                                        .multiply(beginQuantityThirtyDays.add(endQuantity))
+                                        .divide(item.getThirtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
+                                4, RoundingMode.HALF_UP);
+            }
+            if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO)) {
                 return null;
             }
             TurnoverRateStatisticsVo vo = new TurnoverRateStatisticsVo();
             vo.setBomSpecCode(item.getBomSpecCode());
             vo.setBomSpecName(item.getBomSpecName());
-            vo.setTurnoverRate(turnoverRate);
+            vo.setWidth(item.getWidth());
+            vo.setHeight(item.getHeight());
+            vo.setChromatophore(bomChromatophoreMap.get(item.getChromatophore()));
+            vo.setSalesQuantityThirtyDays(item.getThirtyDaysSalesQuantity());
+            vo.setSalesQuantitySixtyDays(item.getSixtyDaysSalesQuantity());
+            vo.setSalesQuantityNinetyDays(item.getNinetyDaysSalesQuantity());
+            vo.setTurnoverRateNinetyDays(turnoverRateNinetyDays);
+            vo.setTurnoverRateSixtyDays(turnoverRateSixtyDays);
+            vo.setTurnoverRateThirtyDays(turnoverRateThirtyDays);
             vo.setQuantity(endQuantity);
             return vo;
-        }).filter(Objects::nonNull).sorted(comparing(TurnoverRateStatisticsVo::getTurnoverRate)).collect(Collectors.toList());
+        }).filter(Objects::nonNull).sorted(comparing(TurnoverRateStatisticsVo::getTurnoverRateNinetyDays)).collect(Collectors.toList());
         return list;
     }
 
@@ -159,7 +243,9 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
             if (list.isEmpty()) {
                 return;
             }
-            Map<Long, OrderSalesShipmentStatistics> statisticsMap = this.mapKEntity(OrderSalesShipmentStatistics::getBomSpecId, q -> q.eq(OrderSalesShipmentStatistics::getTotalDate, formatDate));
+            Map<Long, OrderSalesShipmentStatistics> statisticsMap = this.mapKEntity(
+                    OrderSalesShipmentStatistics::getBomSpecId,
+                    q -> q.eq(OrderSalesShipmentStatistics::getTotalDate, formatDate));
 
             List<Long> orderIds = list.stream().map(BaseIdPo::getId).collect(Collectors.toList());
             List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIds));

+ 99 - 11
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -22,6 +22,7 @@ import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
 import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.bom.po.Bom;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.po.Department;
@@ -39,6 +40,7 @@ import com.sd.business.entity.order.vo.*;
 import com.sd.business.entity.price.po.PriceBillingStandard;
 import com.sd.business.entity.price.po.PriceBillingStandardDetail;
 import com.sd.business.entity.production.po.ProductionWorkOrder;
+import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.statement.po.StatementOfAccount;
 import com.sd.business.entity.statement.vo.StatementOrderClassifyTotalCountVo;
@@ -68,6 +70,7 @@ import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * <p>
@@ -931,24 +934,37 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
     }
 
     @Override
-    public BigDecimal getOrderBomSpecOutStorageQuantity(Long bomSpecId, Date startDate, Date endDate) {
+    public List<BomSpecOrderConsumptionBo> getOrderBomSpecOutStorageQuantity(List<Long> bomSpecIds, Date startDate, Date endDate) {
         // 根据对账时间获取有对账单的订单
         List<StatementOfAccount> list = statementOfAccountService.list(q -> q.between(StatementOfAccount::getTimePeriod, startDate, endDate));
         List<Long> accountIds = list.stream().map(StatementOfAccount::getId).collect(Collectors.toList());
 
-        Map<Long, BomSpecBo> bomSpecBo = skuSpecService.getBomSpecBoByIdList(Collections.singleton(bomSpecId));
+
         IWrapper<OrderInfo> wrapper = getWrapper();
-        wrapper.ge("o", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey());
+        wrapper.in("o", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
         wrapper.in("o", OrderInfo::getStatementOfAccountId, accountIds);
-        if (ObjectUtil.equal(bomSpecBo.get(bomSpecId).getClassifyParentId(), 1L)) {
-            // 查询主材消耗数量
-            wrapper.eq("os", OrderSku::getBomSpecId, bomSpecId);
-            return this.baseMapper.getOrderSkuOutStorageQuantity(wrapper);
-        } else {
-            // 查询包材消耗数量
-            wrapper.eq("osb", OrderSkuBom::getBomSpecId, bomSpecId);
-            return this.baseMapper.getOrderSkuBomOutStorageQuantity(wrapper);
+
+        // 查询主材消耗数量
+        wrapper.groupBy("os.bom_spec_id", "soa.time_period");
+        wrapper.in("os", OrderSku::getBomSpecId, bomSpecIds);
+        List<BomSpecOrderConsumptionBo> orderSkuOutStorageList = this.baseMapper.getOrderSkuOutStorageQuantity(wrapper);
+
+        wrapper = IWrapper.getWrapper();
+        wrapper.in("o", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.in("o", OrderInfo::getStatementOfAccountId, accountIds);
+        wrapper.groupBy("osb.bom_spec_id", "soa.time_period");
+        // 查询包材消耗数量
+        wrapper.in("osb", OrderSkuBom::getBomSpecId, bomSpecIds);
+        List<BomSpecOrderConsumptionBo> orderSkuBomOutStorageList = this.baseMapper.getOrderSkuBomOutStorageQuantity(wrapper);
+        List<BomSpecOrderConsumptionBo> bomOutStorageList = new ArrayList<>();
+        if (ObjectUtil.isNotEmpty(orderSkuOutStorageList)) {
+            bomOutStorageList.addAll(orderSkuOutStorageList);
+        }
+        if (ObjectUtil.isNotEmpty(orderSkuBomOutStorageList)) {
+            bomOutStorageList.addAll(orderSkuBomOutStorageList);
         }
+
+        return bomOutStorageList;
     }
 
     @Override
@@ -1026,6 +1042,78 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         return this.baseMapper.getOrderClassifyTotalCount(wrapper);
     }
 
+    @Override
+    public List<OutBomVo> returnBomList(Long id) {
+        OrderInfo orderInfo = this.getById(id);
+        if (orderInfo == null) {
+            throw new ServiceException("未找到订单");
+        }
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, id));
+        List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.eq(OrderSkuBom::getOrderId, id));
+        Map<Long, OrderSku> orderSkuMap = orderSkuList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
+        if (Objects.equals(orderInfo.getClassify(), OrderClassifyEnum.OUTSOURCE_ORDER.getKey())) {
+            orderSkuList = Collections.emptyList();
+        }
+
+        Map<Long, OutBomVo> map = Stream.concat(
+                        // 主材
+                        orderSkuList.stream()
+                                .map(item -> {
+                                    OutBomVo outBomVo = new OutBomVo();
+                                    outBomVo.setBomSpecId(item.getBomSpecId());
+                                    outBomVo.setOutQuantity(item.getQuantity());
+                                    return outBomVo;
+                                }),
+
+                        // 包材
+                        orderSkuBomList.stream().map(item -> {
+                            OrderSku orderSku = orderSkuMap.get(item.getOrderSkuId());
+                            OutBomVo outBomVo = new OutBomVo();
+                            outBomVo.setBomSpecId(item.getBomSpecId());
+                            outBomVo.setOutQuantity(item.getQuantity().multiply(orderSku.getQuantity()));
+                            return outBomVo;
+                        })
+                )
+                .collect(Collectors.toMap(
+                        OutBomVo::getBomSpecId,
+                        Function.identity(),
+                        (v1, v2) -> {
+                            v1.setOutQuantity(v1.getOutQuantity().add(v2.getOutQuantity()));
+                            return v1;
+                        })
+                );
+
+        // 合并sku主材和包材
+        List<OutBomVo> outBomVoList = new ArrayList<>(map.values());
+
+        // 区分半成品仓和包材仓库
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(map.keySet());
+
+        for (OutBomVo outBomVo : outBomVoList) {
+            Long bomSpecId = outBomVo.getBomSpecId();
+            BomSpecBo bomSpecBo = bomSpecBoMap.get(bomSpecId);
+            outBomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+            outBomVo.setBomSpecName(bomSpecBo.getBomSpecName());
+            outBomVo.setClassifyId(bomSpecBo.getClassifyId());
+            outBomVo.setClassifyName(bomSpecBo.getClassifyName());
+            outBomVo.setClassifyParentId(bomSpecBo.getClassifyParentId());
+
+            // 主材
+            if (Objects.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                outBomVo.setWarehouseId(WarehouseConstant.SEMI_FINISHED_PRODUCT);
+                outBomVo.setWarehouseName("半成品仓");
+            }
+            // 包材
+            else {
+                outBomVo.setWarehouseId(WarehouseConstant.PACKAGING_MATERIAL);
+                outBomVo.setWarehouseName("包材仓");
+            }
+        }
+        return outBomVoList.stream()
+                .sorted(Comparator.comparing(OutBomVo::getWarehouseId, Comparator.reverseOrder()).thenComparing(OutBomVo::getBomSpecCode))
+                .collect(Collectors.toList());
+    }
+
     /**
      * 删除订单以及订单关联数据
      */

+ 1 - 1
sd-business/src/main/java/com/sd/business/service/production/impl/ProductionOrderServiceImpl.java

@@ -101,7 +101,7 @@ public class ProductionOrderServiceImpl implements ProductionOrderService {
     public Page<ProductionOrderVo> getPage(ProductionOrderDto dto) {
 
         IWrapper<ProductionOrderVo> wrapper = IWrapper.getWrapper();
-        wrapper.ge("oi", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey());
+        wrapper.in("oi", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
         wrapper.like("oi", OrderInfo::getCode, dto.getCode());
         wrapper.like("oi", OrderInfo::getWlnCode, dto.getWlnCode());
         wrapper.eq("oi", OrderInfo::getDepartmentId, dto.getDepartmentId());

+ 3 - 2
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseBomService.java

@@ -10,6 +10,7 @@ import com.sd.business.entity.purchase.po.PurchaseBom;
 import com.sd.business.entity.purchase.vo.*;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
@@ -60,8 +61,8 @@ public interface PurchaseBomService extends BaseService<PurchaseBom> {
 
     /**
      * 获取采购bom的在途数量
-     * @param bomSpecId
+     * @param bomSpecIds
      * @return
      */
-    BigDecimal getPurchaseBomInTransitSum(Long bomSpecId);
+    List<PurchaseInTransitBomVo> getPurchaseBomInTransitSum(List<Long> bomSpecIds);
 }

+ 1 - 2
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java

@@ -73,7 +73,6 @@ public interface PurchaseService extends BaseService<Purchase> {
     /**
      * 导入E10采购合同
      * @param list
-     * @param bomImportDataList
      */
-    void purchaseImport(List<PurchaseImportDataDto> list, List<PurchaseBomImportDataDto> bomImportDataList);
+    void purchaseImport(List<PurchaseBomImportDataDto> list);
 }

+ 61 - 67
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java

@@ -1,6 +1,7 @@
 package com.sd.business.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.constant.StatusConstant;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.bom.dto.BomSpecSelectDto;
 import com.sd.business.entity.bom.po.Bom;
 import com.sd.business.entity.bom.po.BomSpec;
@@ -149,23 +151,22 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
 
     @Override
     public Page<PurchaseBomBoardVo> getPurchaseBoardPage(PurchaseBoardSelectDto dto) {
-        BomSpecSelectDto bomSpecSelectDto = new BomSpecSelectDto();
-        bomSpecSelectDto.setName(dto.getBomSpecName());
-        bomSpecSelectDto.setCode(dto.getBomSpecCode());
-        bomSpecSelectDto.setPageNum(dto.getPageNum());
-        bomSpecSelectDto.setPageSize(dto.getPageSize());
-        Page<BomSpecVo> bomSpecVoPage = bomSpecService.getPage(bomSpecSelectDto);
-        List<BomSpecVo> records = bomSpecVoPage.getRecords();
-        Page<PurchaseBomBoardVo> page = new Page<>();
-        page.setSize(bomSpecVoPage.getSize());
-        page.setTotal(bomSpecVoPage.getTotal());
+        IWrapper<PurchaseBom> wrapper = getWrapper();
+        wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
+        wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
+        if (Objects.equals(dto.getSortBy(), 1)) {
+            wrapper.orderByAsc(dto.getSortField());
+        } else {
+            wrapper.orderByDesc(dto.getSortField());
+        }
+        Page<PurchaseBomBoardVo> bomSpecVoPage = this.baseMapper.getPurchaseBomBoardPage(dto.getPage(), wrapper);
+        List<PurchaseBomBoardVo> records = bomSpecVoPage.getRecords();
         if (ObjectUtil.isEmpty(records)) {
-            return page;
+            return bomSpecVoPage;
         }
         Date date = new Date();
-        List<PurchaseBomBoardVo> list = new ArrayList<>();
 
-        List<Long> bomSpecIds = records.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<Long> bomSpecIds = records.stream().map(PurchaseBomBoardVo::getBomSpecId).collect(Collectors.toList());
         // 查询库存数据
         Map<Long, List<Inventory>> inventorMap = inventoryService.mapKGroup(
                 Inventory::getBomSpecId,
@@ -174,37 +175,43 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
                         .in(Inventory::getWarehouseId,
                                 Arrays.asList(WarehouseConstant.SEMI_FINISHED_PRODUCT, WarehouseConstant.PACKAGING_MATERIAL)));
 
-        // 查询周转率数据
-        Map<Long, BigDecimal> turnoverRateMap = orderSalesShipmentStatisticsService.getTurnoverRateMapByBomSpecIds(bomSpecIds);
+        // 在途数据
+        List<PurchaseInTransitBomVo> purchaseBomInTransitList = this.getPurchaseBomInTransitSum(bomSpecIds);
+        Map<Long, BigDecimal> inTransitMap = purchaseBomInTransitList.stream().collect(Collectors.toMap(PurchaseInTransitBomVo::getBomSpecId, PurchaseInTransitBomVo::getInTransitQuantity));
+        // 查询近60天的bom消耗数据
+        List<BomSpecOrderConsumptionBo> orderBomSpecOutStorageList = orderService.getOrderBomSpecOutStorageQuantity(bomSpecIds, DateUtil.offsetDay(date, -60), date);
+        Map<Long, List<BomSpecOrderConsumptionBo>> bomSpecOutStorageMap = orderBomSpecOutStorageList.stream().collect(Collectors.groupingBy(BomSpecOrderConsumptionBo::getBomSpecId));
 
-        // 获取bom的下一批到货天数
-        IWrapper<PurchaseBom> wrapper = IWrapper.getWrapper();
-        wrapper.in("pb", PurchaseBom::getBomSpecId, bomSpecIds);
-        wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
-        wrapper.eq("p", Purchase::getStorageStatus, StatusConstant.NO);
-        wrapper.gt("p", Purchase::getDeliveryDate, date);
-        wrapper.groupBy("pb.bom_spec_id");
-        List<PurchaseInTransitBomVo> deliveryDateList = this.baseMapper.getPurchaseBomDeliveryDate(wrapper);
-        Map<Long, Date> deliveryDateMap = deliveryDateList.stream().collect(Collectors.toMap(PurchaseInTransitBomVo::getBomSpecId, PurchaseInTransitBomVo::getDeliveryDate));
-
-        for (BomSpecVo record : records) {
-            PurchaseBomBoardVo purchaseBomBoard = new PurchaseBomBoardVo();
-            Long bomSpecId = record.getId();
+        for (PurchaseBomBoardVo record : records) {
+            Long bomSpecId = record.getBomSpecId();
             List<Inventory> inventoryList = inventorMap.get(bomSpecId);
+            List<BomSpecOrderConsumptionBo> bomSpecConsumptionList = bomSpecOutStorageMap.getOrDefault(bomSpecId, Collections.emptyList());
 
             // 当前库存数
             BigDecimal inventoryQuantity = ObjectUtil.isEmpty(inventoryList) ? BigDecimal.ZERO : StreamUtil.bigDecimalAdd(inventoryList, Inventory::getQuantity);
             // 近7天消耗量
-            BigDecimal quantitySevenDays = orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -7), date);
+            Date sevenDate = DateUtil.offsetDay(date, -7);
+            BigDecimal quantitySevenDays = bomSpecConsumptionList.stream()
+                    .filter(item -> sevenDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
             // 近30天消耗量
-            BigDecimal quantityThirtyDays = orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -30), date);
+            Date thirtyDate = DateUtil.offsetDay(date, -30);
+            BigDecimal quantityThirtyDays = bomSpecConsumptionList.stream()
+                    .filter(item -> thirtyDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
             // 40天安全库存
             BigDecimal safetyInventoryQuantity = quantityThirtyDays.divide(new BigDecimal("30"), 2, RoundingMode.HALF_UP)
                     .multiply(new BigDecimal("40")).setScale(0, RoundingMode.HALF_UP);
 
             // 近14天消耗量
-            BigDecimal quantityTwoWeek = orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -14), date);
+            Date twoWeekDate = DateUtil.offsetDay(date, -14);
+            BigDecimal quantityTwoWeek = bomSpecConsumptionList.stream()
+                    .filter(item -> twoWeekDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
             // 近两周减去近一周的消耗量为上周数量
             BigDecimal quantityLastWeek = quantityTwoWeek.subtract(quantitySevenDays);
             // 周环比率
@@ -215,45 +222,31 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
                 weekOnWeekRatio = quantitySevenDays.subtract(quantityLastWeek).divide(quantityLastWeek, 2, RoundingMode.HALF_UP);
             }
 
-            // 预计消耗天数
-            int predictOutStorageDays = 0;
-            if (quantitySevenDays.compareTo(BigDecimal.ZERO) != 0) {
-                predictOutStorageDays = inventoryQuantity.divide(quantitySevenDays
-                        .divide(new BigDecimal("7"), 2, RoundingMode.HALF_UP), 2, RoundingMode.HALF_UP).intValue();
-            }
-
             // 获取在途总数
-            purchaseBomBoard.setInTransitSum(this.getPurchaseBomInTransitSum(bomSpecId));
+            BigDecimal inTransitSum = inTransitMap.getOrDefault(bomSpecId, BigDecimal.ZERO);
+            record.setInTransitSum(inTransitSum);
 
-            // 获取下一批到货天数
-            Date deliveryDate = deliveryDateMap.get(bomSpecId);
-            long nextDeliveryDays = 0L;
-            if (ObjectUtil.isNotEmpty(deliveryDate)) {
-                nextDeliveryDays = DateUtil.between(date, deliveryDate, DateUnit.DAY);
-            }
+            // 近15天消耗量
+            Date fifteenDate = DateUtil.offsetDay(date, -15);
+            BigDecimal quantityFifteenDays = bomSpecConsumptionList.stream()
+                    .filter(item -> fifteenDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 近60天消耗量
+            BigDecimal quantitySixtyDays = bomSpecConsumptionList.stream()
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
             // 赋值
-            purchaseBomBoard.setBomSpecName(record.getName());
-            purchaseBomBoard.setBomSpecCode(record.getCode());
-            purchaseBomBoard.setColour(record.getColour());
-            purchaseBomBoard.setLength(record.getLength());
-            purchaseBomBoard.setHeight(record.getHeight());
-            purchaseBomBoard.setWidth(record.getWidth());
-            purchaseBomBoard.setBomSpecId(bomSpecId);
-            purchaseBomBoard.setInventoryQuantity(inventoryQuantity);
-            purchaseBomBoard.setPredictOutStorageDays(predictOutStorageDays);
-            purchaseBomBoard.setSafetyInventoryQuantity(safetyInventoryQuantity);
-            purchaseBomBoard.setOutStorageQuantitySevenDays(quantitySevenDays);
-            purchaseBomBoard.setOutStorageQuantityThirtyDays(quantityThirtyDays);
-            purchaseBomBoard.setOutStorageQuantityFifteenDays(orderService.getOrderBomSpecOutStorageQuantity(record.getId(),DateUtil.offsetDay(date, -15), date));
-            purchaseBomBoard.setOutStorageQuantitySixtyDays(orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -60), date));
-            purchaseBomBoard.setOutStorageWeekOnWeekRatio(weekOnWeekRatio);
-            purchaseBomBoard.setNextDeliveryDays((int) nextDeliveryDays);
-            purchaseBomBoard.setTurnoverRate(turnoverRateMap.get(bomSpecId));
-            list.add(purchaseBomBoard);
+            record.setInventoryQuantity(inventoryQuantity);
+            record.setSafetyInventoryQuantity(safetyInventoryQuantity);
+            record.setOutStorageQuantitySevenDays(quantitySevenDays);
+            record.setOutStorageQuantityThirtyDays(quantityThirtyDays);
+            record.setOutStorageQuantityFifteenDays(quantityFifteenDays);
+            record.setOutStorageQuantitySixtyDays(quantitySixtyDays);
+            record.setOutStorageWeekOnWeekRatio(weekOnWeekRatio);
         }
-        page.setRecords(list);
-        return page;
+        return bomSpecVoPage;
     }
 
     @Override
@@ -267,11 +260,12 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
     }
 
     @Override
-    public BigDecimal getPurchaseBomInTransitSum(Long bomSpecId) {
+    public List<PurchaseInTransitBomVo> getPurchaseBomInTransitSum(List<Long> bomSpecIds) {
         IWrapper<PurchaseBom> wrapper = getWrapper();
-        wrapper.eq("pb", PurchaseBom::getBomSpecId, bomSpecId);
+        wrapper.in("pb", PurchaseBom::getBomSpecId, bomSpecIds);
         wrapper.eq("p", Purchase::getStatus, PurchaseStatusEnum.UNDER_PURCHASE.getKey());
         wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
+        wrapper.groupBy("pb.bom_spec_id");
         return this.baseMapper.getPurchaseBomInTransitSum(wrapper);
     }
 }

+ 15 - 8
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java

@@ -3,6 +3,7 @@ package com.sd.business.service.purchase.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -155,6 +156,7 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
             inOutStorageDto.setWarehouseId(warehouseId);
             inOutStorageDto.setDepartmentId(DepartmentConstant.SD_SPORTS);
             inOutStorageDto.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
+            inOutStorageDto.setInOutStorageTime(dto.getArrivalDate());
             inOutStorageDto.setInOutStorageBomList(inOutStorageBomList);
             inOutStorageService.add(inOutStorageDto);
         }
@@ -179,7 +181,7 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
         // 采购合同数据
         List<Purchase> purchaseList = purchaseService.list(q -> q.in(Purchase::getCode, purchaseCodes).or().in(Purchase::getErpCode, purchaseCodes));
         if (purchaseList.isEmpty()) {
-            throw new ServiceException("未知采购合同号");
+            throw new ServiceException("未知采购合同订单单号");
         }
         Map<String, Purchase> purchaseMap = purchaseList.stream().collect(Collectors.toMap(Purchase::getCode, Function.identity()));
         Map<String, Purchase> erpPurchaseMap = purchaseList.stream().collect(Collectors.toMap(Purchase::getErpCode, Function.identity(), (v1, v2) -> v2));
@@ -199,7 +201,7 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
             if (purchase == null) {
                 purchase = erpPurchaseMap.get(dto.getPurchaseCode());
                 if (purchase == null) {
-                    throw new ServiceException("未知采购合同号:" + dto.getPurchaseCode());
+                    throw new ServiceException("未知采购合同订单单号:" + dto.getPurchaseCode());
                 }
             }
             // 判断采购合同是否存在当前bom
@@ -242,21 +244,26 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
             if (purchasePendingStorageVo.getArrivalCode() == null) {
                 purchasePendingStorageVo.setArrivalCode(dto.getArrivalCode());
             }
+            if (purchasePendingStorageVo.getArrivalDate() == null) {
+                purchasePendingStorageVo.setArrivalDate(dto.getArrivalDate());
+            }
         }
         purchasePendingStorageVo.setPurchasePendingStorageBomList(purchasePendingStorageBomList);
         return purchasePendingStorageVo;
     }
 
     private void validatedImportData(List<PurchaseArrivalImportDataDto> list) {
-        // 删除第一行表头字段
-        list.remove(0);
         Assert.notEmpty(list, "到货明细不能为空");
         for (PurchaseArrivalImportDataDto dto : list) {
-            Assert.notNull(dto.getPurchaseCode(), "采购合同编号不能为空");
-            Assert.notNull(dto.getBomSpecCode(), "bom品号不能为空");
+            if (StrUtil.isBlank(dto.getPurchaseCode())) {
+                dto.setPurchaseCode(dto.getRemarkCode());
+            }
+            Assert.notBlank(dto.getPurchaseCode(), "采购订单单号不能为空");
+            Assert.notBlank(dto.getBomSpecCode(), "bom品号不能为空");
             Assert.notNull(dto.getArrivalCode(), "到货单号不能为空");
-            Assert.eqTrue(NumberUtil.isInteger(dto.getArrivalQuantity()), "到货数量格式不正确");
-            Assert.gtZero(new BigDecimal(dto.getArrivalQuantity()), "到货数量必须大于0");
+            Assert.notNull(dto.getArrivalDate(), "到货日期不能为空");
+            Assert.eqTrue(NumberUtil.isNumber(dto.getArrivalQuantity()), "业务数量格式不正确");
+            Assert.gtZero(new BigDecimal(dto.getArrivalQuantity()), "业务数量必须大于0");
         }
     }
 }

+ 29 - 42
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java

@@ -1,7 +1,6 @@
 package com.sd.business.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -18,7 +17,6 @@ import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.apply.po.ApplyBuyBom;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.in.po.InOutStorageBom;
-import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.purchase.dto.*;
 import com.sd.business.entity.purchase.enums.PurchaseStatusEnum;
 import com.sd.business.entity.purchase.po.Purchase;
@@ -310,7 +308,7 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
         // 采购入库查询排除胜德塑胶供应商
         if (ObjectUtil.equals(dto.getQueryType(), 1)) {
             wrapper.ne("s", Supplier::getName, "福清市胜德塑胶制品有限公司");
-            wrapper.eq("p", Purchase::getStatus, PurchaseStatusEnum.UNDER_PURCHASE);
+            wrapper.eq("p", Purchase::getStatus, PurchaseStatusEnum.UNDER_PURCHASE.getKey());
         }
         wrapper.orderByDesc("p", Purchase::getId);
 
@@ -319,38 +317,37 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     }
 
     @Override
-    public void purchaseImport(List<PurchaseImportDataDto> list, List<PurchaseBomImportDataDto> bomImportDataList) {
+    public void purchaseImport(List<PurchaseBomImportDataDto> list) {
         // 验证导入数据
-        validatedImportData(list, bomImportDataList);
+        validatedImportData(list);
 
-        Map<String, List<PurchaseBomImportDataDto>> bomMap = bomImportDataList.stream().collect(Collectors.groupingBy(PurchaseBomImportDataDto::getPurchaseCode));
+        Map<String, List<PurchaseBomImportDataDto>> bomMap = list.stream().collect(Collectors.groupingBy(PurchaseBomImportDataDto::getPurchaseCode));
+        Map<String, Long> purchaseMap = this.mapKV(Purchase::getErpCode, BaseIdPo::getId, q -> q.in(Purchase::getErpCode, bomMap.keySet()));
 
-        List<String> purchaseCodes = list.stream().map(PurchaseImportDataDto::getCode).collect(Collectors.toList());
-        Map<String, Long> purchaseMap = this.mapKV(Purchase::getErpCode, BaseIdPo::getId, q -> q.in(Purchase::getErpCode, purchaseCodes));
-
-        List<String> supplierCodes = list.stream().map(PurchaseImportDataDto::getSupplierCode).collect(Collectors.toList());
+        Set<String> supplierCodes = list.stream().map(PurchaseBomImportDataDto::getSupplierCode).collect(Collectors.toSet());
         Map<String, Long> supplierMap = supplierService.mapKV(Supplier::getCode, BaseIdPo::getId, q -> q.in(Supplier::getCode, supplierCodes));
-        List<String> bomSpecCodes = bomImportDataList.stream().map(PurchaseBomImportDataDto::getBomSpecCode).collect(Collectors.toList());
+
+        List<String> bomSpecCodes = list.stream().map(PurchaseBomImportDataDto::getBomSpecCode).collect(Collectors.toList());
         Map<String, Long> bomSpecMap = bomSpecService.mapKV(BomSpec::getCode, BaseIdPo::getId, q -> q.in(BomSpec::getCode, bomSpecCodes));
 
         List<Purchase> purchaseList = new ArrayList<>();
         List<PurchaseBom> purchaseBomList = new ArrayList<>();
-        for (PurchaseImportDataDto importDataDto : list) {
+        for (Map.Entry<String, List<PurchaseBomImportDataDto>> entry : bomMap.entrySet()) {
+            String purchaseCode = entry.getKey();
+            List<PurchaseBomImportDataDto> bomList = entry.getValue();
+            if (ObjectUtil.isEmpty(bomList)) {
+                continue;
+            }
+
             // 判断是否存在重复编号
-            Long purchaseId = purchaseMap.get(importDataDto.getCode());
+            Long purchaseId = purchaseMap.get(purchaseCode);
             if (purchaseId != null) {
-                throw new ServiceException("采购合同编号:" + importDataDto.getCode() + " 已存在");
+                throw new ServiceException("采购合同编号:" + purchaseCode + " 已存在");
             }
 
-            Long supplierId = supplierMap.get(importDataDto.getSupplierCode());
+            Long supplierId = supplierMap.get(bomList.get(0).getSupplierCode());
             if (supplierId == null) {
-                throw new ServiceException("未知供应商编号:" + importDataDto.getSupplierCode());
-            }
-
-            List<PurchaseBomImportDataDto> bomList = bomMap.get(importDataDto.getCode());
-
-            if (ObjectUtil.isEmpty(bomList)) {
-                continue;
+                throw new ServiceException("未知供应商编号:" + bomList.get(0).getSupplierCode());
             }
 
             // 保存采购合同
@@ -360,7 +357,7 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
             purchase.setSupplierId(supplierId);
             purchase.setStatus(PurchaseStatusEnum.UNDER_PURCHASE.getKey());
             purchase.setFlowStatus(FlowStatusEnum.PASS.getKey());
-            purchase.setErpCode(importDataDto.getCode());
+            purchase.setErpCode(purchaseCode);
             purchase.setReceiveGoodsType(1);
             purchase.setAdvancePayment(BigDecimal.ZERO);
             purchase.setReturnAmount(BigDecimal.ZERO);
@@ -370,11 +367,8 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
             purchase.setStorageStatus(StatusConstant.NO);
             purchase.setTotalAmountIncludingTax(BigDecimal.ZERO);
             purchase.setTotalAmountExcludingTax(BigDecimal.ZERO);
-            try {
-                purchase.setDeliveryDate(DateUtil.parse(bomList.get(0).getDeliveryDate()));
-            } catch (Exception e) {
-                throw new ServiceException("交付日期格式异常");
-            }
+            purchase.setDeliveryDate(bomList.get(0).getDeliveryDate());
+
 
             List<PurchaseBom> bomData = bomList.stream().map(item -> {
                 Long bomSpecId = bomSpecMap.get(item.getBomSpecCode());
@@ -399,26 +393,19 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
             }).collect(Collectors.toList());
             purchaseList.add(purchase);
             purchaseBomList.addAll(bomData);
-            purchaseMap.put(importDataDto.getCode(), purchase.getId());
+            purchaseMap.put(purchaseCode, purchase.getId());
         }
 
         this.saveBatch(purchaseList);
         purchaseBomService.saveBatch(purchaseBomList);
     }
 
-    private void validatedImportData(List<PurchaseImportDataDto> list, List<PurchaseBomImportDataDto> bomImportDataList) {
-        // 删除第一行表头字段
-        list.remove(0);
-        bomImportDataList.remove(0);
-        Assert.notEmpty(list, "采购合同不能为空");
-        Assert.notEmpty(bomImportDataList, "采购合同明细不能为空");
-        for (PurchaseImportDataDto dto : list) {
-            Assert.notNull(dto.getCode(), "采购合同编号不能为空");
-            Assert.notNull(dto.getSupplierCode(), "供应商编号不能为空");
-        }
-        for (PurchaseBomImportDataDto dto : bomImportDataList) {
-            Assert.notNull(dto.getPurchaseCode(), "采购合同编号不能为空");
-            Assert.notNull(dto.getBomSpecCode(), "bom品号不能为空");
+    private void validatedImportData(List<PurchaseBomImportDataDto> list) {
+        Assert.notEmpty(list, "采购合同明细不能为空");
+        for (PurchaseBomImportDataDto dto : list) {
+            Assert.notBlank(dto.getPurchaseCode(), "采购合同编号不能为空");
+            Assert.notBlank(dto.getSupplierCode(), "供应商编号不能为空");
+            Assert.notBlank(dto.getBomSpecCode(), "bom品号不能为空");
             Assert.eqTrue(NumberUtil.isNumber(dto.getQuantity()), "采购数量格式不正确");
             Assert.eqTrue(NumberUtil.isNumber(dto.getUnitPrice()), "采购单价格式不正确");
             Assert.eqTrue(NumberUtil.isNumber(dto.getTotalAmount()), "采购金额合计格式不正确");

+ 0 - 2
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountServiceImpl.java

@@ -167,7 +167,6 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
                 .packingLabor(item.getPackingLabor())
                 .packagingMaterialCost(item.getPackagingMaterialCost())
                 .managementFee(item.getManagementFee())
-                .outerBoxPackingFee(item.getOuterBoxPackingFee())
                 .build()
         ).collect(Collectors.toList());
 
@@ -442,7 +441,6 @@ public class StatementOfAccountServiceImpl extends ServiceImpl<StatementOfAccoun
             documentByOrderVo.setWlnCreateTime(ObjectUtil.defaultIfNull(item.getWlnCreateTime(), item.getCreateTime()));
             documentByOrderVo.setCode(item.getCode());
             documentByOrderVo.setWlnCode(item.getWlnCode());
-            documentByOrderVo.setOuterBoxPackingFee(item.getOuterBoxPackingFee());
             documentByOrderVo.setTotal(item.getTotalAmount());
 
             documentByOrderVo.setSourcePlatform(item.getSourcePlatform());

+ 0 - 1
sd-business/src/main/java/com/sd/business/strategy/impl/DocumentByOrderExcelExportStrategy.java

@@ -74,7 +74,6 @@ public class DocumentByOrderExcelExportStrategy implements ExcelExportStrategy<M
                             .wlnCreateTime(documentByOrderVo.getWlnCreateTime())
                             .code(documentByOrderVo.getCode())
                             .wlnCode(documentByOrderVo.getWlnCode())
-                            .outerBoxPackingFee(documentByOrderVo.getOuterBoxPackingFee())
                             .total(documentByOrderVo.getTotal())
                             .bomSpecCode(bomSpec.getBomSpecCode())
                             .bomSpecName(bomSpec.getBomSpecName())

+ 0 - 1
sd-business/src/main/java/com/sd/business/strategy/impl/SalesOutWarehouseDetailsExportStrategy.java

@@ -66,7 +66,6 @@ public class SalesOutWarehouseDetailsExportStrategy implements ExcelExportStrate
                             .subtotal(skuSpec.getSubtotal())
                             .wlnCreateTime(documentByOrderVo.getWlnCreateTime())
                             .wlnCode(documentByOrderVo.getWlnCode())
-                            .outerBoxPackingFee(documentByOrderVo.getOuterBoxPackingFee())
                             .total(documentByOrderVo.getTotal())
                             .bomSpecCode(bomSpec.getBomSpecCode())
                             .bomSpecName(bomSpec.getBomSpecName())

+ 10 - 5
sd-business/src/main/resources/mapper/order/OrderMapper.xml

@@ -31,7 +31,6 @@
                o.packing_labor,
                o.management_fee,
                o.packaging_material_cost,
-               o.outer_box_packing_fee,
                o.tax_rate,
                o.shipping_time,
                o.consignee,
@@ -58,22 +57,28 @@
             ${ew.customSqlSegment}
     </select>
 
-       <select id="getOrderSkuOutStorageQuantity" resultType="java.math.BigDecimal">
+       <select id="getOrderSkuOutStorageQuantity" resultType="com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo">
             select
-                ifnull(sum(os.quantity), 0)
+                soa.time_period consumptionDate,
+                os.bom_spec_id,
+                ifnull(sum(os.quantity), 0) quantity
             from
                 order_info o
                 LEFT JOIN order_sku os on o.id = os.order_id
+                LEFT JOIN statement_of_account soa on o.statement_of_account_id = soa.id
                 ${ew.customSqlSegment}
        </select>
 
-       <select id="getOrderSkuBomOutStorageQuantity" resultType="java.math.BigDecimal">
+       <select id="getOrderSkuBomOutStorageQuantity" resultType="com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo">
             select
-                ifnull(sum(os.quantity * osb.quantity), 0)
+                soa.time_period consumptionDate,
+                os.bom_spec_id,
+                ifnull(sum(os.quantity * osb.quantity), 0) quantity
             from
                 order_info o
                 LEFT JOIN order_sku os on o.id = os.order_id
                 LEFT JOIN order_sku_bom osb on os.id = osb.order_sku_id
+                LEFT JOIN statement_of_account soa on o.statement_of_account_id = soa.id
                 ${ew.customSqlSegment}
        </select>
 

+ 19 - 0
sd-business/src/main/resources/mapper/order/OrderSalesShipmentStatisticsMapper.xml

@@ -15,4 +15,23 @@
             left join bom_classify bc on b.bom_classify_id = bc.id
         ${ew.customSqlSegment}
     </select>
+    <select id="getTurnoverRateSalesShipmentStatisticsList"
+            resultType="com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo">
+        select
+            osss.bom_spec_id,
+            bs.code bomSpecCode,
+            bs.name bomSpecName,
+            bs.width,
+            bs.height,
+            b.chromatophore,
+            sum(case when osss.total_date >= date(date_sub(now(), interval 91 day)) then quantity else 0 end) ninetyDaysSalesQuantity,
+            sum(case when osss.total_date >= date(date_sub(now(), interval 61 day)) then quantity else 0 end) sixtyDaysSalesQuantity,
+            sum(case when osss.total_date >= date(date_sub(now(), interval 31 day)) then quantity else 0 end) thirtyDaysSalesQuantity
+        from
+            order_sales_shipment_statistics osss
+                left join bom_spec bs on osss.bom_spec_id = bs.id
+                left join bom b on bs.bom_id = b.id
+                left join bom_classify bc on b.bom_classify_id = bc.id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 0 - 1
sd-business/src/main/resources/mapper/order/OrderSkuMapper.xml

@@ -28,7 +28,6 @@
                oi.settlement_status orderSettlementStatus,
                oi.total_amount      orderTotalAmount,
                oi.wln_create_time,
-               oi.outer_box_packing_fee,
                ss.code              skuSpecCode,
                ss.name              skuSpecName,
                bs.name              bomSpecName,

+ 77 - 13
sd-business/src/main/resources/mapper/purchase/PurchaseBomMapper.xml

@@ -81,6 +81,7 @@
             bs.code bomSpecCode,
             bs.name bomSpecName,
             p.code purchaseCode,
+            p.erp_code purchaseErpCode,
             s.name supplierName,
             pb.purchase_quantity,
             (pb.purchase_quantity - pb.arrival_quantity) inTransitQuantity,
@@ -93,26 +94,16 @@
             ${ew.customSqlSegment}
     </select>
 
-    <select id="getPurchaseBomInTransitSum" resultType="java.math.BigDecimal">
-        select
-            ifnull(sum(pb.purchase_quantity - pb.arrival_quantity + pb.return_quantity), 0)
-        from
-            purchase_bom pb
-            left join purchase p on pb.purchase_id = p.id
-            ${ew.customSqlSegment}
-    </select>
-
-    <select id="getPurchaseBomDeliveryDate" resultType="com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo">
+    <select id="getPurchaseBomInTransitSum" resultType="com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo">
         select
             pb.bom_spec_id,
-            min(p.delivery_date) delivery_date
+            ifnull(sum(pb.purchase_quantity - pb.arrival_quantity + pb.return_quantity), 0) inTransitQuantity
         from
             purchase_bom pb
-            LEFT JOIN purchase p on pb.purchase_id = p.id
+            left join purchase p on pb.purchase_id = p.id
             ${ew.customSqlSegment}
     </select>
 
-
     <select id="getDetailsPage" resultType="com.sd.business.entity.purchase.vo.PurchaseBomDetailsVo">
         select
             p.code purchaseCode,
@@ -132,4 +123,77 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="getPurchaseBomBoardPage" resultType="com.sd.business.entity.purchase.vo.PurchaseBomBoardVo">
+        SELECT
+            bs.id bomSpecId,
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            bs.colour,
+            bs.length,
+            bs.width,
+            bs.height,
+            ifnull((i.quantity + ifnull(i.lock_quantity, 0)) / ((ifnull(osq.quantity, 0) + ifnull(osbq.quantity, 0)) / 7), 0) predictOutStorageDays,
+            ifnull(pd.next_delivery_days, 0) nextDeliveryDays,
+            ifnull(btr.turnover_rate, 0) turnoverRate
+        FROM
+            bom_spec bs
+            left join inventory i on bs.id = i.bom_spec_id and department_id = 0 and warehouse_id in (1684037244354052098, 1684037201379213314)
+            left join (
+                select
+                    os.bom_spec_id,
+                    ifnull(sum(os.quantity), 0) quantity
+                from
+                    order_info o
+                    left join order_sku os on o.id = os.order_id
+                    left join statement_of_account soa on o.statement_of_account_id = soa.id
+                where soa.time_period >= DATE_SUB(now(), INTERVAL 7 day)
+                    and o.`status` = 40
+                group by os.bom_spec_id
+            ) osq on bs.id = osq.bom_spec_id
+            left join (
+                select
+                    osb.bom_spec_id,
+                    ifnull(sum(os.quantity * osb.quantity), 0) quantity
+                from
+                    order_info o
+                    left join order_sku os on o.id = os.order_id
+                    left join order_sku_bom osb on os.id = osb.order_sku_id
+                    left join statement_of_account soa on o.statement_of_account_id = soa.id
+                where soa.time_period >= DATE_SUB(now(), INTERVAL 7 day)
+                    and o.`status` = 40
+                group by osb.bom_spec_id
+            ) osbq on bs.id = osbq.bom_spec_id
+            left join (
+                select
+                    pb.bom_spec_id,
+                    datediff(min(p.delivery_date), now()) next_delivery_days
+                from
+                    purchase_bom pb
+                    left join purchase p on pb.purchase_id = p.id
+                where pb.purchase_quantity > pb.arrival_quantity
+                    and p.storage_status = 0
+                    and p.delivery_date > now()
+                group by pb.bom_spec_id
+            ) pd on bs.id = pd.bom_spec_id
+            left join (
+                select
+                    oq.bom_spec_id,
+                    90 / (90 * 0.5 * (sum(IFNULL(ib.quantity, 0) + IFNULL(ib.lock_quantity, 0))) / oq.quantity) turnover_rate
+                from (
+                    select
+                        osss.bom_spec_id,
+                        sum(osss.quantity) quantity
+                    FROM
+                        order_sales_shipment_statistics osss
+                    where total_date >= date(date_sub(now(), INTERVAL 91 day))
+                    group by osss.bom_spec_id
+                ) oq
+                    left join inventory_backup ib on oq.bom_spec_id = ib.bom_spec_id
+                             and backup_date in (date(date_sub(now(), INTERVAL 91 day)), date(date_sub(now(), INTERVAL 1 day)))
+                             and department_id = 0 and warehouse_id in (1684037244354052098, 1684037201379213314)
+                group by oq.bom_spec_id
+            ) btr on bs.id = btr.bom_spec_id
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>

BIN
sd-starter/src/main/resources/template/inOutStorageDetails.xlsx