eight
2024-08-15 8c2f79b721a05fbf73c50a78b267ea3868c632d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package cn.lihu.jh.module.ecg.service.queue;
 
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueStatisticDO;
import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO;
import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomStatisticsDO;
import cn.lihu.jh.module.ecg.dal.mysql.room.RoomMapper;
import cn.lihu.jh.module.ecg.enums.QueueStatusEnum;
import lombok.Data;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
 
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.*;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.common.util.object.BeanUtils;
 
import cn.lihu.jh.module.ecg.dal.mysql.queue.queueMapper;
 
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
 
import java.util.HashMap;
import java.util.List;
import java.util.PriorityQueue;
 
import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*;
 
/**
 * 排队 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class QueueServiceImpl implements QueueService {
 
    final static Integer MAX_QUEUE_NUM = 2;
 
    Integer  curSeqNum = 0;
 
    PriorityQueue<BedQueueBO> priorityQueue = new PriorityQueue<>();
 
    @Resource
    private queueMapper queueMapper;
 
    @Resource
    private RoomMapper roomMapper;
 
    @Override
    public Integer createqueue(QueueSaveReqVO createReqVO) {
        // 插入
        QueueDO queue = BeanUtils.toBean(createReqVO, QueueDO.class);
        queueMapper.insert(queue);
        // 返回
        return queue.getId();
    }
 
    @Override
    public void updatequeue(QueueSaveReqVO updateReqVO) {
        // 校验存在
        validatequeueExists(updateReqVO.getId());
        // 更新
        QueueDO updateObj = BeanUtils.toBean(updateReqVO, QueueDO.class);
        queueMapper.updateById(updateObj);
    }
 
    @Override
    public void deletequeue(Integer id) {
        // 校验存在
        validatequeueExists(id);
        // 删除
        queueMapper.deleteById(id);
    }
 
    private void validatequeueExists(Integer id) {
        if (queueMapper.selectById(id) == null) {
            throw exception(QUEUE_NOT_EXISTS);
        }
    }
 
    @Override
    public QueueDO getqueue(Integer id) {
        return queueMapper.selectById(id);
    }
 
    @Override
    public PageResult<QueueDO> getqueuePage(QueuePageReqVO pageReqVO) {
        return queueMapper.selectPage(pageReqVO);
    }
 
    @Override
    public List<QueueStatisticDO> queueStatistics(List<Byte> statusList) {
        return queueMapper.queueStatistic(statusList);
    }
 
    @Override
    public void queue(QueueSaveReqVO queueSaveReqVO) {
        BedQueueBO bedQueueBO = priorityQueue.peek();
        if (bedQueueBO.queueNum == bedQueueBO.maxQueueNum) {
            queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //排队中
        } else if (bedQueueBO.queueNum < bedQueueBO.maxQueueNum) {
            queueSaveReqVO.setStatus(QueueStatusEnum.READY.getStatus()); //候诊准备中
            queueSaveReqVO.setRoomNum(bedQueueBO.getRoomName());
            queueSaveReqVO.setBedNum(bedQueueBO.getBedNo());
            queueSaveReqVO.setSeqNum(curSeqNum++);
            QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class);
            queueMapper.insert(queue);  // queue.getId();
 
            bedQueueBO.queueNum++;
        }
    }
 
    @PostConstruct
    private void initQueue() {
        List<RoomDO> roomDOList = roomMapper.simpleRoomList();
        List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList();
 
        bedQueueBOList.forEach(item -> {
            item.maxQueueNum = MAX_QUEUE_NUM;
            item.queueNum = 0;
            priorityQueue.add(item);
        });
 
        curSeqNum = queueMapper.getMaxSeqNum();
    }
}