zhanghl
2025-05-23 dec8951aae400e54f6ee83a8f95867dba9da8af1
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsMaterialStorageManagementServiceImpl.java
@@ -1,16 +1,19 @@
package com.aps.core.service.impl;
import java.util.List;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.aps.common.core.utils.DateUtils;
import com.aps.common.core.utils.StringUtils;
import com.aps.core.domain.ApsMaterialStorageManagement;
import com.aps.core.mapper.ApsMaterialStorageManagementMapper;
import com.aps.core.service.IApsMaterialStorageManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.aps.core.mapper.ApsMaterialStorageManagementMapper;
import com.aps.core.domain.ApsMaterialStorageManagement;
import com.aps.core.service.IApsMaterialStorageManagementService;
import java.math.BigDecimal;
import java.util.*;
/**
 * 物料库存管理Service业务层处理
@@ -19,6 +22,7 @@
 * @date 2025-04-17
 */
@Service
@Slf4j
public class ApsMaterialStorageManagementServiceImpl implements IApsMaterialStorageManagementService 
{
    @Autowired
@@ -98,21 +102,94 @@
    {
        return apsMaterialStorageManagementMapper.deleteApsMaterialStorageManagementById(id);
    }
    /**
     * 获取物料库存信息
     * */
    @Override
    public Optional<ApsMaterialStorageManagement> getItemStorage(String plant, String itemNumber) {
        ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement();
        storageParam.setItemNumber(itemNumber);
        storageParam.setApplicableFactories(plant);
        return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(storageParam).stream()
                .findFirst();
    }
    public  ApsMaterialStorageManagement getRdsStorage(String plant,String itemCode){
        JSONObject materialStorage = (JSONObject)redisTemplate.opsForValue().get("MaterialStorage:Material_"+plant+"_"+itemCode);
    /**
     * 从Redis中获取库存信息
     *
     * 此方法首先尝试从Redis中获取指定工厂和物料代码的库存信息如果Redis中不存在相关数据,
     * 则从数据库中查询,并将结果缓存到Redis中以提高下次查询的效率
     *
     * @param plant 工厂代码,用于指定库存信息所属的工厂
     * @param itemCode 物料代码,用于指定需要查询的物料
     * @return ApsMaterialStorageManagement 返回获取到的库存信息对象,如果没有找到,则返回null
     */
    @Override
    public Optional<ApsMaterialStorageManagement> getRdsStorage(String plant, String itemCode){
        // 尝试从Redis中获取库存信息
        String key = "MaterialStorage:Material_" + plant + "_" + itemCode;
        JSONObject materialStorage = (JSONObject)redisTemplate.opsForValue().get(key);
        if(materialStorage!=null){
            ApsMaterialStorageManagement apsMaterialStorageManagement = new ApsMaterialStorageManagement();
            apsMaterialStorageManagement.setId(materialStorage.getString("id"));
            apsMaterialStorageManagement.setItemNumber(materialStorage.getString("itemNumber"));
            apsMaterialStorageManagement.setRemainderStock(materialStorage.getBigDecimal("remainderStock"));
            apsMaterialStorageManagement.setVersion(materialStorage.getInteger("version"));
            return apsMaterialStorageManagement;
            // 如果Redis中有缓存,将其转换为ApsMaterialStorageManagement对象并返回
            ApsMaterialStorageManagement ams= materialStorage.toJavaObject(ApsMaterialStorageManagement.class);
            Optional<ApsMaterialStorageManagement>   optional =  Optional.ofNullable(ams);
            return optional  ;
        }else {
            return null;
            // 从数据库中查询库存信息
            Optional<ApsMaterialStorageManagement> first = getItemStorage( plant, itemCode);
            first.ifPresent(apsMaterialStorageManagement ->
                    redisTemplate.opsForValue().set(key, JSONObject.parseObject(JSON.toJSONString(apsMaterialStorageManagement)))
            );
            return first;
        }
    }
    /**
     * 设置库存数据到redis
     * @param orgCode
     * @return
     */
    @Override
    public boolean setStorageDataToRedis(String orgCode) {
        try {
            log.info("开始同步 物料库存至Redis!");
            Set<String> keys = redisTemplate.keys("MaterialStorage:Material_*");
            if (keys != null && !keys.isEmpty()) {
                redisTemplate.delete(keys);
            }
            ApsMaterialStorageManagement temp = new ApsMaterialStorageManagement();
            if(!StringUtils.isEmpty(orgCode)){
                temp.setApplicableFactories(orgCode);
            }
            List<ApsMaterialStorageManagement> list = apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(temp);
            Map<String, Object> bulkData = new HashMap<>();
            list.forEach(apsMaterialStorageManagement -> {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("id", apsMaterialStorageManagement.getId());
                jsonObject.put("itemNumber", apsMaterialStorageManagement.getItemNumber());
                jsonObject.put("remainderStock", apsMaterialStorageManagement.getRemainderStock());
                jsonObject.put("applicableFactories", apsMaterialStorageManagement.getApplicableFactories());
                bulkData.put("MaterialStorage:Material_"+apsMaterialStorageManagement.getApplicableFactories()+"_"+apsMaterialStorageManagement.getItemNumber(), jsonObject);
            });
            redisTemplate.opsForValue().multiSet(bulkData);
            log.info("完成同步 物料库存至Redis!");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("同步物料库存至Redis失败!"+e.getMessage());
            return false;
        }
        return true;
    }
    /**
     * 更新库存信息
     * */
    public int updateMaterialStorageByVersion(String id, BigDecimal remainderStock, Integer version) {
        return apsMaterialStorageManagementMapper.updateMaterialStorageByVersion(id, remainderStock, version);
    }
    @Override
    public int  updateRemainderStock(String id, BigDecimal remainderStock, Integer version){
        return apsMaterialStorageManagementMapper.updateRemainderStock(id, remainderStock, version);
    }
}