FoodServiceImpl.java
package foodsearch.service;
import edu.fudan.common.entity.Food;
import edu.fudan.common.entity.StationFoodStore;
import edu.fudan.common.entity.TrainFood;
import edu.fudan.common.util.JsonUtils;
import edu.fudan.common.util.Response;
import edu.fudan.common.entity.Route;
import foodsearch.entity.*;
import foodsearch.mq.RabbitSend;
import foodsearch.repository.FoodOrderRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
@Service
public class FoodServiceImpl implements FoodService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private FoodOrderRepository foodOrderRepository;
@Autowired
private RabbitSend sender;
@Autowired
private DiscoveryClient discoveryClient;
private static final Logger LOGGER = LoggerFactory.getLogger(FoodServiceImpl.class);
private String getServiceUrl(String serviceName) {
return "http://" + serviceName;
}
String success = "Success.";
String orderIdNotExist = "Order Id Is Non-Existent.";
@Override
public Response createFoodOrdersInBatch(List<FoodOrder> orders, HttpHeaders headers) {
boolean error = false;
String errorOrderId = "";
// Check if foodOrder exists
for (FoodOrder addFoodOrder : orders) {
FoodOrder fo = foodOrderRepository.findByOrderId(addFoodOrder.getOrderId());
if (fo != null) {
LOGGER.error("[createFoodOrdersInBatch][AddFoodOrder][Order Id Has Existed][OrderId: {}]", addFoodOrder.getOrderId());
error = true;
errorOrderId = addFoodOrder.getOrderId().toString();
break;
}
}
if (error) {
return new Response<>(0, "Order Id " + errorOrderId + "Existed", null);
}
List<String> deliveryJsons = new ArrayList<>();
for (FoodOrder addFoodOrder : orders) {
FoodOrder fo = new FoodOrder();
fo.setId(UUID.randomUUID().toString());
fo.setOrderId(addFoodOrder.getOrderId());
fo.setFoodType(addFoodOrder.getFoodType());
if (addFoodOrder.getFoodType() == 2) {
fo.setStationName(addFoodOrder.getStationName());
fo.setStoreName(addFoodOrder.getStoreName());
}
fo.setFoodName(addFoodOrder.getFoodName());
fo.setPrice(addFoodOrder.getPrice());
foodOrderRepository.save(fo);
LOGGER.info("[createFoodOrdersInBatch][AddFoodOrderBatch][Success Save One Order][FoodOrderId: {}]", fo.getOrderId());
Delivery delivery = new Delivery();
delivery.setFoodName(addFoodOrder.getFoodName());
delivery.setOrderId(UUID.fromString(addFoodOrder.getOrderId()));
delivery.setStationName(addFoodOrder.getStationName());
delivery.setStoreName(addFoodOrder.getStoreName());
String deliveryJson = JsonUtils.object2Json(delivery);
deliveryJsons.add(deliveryJson);
}
// 批量发送消息
for(String deliveryJson: deliveryJsons) {
LOGGER.info("[createFoodOrdersInBatch][AddFoodOrder][delivery info send to mq][delivery info: {}]", deliveryJson);
try {
sender.send(deliveryJson);
} catch (Exception e) {
LOGGER.error("[createFoodOrdersInBatch][AddFoodOrder][send delivery info to mq error][exception: {}]", e.toString());
}
}
return new Response<>(1, success, null);
}
@Override
public Response createFoodOrder(FoodOrder addFoodOrder, HttpHeaders headers) {
FoodOrder fo = foodOrderRepository.findByOrderId(addFoodOrder.getOrderId());
if (fo != null) {
FoodServiceImpl.LOGGER.error("[createFoodOrder][AddFoodOrder][Order Id Has Existed][OrderId: {}]", addFoodOrder.getOrderId());
return new Response<>(0, "Order Id Has Existed.", null);
} else {
fo = new FoodOrder();
fo.setId(UUID.randomUUID().toString());
fo.setOrderId(addFoodOrder.getOrderId());
fo.setFoodType(addFoodOrder.getFoodType());
if (addFoodOrder.getFoodType() == 2) {
fo.setStationName(addFoodOrder.getStationName());
fo.setStoreName(addFoodOrder.getStoreName());
}
fo.setFoodName(addFoodOrder.getFoodName());
fo.setPrice(addFoodOrder.getPrice());
foodOrderRepository.save(fo);
FoodServiceImpl.LOGGER.info("[createFoodOrder][AddFoodOrder Success]");
Delivery delivery = new Delivery();
delivery.setFoodName(addFoodOrder.getFoodName());
delivery.setOrderId(UUID.fromString(addFoodOrder.getOrderId()));
delivery.setStationName(addFoodOrder.getStationName());
delivery.setStoreName(addFoodOrder.getStoreName());
String deliveryJson = JsonUtils.object2Json(delivery);
LOGGER.info("[createFoodOrder][AddFoodOrder, delivery info send to mq][delivery info: {}]", deliveryJson);
try {
sender.send(deliveryJson);
} catch (Exception e) {
LOGGER.error("[createFoodOrder][AddFoodOrder][send delivery info to mq error][exception: {}]", e.toString());
}
return new Response<>(1, success, fo);
}
}
@Transactional
@Override
public Response deleteFoodOrder(String orderId, HttpHeaders headers) {
FoodOrder foodOrder = foodOrderRepository.findByOrderId(UUID.fromString(orderId).toString());
if (foodOrder == null) {
FoodServiceImpl.LOGGER.error("[deleteFoodOrder][Cancel FoodOrder][Order Id Is Non-Existent][orderId: {}]", orderId);
return new Response<>(0, orderIdNotExist, null);
} else {
// foodOrderRepository.deleteFoodOrderByOrderId(UUID.fromString(orderId));
foodOrderRepository.deleteFoodOrderByOrderId(orderId);
FoodServiceImpl.LOGGER.info("[deleteFoodOrder][Cancel FoodOrder Success]");
return new Response<>(1, success, null);
}
}
@Override
public Response findAllFoodOrder(HttpHeaders headers) {
List<FoodOrder> foodOrders = foodOrderRepository.findAll();
if (foodOrders != null && !foodOrders.isEmpty()) {
return new Response<>(1, success, foodOrders);
} else {
FoodServiceImpl.LOGGER.error("[findAllFoodOrder][Find all food order error: {}]", "No Content");
return new Response<>(0, "No Content", null);
}
}
@Override
public Response updateFoodOrder(FoodOrder updateFoodOrder, HttpHeaders headers) {
FoodOrder fo = foodOrderRepository.findById(updateFoodOrder.getId()).orElse(null);
if (fo == null) {
FoodServiceImpl.LOGGER.info("[updateFoodOrder][Update FoodOrder][Order Id Is Non-Existent][orderId: {}]", updateFoodOrder.getOrderId());
return new Response<>(0, orderIdNotExist, null);
} else {
fo.setFoodType(updateFoodOrder.getFoodType());
if (updateFoodOrder.getFoodType() == 1) {
fo.setStationName(updateFoodOrder.getStationName());
fo.setStoreName(updateFoodOrder.getStoreName());
}
fo.setFoodName(updateFoodOrder.getFoodName());
fo.setPrice(updateFoodOrder.getPrice());
foodOrderRepository.save(fo);
FoodServiceImpl.LOGGER.info("[updateFoodOrder][Update FoodOrder Success]");
return new Response<>(1, "Success", fo);
}
}
@Override
public Response findByOrderId(String orderId, HttpHeaders headers) {
FoodOrder fo = foodOrderRepository.findByOrderId(UUID.fromString(orderId).toString());
if (fo != null) {
FoodServiceImpl.LOGGER.info("[findByOrderId][Find Order by id Success][orderId: {}]", orderId);
return new Response<>(1, success, fo);
} else {
FoodServiceImpl.LOGGER.warn("[findByOrderId][Find Order by id][Order Id Is Non-Existent][orderId: {}]", orderId);
return new Response<>(0, orderIdNotExist, null);
}
}
@Override
public Response getAllFood(String date, String startStation, String endStation, String tripId, HttpHeaders headers) {
FoodServiceImpl.LOGGER.info("[getAllFood][get All Food with info][data:{} start:{} end:{} tripid:{}]", date, startStation, endStation, tripId);
AllTripFood allTripFood = new AllTripFood();
if (null == tripId || tripId.length() <= 2) {
FoodServiceImpl.LOGGER.error("[getAllFood][Get the Get Food Request Failed][Trip id is not suitable][date: {}, tripId: {}]", date, tripId);
return new Response<>(0, "Trip id is not suitable", null);
}
// need return this tow element
List<Food> trainFoodList = null;
Map<String, List<StationFoodStore>> foodStoreListMap = new HashMap<>();
/**--------------------------------------------------------------------------------------*/
HttpEntity requestEntityGetTrainFoodListResult = new HttpEntity(null);
String train_food_service_url = getServiceUrl("ts-train-food-service");
ResponseEntity<Response<List<Food>>> reGetTrainFoodListResult = restTemplate.exchange(
train_food_service_url + "/api/v1/trainfoodservice/trainfoods/" + tripId,
HttpMethod.GET,
requestEntityGetTrainFoodListResult,
new ParameterizedTypeReference<Response<List<Food>>>() {
});
List<Food> trainFoodListResult = reGetTrainFoodListResult.getBody().getData();
if (trainFoodListResult != null) {
trainFoodList = trainFoodListResult;
FoodServiceImpl.LOGGER.info("[getAllFood][Get Train Food List!]");
} else {
FoodServiceImpl.LOGGER.error("[getAllFood][reGetTrainFoodListResult][Get the Get Food Request Failed!][date: {}, tripId: {}]", date, tripId);
return new Response<>(0, "Get the Get Food Request Failed!", null);
}
//车次途经的车站
/**--------------------------------------------------------------------------------------*/
HttpEntity requestEntityGetRouteResult = new HttpEntity(null, null);
String travel_service_url = getServiceUrl("ts-travel-service");
ResponseEntity<Response<Route>> reGetRouteResult = restTemplate.exchange(
travel_service_url + "/api/v1/travelservice/routes/" + tripId,
HttpMethod.GET,
requestEntityGetRouteResult,
new ParameterizedTypeReference<Response<Route>>() {
});
Response<Route> stationResult = reGetRouteResult.getBody();
if (stationResult.getStatus() == 1) {
Route route = stationResult.getData();
List<String> stations = route.getStations();
//去除不经过的站,如果起点终点有的话
if (null != startStation && !"".equals(startStation)) {
/**--------------------------------------------------------------------------------------*/
for (int i = 0; i < stations.size(); i++) {
if (stations.get(i).equals(startStation)) {
break;
} else {
stations.remove(i);
}
}
}
if (null != endStation && !"".equals(endStation)) {
/**--------------------------------------------------------------------------------------*/
for (int i = stations.size() - 1; i >= 0; i--) {
if (stations.get(i).equals(endStation)) {
break;
} else {
stations.remove(i);
}
}
}
HttpEntity requestEntityFoodStoresListResult = new HttpEntity(stations, null);
String station_food_service_url = getServiceUrl("ts-station-food-service");
ResponseEntity<Response<List<StationFoodStore>>> reFoodStoresListResult = restTemplate.exchange(
station_food_service_url + "/api/v1/stationfoodservice/stationfoodstores",
HttpMethod.POST,
requestEntityFoodStoresListResult,
new ParameterizedTypeReference<Response<List<StationFoodStore>>>() {
});
List<StationFoodStore> stationFoodStoresListResult = reFoodStoresListResult.getBody().getData();
if (stationFoodStoresListResult != null && !stationFoodStoresListResult.isEmpty()) {
for (String station : stations) {
List<StationFoodStore> res = stationFoodStoresListResult.stream()
.filter(stationFoodStore -> (stationFoodStore.getStationName().equals(station)))
.collect(Collectors.toList());
foodStoreListMap.put(station, res);
}
} else {
FoodServiceImpl.LOGGER.error("[getAllFood][Get the Get Food Request Failed!][foodStoresListResult is null][date: {}, tripId: {}]", date, tripId);
return new Response<>(0, "Get All Food Failed", allTripFood);
}
} else {
FoodServiceImpl.LOGGER.error("[getAllFood][Get the Get Food Request Failed!][station status error][date: {}, tripId: {}]", date, tripId);
return new Response<>(0, "Get All Food Failed", allTripFood);
}
allTripFood.setTrainFoodList(trainFoodList);
allTripFood.setFoodStoreListMap(foodStoreListMap);
return new Response<>(1, "Get All Food Success", allTripFood);
}
}