liyong
4 天以前 c7cf13da4cd96a76771475b8e4c364dfddebf712
feat(sales): 库存
已添加4个文件
已修改5个文件
314 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/controller/EnumController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/BaseEnum.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StockRecordTypeEnum.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/EnumUtil.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
}
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;
    }
}
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;
    }
}
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=拉丝}
    }
}
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);
    }
}
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
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
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
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;