package com.aps.core.service.impl; 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 java.math.BigDecimal; import java.util.*; /** * 物料库存管理Service业务层处理 * * @author dingYang * @date 2025-04-17 */ @Service @Slf4j public class ApsMaterialStorageManagementServiceImpl implements IApsMaterialStorageManagementService { @Autowired private ApsMaterialStorageManagementMapper apsMaterialStorageManagementMapper; @Autowired public RedisTemplate redisTemplate; /** * 查询物料库存管理 * * @param id 物料库存管理主键 * @return 物料库存管理 */ @Override public ApsMaterialStorageManagement selectApsMaterialStorageManagementById(String id) { return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementById(id); } /** * 查询物料库存管理列表 * * @param apsMaterialStorageManagement 物料库存管理 * @return 物料库存管理 */ @Override public List selectApsMaterialStorageManagementList(ApsMaterialStorageManagement apsMaterialStorageManagement) { return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(apsMaterialStorageManagement); } /** * 新增物料库存管理 * * @param apsMaterialStorageManagement 物料库存管理 * @return 结果 */ @Override public int insertApsMaterialStorageManagement(ApsMaterialStorageManagement apsMaterialStorageManagement) { apsMaterialStorageManagement.setCreateTime(DateUtils.getNowDate()); return apsMaterialStorageManagementMapper.insertApsMaterialStorageManagement(apsMaterialStorageManagement); } /** * 修改物料库存管理 * * @param apsMaterialStorageManagement 物料库存管理 * @return 结果 */ @Override public int updateApsMaterialStorageManagement(ApsMaterialStorageManagement apsMaterialStorageManagement) { apsMaterialStorageManagement.setUpdateTime(DateUtils.getNowDate()); return apsMaterialStorageManagementMapper.updateApsMaterialStorageManagement(apsMaterialStorageManagement); } /** * 批量删除物料库存管理 * * @param ids 需要删除的物料库存管理主键 * @return 结果 */ @Override public int deleteApsMaterialStorageManagementByIds(String[] ids) { return apsMaterialStorageManagementMapper.deleteApsMaterialStorageManagementByIds(ids); } /** * 删除物料库存管理信息 * * @param id 物料库存管理主键 * @return 结果 */ @Override public int deleteApsMaterialStorageManagementById(String id) { return apsMaterialStorageManagementMapper.deleteApsMaterialStorageManagementById(id); } /** * 获取物料库存信息 * */ @Override public Optional getItemStorage(String plant, String itemNumber) { ApsMaterialStorageManagement storageParam = new ApsMaterialStorageManagement(); storageParam.setItemNumber(itemNumber); storageParam.setApplicableFactories(plant); return apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(storageParam).stream() .findFirst(); } /** * 从Redis中获取库存信息 * * 此方法首先尝试从Redis中获取指定工厂和物料代码的库存信息如果Redis中不存在相关数据, * 则从数据库中查询,并将结果缓存到Redis中以提高下次查询的效率 * * @param plant 工厂代码,用于指定库存信息所属的工厂 * @param itemCode 物料代码,用于指定需要查询的物料 * @return ApsMaterialStorageManagement 返回获取到的库存信息对象,如果没有找到,则返回null */ @Override public Optional getRdsStorage(String plant, String itemCode){ // 尝试从Redis中获取库存信息 String key = "MaterialStorage:Material_" + plant + "_" + itemCode; JSONObject materialStorage = (JSONObject)redisTemplate.opsForValue().get(key); if(materialStorage!=null){ // 如果Redis中有缓存,将其转换为ApsMaterialStorageManagement对象并返回 ApsMaterialStorageManagement ams= materialStorage.toJavaObject(ApsMaterialStorageManagement.class); Optional optional = Optional.ofNullable(ams); return optional ; }else { // 从数据库中查询库存信息 Optional 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 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 list = apsMaterialStorageManagementMapper.selectApsMaterialStorageManagementList(temp); Map 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); } }