package cn.lihu.jh.module.ecg.service.callingscreen; import cn.lihu.jh.framework.common.pojo.PageResult; import cn.lihu.jh.module.ecg.controller.admin.checktype.vo.CheckTypePageReqVO; import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO; import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO; import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO; import cn.lihu.jh.module.ecg.dal.mysql.checktype.CheckTypeMapper; import cn.lihu.jh.module.ecg.dal.mysql.queue.QueueMapper; import cn.lihu.jh.module.ecg.dal.mysql.room.RoomMapper; import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * 排队 Service 实现类 * * @author 芋道源码 */ @Service @Validated @Slf4j public class CallingScreenServiceImpl implements CallingScreenService { @Resource private QueueMapper queueMapper; @Resource private RoomMapper roomMapper; @Resource private CheckTypeMapper checkTypeMapper; BigScreenConfig bigScreenConfig; Map mapCheckTypeVsDisplayColumn = null; Map> mapDisplaySlotVsCallingData = new HashMap<>(); Integer waitingFrom = 0; Integer passedFrom = 0; @Override public void setBigScreenConfig(BigScreenConfig bigScreenConfig) { this.bigScreenConfig = bigScreenConfig; } @Override public Map> callingData() { if (null == mapCheckTypeVsDisplayColumn) { getDisplayColumnConfig(); } else { mapDisplaySlotVsCallingData.values().stream().forEach(slotQueueList -> slotQueueList.clear()); } List queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus()); queueStatusList.add(QueueStatusEnum.WAITING.getStatus()); queueStatusList.add(QueueStatusEnum.RECALLED.getStatus()); queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); List queueDOList = queueMapper.getQueueByStatus( queueStatusList ); queueDOList.stream().forEach(queueDO -> { List listSolt = getDisplatSlotByQueue( queueDO.getBookCheckType(), queueDO.getStatus()); listSolt.add( queueDO ); }); mapDisplaySlotVsCallingData.values().stream().forEach(slotQueueList -> slotQueueList.sort(null)); return mapDisplaySlotVsCallingData; } @Override public Map> callingData2() { List queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus()); List listReady = queueMapper.getQueueByStatus( queueStatusList ); queueStatusList.clear(); queueStatusList.add(QueueStatusEnum.WAITING.getStatus()); queueStatusList.add(QueueStatusEnum.RECALLED.getStatus()); List listWaiting = queueMapper.getPartialQueueByStatus( queueStatusList, waitingFrom, bigScreenConfig.waitingSize ); if (listWaiting.size() < bigScreenConfig.waitingSize && waitingFrom != 0) { List listWaiting_next = queueMapper.getPartialQueueByStatus( queueStatusList, 0, bigScreenConfig.waitingSize - listWaiting.size()); listWaiting.addAll(listWaiting_next); } if (listWaiting.size() < bigScreenConfig.waitingSize) { waitingFrom = 0; } else { waitingFrom = listWaiting.getLast().getId() + 1; } queueStatusList.clear(); queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); List listPassed = queueMapper.getPartialQueueByStatus( queueStatusList, passedFrom, bigScreenConfig.passedSize ); if (listPassed.size() < bigScreenConfig.passedSize && passedFrom != 0) { List listPassed_next = queueMapper.getPartialQueueByStatus( queueStatusList, 0, bigScreenConfig.passedSize - listPassed.size()); listPassed.addAll(listPassed_next); } if (listPassed.size() < bigScreenConfig.passedSize) { passedFrom = 0; } else { passedFrom = listPassed.getLast().getId(); } log.info( " waitingFrom: {} passedFrom: {} ", waitingFrom, passedFrom); Map> map = new HashMap<>(); map.put(1, listReady); map.put(2, listWaiting); map.put(3, listPassed); return map; } @Override public List getRoomQueue(String ip, List statusList) { List roomDOList = roomMapper.queueByIp(ip); Optional optionalQueueDO = roomDOList.stream().filter(item -> StringUtils.hasLength(item.getIp())).findFirst(); if (!optionalQueueDO.isPresent()) { return new ArrayList(); } Long roomId = optionalQueueDO.get().getRoomId(); List queueDOList = queueMapper.getRoomQueueByStatus(roomId, statusList); return queueDOList; } private void getDisplayColumnConfig() { CheckTypePageReqVO checkTypePageReqVO = new CheckTypePageReqVO(); checkTypePageReqVO.setPageSize(-1); PageResult pageResult = checkTypeMapper.selectPage(checkTypePageReqVO); mapCheckTypeVsDisplayColumn = pageResult.getList().stream().collect(Collectors.toMap(CheckTypeDO::getValue, item -> item.getCallingColumn())); int displayColCnt = (int) mapCheckTypeVsDisplayColumn.values().stream().distinct().count(); for (int i=0; i()); mapDisplaySlotVsCallingData.put(i*1000 + 1, new ArrayList<>()); mapDisplaySlotVsCallingData.put(i*1000 + 2, new ArrayList<>()); } } private List getDisplatSlotByQueue( Integer checkType, Integer queueStatus ) { return mapDisplaySlotVsCallingData.get(mapCheckTypeVsDisplayColumn.get(checkType)*1000 + getDisplatSlotByQueueStatus(queueStatus)); } private Integer getDisplatSlotByQueueStatus( Integer queueStatus ) { if (QueueStatusEnum.READY.getStatus() == queueStatus) return 0; else if (QueueStatusEnum.ONSTAGE.getStatus() == queueStatus) return 0; else if (QueueStatusEnum.WAITING.getStatus() == queueStatus) return 1; else if (QueueStatusEnum.RECALLED.getStatus() == queueStatus) return 1; else if (QueueStatusEnum.PASSED.getStatus() == queueStatus) return 2; else return 0; } }