浏览代码

update
1.成品成本

wks 4 月之前
父节点
当前提交
9d3113f638
共有 19 个文件被更改,包括 440 次插入14 次删除
  1. 62 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/WmsFinishedSkuCost.java
  2. 25 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/dto/ReceiptOrderDetailSummary.java
  3. 11 1
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/ItemSku.java
  4. 78 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/WmsFinishedProductCost.java
  5. 1 1
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/WmsTaskDetails.java
  6. 10 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/ReceiptOrderDetailMapper.java
  7. 18 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/WmsFinishedProductCostMapper.java
  8. 18 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/WmsFinishedSkuCostMapper.java
  9. 1 1
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ItemService.java
  10. 5 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ReceiptOrderDetailService.java
  11. 32 2
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ReceiptOrderService.java
  12. 2 2
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ShipmentOrderService.java
  13. 27 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/WmsFinishedProductCostService.java
  14. 13 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/WmsFinishedSkuCostService.java
  15. 87 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsFinishedProductCostServiceImpl.java
  16. 22 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsFinishedSkuCostServiceImpl.java
  17. 12 6
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsTaskServiceImpl.java
  18. 1 1
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsUnitConfigServiceImpl.java
  19. 15 0
      ruoyi-admin-wms/src/main/resources/mapper/wms/ReceiptOrderDetailMapper.xml

+ 62 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/WmsFinishedSkuCost.java

@@ -0,0 +1,62 @@
+package com.ruoyi.wms.domain.bo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 成品成本明细列表
+ * @TableName wms_finished_sku_cost
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@TableName(value ="wms_finished_sku_cost")
+@Data
+public class WmsFinishedSkuCost implements Serializable {
+    /**
+     *
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 成品成本明细表id
+     */
+    @TableField(value = "product_id")
+    private Long productId;
+
+    /**
+     * @see com.ruoyi.wms.domain.constant.ItemType
+     * 商品类型
+     */
+    @TableField(value = "itemType")
+    private Integer itemType;
+
+    /**
+     * 物料sku id
+     */
+    @TableField(value = "item_sku_id")
+    private Long itemSkuId;
+
+    /**
+     * 成本
+     */
+    @TableField(value = "cost")
+    private BigDecimal cost;
+
+    @Serial
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+}

+ 25 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/dto/ReceiptOrderDetailSummary.java

@@ -0,0 +1,25 @@
+package com.ruoyi.wms.domain.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ReceiptOrderDetailSummary {
+
+    /**
+     * 物料 sku id
+     */
+    private Long skuId;
+
+    /**
+     * 基准数量
+     */
+    private BigDecimal baseQuantity;
+
+    /**
+     * 价格
+     */
+    private BigDecimal amount;
+
+}

+ 11 - 1
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/ItemSku.java

@@ -2,7 +2,6 @@ package com.ruoyi.wms.domain.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.mybatis.core.domain.BaseEntity;
 import com.ruoyi.wms.domain.bo.UnitConfigBo;
@@ -36,6 +35,12 @@ public class ItemSku extends BaseEntity {
      */
     private Long itemId;
 
+    /**
+     * @see com.ruoyi.wms.domain.constant.ItemType
+     * 商品类型
+     */
+    private Integer itemType;
+
     /**
      * 条码
      */
@@ -87,6 +92,11 @@ public class ItemSku extends BaseEntity {
      */
     private String unit;
 
+    /**
+     * 基础单位成本
+     */
+    private BigDecimal baseUnitCost;
+
     /**
      * 是否是多单位 0 否 1 是
      */

+ 78 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/WmsFinishedProductCost.java

@@ -0,0 +1,78 @@
+package com.ruoyi.wms.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 成品成本明细列表
+ * @TableName wms_finished_product_cost
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@TableName(value ="wms_finished_product_cost")
+@Data
+public class WmsFinishedProductCost implements Serializable {
+    /**
+     *
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 任务id
+     */
+    @TableField(value = "task_id")
+    private Long taskId;
+
+    /**
+     * bom 版本id
+     */
+    @TableField(value = "version_id")
+    private Long versionId;
+
+    /**
+     * 物料sku id
+     */
+    @TableField(value = "item_sku_id")
+    private Long itemSkuId;
+
+    /**
+     * 材料成本
+     */
+    @TableField(value = "material_cost")
+    private BigDecimal materialCost;
+
+    /**
+     * 包材成本
+     */
+    @TableField(value = "packaging_cost")
+    private BigDecimal packagingCost;
+
+    /**
+     * 总成本
+     */
+    @TableField(value = "total_cost")
+    private BigDecimal totalCost;
+
+    /**
+     * 生产数量
+     */
+    @TableField(value = "quantity")
+    private BigDecimal quantity;
+
+    @Serial
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 1 - 1
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/WmsTaskDetails.java

@@ -29,7 +29,7 @@ public class WmsTaskDetails implements Serializable {
      *
      */
     @TableId(value = "id", type = IdType.AUTO)
-    private String id;
+    private Long id;
 
     /**
      * 任务id

+ 10 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/ReceiptOrderDetailMapper.java

@@ -1,9 +1,12 @@
 package com.ruoyi.wms.mapper;
 
 import com.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
+import com.ruoyi.wms.domain.dto.ReceiptOrderDetailSummary;
 import com.ruoyi.wms.domain.entity.ReceiptOrderDetail;
 import com.ruoyi.wms.domain.vo.ReceiptOrderDetailVo;
 
+import java.util.List;
+
 /**
  * 入库单详情Mapper接口
  *
@@ -12,4 +15,11 @@ import com.ruoyi.wms.domain.vo.ReceiptOrderDetailVo;
  */
 public interface ReceiptOrderDetailMapper extends BaseMapperPlus<ReceiptOrderDetail, ReceiptOrderDetailVo> {
 
+
+    /**
+     * 获取采购入库 汇总数量 和 汇总金额
+     * @param skuId sku Id
+     * @return 汇总数量 和 汇总金额
+     */
+    List<ReceiptOrderDetailSummary> getQuantityAndAmount(List<Long> skuId);
 }

+ 18 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/WmsFinishedProductCostMapper.java

@@ -0,0 +1,18 @@
+package com.ruoyi.wms.mapper;
+
+import com.ruoyi.wms.domain.entity.WmsFinishedProductCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【wms_finished_product_cost(成品成本明细列表)】的数据库操作Mapper
+* @createDate 2026-04-15 17:22:14
+* @Entity com.ruoyi.wms.domain.entity.WmsFinishedProductCost
+*/
+public interface WmsFinishedProductCostMapper extends BaseMapper<WmsFinishedProductCost> {
+
+}
+
+
+
+

+ 18 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/WmsFinishedSkuCostMapper.java

@@ -0,0 +1,18 @@
+package com.ruoyi.wms.mapper;
+
+import com.ruoyi.wms.domain.bo.WmsFinishedSkuCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【wms_finished_sku_cost(成品成本明细列表)】的数据库操作Mapper
+* @createDate 2026-04-15 17:47:58
+* @Entity com.ruoyi.wms.domain.bo.WmsFinishedSkuCost
+*/
+public interface WmsFinishedSkuCostMapper extends BaseMapper<WmsFinishedSkuCost> {
+
+}
+
+
+
+

+ 1 - 1
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ItemService.java

@@ -32,7 +32,7 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 @Service
 @Log4j2
-public class ItemService {
+public class ItemService  {
 
     private final ItemMapper itemMapper;
 

+ 5 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ReceiptOrderDetailService.java

@@ -9,6 +9,7 @@ import com.ruoyi.common.core.utils.MapstructUtils;
 import com.ruoyi.common.mybatis.core.page.PageQuery;
 import com.ruoyi.common.mybatis.core.page.TableDataInfo;
 import com.ruoyi.wms.domain.bo.ReceiptOrderDetailBo;
+import com.ruoyi.wms.domain.dto.ReceiptOrderDetailSummary;
 import com.ruoyi.wms.domain.entity.ReceiptOrderDetail;
 import com.ruoyi.wms.domain.vo.ReceiptOrderDetailVo;
 import com.ruoyi.wms.mapper.ReceiptOrderDetailMapper;
@@ -121,4 +122,8 @@ public class ReceiptOrderDetailService extends ServiceImpl<ReceiptOrderDetailMap
         itemSkuService.setItemSkuMap(details);
         return details;
     }
+
+    public List<ReceiptOrderDetailSummary> getQuantityAndAmount(List<Long> skuId) {
+        return this.baseMapper.getQuantityAndAmount(skuId);
+    }
 }

+ 32 - 2
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ReceiptOrderService.java

@@ -17,8 +17,11 @@ import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.mybatis.core.domain.BaseEntity;
 import com.ruoyi.common.mybatis.core.page.PageQuery;
 import com.ruoyi.common.mybatis.core.page.TableDataInfo;
+import com.ruoyi.wms.domain.bo.BaseOrderDetailBo;
 import com.ruoyi.wms.domain.bo.ReceiptOrderBo;
 import com.ruoyi.wms.domain.bo.ReceiptOrderDetailBo;
+import com.ruoyi.wms.domain.dto.ReceiptOrderDetailSummary;
+import com.ruoyi.wms.domain.entity.ItemSku;
 import com.ruoyi.wms.domain.entity.ReceiptOrder;
 import com.ruoyi.wms.domain.entity.ReceiptOrderDetail;
 import com.ruoyi.wms.domain.vo.ReceiptOrderDetailVo;
@@ -28,6 +31,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -49,6 +53,8 @@ public class ReceiptOrderService {
 
     private final InventoryHistoryService inventoryHistoryService;
 
+    private final ItemSkuService itemSkuService;
+
     private final WmsUnitConfigService wmsUnitConfigService;
 
     /**
@@ -136,13 +142,37 @@ public class ReceiptOrderService {
         } else {
             updateByBo(bo);
         }
+
         // 3.单位换算
         wmsUnitConfigService.unitConversion(bo.getDetails());
 
-        // 4.增加库存
+        // 计算成本   单位成本
+        if (bo.getOptType() == 2) {
+            List<Long> skuId = bo.getDetails().stream().map(BaseOrderDetailBo::getSkuId).toList();
+            Map<Long, ItemSku> itemSkus = itemSkuService.listByIds(skuId).stream().collect(Collectors.toMap(ItemSku::getId, itemSku -> itemSku));
+            Map<Long, ReceiptOrderDetailSummary> summaryMap = receiptOrderDetailService.getQuantityAndAmount(skuId).stream()
+                .collect(Collectors.toMap(ReceiptOrderDetailSummary::getSkuId, s -> s));
+            bo.getDetails().forEach(receiptOrderDetailBo -> {
+                BigDecimal unitCost;
+                ItemSku itemSku = itemSkus.get(receiptOrderDetailBo.getSkuId());
+                ReceiptOrderDetailSummary receiptOrderDetailSummary = summaryMap.get(receiptOrderDetailBo.getSkuId());
+                if (Objects.isNull(receiptOrderDetailSummary)) {
+                    unitCost = receiptOrderDetailBo.getAmount().subtract(receiptOrderDetailBo.getBaseQuantity());
+                    itemSku.setBaseUnitCost(unitCost);
+                } else {
+                    BigDecimal amount = receiptOrderDetailSummary.getAmount().add(receiptOrderDetailBo.getAmount());
+                    BigDecimal baseQuantity = receiptOrderDetailSummary.getBaseQuantity().add(receiptOrderDetailBo.getBaseQuantity());
+                    unitCost = amount.subtract(baseQuantity);
+                }
+                itemSku.setBaseUnitCost(unitCost);
+            });
+            itemSkuService.updateBatchById(itemSkus.values());
+        }
+
+        // 5.增加库存
         inventoryService.add(bo.getDetails());
 
-        // 5.保存库存记录
+        // 6.保存库存记录
         inventoryHistoryService.saveInventoryHistory(bo, ServiceConstants.InventoryHistoryOrderType.RECEIPT, true);
     }
 

+ 2 - 2
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/ShipmentOrderService.java

@@ -185,10 +185,10 @@ public class ShipmentOrderService  extends ServiceImpl<ShipmentOrderMapper, Ship
         // 3.单位换算
         wmsUnitConfigService.unitConversion(bo.getDetails());
 
-        // 3.更新库存:Inventory表
+        // 4.更新库存:Inventory表
         inventoryService.subtract(bo.getDetails());
 
-        // 4.创建库存记录
+        // 5.创建库存记录
         inventoryHistoryService.saveInventoryHistory(bo, ServiceConstants.InventoryHistoryOrderType.SHIPMENT, false);
     }
 

+ 27 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/WmsFinishedProductCostService.java

@@ -0,0 +1,27 @@
+package com.ruoyi.wms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.wms.domain.entity.WmsBomItem;
+import com.ruoyi.wms.domain.entity.WmsFinishedProductCost;
+import com.ruoyi.wms.domain.entity.WmsTaskDetails;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @description 针对表【wms_finished_product_cost(成品成本明细列表)】的数据库操作Service
+ * @createDate 2026-04-15 17:22:14
+ */
+public interface WmsFinishedProductCostService extends IService<WmsFinishedProductCost> {
+
+    /**
+     * 成品成本计算
+     *
+     * @param versionMap    版本对应的任务列表
+     * @param wmsBomItems   物料清单
+     * @param itemSkuIdList 物料清单sku id 列表
+     */
+    void costCalculation(Map<Long, WmsTaskDetails> versionMap, List<WmsBomItem> wmsBomItems, List<Long> itemSkuIdList);
+
+}

+ 13 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/WmsFinishedSkuCostService.java

@@ -0,0 +1,13 @@
+package com.ruoyi.wms.service;
+
+import com.ruoyi.wms.domain.bo.WmsFinishedSkuCost;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【wms_finished_sku_cost(成品成本明细列表)】的数据库操作Service
+* @createDate 2026-04-15 17:47:58
+*/
+public interface WmsFinishedSkuCostService extends IService<WmsFinishedSkuCost> {
+
+}

+ 87 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsFinishedProductCostServiceImpl.java

@@ -0,0 +1,87 @@
+package com.ruoyi.wms.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.wms.domain.bo.WmsFinishedSkuCost;
+import com.ruoyi.wms.domain.constant.ItemType;
+import com.ruoyi.wms.domain.entity.*;
+import com.ruoyi.wms.service.ItemService;
+import com.ruoyi.wms.service.ItemSkuService;
+import com.ruoyi.wms.service.WmsFinishedProductCostService;
+import com.ruoyi.wms.mapper.WmsFinishedProductCostMapper;
+import com.ruoyi.wms.service.WmsFinishedSkuCostService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* @author Administrator
+* @description 针对表【wms_finished_product_cost(成品成本明细列表)】的数据库操作Service实现
+* @createDate 2026-04-15 17:22:14
+*/
+@Service
+@RequiredArgsConstructor
+public class WmsFinishedProductCostServiceImpl extends ServiceImpl<WmsFinishedProductCostMapper, WmsFinishedProductCost>
+    implements WmsFinishedProductCostService{
+
+    private final ItemSkuService itemSkuService;
+
+    private final WmsFinishedSkuCostService wmsFinishedSkuCostService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void costCalculation(Map<Long, WmsTaskDetails> versionMap, List<WmsBomItem> wmsBomItems, List<Long> itemSkuIdList) {
+        List<ItemSku> itemSkus = itemSkuService.listByIds(itemSkuIdList);
+        Map<Long, ItemSku> itemSkuMap = itemSkus.stream().collect(Collectors.toMap(ItemSku::getId, itemSku -> itemSku));
+
+        List<WmsFinishedSkuCost> wmsFinishedSkuCostList = wmsBomItems.stream().map(itemSku -> {
+            WmsTaskDetails wmsTaskDetails = versionMap.get(itemSku.getVersionId());
+            ItemSku sku = itemSkuMap.get(itemSku.getItemSkuId());
+            BigDecimal cose = sku.getBaseUnitCost().multiply(itemSku.getBaseQuantity());
+            return WmsFinishedSkuCost.builder()
+                .productId(wmsTaskDetails.getId())
+                .itemType(sku.getItemType())
+                .itemSkuId(itemSku.getItemSkuId())
+                .cost(cose)
+                .build();
+        }).toList();
+
+        Map<String, BigDecimal> groupedCost = wmsFinishedSkuCostList.stream()
+            .collect(Collectors.groupingBy(
+                cost -> cost.getProductId() + "-" + cost.getItemType(),
+                Collectors.reducing(
+                    BigDecimal.ZERO,
+                    WmsFinishedSkuCost::getCost,
+                    BigDecimal::add
+                )
+            ));
+
+        List<WmsFinishedProductCost> list = versionMap.keySet().stream().map(versionId -> {
+            WmsTaskDetails wmsTaskDetails = versionMap.get(versionId);
+
+            BigDecimal rawMaterialsCost = groupedCost.get(wmsTaskDetails.getId() + "-" + ItemType.ITEM_TYPE_1.getCode());
+            BigDecimal packagingMaterialsCost = groupedCost.get(wmsTaskDetails.getId() + "-" + ItemType.ITEM_TYPE_3.getCode());
+
+            return WmsFinishedProductCost.builder().id(wmsTaskDetails.getId())
+                .taskId(wmsTaskDetails.getTaskId())
+                .versionId(wmsTaskDetails.getVersionId())
+                .itemSkuId(wmsTaskDetails.getItemSkuId())
+                .materialCost(rawMaterialsCost)
+                .packagingCost(packagingMaterialsCost)
+                .totalCost(rawMaterialsCost.add(packagingMaterialsCost))
+                .quantity(new BigDecimal(wmsTaskDetails.getQuantity()))
+                .build();
+        }).toList();
+
+        wmsFinishedSkuCostService.saveBatch(wmsFinishedSkuCostList);
+        this.saveBatch(list);
+    }
+}
+
+
+
+

+ 22 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsFinishedSkuCostServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ruoyi.wms.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.wms.domain.bo.WmsFinishedSkuCost;
+import com.ruoyi.wms.service.WmsFinishedSkuCostService;
+import com.ruoyi.wms.mapper.WmsFinishedSkuCostMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【wms_finished_sku_cost(成品成本明细列表)】的数据库操作Service实现
+* @createDate 2026-04-15 17:47:58
+*/
+@Service
+public class WmsFinishedSkuCostServiceImpl extends ServiceImpl<WmsFinishedSkuCostMapper, WmsFinishedSkuCost>
+    implements WmsFinishedSkuCostService{
+
+}
+
+
+
+

+ 12 - 6
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsTaskServiceImpl.java

@@ -18,6 +18,7 @@ import com.ruoyi.wms.service.*;
 import lombok.RequiredArgsConstructor;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.HashMap;
@@ -47,6 +48,8 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
 
     private final ShipmentOrderDetailService shipmentOrderDetailService;
 
+    private final WmsFinishedProductCostService wmsFinishedProductCostService;
+
     @Override
     public void addTask(TaskAddDto taskAddDto) {
         // 生成任务单
@@ -61,6 +64,7 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void complete(String id) {
         WmsTask wmsTask = this.getById(id);
         Assert.notNull(wmsTask, "任务单不存在");
@@ -70,11 +74,15 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
 
         // 任务明细
         List<WmsTaskDetails> wmsTaskDetails = wmsTaskDetailsService.lambdaQuery().eq(WmsTaskDetails::getTaskId, wmsTask.getId()).list();
-        Map<Long, Integer> versionMap = wmsTaskDetails.stream().collect(Collectors.toMap(WmsTaskDetails::getVersionId, WmsTaskDetails::getQuantity));
+        Map<Long, WmsTaskDetails> versionMap = wmsTaskDetails.stream().collect(Collectors.toMap(WmsTaskDetails::getVersionId, x->x));
 
         // BOM明细
         List<WmsBomItem> wmsBomItems = wmsBomItemService.lambdaQuery().in(WmsBomItem::getVersionId, versionMap.keySet()).list();
         List<Long> itemSkuIdList = wmsBomItems.stream().map(WmsBomItem::getItemSkuId).toList();
+
+        // 成本计算
+        wmsFinishedProductCostService.costCalculation(versionMap, wmsBomItems, itemSkuIdList);
+
         // 库存
         List<Inventory> inventoryList = inventoryService.lambdaQuery()
             .eq(Inventory::getSkuId, itemSkuIdList)
@@ -85,12 +93,10 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
 
         // 出库单
         Map<Long, ShipmentOrder> shipmentOrderMap = new HashMap<>();
-
         Map<String, ShipmentOrderDetail> shipmentOrderDetailMap = new HashMap<>();
 
         // 汇总出库原料
         Map<Long, UnitPo> bomItemQuantityMap = getLongBigDecimalMap(wmsBomItems, versionMap);
-
         for (Long skuId : bomItemQuantityMap.keySet()) {
             List<Inventory> inventories = inventoryMap.get(skuId);
 
@@ -145,12 +151,12 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
     }
 
     @NotNull
-    private static Map<Long, UnitPo> getLongBigDecimalMap(List<WmsBomItem> wmsBomItems, Map<Long, Integer> versionMap) {
+    private static Map<Long, UnitPo> getLongBigDecimalMap(List<WmsBomItem> wmsBomItems, Map<Long, WmsTaskDetails> versionMap) {
         Map<Long, UnitPo> bomItemQuantityMap = new HashMap<>();
         for (WmsBomItem wmsBomItem : wmsBomItems) {
             UnitPo unitPo = bomItemQuantityMap.get(wmsBomItem.getItemSkuId());
-            Integer i = versionMap.get(wmsBomItem.getVersionId());
-            BigDecimal add = wmsBomItem.getBaseQuantity().add(new BigDecimal(i));
+            WmsTaskDetails wmsTaskDetails = versionMap.get(wmsBomItem.getVersionId());
+            BigDecimal add = wmsBomItem.getBaseQuantity().add(new BigDecimal(wmsTaskDetails.getQuantity()));
             if (unitPo == null) {
                 bomItemQuantityMap.put(wmsBomItem.getItemSkuId(), new UnitPo(wmsBomItem.getBaseUnit(), add));
             } else {

+ 1 - 1
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsUnitConfigServiceImpl.java

@@ -10,6 +10,7 @@ import com.ruoyi.wms.mapper.WmsUnitConfigMapper;
 import com.ruoyi.wms.utils.UnitCalculation;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -39,7 +40,6 @@ public class WmsUnitConfigServiceImpl extends ServiceImpl<WmsUnitConfigMapper, W
             movementOrderDetailBo.setBaseUnit(unitPo.getBaseUnit());
             movementOrderDetailBo.setBaseQuantity(unitPo.getBaseQuantity());
         });
-
     }
 
 

+ 15 - 0
ruoyi-admin-wms/src/main/resources/mapper/wms/ReceiptOrderDetailMapper.xml

@@ -4,4 +4,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.wms.mapper.ReceiptOrderDetailMapper">
 
+
+    <select id="getQuantityAndAmount" resultType="com.ruoyi.wms.domain.dto.ReceiptOrderDetailSummary">
+        select sku_id,
+        sum(amount) as amount,
+        sum(base_quantity) as base_quantity
+        from wms_receipt_order_detail wrod
+        left join wms_receipt_order wro on wrod.order_id = wro.id
+        where wrod.sku_id in
+        <foreach collection="skuId" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        group by sku_id
+
+    </select>
+
 </mapper>