From c7cf13da4cd96a76771475b8e4c364dfddebf712 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 23 一月 2026 11:09:33 +0800
Subject: [PATCH] feat(sales): 库存

---
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java |    2 
 src/main/java/com/ruoyi/common/utils/EnumUtil.java                          |  107 +++++++++++++++++
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java   |    5 
 src/main/java/com/ruoyi/common/enums/StockRecordTypeEnum.java               |   30 +++++
 src/main/java/com/ruoyi/basic/controller/EnumController.java                |   29 ++++
 src/main/java/com/ruoyi/common/enums/BaseEnum.java                          |   58 +++++++++
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java             |   71 +++++++++++
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java    |    6 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java   |    6 
 9 files changed, 304 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/controller/EnumController.java b/src/main/java/com/ruoyi/basic/controller/EnumController.java
new file mode 100644
index 0000000..8091ac9
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/controller/EnumController.java
@@ -0,0 +1,29 @@
+package com.ruoyi.basic.controller;
+
+import com.ruoyi.common.enums.StockRecordTypeEnum;
+import com.ruoyi.common.utils.EnumUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
+import com.ruoyi.framework.web.domain.R;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@Api(tags = "鏋氫妇鎺ュ彛")
+@RequestMapping("/basic/enum")
+public class EnumController {
+
+
+    //鑾峰彇搴撳瓨鏋氫妇
+    @GetMapping("/stockRecordType")
+    @Anonymous
+    public R  getStockRecordTypeEnum(){
+        List<Map<String, Object>> list = EnumUtil.toList(StockRecordTypeEnum.class);
+        return R.ok(list);
+    }
+}
diff --git a/src/main/java/com/ruoyi/common/enums/BaseEnum.java b/src/main/java/com/ruoyi/common/enums/BaseEnum.java
new file mode 100644
index 0000000..cb6311c
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/BaseEnum.java
@@ -0,0 +1,58 @@
+package com.ruoyi.common.enums;
+
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public interface BaseEnum {
+    @JsonValue
+    Integer getCode();
+
+    String getValue();
+
+    /**
+     * 閫氱敤闈欐�佸伐鍏锋柟娉曪紙鍙鎵�鏈夋灇涓捐皟鐢級
+     */
+    /**
+     * 閫氱敤闈欐�佸伐鍏锋柟娉曪細鏀寔浠� Integer 鎴� String 绫诲瀷鐨� Code 杩涜鍙嶅簭鍒楀寲
+     */
+    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
+    static <E extends Enum<E> & BaseEnum> E fromCode(Class<E> enumClass, Object code) {
+        if (code == null) {
+            return null;
+        }
+
+        // 鐩爣 Code 鐨勬暣鏁板��
+        Integer targetCode = null;
+
+        if (code instanceof Integer) {
+            // 1. 濡傛灉浼犲叆鐨勬槸鏁板瓧 (Integer)
+            targetCode = (Integer) code;
+        } else if (code instanceof String) {
+            // 2. 濡傛灉浼犲叆鐨勬槸瀛楃涓� ("1")
+            try {
+                // 灏濊瘯灏嗗瓧绗︿覆杞崲涓烘暣鏁�
+                targetCode = Integer.valueOf((String) code);
+            } catch (NumberFormatException e) {
+                // 濡傛灉瀛楃涓蹭笉鏄湁鏁堢殑鏁板瓧锛堜緥濡� "Unknown"锛夛紝鍒� targetCode 淇濇寔涓� null
+                // 鎮ㄤ篃鍙互鍦ㄨ繖閲岃褰曟棩蹇楁垨鎵ц鍏朵粬閿欒澶勭悊
+                // System.err.println("鏃犳硶灏嗗瓧绗︿覆 Code 杞崲涓烘暟瀛�: " + code);
+                return null; // 鎴栬�呭湪鎵句笉鍒板尮閰嶇殑鎯呭喌涓嬭繑鍥� null
+            }
+        }
+        // else if (code instanceof Long) { ... 鎮ㄤ篃鍙互娣诲姞瀵� Long 绫诲瀷鐨勬敮鎸� }
+
+        if (targetCode == null) {
+            return null;
+        }
+
+        // 浣跨敤鑾峰彇鍒扮殑鏁存暟鍊艰繘琛屾煡鎵�
+        for (E e : enumClass.getEnumConstants()) {
+            if (e.getCode().equals(targetCode)) {
+                return e;
+            }
+        }
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/enums/StockRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockRecordTypeEnum.java
new file mode 100644
index 0000000..bae2856
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/StockRecordTypeEnum.java
@@ -0,0 +1,30 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+/**
+ * @author buhuazhen
+ * @date 2025/11/3
+ * @email 3038525872@qq.com
+ */
+@Getter
+public enum StockRecordTypeEnum implements BaseEnum {
+    CUSTOMIZATION_STOCK_IN(0, "鑷畾涔夊叆搴�"),
+    CUSTOMIZATION_STOCK_OUT(1, "鑷畾涔夊嚭搴�"),
+    PRODUCTION_REPORT_STOCK_IN(2, "鐢熶骇鎶ュ伐-鍏ュ簱"),
+    PRODUCTION_REPORT_STOCK_OUT(3, "鐢熶骇鎶ュ伐-鍑哄簱"),
+    PRODUCTION_SCRAP(4, "鐢熶骇鎶ュ伐-鎶ュ簾"),
+    DEFECTIVE_SCRAP(5, "涓嶅悎鏍煎鐞�-鎶ュ簾"),
+    DEFECTIVE_PASS(6, "涓嶅悎鏍煎鐞�-璁╂鏀捐"),
+    PURCHASE_STOCK_IN(7, "閲囪喘-鍏ュ簱"),
+    SALE_STOCK_OUT(8, "閿�鍞�-鍑哄簱");
+
+    private final Integer code;
+    private final String value;
+
+    StockRecordTypeEnum(Integer code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/common/utils/EnumUtil.java b/src/main/java/com/ruoyi/common/utils/EnumUtil.java
new file mode 100644
index 0000000..75be83a
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/utils/EnumUtil.java
@@ -0,0 +1,107 @@
+package com.ruoyi.common.utils;
+
+
+import com.ruoyi.common.enums.BaseEnum;
+import com.ruoyi.common.enums.StockRecordTypeEnum;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 閫氱敤鏋氫妇宸ュ叿绫�
+ * 閫傜敤浜庢墍鏈夊疄鐜� BaseEnum 鎺ュ彛鐨勬灇涓�
+ *
+ * @author Bu
+ */
+public class EnumUtil {
+
+    /**
+     * 鏍规嵁 code 鑾峰彇鏋氫妇瀹炰緥
+     */
+    public static <E extends Enum<E> & BaseEnum> E fromCode(Class<E> enumClass, int code) {
+        for (E e : enumClass.getEnumConstants()) {
+            if (e.getCode() == code) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException("鏈煡鐨� code: " + code + " 瀵逛簬鏋氫妇 " + enumClass.getSimpleName());
+    }
+
+    public static <E extends Enum<E> & BaseEnum> E fromCodeHasNull(Class<E> enumClass, int code) {
+        for (E e : enumClass.getEnumConstants()) {
+            if (e.getCode() == code) {
+                return e;
+            }
+        }
+        return null;
+    }
+
+    public static <E extends Enum<E> & BaseEnum> E fromCodeHasDefault(Class<E> enumClass, int code,E defaultE) {
+        for (E e : enumClass.getEnumConstants()) {
+            if (e.getCode() == code) {
+                return e;
+            }
+        }
+        return defaultE;
+    }
+
+
+
+    /**
+     * 鏍规嵁 value 鑾峰彇鏋氫妇瀹炰緥
+     */
+    public static <E extends Enum<E> & BaseEnum> E fromValue(Class<E> enumClass, String value) {
+        for (E e : enumClass.getEnumConstants()) {
+            if (Objects.equals(e.getValue(), value)) {
+                return e;
+            }
+        }
+        throw new IllegalArgumentException("鏈煡鐨� value: " + value + " 瀵逛簬鏋氫妇 " + enumClass.getSimpleName());
+    }
+
+    /**
+     * 鑾峰彇鎵�鏈夋灇涓鹃」鍒楄〃
+     */
+    public static <E extends Enum<E> & BaseEnum> List<E> listAll(Class<E> enumClass) {
+        return Arrays.asList(enumClass.getEnumConstants());
+    }
+
+    /**
+     * 杞负 List<Map>锛堥�傚悎杩斿洖缁欏墠绔級
+     * 鏍煎紡: [{ "code": 1, "value": "缁炵嚎" }, ...]
+     */
+    public static <E extends Enum<E> & BaseEnum> List<Map<String, Object>> toList(Class<E> enumClass) {
+        return Arrays.stream(enumClass.getEnumConstants())
+                .map(e -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("key", e.getCode());
+                    map.put("value", e.getValue());
+                    return map;
+                })
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 杞负 Map<Integer, String>
+     * 鏍煎紡: { 1: "缁炵嚎", 0: "鎷変笣" }
+     */
+    public static <E extends Enum<E> & BaseEnum> Map<Integer, String> toMap(Class<E> enumClass) {
+        return Arrays.stream(enumClass.getEnumConstants())
+                .collect(Collectors.toMap(BaseEnum::getCode, BaseEnum::getValue));
+    }
+
+
+    public static void main(String[] args) {
+        // 鉁� 1. 鏍规嵁 code 鑾峰彇鏋氫妇
+        StockRecordTypeEnum status = EnumUtil.fromCode(StockRecordTypeEnum.class, 1);
+        System.out.println(status.getValue()); // 缁炵嚎
+
+        // 鉁� 2. 杞垚 list (閫傚悎鍓嶇)
+        System.out.println(EnumUtil.toList(StockRecordTypeEnum.class));
+        // 杈撳嚭: [{code=1, value=缁炵嚎}, {code=0, value=鎷変笣}]
+
+        // 鉁� 3. 杞垚 map
+        System.out.println(EnumUtil.toMap(StockRecordTypeEnum.class));
+        // 杈撳嚭: {1=缁炵嚎, 0=鎷変笣}
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 0d61f87..6d7f6a0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -2,6 +2,11 @@
 
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
+import com.ruoyi.stock.dto.StockInRecordDto;
+import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.dto.StockUninventoryDto;
+import com.ruoyi.stock.service.StockInventoryService;
+import com.ruoyi.stock.service.StockUninventoryService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
@@ -14,6 +19,8 @@
 public class StockUtils {
     private final ProcurementRecordOutMapper procurementRecordOutMapper;
     private final ProcurementRecordMapper procurementRecordMapper;
+    private final StockUninventoryService stockUninventoryService;
+    private final StockInventoryService stockInventoryService;
 
     // 鑾峰彇鍟嗗搧鍏ュ簱鏁伴噺,鍑哄簱鏁伴噺,鍓╀綑搴撳瓨
     public Map<String, BigDecimal> getStockQuantity(Long productModelId) {
@@ -29,4 +36,68 @@
         stockMap.put("stockQuantity", stockQuantity);
         return stockMap;
     }
+
+    /**
+     * 涓嶅悎鏍煎叆搴�
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void addUnStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+        StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+        stockUninventoryDto.setRecordId(recordId);
+        stockUninventoryDto.setRecordType(recordType);
+        stockUninventoryDto.setQualitity(quantity);
+        stockUninventoryDto.setProductModelId(productModelId);
+        stockUninventoryService.addStockUninventory(stockUninventoryDto);
+    }
+
+    /**
+     * 涓嶅悎鏍煎嚭搴�
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void subtractUnStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+        StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+        stockUninventoryDto.setRecordId(recordId);
+        stockUninventoryDto.setRecordType(recordType);
+        stockUninventoryDto.setQualitity(quantity);
+        stockUninventoryDto.setProductModelId(productModelId);
+        stockUninventoryService.subtractStockUninventory(stockUninventoryDto);
+    }
+
+    /**
+     * 鍚堟牸鍏ュ簱
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void addStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+        StockInventoryDto stockInventoryDto = new StockInventoryDto();
+        stockInventoryDto.setRecordId(recordId);
+        stockInventoryDto.setRecordType(recordType);
+        stockInventoryDto.setQualitity(quantity);
+        stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryService.addstockInventory(stockInventoryDto);
+    }
+
+    /**
+     * 鍚堟牸鍑哄簱
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void substractStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+        StockInventoryDto stockInventoryDto = new StockInventoryDto();
+        stockInventoryDto.setRecordId(recordId);
+        stockInventoryDto.setRecordType(recordType);
+        stockInventoryDto.setQualitity(quantity);
+        stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryService.subtractStockInventory(stockInventoryDto);
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index ad80bd5..4cef388 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -18,6 +18,7 @@
 import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
+import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,12 +26,11 @@
 import java.util.List;
 
 @Service
+@AllArgsConstructor
 public class StockInRecordServiceImpl extends ServiceImpl<StockInRecordMapper, StockInRecord> implements StockInRecordService {
-    @Autowired
+
     private StockInRecordMapper stockInRecordMapper;
-    @Autowired
     private StockInventoryMapper stockInventoryMapper;
-    @Autowired
     private StockUninventoryMapper stockUninventoryMapper;
 
     @Override
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 98a5769..2c29759 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -15,6 +15,7 @@
 import com.ruoyi.stock.service.StockInventoryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.stock.service.StockOutRecordService;
+import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -28,14 +29,11 @@
  * @since 2026-01-21 04:16:36
  */
 @Service
+@AllArgsConstructor
 public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
 
-    @Autowired
     private  StockInventoryMapper stockInventoryMapper;
-
-    @Autowired
     private StockInRecordService stockInRecordService;
-    @Autowired
     private StockOutRecordService stockOutRecordService;
 
     @Override
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index 420e6e2..a9c48ed 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -18,6 +18,7 @@
 import com.ruoyi.stock.pojo.StockOutRecord;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockOutRecordService;
+import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -32,12 +33,10 @@
  * @since 2026-01-21 05:27:04
  */
 @Service
+@AllArgsConstructor
 public class StockOutRecordServiceImpl extends ServiceImpl<StockOutRecordMapper, StockOutRecord> implements StockOutRecordService {
-    @Autowired
     private StockOutRecordMapper stockOutRecordMapper;
-    @Autowired
     private StockInventoryMapper stockInventoryMapper;
-    @Autowired
     private StockUninventoryMapper stockUninventoryMapper;
 
     @Override
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
index 06096c5..f0755f0 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -14,6 +14,7 @@
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.service.StockUninventoryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -26,6 +27,7 @@
  * @since 2026-01-22 10:17:45
  */
 @Service
+@AllArgsConstructor
 public class StockUninventoryServiceImpl extends ServiceImpl<StockUninventoryMapper, StockUninventory> implements StockUninventoryService {
 
     private StockUninventoryMapper stockUninventoryMapper;

--
Gitblit v1.9.3