package com.qianwen.mdc.collect.cache; import java.time.Duration; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.baomidou.mybatisplus.core.toolkit.Wrappers; //import com.qianwen.core.redis.cache.BladeRedis; import com.qianwen.mdc.collect.dto.WorkstationDTO; import com.qianwen.mdc.collect.entity.mgr.EmployeeOnOffWork; import com.qianwen.mdc.collect.entity.mgr.GlobalWcsOfRps; import com.qianwen.mdc.collect.entity.mgr.Workstation; import com.qianwen.mdc.collect.mapper.mgr.EmployeeOnOffWorkMapper; import com.qianwen.mdc.collect.mapper.mgr.GlobalWcsOfRpsMapper; import com.qianwen.mdc.collect.service.WorkstationService; import com.qianwen.mdc.collect.utils.redis.RedisUtil; import cn.hutool.core.util.ObjectUtil; @Component public class WorkstationCache { private static final String WORKSTATION_ID = "workstation:id:"; private static final String CALENDAR_DATE = ":calendar:date:"; private static final String WORKSTATION_ALL = "workstation:all"; private static final String WCS_SETTING = ":wcsSetting"; private static final String EMPLOYEE = ":employee"; @Autowired private RedisUtil redisUtil; private static final Logger log = LoggerFactory.getLogger(WorkstationCache.class); //private static final BladeRedis bladeRedis = (BladeRedis) SpringUtil.getBean(BladeRedis.class); //private static final IWorkstationService workStationService = (IWorkstationService) SpringUtil.getBean(IWorkstationService.class); @Autowired private GlobalWcsOfRpsMapper globalWcsOfRpsMapper; @Autowired private WorkstationService workstationService; @Autowired private EmployeeOnOffWorkMapper employeeOnOffWorkMapper; //private static final EmployeeOnOffWorkMapper employeeOnOffWorkMapper = (EmployeeOnOffWorkMapper) SpringUtil.getBean(EmployeeOnOffWorkMapper.class); public Map getWorkstations() { String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL); /*Map map = bladeRedis.hGetAll(redisKey); if (Func.isEmpty(map)) { map = setWorkStations(); } return map; */ Map map = convertMap(redisUtil.hmget(redisKey)); if (ObjectUtil.isEmpty(map)) { map = setWorkstations(); } return map; } private Map setWorkstations() { List list = workstationService.list(); String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL); list.forEach(ws -> { /* WorkStationDTO workStationDTO = WorkstationConvert.INSTANCE.convertDTO(workStation); bladeRedis.hSet(redisKey, workStation.getId(), workStationDTO); */ WorkstationDTO dto = new WorkstationDTO(); dto.setCalendarCode(ws.getCalendarCode()); dto.setCode(ws.getCode()); dto.setId(ws.getId()); dto.setName(ws.getName()); redisUtil.hset(redisKey, ws.getId(), dto); }); //bladeRedis.expire(redisKey, 259200L); redisUtil.expire(redisKey, 259200L); //return bladeRedis.hGetAll(redisKey); return convertMap(redisUtil.hmget(redisKey)); } static Map convertMap(Map map){ Map result = new HashMap<>(); for(Map.Entry entry : map.entrySet()) { result.put((K)entry.getKey(), (V)entry.getValue()); } return result; } /* public static Boolean clearWorkStationCache() { String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ALL); return bladeRedis.del(redisKey); } */ /** * 获取指定日期的日历代码 * @param workstationId * @param date * @return */ public String getWorkstationCalendarCodeForDate(Long workstationId, String date) { String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ID).concat(workstationId.toString().concat(CALENDAR_DATE)).concat(date); //String calendarCode = (String) bladeRedis.get(redisKey); String calendarCode = (String) redisUtil.get(redisKey); if (ObjectUtil.isEmpty(calendarCode)) { log.warn("获取工位{}指定日期{}日历缓存不存在,从数据库内获取并生成缓存", workstationId, date); Optional.ofNullable(workstationService.getById(workstationId)).ifPresent(workStation -> { //bladeRedis.setEx(redisKey, workStation.getCalendarCode(), 259200L); redisUtil.set(redisKey, workStation.getCalendarCode(), 259200L); }); } //return (String) bladeRedis.get(redisKey); return calendarCode; } public GlobalWcsOfRps getWorkstationWcsSetting(Long workstationId, String code) { String redisKey = "posting:workstation".concat("::").concat(WORKSTATION_ID).concat(workstationId.toString() .concat(WCS_SETTING)); //GlobalWcsOfRps wcsSetting = (GlobalWcsOfRps)redisUtil.hGet(redisKey, code); GlobalWcsOfRps wcsSetting = (GlobalWcsOfRps)redisUtil.hget(redisKey, code); if (wcsSetting == null) { wcsSetting = globalWcsOfRpsMapper.selectOne(Wrappers.lambdaQuery() .eq(GlobalWcsOfRps::getCode, code) .isNull(GlobalWcsOfRps::getPrecondition)); if(wcsSetting == null) { wcsSetting = new GlobalWcsOfRps(); wcsSetting.setRps(0); wcsSetting.setIsPlan(GlobalWcsOfRps.IN_PLAN); } //wcsSetting = Func.isNotEmpty(wcsSetting) ? wcsSetting : GlobalWcsOfRps.builder().rps(0).isPlan(0).build(); //bladeRedis.hSet(redisKey, code, wcsSetting); //bladeRedis.expire(redisKey, Duration.ofDays(1L)); redisUtil.hset(redisKey, code, wcsSetting, Duration.ofDays(1L).getSeconds()); } return wcsSetting; } /** * 获取工位在指定时间的上班员工 * @param workstationId * @param timePoint * @return */ public Long getBelongToEmployeeForWorkstation(Long workstationId, Date timePoint) { Long employeeId = null; String redisKey = "posting:workstation".concat("::").concat("workstation:id:") .concat(workstationId.toString().concat(EMPLOYEE)); // Set employeeOnOffWorks = bladeRedis.sMembers(redisKey); Set employeeOnOffWorks = (Set) redisUtil.sGet(redisKey); EmployeeOnOffWork matchEmployee = null; if (ObjectUtil.isNotEmpty(employeeOnOffWorks)) { matchEmployee = employeeOnOffWorks.stream().filter( item -> (item.getOnlineTime().getTime() <= timePoint.getTime() && (item.getOfflineTime() == null || item.getOfflineTime().getTime() > timePoint.getTime()))) .findFirst().orElse(null); } if (ObjectUtil.isNotEmpty(matchEmployee)) { employeeId = matchEmployee.getOnEmployeeId(); } else { List queryResult = employeeOnOffWorkMapper.selectList( Wrappers.lambdaQuery().eq(EmployeeOnOffWork::getWorkstationId, workstationId) .le(EmployeeOnOffWork::getOnlineTime, timePoint) .and(wrapper -> wrapper.gt(EmployeeOnOffWork::getOfflineTime, timePoint).or() .isNull(EmployeeOnOffWork::getOfflineTime))); if (ObjectUtil.isNotEmpty(queryResult)) { employeeId = ((EmployeeOnOffWork) queryResult.get(0)).getOnEmployeeId(); //bladeRedis.sAdd(redisKey, new Object[] { queryResult.get(0) }); //bladeRedis.expire(redisKey, 259200L); redisUtil.sSetAndTime(redisKey, 259200L, new Object[] { queryResult.get(0) }); } } return employeeId; } }