package com.tourguide.modules.order.service;
|
|
import com.tourguide.modules.order.mapper.TourOrderMapper;
|
import com.tourguide.modules.order.entity.TourOrder;
|
import com.tourguide.modules.user.entity.GuideReceivingSession;
|
import com.tourguide.modules.user.mapper.GuideRealtimeStatusMapper;
|
import com.tourguide.modules.user.mapper.GuideReceivingSessionMapper;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import java.time.LocalDateTime;
|
|
@Service
|
public class GuideSessionTransitionService {
|
private final GuideReceivingSessionMapper sessionMapper;
|
private final TourOrderMapper orderMapper;
|
private final GuideRealtimeStatusMapper realtimeStatusMapper;
|
|
public GuideSessionTransitionService(GuideReceivingSessionMapper sessionMapper,
|
TourOrderMapper orderMapper,
|
GuideRealtimeStatusMapper realtimeStatusMapper) {
|
this.sessionMapper = sessionMapper;
|
this.orderMapper = orderMapper;
|
this.realtimeStatusMapper = realtimeStatusMapper;
|
}
|
|
@Transactional
|
public void startIfDue(GuideReceivingSession session) {
|
if (sessionMapper.startDueSession(session.getId()) != 1) return;
|
orderMapper.startSessionOrders(session.getId(), LocalDateTime.now());
|
realtimeStatusMapper.disableReceiving(session.getGuideId());
|
}
|
|
@Transactional
|
public boolean completeSession(GuideReceivingSession session, LocalDateTime completedAt) {
|
if (session == null || session.getId() == null || session.getGuideId() == null) {
|
return false;
|
}
|
int orderCount = orderMapper.completeSessionOrders(session.getGuideId(), session.getId(), completedAt);
|
if (orderCount == 0) {
|
return false;
|
}
|
|
sessionMapper.stopServiceSession(session.getId(), session.getGuideId());
|
realtimeStatusMapper.stopGuide(session.getGuideId());
|
return true;
|
}
|
|
@Transactional
|
public void restoreAfterOrderCancellation(TourOrder order) {
|
if (order == null || order.getGuideId() == null || order.getReceivingSessionId() == null) return;
|
|
GuideReceivingSession session = sessionMapper.selectForUpdate(
|
order.getReceivingSessionId(), order.getGuideId());
|
if (session == null) return;
|
|
long remainingOrders = orderMapper.countPendingMeetingBySession(session.getId(), order.getGuideId());
|
if ("PRIVATE".equals(session.getReceivingMode())
|
|| ("ALL".equals(session.getReceivingMode()) && isPrivateOrder(order))) {
|
if (remainingOrders == 0
|
&& sessionMapper.reopenPrivateAfterOrderCancellation(session.getId(), order.getGuideId()) == 1) {
|
realtimeStatusMapper.enableReceiving(order.getGuideId());
|
}
|
return;
|
}
|
|
if (!("GROUP".equals(session.getReceivingMode())
|
|| ("ALL".equals(session.getReceivingMode()) && !isPrivateOrder(order)))
|
|| !"RECEIVING".equals(session.getStatus())) return;
|
if (remainingOrders == 0) {
|
sessionMapper.resetGroupAfterOrderCancellation(session.getId(), order.getGuideId());
|
return;
|
}
|
int peopleCount = order.getPeopleCount() == null ? 0 : Math.max(0, order.getPeopleCount());
|
if (peopleCount > 0) {
|
sessionMapper.releaseGroupCapacity(session.getId(), order.getGuideId(), peopleCount);
|
}
|
}
|
|
private boolean isPrivateOrder(TourOrder order) {
|
return order.getOrderType() != null && order.getOrderType().startsWith("PRIVATE_");
|
}
|
}
|