| | |
| | | import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO; |
| | | import cn.lihu.jh.module.ecg.dal.mysql.checktype.CheckTypeMapper; |
| | | import cn.lihu.jh.module.infra.api.config.ConfigApi; |
| | | import cn.lihu.jh.module.system.api.dict.DictDataApi; |
| | | import cn.lihu.jh.module.system.api.dict.dto.DictDataRespDTO; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | private ConfigApi configApi; |
| | | |
| | | @Resource |
| | | private DictDataApi dictDataApi; |
| | | |
| | | @Resource |
| | | private QueueSequenceMapper queueSequenceMapper; |
| | | |
| | | @Resource |
| | | private CheckTypeMapper checkTypeMapper; |
| | | |
| | | @Override |
| | | public void initQueueSequenceTable() { |
| | | queueSequenceMapper.clearQueueSequenceTableNotCurrent(); |
| | | Integer rowCount = queueSequenceMapper.getQueueSequenceTableRowCount(); |
| | | if (null == rowCount || 0 == rowCount) { |
| | | resetQueueSequence(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Integer createQueueSequence(QueueSequenceSaveReqVO createReqVO) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<QueueSequenceDO> selectGivenCheckTypeTimeslot(Integer checkType) { |
| | | return queueSequenceMapper.selectTimeslotByCheckType( checkType ); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<QueueSequenceDO> getQueueSequencePage(QueueSequencePageReqVO pageReqVO) { |
| | | return queueSequenceMapper.selectPage(pageReqVO); |
| | | } |
| | |
| | | |
| | | // 读取时段配置 |
| | | String strBookTimeslotLength = configApi.getConfigValueByKey(BOOK_TIMESLOT_LENGTH); |
| | | String strBookTimeslotList = configApi.getConfigValueByKey(BOOK_TIMESLOT_LIST); |
| | | |
| | | // 方案1:配置中取 7:30,8:30,9:30,10:30,11:30,12:30,13:30,14:30,15:30 |
| | | //String strBookTimeslotList = configApi.getConfigValueByKey(BOOK_TIMESLOT_LIST); |
| | | //List<LocalTime> timeslotList = Utils.parseTimeSlotList(strBookTimeslotList, Integer.valueOf(strBookTimeslotLength)); |
| | | |
| | | List<DictDataRespDTO> dictBookTimeslotList = dictDataApi.getDictDataList(ECG_BOOK_TIMESLOT); |
| | | |
| | | // 读取所有的检查类型 |
| | | List<CheckTypeDO> checkTypeDOList = checkTypeMapper.simpleCheckTypeList(); |
| | | checkTypeDOList.forEach( checkTypeDO -> { |
| | | List<LocalTime> timeslotList = Utils.parseTimeSlotList(strBookTimeslotList, Integer.valueOf(strBookTimeslotLength)); |
| | | for (int i=0; i < timeslotList.size(); i++) { |
| | | LocalTime timeslot = timeslotList.get(i); |
| | | |
| | | for (int i=0; i < dictBookTimeslotList.size(); i++) { |
| | | QueueSequenceDO queueSequenceDO = new QueueSequenceDO(); |
| | | queueSequenceDO.setCheckType( checkTypeDO.getValue() ); |
| | | queueSequenceDO.setTimeSlot( timeslot.getHour()*100 + timeslot.getMinute() ); |
| | | queueSequenceDO.setTimeSlot( Integer.valueOf(dictBookTimeslotList.get(i).getValue()) ); |
| | | queueSequenceDO.setQueueNo( i * checkTypeDO.getTimeslotBookNum() + checkTypeDO.getTimeslotReservedNum()); |
| | | queueSequenceDO.setQueueVipNo( i * checkTypeDO.getTimeslotBookNum()); |
| | | queueSequenceDO.setQueueFull( i * checkTypeDO.getTimeslotBookNum() + checkTypeDO.getTimeslotBookNum()); |
| | |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | public Integer distributeSeqNo(Integer checkType, Integer timeslot) { |
| | | Integer curSeqNo = queueSequenceMapper.selectQueueNoForUpdate(checkType, timeslot); |
| | | if (null == curSeqNo) { |
| | | // 从下一个时段 获取序号。原因系统用30分钟的间隔划分预约时间段,HIS的预约时间段可能是30分钟或60分钟 |
| | | Integer nextTimeslot = getNextTimeSlot(timeslot, checkType); |
| | | if (null == nextTimeslot) { |
| | | throw exception(QUEUE_SEQUENCE_TIMESLOT_FULL); |
| | | } |
| | | |
| | | curSeqNo = queueSequenceMapper.selectQueueNoForUpdate(checkType, nextTimeslot); |
| | | if (null == curSeqNo) { |
| | | throw exception(QUEUE_SEQUENCE_TIMESLOT_FULL); |
| | | } |
| | | |
| | | Integer updateRowNum = queueSequenceMapper.updateGivenCheckTypeTimeslotSeqNo(checkType, nextTimeslot, curSeqNo); |
| | | if (null == updateRowNum || updateRowNum == 0) { |
| | | throw exception(QUEUE_SEQUENCE_TIMESLOT_EXCEPTION); |
| | | } |
| | | |
| | | } else { |
| | | Integer updateRowNum = queueSequenceMapper.updateGivenCheckTypeTimeslotSeqNo(checkType, timeslot, curSeqNo); |
| | | if (null == updateRowNum || updateRowNum == 0) { |
| | | throw exception(QUEUE_SEQUENCE_TIMESLOT_EXCEPTION); |
| | | } |
| | | } |
| | | |
| | | return curSeqNo + 1; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | public Integer distributeVipSeqNo(Integer checkType, Integer timeslot) { |
| | | Integer curVipSeqNo = queueSequenceMapper.selectQueueVipNoForUpdate(checkType, timeslot); |
| | | if (null == curVipSeqNo) { |
| | | throw exception(QUEUE_SEQUENCE_TIMESLOT_FULL); |
| | | } |
| | | |
| | | Integer updateRowNum = queueSequenceMapper.updateGivenCheckTypeTimeslotVipSeqNo(checkType, timeslot, curVipSeqNo); |
| | | if (null == updateRowNum || updateRowNum == 0) { |
| | | throw exception(QUEUE_SEQUENCE_TIMESLOT_EXCEPTION); |
| | | } |
| | | |
| | | return curVipSeqNo + 1; |
| | | } |
| | | |
| | | private Integer getNextTimeSlot(Integer timeslot, Integer checkType) { |
| | | List<DictDataRespDTO> dictBookTimeslotList = dictDataApi.getDictDataList(ECG_BOOK_TIMESLOT); |
| | | Optional<Integer> index = dictBookTimeslotList.stream() |
| | | .filter(e -> e.getValue().equals(String.valueOf(timeslot))) |
| | | .findFirst() |
| | | .map(dictBookTimeslotList::indexOf); |
| | | if (!index.isPresent()) |
| | | return null; |
| | | |
| | | if (dictBookTimeslotList.size() <= (index.get() + 1)) |
| | | return null; |
| | | |
| | | DictDataRespDTO dictDataRespDTO = dictBookTimeslotList.get(index.get() + 1); |
| | | return Integer.valueOf(dictDataRespDTO.getValue()); |
| | | } |
| | | |
| | | } |
| | | |