Explorar el Código

save
1.任务管理

wks hace 4 meses
padre
commit
54812b2ee7
Se han modificado 21 ficheros con 383 adiciones y 47 borrados
  1. 26 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/SystemController.java
  2. 0 1
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/TaskController.java
  3. 5 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/BaseOrderDetailBo.java
  4. 7 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/ItemSkuBo.java
  5. 34 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/constant/MeasurementUnit.java
  6. 23 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/constant/WmsConstant.java
  7. 32 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/dto/WmsUnitAuxiliaryDto.java
  8. 11 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/BaseOrderDetail.java
  9. 5 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/ShipmentOrder.java
  10. 11 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/WmsBomItem.java
  11. 24 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/po/UnitPo.java
  12. 5 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/BaseOrderVo.java
  13. 31 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/MeasurementUnitVo.java
  14. 11 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/WmsUnitConfigMapper.java
  15. 1 1
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/InventoryService.java
  16. 17 5
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/WmsUnitConfigService.java
  17. 17 4
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsBomVersionServiceImpl.java
  18. 63 36
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsTaskServiceImpl.java
  19. 12 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsUnitConfigServiceImpl.java
  20. 34 0
      ruoyi-admin-wms/src/main/java/com/ruoyi/wms/utils/UnitCalculation.java
  21. 14 0
      ruoyi-admin-wms/src/main/resources/mapper/wms/WmsUnitConfigMapper.xml

+ 26 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/SystemController.java

@@ -0,0 +1,26 @@
+package com.ruoyi.wms.controller;
+
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.wms.domain.constant.WmsConstant;
+import com.ruoyi.wms.domain.vo.MeasurementUnitVo;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/wms/system")
+public class SystemController {
+
+    @Operation(summary = "查询单位信息")
+    @GetMapping("/measurement/unit")
+    public R<List<MeasurementUnitVo>> measurementUnit() {
+        return R.ok(WmsConstant.MEASUREMENT_UNIT_LIST);
+    }
+
+}

+ 0 - 1
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/controller/TaskController.java

@@ -68,6 +68,5 @@ public class TaskController {
         return R.ok("作废成功");
     }
 
-
 }
 

+ 5 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/BaseOrderDetailBo.java

@@ -41,6 +41,11 @@ public class BaseOrderDetailBo extends BaseEntity {
     @NotNull(message = "出入库数量不能为空", groups = {AddGroup.class, EditGroup.class})
     private BigDecimal quantity;
 
+    /**
+     * 单位
+     */
+    private String unit;
+
     /**
      * 金额
      */

+ 7 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/bo/ItemSkuBo.java

@@ -105,6 +105,13 @@ public class ItemSkuBo extends BaseEntity {
      */
     private String itemCategory;
 
+    /**
+     * @see com.ruoyi.wms.domain.constant.ItemType
+     * 商品类型
+     */
+    private String itemType;
+
+
     private Long itemBrand;
 
     /**

+ 34 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/constant/MeasurementUnit.java

@@ -0,0 +1,34 @@
+package com.ruoyi.wms.domain.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.math.BigDecimal;
+
+@Getter
+@AllArgsConstructor
+public enum MeasurementUnit {
+
+    WEIGHT_G("WEIGHT", "g", "克", "g", new BigDecimal("1")),
+    WEIGHT_KG("WEIGHT", "kg", "千克", "g", new BigDecimal("1000")),
+    WEIGHT_T("WEIGHT", "t", "吨", "g", new BigDecimal("1000000")),
+
+    VOLUME_ML("VOLUME", "ml", "毫升", "ml", new BigDecimal("1")),
+    VOLUME_L("VOLUME", "L", "升", "ml", new BigDecimal("1000")),
+
+    LENGTH_MM("LENGTH", "mm", "毫米", "mm", new BigDecimal("1")),
+    LENGTH_CM("LENGTH", "cm", "厘米", "mm", new BigDecimal("10")),
+    LENGTH_M("LENGTH", "m", "米", "mm", new BigDecimal("1000"));
+
+    private final String categoryCode;
+
+    private final String unitCode;
+
+    private final String unitName;
+
+    private final String baseUnitCode;
+
+    private final BigDecimal conversionRatio;
+
+
+}

+ 23 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/constant/WmsConstant.java

@@ -0,0 +1,23 @@
+package com.ruoyi.wms.domain.constant;
+
+import com.ruoyi.wms.domain.vo.MeasurementUnitVo;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+public final class WmsConstant {
+
+    public static List<MeasurementUnitVo> MEASUREMENT_UNIT_LIST;
+
+    public static Map<String, MeasurementUnit> MEASUREMENT_UNIT_MAP;
+
+    static {
+        MeasurementUnit[] values = MeasurementUnit.values();
+        MEASUREMENT_UNIT_LIST = Arrays.stream(values).map(MeasurementUnitVo::new).toList();
+        MEASUREMENT_UNIT_MAP = Arrays.stream(values).collect(Collectors.toMap(MeasurementUnit::getUnitCode, metricUnit -> metricUnit));
+    }
+
+}

+ 32 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/dto/WmsUnitAuxiliaryDto.java

@@ -0,0 +1,32 @@
+package com.ruoyi.wms.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class WmsUnitAuxiliaryDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6270907460281722763L;
+
+    private Long itemSkuId;
+
+    /**
+     * 主单位
+     */
+    private String mainUnit;
+
+    /**
+     * 辅助单位
+     */
+    private String auxiliaryUnit;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+}

+ 11 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/BaseOrderDetail.java

@@ -1,5 +1,6 @@
 package com.ruoyi.wms.domain.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.ruoyi.common.mybatis.core.domain.BaseEntity;
 import lombok.Data;
@@ -42,6 +43,16 @@ public class BaseOrderDetail extends BaseEntity {
      */
     private String unit;
 
+    /**
+     * 基准数量
+     */
+    private BigDecimal baseQuantity;
+
+    /**
+     * 基准单位
+     */
+    private String baseUnit;
+
     /**
      * 金额
      */

+ 5 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/ShipmentOrder.java

@@ -24,6 +24,11 @@ public class ShipmentOrder extends BaseOrder {
      */
     private Long optType;
 
+    /**
+     * 任务单号
+     */
+    private Long taskId;
+
     /**
      * 业务订单号
      */

+ 11 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/entity/WmsBomItem.java

@@ -58,5 +58,16 @@ public class WmsBomItem implements Serializable {
     @TableField(value = "unit")
     private String unit;
 
+    /**
+     * 基准数量
+     */
+    @TableField(value = "base_quantity")
+    private BigDecimal baseQuantity;
+
+    /**
+     * 基准单位
+     */
+    @TableField(value = "base_unit")
+    private String baseUnit;
 
 }

+ 24 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/po/UnitPo.java

@@ -0,0 +1,24 @@
+package com.ruoyi.wms.domain.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UnitPo {
+
+    /**
+     * 基准单位
+     */
+    private String baseUnit;
+
+    /**
+     * 基准数量
+     */
+    private BigDecimal baseQuantity;
+
+}

+ 5 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/BaseOrderVo.java

@@ -6,6 +6,7 @@ import com.ruoyi.common.mybatis.core.domain.BaseVo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serial;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -13,6 +14,10 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 @ExcelIgnoreUnannotated
 public class BaseOrderVo<T extends BaseOrderDetailVo> extends BaseVo {
+
+    @Serial
+    private static final long serialVersionUID = 7010169991648193372L;
+
     /**
      *
      */

+ 31 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/domain/vo/MeasurementUnitVo.java

@@ -0,0 +1,31 @@
+package com.ruoyi.wms.domain.vo;
+
+import com.ruoyi.wms.domain.constant.MeasurementUnit;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MeasurementUnitVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -747791885790213401L;
+
+    private String categoryCode;
+
+    private String unitCode;
+
+    private String unitName;
+
+    public MeasurementUnitVo(MeasurementUnit measurementUnit) {
+        this.categoryCode = measurementUnit.getCategoryCode();
+        this.unitCode = measurementUnit.getUnitCode();
+        this.unitName = measurementUnit.getUnitName();
+    }
+
+}

+ 11 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/mapper/WmsUnitConfigMapper.java

@@ -1,7 +1,11 @@
 package com.ruoyi.wms.mapper;
 
+import com.ruoyi.wms.domain.dto.WmsUnitAuxiliaryDto;
 import com.ruoyi.wms.domain.entity.WmsUnitConfig;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
 * @author Administrator
@@ -11,6 +15,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 */
 public interface WmsUnitConfigMapper extends BaseMapper<WmsUnitConfig> {
 
+    /**
+     * 获取多单位配置
+     *
+     * @param itemSkuIdList sku id 列表
+     * @return 辅助单位列表
+     */
+    List<WmsUnitAuxiliaryDto> getBySkuId(@Param("itemSkuIdList") List<Long> itemSkuIdList);
 }
 
 

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

@@ -117,7 +117,7 @@ public class InventoryService extends ServiceImpl<InventoryMapper, Inventory> {
         return TableDataInfo.build(result);
     }
 
-    public void updateInventory(List<CheckOrderDetailBo> details) {
+    public void  updateInventory(List<CheckOrderDetailBo> details) {
         List<Inventory> updateInventoryList = new LinkedList<>();
         List<Inventory> insertInventoryList = new LinkedList<>();
 

+ 17 - 5
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/WmsUnitConfigService.java

@@ -1,13 +1,25 @@
 package com.ruoyi.wms.service;
 
-import com.ruoyi.wms.domain.entity.WmsUnitConfig;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.wms.domain.dto.WmsUnitAuxiliaryDto;
+import com.ruoyi.wms.domain.entity.WmsUnitConfig;
+
+import java.util.List;
+import java.util.Map;
 
 /**
-* @author Administrator
-* @description 针对表【wms_unit_config(多单位配置)】的数据库操作Service
-* @createDate 2026-04-09 16:02:46
-*/
+ * @author Administrator
+ * @description 针对表【wms_unit_config(多单位配置)】的数据库操作Service
+ * @createDate 2026-04-09 16:02:46
+ */
 public interface WmsUnitConfigService extends IService<WmsUnitConfig> {
 
+
+    /**
+     * 获取多单位配置
+     *
+     * @param itemSkuIdList sku id 列表
+     * @return 辅助单位列表
+     */
+    Map<Long, Map<String, WmsUnitAuxiliaryDto>> getBySkuId(List<Long> itemSkuIdList);
 }

+ 17 - 4
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsBomVersionServiceImpl.java

@@ -4,18 +4,23 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.wms.domain.dto.BomAddDto;
 import com.ruoyi.wms.domain.dto.BomItemSkuDto;
 import com.ruoyi.wms.domain.dto.BomListQueryDto;
+import com.ruoyi.wms.domain.dto.WmsUnitAuxiliaryDto;
 import com.ruoyi.wms.domain.entity.WmsBomItem;
 import com.ruoyi.wms.domain.entity.WmsBomVersion;
+import com.ruoyi.wms.domain.po.UnitPo;
 import com.ruoyi.wms.domain.vo.BomListVo;
 import com.ruoyi.wms.mapper.WmsBomVersionMapper;
 import com.ruoyi.wms.service.WmsBomItemService;
 import com.ruoyi.wms.service.WmsBomVersionService;
+import com.ruoyi.wms.service.WmsUnitConfigService;
+import com.ruoyi.wms.utils.UnitCalculation;
 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;
 
 /**
@@ -30,6 +35,8 @@ public class WmsBomVersionServiceImpl extends ServiceImpl<WmsBomVersionMapper, W
 
     private final WmsBomItemService wmsBomItemService;
 
+    private final WmsUnitConfigService wmsUnitConfigService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addBomConfig(BomAddDto bomAddDto) {
@@ -41,7 +48,10 @@ public class WmsBomVersionServiceImpl extends ServiceImpl<WmsBomVersionMapper, W
         // 保存版本信息
         save(bomVersion);
 
-        List<WmsBomItem> wmsBomItems = buildBomItemList(bomAddDto.getBomItemSkuList(), bomVersion.getId());
+        List<Long> list = bomAddDto.getBomItemSkuList().stream().map(BomItemSkuDto::getBomItemSkuId).toList();
+        Map<Long, Map<String, WmsUnitAuxiliaryDto>> unitAuxiliaryMap = wmsUnitConfigService.getBySkuId(list);
+
+        List<WmsBomItem> wmsBomItems = buildBomItemList(bomAddDto.getBomItemSkuList(), bomVersion.getId(), unitAuxiliaryMap);
         // 保存明细
         wmsBomItemService.saveBatch(wmsBomItems);
     }
@@ -51,15 +61,18 @@ public class WmsBomVersionServiceImpl extends ServiceImpl<WmsBomVersionMapper, W
         return this.baseMapper.getBomConfig(bomListQueryDto);
     }
 
-    private List<WmsBomItem> buildBomItemList(List<BomItemSkuDto> bomVersionList, Long versionId) {
-        return bomVersionList.stream().map(x -> buildBomItem(x, versionId)).collect(Collectors.toList());
+    private List<WmsBomItem> buildBomItemList(List<BomItemSkuDto> bomVersionList, Long versionId, Map<Long, Map<String, WmsUnitAuxiliaryDto>> unitAuxiliaryMap) {
+        return bomVersionList.stream().map(x -> buildBomItem(x, versionId, unitAuxiliaryMap)).collect(Collectors.toList());
     }
 
-    private WmsBomItem buildBomItem(BomItemSkuDto bomItemSkuDto, Long versionId) {
+    private WmsBomItem buildBomItem(BomItemSkuDto bomItemSkuDto, Long versionId, Map<Long, Map<String, WmsUnitAuxiliaryDto>> unitAuxiliaryMap) {
+        UnitPo unitPo = UnitCalculation.conversion(bomItemSkuDto.getBomItemSkuId(), bomItemSkuDto.getUnit(), new BigDecimal(bomItemSkuDto.getQuantity()), unitAuxiliaryMap);
         return WmsBomItem.builder()
             .versionId(versionId)
             .unit(bomItemSkuDto.getUnit())
             .quantity(new BigDecimal(bomItemSkuDto.getQuantity()))
+            .baseQuantity(unitPo.getBaseQuantity())
+            .baseUnit(unitPo.getBaseUnit())
             .itemSkuId(bomItemSkuDto.getBomItemSkuId())
             .build();
     }

+ 63 - 36
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/service/impl/WmsTaskServiceImpl.java

@@ -5,19 +5,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.component.TaskCodeGenerator;
+import com.ruoyi.common.core.constant.ServiceConstants;
 import com.ruoyi.common.core.exception.base.BaseException;
 import com.ruoyi.common.core.utils.OrderNoGenerator;
 import com.ruoyi.wms.domain.constant.TaskStatus;
 import com.ruoyi.wms.domain.dto.TaskAddDto;
 import com.ruoyi.wms.domain.dto.TaskItemSkuDto;
 import com.ruoyi.wms.domain.entity.*;
+import com.ruoyi.wms.domain.po.UnitPo;
 import com.ruoyi.wms.mapper.WmsTaskMapper;
 import com.ruoyi.wms.service.*;
 import lombok.RequiredArgsConstructor;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,8 +43,6 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
 
     private final WmsBomItemService wmsBomItemService;
 
-    private final WmsBomVersionService wmsBomVersionService;
-
     private final ShipmentOrderService shipmentOrderService;
 
     private final ShipmentOrderDetailService shipmentOrderDetailService;
@@ -70,72 +70,73 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
 
         // 任务明细
         List<WmsTaskDetails> wmsTaskDetails = wmsTaskDetailsService.lambdaQuery().eq(WmsTaskDetails::getTaskId, wmsTask.getId()).list();
-        List<Long> versionList = wmsTaskDetails.stream().map(WmsTaskDetails::getVersionId).toList();
+        Map<Long, Integer> versionMap = wmsTaskDetails.stream().collect(Collectors.toMap(WmsTaskDetails::getVersionId, WmsTaskDetails::getQuantity));
+
         // BOM明细
-        List<WmsBomItem> wmsBomItems = wmsBomItemService.lambdaQuery().in(WmsBomItem::getVersionId, versionList).list();
+        List<WmsBomItem> wmsBomItems = wmsBomItemService.lambdaQuery().in(WmsBomItem::getVersionId, versionMap.keySet()).list();
         List<Long> itemSkuIdList = wmsBomItems.stream().map(WmsBomItem::getItemSkuId).toList();
         // 库存
         List<Inventory> inventoryList = inventoryService.lambdaQuery()
             .eq(Inventory::getSkuId, itemSkuIdList)
             .orderByDesc(Inventory::getQuantity)
             .list();
-
         // 库存处理
         Map<Long, List<Inventory>> inventoryMap = inventoryList.stream().collect(Collectors.groupingBy(Inventory::getSkuId));
 
         // 出库单
-        Map<String, ShipmentOrder> shipmentOrderMap = new HashMap<>();
+        Map<Long, ShipmentOrder> shipmentOrderMap = new HashMap<>();
+
         Map<String, ShipmentOrderDetail> shipmentOrderDetailMap = new HashMap<>();
-        //
 
-        List<Inventory> list = new ArrayList<>();
-        for (WmsBomItem wmsBomItem : wmsBomItems) {
-            List<Inventory> inventories = inventoryMap.get(wmsBomItem.getItemSkuId());
-            for (Inventory inventory : inventories) {
-                list.add(inventory);
-                String shipmentOrderDetailKey = inventory.getWarehouseId() + "," + wmsBomItem.getItemSkuId();
-                String shipmentOrderKey = inventory.getWarehouseId() + ",";
-                ShipmentOrder shipmentOrder = shipmentOrderMap.get(inventory.getWarehouseId() + "");
+        // 汇总出库原料
+        Map<Long, UnitPo> bomItemQuantityMap = getLongBigDecimalMap(wmsBomItems, versionMap);
+
+        for (Long skuId : bomItemQuantityMap.keySet()) {
+            List<Inventory> inventories = inventoryMap.get(skuId);
+
+            for (int i = 0; i < inventories.size(); i++) {
+                Inventory inventory = inventories.get(i);
+                String shipmentOrderDetailKey = inventory.getWarehouseId() + "," + skuId;
+                Long warehouseId = inventory.getWarehouseId();
+
+                // 出库单
+                ShipmentOrder shipmentOrder = shipmentOrderMap.get(warehouseId);
                 if (shipmentOrder == null) {
                     shipmentOrder = new ShipmentOrder();
                     shipmentOrder.setId(IdWorker.getId());
                     shipmentOrder.setOrderNo(OrderNoGenerator.generateCK());
+                    shipmentOrder.setTaskId(wmsTask.getId());
                     shipmentOrder.setWarehouseId(inventory.getWarehouseId());
-                    shipmentOrderMap.putIfAbsent(shipmentOrderKey, shipmentOrder);
+                    shipmentOrder.setOrderStatus(ServiceConstants.ShipmentOrderStatus.PENDING);
+                    shipmentOrderMap.putIfAbsent(warehouseId, shipmentOrder);
                 }
 
+                // 出库明细
                 ShipmentOrderDetail shipmentOrderDetail = shipmentOrderDetailMap.get(shipmentOrderDetailKey);
                 if (shipmentOrderDetail == null) {
                     shipmentOrderDetail = new ShipmentOrderDetail();
                     shipmentOrderDetail.setWarehouseId(inventory.getWarehouseId());
-                    shipmentOrderDetail.setSkuId(wmsBomItem.getItemSkuId());
+                    shipmentOrderDetail.setSkuId(skuId);
                     shipmentOrderDetail.setOrderId(shipmentOrder.getId());
-                    shipmentOrderDetail.setQuantity(wmsBomItem.getQuantity());
-                    shipmentOrderDetail.setUnit(wmsBomItem.getUnit());
-                    shipmentOrderMap.putIfAbsent(shipmentOrderKey, shipmentOrder);
                     shipmentOrderDetailMap.putIfAbsent(shipmentOrderDetailKey, shipmentOrderDetail);
-                } else {
-                    shipmentOrderDetail.setQuantity(shipmentOrderDetail.getQuantity().add(wmsBomItem.getQuantity()));
                 }
 
-                if (inventory.getQuantity().compareTo(wmsBomItem.getQuantity()) > 0) {
-                    BigDecimal subtract = inventory.getQuantity().subtract(wmsBomItem.getQuantity());
-                    wmsBomItem.setQuantity(new BigDecimal(0));
-                    inventory.setQuantity(subtract);
+                UnitPo unitPo = bomItemQuantityMap.get(skuId);
+                shipmentOrderDetail.setUnit(unitPo.getBaseUnit());
+                shipmentOrderDetail.setBaseUnit(unitPo.getBaseUnit());
+                if (unitPo.getBaseQuantity().compareTo(inventory.getQuantity()) < 0 || i == inventories.size() - 1) {
+                    shipmentOrderDetail.setQuantity(unitPo.getBaseQuantity());
+                    shipmentOrderDetail.setBaseQuantity(unitPo.getBaseQuantity());
                     break;
                 } else {
-                    BigDecimal subtract = wmsBomItem.getQuantity().subtract(inventory.getQuantity());
-                    wmsBomItem.setQuantity(subtract);
-                    inventory.setQuantity(new BigDecimal(0));
-                }
-
-                if (wmsBomItem.getQuantity().compareTo(new BigDecimal(0)) > 0) {
-                    throw new BaseException("库存不足:%s".formatted(wmsBomItem.getItemSkuId()));
+                    shipmentOrderDetail.setQuantity(inventory.getQuantity());
+                    shipmentOrderDetail.setBaseQuantity(inventory.getQuantity());
                 }
-
+                BigDecimal subtract = unitPo.getBaseQuantity().subtract(inventory.getQuantity());
+                unitPo.setBaseQuantity(subtract);
             }
         }
-        inventoryService.updateBatchById(list);
+
         shipmentOrderService.saveBatch(shipmentOrderMap.values());
         shipmentOrderDetailService.saveBatch(shipmentOrderDetailMap.values());
 
@@ -143,11 +144,37 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
         this.updateById(wmsTask);
     }
 
+    @NotNull
+    private static Map<Long, UnitPo> getLongBigDecimalMap(List<WmsBomItem> wmsBomItems, Map<Long, Integer> 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));
+            if (unitPo == null) {
+                bomItemQuantityMap.put(wmsBomItem.getItemSkuId(), new UnitPo(wmsBomItem.getBaseUnit(), add));
+            } else {
+                BigDecimal add1 = unitPo.getBaseQuantity().add(add);
+                unitPo.setBaseQuantity(add1);
+            }
+        }
+        return bomItemQuantityMap;
+    }
+
     @Override
     public void revoke(String id) {
         WmsTask wmsTask = this.getById(id);
         Assert.notNull(wmsTask, "任务单不存在");
 
+        List<ShipmentOrder> list = shipmentOrderService.lambdaQuery()
+            .eq(ShipmentOrder::getTaskId, wmsTask.getId())
+            .eq(ShipmentOrder::getOrderStatus, ServiceConstants.ShipmentOrderStatus.FINISH)
+            .list();
+
+        if (!list.isEmpty()) {
+            throw new BaseException("生产任务所需要的原料已出库,生产任务已无法作废");
+        }
+
         wmsTask.setStatus(TaskStatus.TASK_STATUS_3.getCode());
         this.updateById(wmsTask);
     }

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

@@ -1,11 +1,16 @@
 package com.ruoyi.wms.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.wms.domain.dto.WmsUnitAuxiliaryDto;
 import com.ruoyi.wms.domain.entity.WmsUnitConfig;
 import com.ruoyi.wms.service.WmsUnitConfigService;
 import com.ruoyi.wms.mapper.WmsUnitConfigMapper;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
 * @author Administrator
 * @description 针对表【wms_unit_config(多单位配置)】的数据库操作Service实现
@@ -15,6 +20,13 @@ import org.springframework.stereotype.Service;
 public class WmsUnitConfigServiceImpl extends ServiceImpl<WmsUnitConfigMapper, WmsUnitConfig>
     implements WmsUnitConfigService{
 
+
+    @Override
+    public Map<Long, Map<String, WmsUnitAuxiliaryDto>> getBySkuId(List<Long> itemSkuIdList) {
+        List<WmsUnitAuxiliaryDto> unitAuxiliaryDtoList =  this.baseMapper.getBySkuId(itemSkuIdList);
+        return unitAuxiliaryDtoList.stream().collect(Collectors.groupingBy(WmsUnitAuxiliaryDto::getItemSkuId, Collectors.toMap(WmsUnitAuxiliaryDto::getAuxiliaryUnit, value -> value, (d1, d2) -> d1)));
+    }
+
 }
 
 

+ 34 - 0
ruoyi-admin-wms/src/main/java/com/ruoyi/wms/utils/UnitCalculation.java

@@ -0,0 +1,34 @@
+package com.ruoyi.wms.utils;
+
+
+import com.ruoyi.wms.domain.constant.MeasurementUnit;
+import com.ruoyi.wms.domain.constant.WmsConstant;
+import com.ruoyi.wms.domain.dto.WmsUnitAuxiliaryDto;
+import com.ruoyi.wms.domain.po.UnitPo;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+public final class UnitCalculation {
+
+    public static UnitPo conversion(Long skuId, String unit, BigDecimal quantity, Map<Long, Map<String, WmsUnitAuxiliaryDto>> unitAuxiliaryMap) {
+        UnitPo unitPo = new UnitPo();
+        MeasurementUnit measurementUnit = WmsConstant.MEASUREMENT_UNIT_MAP.get(unit);
+        BigDecimal ratio;
+        String baseUnitCode;
+        if (measurementUnit == null) {
+            WmsUnitAuxiliaryDto wmsUnitAuxiliaryDto = unitAuxiliaryMap.get(skuId).get(unit);
+            ratio = wmsUnitAuxiliaryDto.getQuantity();
+            baseUnitCode = wmsUnitAuxiliaryDto.getMainUnit();
+        } else {
+            ratio = measurementUnit.getConversionRatio();
+            baseUnitCode = measurementUnit.getBaseUnitCode();
+        }
+        BigDecimal multiply = quantity.multiply(ratio);
+        unitPo.setBaseQuantity(multiply);
+        unitPo.setBaseUnit(baseUnitCode);
+        return unitPo;
+    }
+
+
+}

+ 14 - 0
ruoyi-admin-wms/src/main/resources/mapper/wms/WmsUnitConfigMapper.xml

@@ -14,4 +14,18 @@
     <sql id="Base_Column_List">
         item_sku_id,outbound_unit,warehousing_unit,main_unit
     </sql>
+
+    <select id="getBySkuId" resultType="com.ruoyi.wms.domain.dto.WmsUnitAuxiliaryDto">
+        select wua.item_sku_id,
+        wuc.main_unit,
+        wua.auxiliary_unit,
+        wua.quantity
+        from wms_unit_auxiliary wua
+        left join wms_unit_config wuc on wua.item_sku_id = wuc.item_sku_id
+        where wua.item_sku_id in
+        <foreach collection="itemSkuIdList" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
 </mapper>