WaitListOrderServiceImpl.java
package waitorder.service.Impl;
import edu.fudan.common.util.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import waitorder.entity.WaitListOrder;
import waitorder.entity.WaitListOrderStatus;
import waitorder.entity.WaitListOrderVO;
import waitorder.repository.WaitListOrderRepository;
import waitorder.service.WaitListOrderService;
import waitorder.utils.PollThread;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class WaitListOrderServiceImpl implements WaitListOrderService {
@Autowired
private WaitListOrderRepository waitListOrderRepository;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
private static final Logger LOGGER = LoggerFactory.getLogger(WaitListOrderServiceImpl.class);
String success = "Success";
@Override
public Response findOrderById(String id, HttpHeaders headers) {
Optional<WaitListOrder> op = waitListOrderRepository.findById(id);
if(!op.isPresent()){
LOGGER.warn("[findWaitOrderById][Find Order By Id Fail][No content][id: {}] ",id);
return new Response<>(0, "No Content by this id", null);
} else {
WaitListOrder wo = op.get();
LOGGER.info("[findWaitOrderById][Find Order By Id Success][id: {}] ",id);
return new Response<>(1, success, wo);
}
}
@Transactional
@Override
public Response create(WaitListOrderVO orderVO, HttpHeaders headers) {
LOGGER.info("[create][Create Wait Order][Ready to Create Wait Order]");
Response<WaitListOrder> response=saveNewOrder(orderVO,headers);
if(response.getStatus()==0){
//未能正常保存到数据库
return response;
} else {
//已保存到数据库 开始轮询
return triggerThread(response.getData(),orderVO,headers);
}
}
@Override
public Response getAllOrders(HttpHeaders headers) {
List<WaitListOrder> orderList= waitListOrderRepository.findAll();
if (orderList != null && !orderList.isEmpty()) {
WaitListOrderServiceImpl.LOGGER.warn("[getAllOrders][Find all orders Success][size:{}]",orderList.size());
return new Response<>(1, "Success.", orderList);
} else {
LOGGER.warn("[getAllOrders][Find All Wait List Orders Fail][{}]","No content");
return new Response<>(0, "No Content.", null);
}
}
@Override
public Response getAllWaitListOrders(HttpHeaders headers) {
List<WaitListOrder> orderList= waitListOrderRepository.findAll();
if (orderList != null && !orderList.isEmpty()) {
WaitListOrderServiceImpl.LOGGER.warn("[getAllWaitListOrders][Find all orders Success][size:{}]",orderList.size());
List<Integer> filterList=new ArrayList<>();
filterList.add(WaitListOrderStatus.NOTPAID.getCode());
filterList.add(WaitListOrderStatus.PAID.getCode());
//Only orders in the wait list will be selected
orderList=orderList.stream()
.filter(WaitListOrder -> filterList.contains(WaitListOrder.getStatus()))
.collect(Collectors.toList());
return new Response<>(1, "Success.", orderList);
} else {
LOGGER.warn("[getAllWaitListOrders][Find All Wait List Orders Fail][{}]","No content");
return new Response<>(0, "No Content.", null);
}
}
@Transactional
@Override
public Response updateOrder(WaitListOrder order, HttpHeaders headers) {
LOGGER.info("[updateOrder][Update Wait List Order][Order Info:{}] ", order.toString());
Optional<WaitListOrder> op = waitListOrderRepository.findById(order.getId());
if(!op.isPresent()){
LOGGER.error("[updateOrder][Update Order Info Fail][Order not found][OrderId: {}]",order.getId());
return new Response<>(0, "Order Not Found, Can't update", null);
} else {
WaitListOrder old = op.get();
BeanUtils.copyProperties(old,order);
waitListOrderRepository.save(old);
LOGGER.info("[updateOrder][Update Wait List Order Info Success][OrderId: {}]",order.getId());
return new Response<>(1, "Update Wait List Order Success", old);
}
}
@Transactional
@Override
public Response modifyWaitListOrderStatus(int status, String orderId) {
LOGGER.info("[modifyWaitListOrderStatus][Modify Order Status][OrderId:{}] ", orderId);
Optional<WaitListOrder> op = waitListOrderRepository.findById(orderId);
if(!op.isPresent()){
LOGGER.error("[modifyWaitListOrderStatus][Modify Order Status Fail][Order not found][OrderId: {}]",orderId);
return new Response<>(0, "Order Not Found, Can't update", null);
} else {
WaitListOrder old = op.get();
old.setStatus(status);
waitListOrderRepository.save(old);
LOGGER.info("[modifyWaitListOrderStatus][Modify Order Status Success][OrderId: {}]",orderId);
return new Response<>(1, "Modify Wait List Order Status Success", old);
}
}
private Response<WaitListOrder> saveNewOrder(WaitListOrderVO orderVO, HttpHeaders headers) {
ArrayList<WaitListOrder> accountOrders= waitListOrderRepository.findByAccountId(orderVO.getAccountId());
//if the order already exist
if(WaitListOrderExist(accountOrders,orderVO)){
WaitListOrderServiceImpl.LOGGER.error("[create][Create Wait Order Fail][Order already exists][AccountId: {} , TripId: {}]", orderVO.getAccountId(),orderVO.getTripId());
return new Response<>(0, "Order already exist", null);
} else {
WaitListOrder newWaitListOrder=new WaitListOrder();
newWaitListOrder.setId(UUID.randomUUID().toString());
BeanUtils.copyProperties(newWaitListOrder,orderVO);
newWaitListOrder.setTrainNumber(orderVO.getTripId());
waitListOrderRepository.save(newWaitListOrder);
WaitListOrderServiceImpl.LOGGER.info("[create][Create Wait Order Success][Order Price][AccountId: {} , TripId: {}]", orderVO.getAccountId(),orderVO.getTripId());
return new Response<>(1,success,newWaitListOrder);
}
}
private Boolean WaitListOrderExist(List<WaitListOrder> orderList,WaitListOrderVO newOrder){
for(WaitListOrder order: orderList){
if(Objects.equals(order.getAccountId(), newOrder.getAccountId())
&& Objects.equals(order.getContactsId(), newOrder.getContactsId())
&& Objects.equals(order.getTrainNumber(), newOrder.getTripId())
&& Objects.equals(order.getTravelTime(),newOrder.getDate())
&& Objects.equals(order.getFrom(),newOrder.getFrom())
&& Objects.equals(order.getTo(),newOrder.getTo())){
return true;
}
}
return false;
}
private Response triggerThread(WaitListOrder orderPO,WaitListOrderVO orderVO,HttpHeaders headers){
PollThread pollThread;
try{
pollThread =new PollThread(orderPO.getWaitUtilTime(),this,orderVO,restTemplate, headers);
pollThread.start();
} catch (Exception e){
return new Response<>(0, "Fail To Run A New Thread", null);
}
return new Response<>(1,"Thread Start Success",null);
}
}