package com.fzzy.igds.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.fzzy.igds.constant.RedisConst; import com.fzzy.igds.domain.Depot; import com.fzzy.igds.domain.DepotStore; import com.fzzy.igds.mapper.DepotMapper; import com.fzzy.igds.utils.ContextUtil; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; /** * @Description * @Author CZT * @Date 2025/11/27 13:43 */ @Slf4j @Service public class DepotService { @Resource private DepotMapper depotMapper; @Resource private RedisCache redisCache; @Resource private DepotStoreService depotStoreService; /** * 查询库区下仓库列表 * * @param companyId * @param deptId * @param idDesc 是否ID倒序排列 * @return */ public List getData(String companyId, String deptId, boolean idDesc) { if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("company_id", companyId); if (StringUtils.isNotBlank(deptId)) { queryWrapper.likeRight("dept_id", deptId); } if (idDesc) { //ID倒序 queryWrapper.orderByDesc("id"); } else { //序号正序 queryWrapper.orderByAsc("order_num"); } return depotMapper.selectList(queryWrapper); } /** * 根据库存表信息,更新仓库库存 * * @param data */ public void updateByDepotStore(DepotStore data) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", data.getDepotId()).set("storage_real", data.getStorageReal()); depotMapper.update(null, updateWrapper); } /** * 保存更新仓库信息 * * @param depot */ public void saveDepot(Depot depot) { if (StringUtils.isEmpty(depot.getCompanyId())) { depot.setCompanyId(ContextUtil.getCompanyId()); } if (StringUtils.isEmpty(depot.getDeptId())) { depot.setDeptId(ContextUtil.subDeptId(null)); } //默认顺序号 if (null == depot.getOrderNum()) { depot.setOrderNum(1); } //主键ID if (StringUtils.isEmpty(depot.getId())) { depot.setId(getStrId(depot.getDeptId())); depot.setCreateBy(ContextUtil.getLoginUserName()); depot.setCreateTime(new Date()); depotMapper.insert(depot); } else { depot.setUpdateBy(ContextUtil.getLoginUserName()); depot.setUpdateTime(new Date()); depotMapper.updateById(depot); } flushCache(depot.getCompanyId()); } /** * 更新库存信息 * * @param depot */ public void updateStorageReal(Depot depot) { Depot cacheDepot = this.getCacheDepot(depot.getCompanyId(), depot.getId()); depot.setUpdateBy(ContextUtil.getLoginUserName()); depot.setUpdateTime(new Date()); depot.setRemark("【" + ContextUtil.getLoginUserName() + "】于[" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "]修改库存:" + cacheDepot.getStorageReal() + "-->" + depot.getStorageReal()); depotMapper.updateById(depot); DepotStore lastData = new DepotStore(); //主键ID规则:yyyyMMddHHmm_仓库编码 lastData.setId(DateFormatUtils.format(new Date(), "yyyyMMddHHmm") + "_" + depot.getId() + "_HAND"); lastData.setCompanyId(depot.getCompanyId()); lastData.setDeptId(depot.getDeptId()); lastData.setDepotId(depot.getId()); lastData.setStorageReal(0.0); lastData.setUpdateTime(new Date()); lastData.setUpdateBy("系统定时统计"); lastData.setDepotStatus(depot.getDepotStatus()); lastData.setFoodVariety(depot.getFoodVariety()); lastData.setFoodLevel(depot.getFoodLevel()); lastData.setFoodLocation(depot.getFoodLocation()); lastData.setFoodLocationId(depot.getFoodLocationId()); lastData.setFoodType(depot.getFoodType()); lastData.setFoodYear(depot.getFoodYear()); lastData.setStorageReal(depot.getStorageReal()); lastData.setCreateTime(new Date()); //设置为最新时间,其他系统可以通过此时间查询数据是否有更新修改,同步到省平台接口。 lastData.setCreateBy(ContextUtil.getLoginUserName()); lastData.setRemark("【" + ContextUtil.getLoginUserName() + "】于[" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "]修改库存为:" + depot.getStorageReal()); depotStoreService.updateAndSave(lastData); flushCache(depot.getCompanyId()); } /** * 获取主键ID * * @param deptId * @param deptId */ public String getStrId(String deptId) { List depots = this.getData(null, deptId, true); String oldOrderId = null; if (null != depots && depots.size() > 0) { oldOrderId = depots.get(0).getId().substring(deptId.length()); } return deptId + ContextUtil.getOrderId(oldOrderId, 3); } /** * 更新仓库状态 * * @param depotId * @param status */ public void updateDepotStatus(String depotId, String status) { if (StringUtils.isEmpty(depotId)) { return; } UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", depotId).set("depot_status", status); depotMapper.update(null, updateWrapper); } /** * 删除仓库货位信息 * * @param depot */ public void deleteDepot(Depot depot) { depotMapper.deleteById(depot); //删除配置缓存 this.delCacheDepot(depot, depot.getCompanyId()); } /** * 刷新仓库货位缓存 * * @param companyId */ public void flushCache(String companyId) { if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } List list = this.getData(companyId, null, false); this.setCacheDepotList(list, companyId); } /** * 设置缓存 * * @param list * @param companyId */ public void setCacheDepotList(List list, String companyId) { if (null == list) return; String key; for (Depot depot : list) { key = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT, depot.getId()); redisCache.setCacheObject(key, depot); } } /** * 删除缓存信息 * * @param depot * @param companyId */ public void delCacheDepot(Depot depot, String companyId) { if (null == depot) { return; } if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } String key = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT, depot.getId()); redisCache.deleteObject(key); } /** * 获取缓存-根据组织编码获取仓库集合 * * @param companyId * @return */ public List getCacheDepotList(String companyId) { if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } List list = new ArrayList<>(); List resultList = new ArrayList<>(); String patten = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT) + "*"; Collection keys = redisCache.keys(patten); if (null != keys) { for (String key : keys) { list.add((Depot) redisCache.getCacheObject(key)); } } //缓存获取为空,则查询数据库 if (list.isEmpty()) { list = this.getData(companyId, null, false); setCacheDepotList(list, companyId); } if (!list.isEmpty()) { //重新排序 //检查数据是否为空 for (Depot depot : list) { if( null!=depot){ resultList.add(depot); } } boolean hasNullOrderNum = true; // 检查是否有仓库的排序号为空 for (Depot depot : resultList) { if ( null== depot.getOrderNum()) { hasNullOrderNum = true; break; } } // 如果存在排序号为空的仓库,则不进行排序 if (!hasNullOrderNum) { Collections.sort(resultList, (p1, p2) -> p1.getOrderNum() - p2.getOrderNum()); } } return resultList; } /** * 获取缓存-根据组织编码和库区编码获取仓库集合 * * @param companyId * @param deptId * @return */ public List getCacheDepotList(String companyId, String deptId) { if (StringUtils.isEmpty(deptId)) { return null; } List list = getCacheDepotList(companyId); if (null == list || list.isEmpty()) { return null; } List result = new ArrayList<>(); for (Depot depot : list) { if (deptId.equals(depot.getDeptId())) { result.add(depot); } } if (!result.isEmpty()) { //重新排序 Collections.sort(list, (p1, p2) -> p1.getOrderNum() - p2.getOrderNum()); } return result; } /** * 获取仓库信息-根据仓库编码获取缓存信息 * * @param companyId * @param depotId * @return */ public Depot getCacheDepot(String companyId, String depotId) { if (StringUtils.isEmpty(depotId)) { return null; } if (StringUtils.isEmpty(companyId)) { companyId = ContextUtil.getCompanyId(); } String key = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT, depotId); Depot depot = redisCache.getCacheObject(key); if (null == depot) { depot = depotMapper.selectById(depotId); redisCache.setCacheObject(key, depot); } return depot; } /** * 获取仓库信息-根据仓库名称获取仓库ID * * @param deptId * @return */ public String getDepotId(String deptId, String depotName) { if (StringUtils.isEmpty(deptId)) { return null; } if (StringUtils.isEmpty(depotName)) { return null; } List depotList = getCacheDepotList(ContextUtil.getCompanyId(), deptId); if (null == depotList || depotList.isEmpty()) { return null; } for (Depot depot : depotList) { if (depotName.equals(depot.getName())) { return depot.getId(); } } return null; } }