zhuyifan

fix

package com.infoloop.tianting.controller;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infoloop.tianting.model.dto.MenuDbDTO;
import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDetailDto;
......@@ -40,11 +41,11 @@ public class MenuController {
return menuService.queryMiniProgramPublishedMenusByStallId(enterpriseId, stallId);
}
@ApiOperation(value = "根据stallId获取所有已发布餐单")
@GetMapping("/enterprises/{enterpriseId}/stalls/{stallId}/all/menus")
@ApiOperation(value = "根据stallIds获取所有已发布餐单")
@PostMapping("/enterprises/{enterpriseId}/stalls/all/menus")
@ResponseStatus(HttpStatus.OK)
public List<MenuDto> queryPublishedMenusByStallIds(@PathVariable Integer enterpriseId, @PathVariable Integer stallId) {
return menuService.queryPublishedMenusByStallId(enterpriseId, stallId);
public List<MenuDto> queryPublishedMenusByStallIds(@PathVariable Integer enterpriseId, @Valid @RequestBody final MenuDbDTO.QueryStallMenuDTO queryStallMenuDTO) {
return menuService.queryPublishedMenusByStallId(enterpriseId, queryStallMenuDTO.getStallIds());
}
@ApiOperation(value = "根据MenuId获取餐单")
......
......@@ -5,16 +5,15 @@ import com.infoloop.tianting.menuservice.CloseTimeTypeEnum;
import com.infoloop.tianting.menuservice.DishSelectRuleEnum;
import com.infoloop.tianting.menuservice.DishTypeEnum;
import com.infoloop.tianting.menuservice.ModeOfPaymentEnum;
import com.infoloop.tianting.model.dto.MenuDbDTO.CreateMenuRefsDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
@ApiModel(description = "餐单DTO")
public class MenuDbDTO {
......@@ -152,4 +151,14 @@ public class MenuDbDTO {
private List<Integer> ids;
}
@Data
@Builder
@ToString
@ApiModel(description = "查询档口餐单")
public static class QueryStallMenuDTO {
@NotEmpty(message = "stallIds不能为空")
private List<Integer> stallIds;
}
}
......
......@@ -271,7 +271,7 @@ public class OrderDbDTO {
private Integer customerId;
@ApiModelProperty(value = "状态订单;待备餐=1,备餐中=2,部分出餐=3,已出餐=4,已取消=5")
private Integer status;
private OrderStatusEnum status;
@ApiModelProperty(value = "餐单 id")
@NotNull(message = "餐单 id不能为空")
......
package com.infoloop.tianting.server;
import com.infoloop.tianting.server.session.UserTypeEnum;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class UserAuthData {
private int operatorId;
private UserTypeEnum userType;
}
......@@ -7,14 +7,17 @@ import com.infoloop.tianting.server.session.UserSessionData;
import com.infoloop.tianting.server.session.UserSessionKey;
import com.infoloop.tianting.server.session.UserTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
......@@ -23,7 +26,7 @@ import java.util.stream.Collectors;
@Slf4j
public class WebSocketServer extends TextWebSocketHandler {
private static final ConcurrentHashMap<UserSessionKey, UserSessionData> userSessions = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<UserSessionKey, List<UserSessionData>> userSessions = new ConcurrentHashMap<>();
private static final long INACTIVITY_TIMEOUT = 60 * 60 * 1000;
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
......@@ -33,38 +36,47 @@ public class WebSocketServer extends TextWebSocketHandler {
private static void cleanInactiveSessions() {
final var currentTime = System.currentTimeMillis();
final var iterator = userSessions.entrySet().iterator();
log.info("cleanInactiveSessions; sessions:{}", userSessions.keySet());
while (iterator.hasNext()) {
final var entry = iterator.next();
final var key = entry.getKey();
final var userData = entry.getValue();
final var lastActiveTime = userData.getLastActiveTime();
if (currentTime - lastActiveTime > INACTIVITY_TIMEOUT) {
try {
userData.closeSession();
log.info("closeSession,userId : {}, userType : {}", key.getUserId(), key.getUserType());
} catch (IOException e) {
log.error("closeSession error,userId : {}, userType : {}", key.getUserId(), key.getUserType(), e);
}
iterator.remove();
}
}
userSessions.forEach((key, sessionList) ->
userSessions.computeIfPresent(key, (k, sessions) -> {
sessions.removeIf(userData -> {
if (currentTime - userData.getLastActiveTime() > INACTIVITY_TIMEOUT) {
try {
userData.closeSession();
log.info("closeSession, userId: {}, userType: {}", key.getUserId(), key.getUserType());
} catch (IOException e) {
log.error("closeSession error, userId: {}, userType: {}", key.getUserId(), key.getUserType(), e);
}
return true;
}
return false;
});
return sessions.isEmpty() ? null : sessions; // 为空时移除
})
);
}
public static <T> void sendMessageToUser(UserSessionKey key, SocketMessage<T> socketMessage) throws IOException {
sendMessageToUsers(List.of(key), socketMessage);
}
public static <T> void sendMessageToUsers(List<UserSessionKey> keys, SocketMessage<T> socketMessage) throws IOException {
for (final var key : keys) {
final var userData = userSessions.get(key);
if (userData != null && userData.getSession().isOpen()) {
userData.getSession().sendMessage(new TextMessage(socketMessage.toJsonString()));
userData.updateLastActiveTime();
log.info("send message to userId : {}, userType : {}", key.getUserId(), key.getUserType());
} else {
log.info("userId : {}, userType : {} WebSocket connect closed; ", key.getUserId(), key.getUserType());
final var sessionList = userSessions.get(key);
if (sessionList != null) {
sessionList.forEach(userData -> {
try {
if (userData.getSession().isOpen()) {
userData.getSession().sendMessage(new TextMessage(socketMessage.toJsonString()));
userData.updateLastActiveTime();
log.info("Send message to userId: {}, userType: {}", key.getUserId(), key.getUserType());
} else {
log.info("WebSocket closed; userId: {}, userType: {}", key.getUserId(), key.getUserType());
}
} catch (IOException e) {
log.error("Failed to send message; userId: {}, userType: {}", key.getUserId(), key.getUserType(), e);
}
});
}
}
}
......@@ -75,39 +87,40 @@ public class WebSocketServer extends TextWebSocketHandler {
public static <T> void sendMessageByUserTypes(List<UserTypeEnum> userTypes, SocketMessage<T> socketMessage) throws IOException {
final var keys = userSessions.keySet().stream()
.filter(userSessionData -> userTypes.contains(userSessionData.getUserType()))
.filter(userKey -> userTypes.contains(userKey.getUserType()))
.collect(Collectors.toList());
sendMessageToUsers(keys, socketMessage);
}
public static <T> void sendMessageByUserTypes(List<UserTypeEnum> userTypes, List<String> authUserIds, SocketMessage<T> socketMessage) throws IOException {
public static <T> void sendMessageByUserTypes(List<UserTypeEnum> userTypes, List<UserAuthData> userAuthData, SocketMessage<T> socketMessage) throws IOException {
final var keys = userSessions.keySet().stream()
.filter(userSessionData -> userTypes.contains(userSessionData.getUserType()))
.filter(userSessionData -> authUserIds.contains(userSessionData.getUserId()))
.filter(userKey -> userTypes.contains(userKey.getUserType()))
.filter(userKey -> userAuthData.isEmpty()
|| userAuthData.stream().anyMatch(data -> String.valueOf(data.getOperatorId()).equals(userKey.getUserId()) && data.getUserType().equals(userKey.getUserType())))
.collect(Collectors.toList());
sendMessageToUsers(keys, socketMessage);
}
public static void closeConnection(UserSessionKey key) {
final var userData = userSessions.get(key);
if (userData != null) {
try {
userData.closeSession();
userSessions.remove(key);
log.info("WebSocket close; userId = {}, userType = {}", key.getUserId(), key.getUserType());
} catch (IOException e) {
log.error("WebSocket close failed: userId = {}, userType = {}", key.getUserId(), key.getUserType(), e);
}
} else {
log.warn("Not Found userId : {}, userType : {} WebSocket Connect ", key.getUserId(), key.getUserType());
}
userSessions.computeIfPresent(key, (k, sessionList) -> {
sessionList.forEach(userData -> {
try {
userData.closeSession();
} catch (IOException e) {
log.error("WebSocket close failed: userId: {}, userType: {}", key.getUserId(), key.getUserType(), e);
}
});
return null; // 直接返回 null,移除 key
});
log.info("WebSocket closed; userId: {}, userType: {}", key.getUserId(), key.getUserType());
}
@Nullable
private UserSessionKey getUserSessionKey(WebSocketSession session) {
final var userId = (String) session.getAttributes().get(CommonConstants.USER_ID);
final var userTypeStr = (String) session.getAttributes().get(CommonConstants.USER_TYPE);
final var userType = UserTypeEnum.fromString(userTypeStr);
if (userId != null && userType != null) {
if (StringUtils.isNotEmpty(userId) && userType != null) {
return UserSessionKey.builder().userId(userId).userType(userType).build();
}
return null;
......@@ -117,30 +130,25 @@ public class WebSocketServer extends TextWebSocketHandler {
public void afterConnectionEstablished(WebSocketSession session) {
final var key = getUserSessionKey(session);
if (key != null) {
final var existingSession = userSessions.remove(key);
if (existingSession != null) {
try {
existingSession.closeSession();
log.info("WebSocket old connect closed,userId : {}, userType : {}", key.getUserId(), key.getUserType());
} catch (IOException e) {
log.error("old WebSocket close failed,userId : {}, userType : {}", key.getUserId(), key.getUserType(), e);
}
}
userSessions.put(key, new UserSessionData(session));
log.info("WebSocket connect success, userId : {}, userType : {}", key.getUserId(), key.getUserType());
userSessions.computeIfAbsent(key, k -> new CopyOnWriteArrayList<>()).add(new UserSessionData(session));
log.info("WebSocket connection established; userId: {}, userType: {}", key.getUserId(), key.getUserType());
} else {
log.warn("WebSocket connect failed,unable to get valid user information");
log.warn("WebSocket connection failed; unable to retrieve valid user information");
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
final var key = getUserSessionKey(session);
if (key != null) {
userSessions.remove(key);
log.info("WebSocket closed: userId : {}, userType : {}", key.getUserId(), key.getUserType());
userSessions.computeIfPresent(key, (k, sessionList) -> {
sessionList.removeIf(userData -> userData.getSession().getId().equals(session.getId()));
return sessionList.isEmpty() ? null : sessionList;
});
log.info("WebSocket closed; userId: {}, userType: {}", key.getUserId(), key.getUserType());
} else {
log.warn("WebSocket closed failed,unable to get valid user information");
log.warn("WebSocket closed; unable to retrieve valid user information");
}
}
}
\ No newline at end of file
......
......@@ -13,7 +13,7 @@ public interface MenuService {
List<MenuDto> queryMiniProgramPublishedMenusByStallId(Integer enterpriseId, Integer stallId);
List<MenuDto> queryPublishedMenusByStallId(Integer enterpriseId, Integer stallId);
List<MenuDto> queryPublishedMenusByStallId(Integer enterpriseId, List<Integer> stallIds);
MenuDto getMenuById(Integer enterpriseId, Integer id);
......
package com.infoloop.tianting.service.client;
import com.infoloop.tianting.enterpriseresourcetagservice.EnterpriseResourceTagServiceRpcGrpc;
import com.infoloop.tianting.enterpriseresourcetagservice.GetOperatorIdsByStallIdRpcRequest;
import com.infoloop.tianting.enterpriseresourcetagservice.UserTagsAndResourcesGetRequest;
import com.infoloop.tianting.enterpriseresourcetagservice.UserTagsAndResourcesGetResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class EnterpriseResourceServiceRpcClient {
......@@ -21,4 +24,12 @@ public class EnterpriseResourceServiceRpcClient {
.build();
return enterpriseResourceTagServiceRpcBlockingStub.getUserResources(request);
}
public List<Integer> getOperatorIdsByStallId(int enterpriseId, int stallId) {
final var request = GetOperatorIdsByStallIdRpcRequest.newBuilder()
.setEnterpriseId(enterpriseId)
.setStallId(stallId)
.build();
return enterpriseResourceTagServiceRpcBlockingStub.getOperatorIdsByStallId(request).getOperatorIdsList();
}
}
......
......@@ -45,11 +45,10 @@ public class MenuServiceRpcClient {
return menuServiceRpcBlockingStub.getMicroPublishedMenusByStallIds(request);
}
public GetPublishedMenusByStallIdsRpcResponse queryPublishedMenusByStallId(
Integer enterpriseId, Integer stallId) {
public GetPublishedMenusByStallIdsRpcResponse queryPublishedMenusByStallId(Integer enterpriseId, List<Integer> stallIds) {
final var request = GetPublishedMenusByStallIdsRpcRequest.newBuilder()
.setEnterpriseId(enterpriseId)
.addAllStallIds(List.of(stallId))
.addAllStallIds(stallIds)
.build();
return menuServiceRpcBlockingStub.getPublishedMenusByStallIds(request);
}
......
......@@ -67,6 +67,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailOperationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
import com.infoloop.tianting.server.UserAuthData;
import com.infoloop.tianting.server.WebSocketServer;
import com.infoloop.tianting.server.message.MessageTypeEnum;
import com.infoloop.tianting.server.message.NoticeTypeEnum;
......@@ -105,6 +106,7 @@ public class OrderServiceRpcClient {
private final SkuServiceRpcClient skuServiceRpcClient;
private final OperatorServiceRpcClient operatorServiceRpcClient;
private final ClientResourceTagServiceRpcClient clientResourceTagServiceRpcClient;
private final EnterpriseResourceServiceRpcClient enterpriseResourceServiceRpcClient;
private final RedissonClient redissonClient;
private final DelayedQueue<AutoCancelParam> delayedQueue;
......@@ -547,7 +549,7 @@ public class OrderServiceRpcClient {
OrderStatusEnum orderStatus = OrderStatusEnum.TO_PREPARE;
if (createOrderDto.getOnlinePay() != OnlinePayEnum.ONLINE) {
var orderRuleJson = menuById.getResponse().getOrderRuleJson();
if (orderRuleJson.getModeOfPayment() == ModeOfPaymentEnum.ONLINE && orderRuleJson.getCloseTimeType() == CloseTimeTypeEnum.IMMEDIATELY) {
if (orderRuleJson.getModeOfPayment() != ModeOfPaymentEnum.ONLINE && orderRuleJson.getCloseTimeType() == CloseTimeTypeEnum.IMMEDIATELY) {
orderStatus = OrderStatusEnum.PREPARING;
}
}
......@@ -555,7 +557,7 @@ public class OrderServiceRpcClient {
.setShouldCreateCustomerId(createOrderDto.getShouldCreateCustomerId())
.setShouldCreateCustomerId(true).setCustomerId(createOrderDto.getCustomerId())
.setStallId(createOrderDto.getStallId())
.setStatus(orderStatus)
.setStatus(createOrderDto.getStatus() != null ? createOrderDto.getStatus() : orderStatus)
.setAddress(createOrderDto.getAddress())
.setClientId(createOrderDto.getClientId())
.setShouldCreateOpenId(!LoginContextHolder.getOpenId().isEmpty()).setOpenId(LoginContextHolder.getOpenId())
......@@ -605,7 +607,6 @@ public class OrderServiceRpcClient {
if (orderResponse.getIsCreated()) {
// 用餐时间为当天,并且非在线支付餐单,发送消息给客户端
if (createOrderDto.getMealTime().toLocalDate().equals(LocalDate.now()) && menuById.getResponse().getOrderRuleJson().getModeOfPayment() != ModeOfPaymentEnum.ONLINE) {
final var userIds = clientResourceTagServiceRpcClient.getOperatorIdsByStallIds(List.of(createOrderDto.getStallId())).stream().map(SingleResourceLabelEntityRefsResponse::getEntityId).distinct().map(String::valueOf).collect(Collectors.toList());
final var orderCreateSuccessData = OrderCreateSuccessData.builder()
.orderId(orderResponse.getId())
.build();
......@@ -616,8 +617,14 @@ public class OrderServiceRpcClient {
.message("有新的订单下单成功啦,快去查看吧~")
.data(orderCreateSuccessData)
.build();
final var clientOperatorIds = clientResourceTagServiceRpcClient.getOperatorIdsByStallIds(List.of(createOrderDto.getStallId())).stream().map(SingleResourceLabelEntityRefsResponse::getEntityId).distinct().collect(Collectors.toList());
final var enterpriseOperatorIds = enterpriseResourceServiceRpcClient.getOperatorIdsByStallId(createOrderDto.getEnterpriseId(), createOrderDto.getStallId());
final var userAuthData = new ArrayList<UserAuthData>();
userAuthData.addAll(clientOperatorIds.stream().map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.CLIENT).build()).collect(Collectors.toList()));
userAuthData.addAll(enterpriseOperatorIds.stream().map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.KDS).build()).collect(Collectors.toList()));
log.info("received userAuthData:{}", userAuthData);
try {
WebSocketServer.sendMessageByUserTypes(List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), userIds, data);
WebSocketServer.sendMessageByUserTypes(List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), userAuthData, data);
} catch (IOException e) {
log.error("Failed to send message to user", e);
}
......
......@@ -10,6 +10,7 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
import com.infoloop.tianting.clientresourcetagservice.SingleResourceLabelEntityRefsResponse;
import com.infoloop.tianting.config.BusinessConfig;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.exception.ClientEndExceptions;
......@@ -19,10 +20,12 @@ import com.infoloop.tianting.model.dto.PayDTO.PayResponseDto;
import com.infoloop.tianting.model.dto.PayDTO.ThirdPartyPayInformRequestDto;
import com.infoloop.tianting.model.dto.PaymentCallbackDTO;
import com.infoloop.tianting.model.dto.PaymentCallbackResult;
import com.infoloop.tianting.server.UserAuthData;
import com.infoloop.tianting.server.WebSocketServer;
import com.infoloop.tianting.server.message.MessageTypeEnum;
import com.infoloop.tianting.server.message.NoticeTypeEnum;
import com.infoloop.tianting.server.message.SocketMessage;
import com.infoloop.tianting.server.message.data.OrderCreateSuccessData;
import com.infoloop.tianting.server.message.data.OrderPaymentSuccessData;
import com.infoloop.tianting.server.session.UserSessionKey;
import com.infoloop.tianting.server.session.UserTypeEnum;
......@@ -39,10 +42,15 @@ import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
......@@ -56,6 +64,10 @@ public class PayServiceClient {
private final OrderServiceRpcClient orderServiceRpcClient;
private final ClientResourceTagServiceRpcClient clientResourceTagServiceRpcClient;
private final EnterpriseResourceServiceRpcClient enterpriseResourceServiceRpcClient;
private final XmlMapper xmlMapper = new XmlMapper();
public PayResponseDto payInform(PayInformRequestDto payRequestDto) {
......@@ -180,6 +192,29 @@ public class PayServiceClient {
.userId(orderById.getOpenId())
.userType(UserTypeEnum.MICRO)
.build(), data);
if (LocalDate.now().equals(DateUtil.toLocalDate(orderById.getMealTime()))) {
final var orderCreateSuccessData = OrderCreateSuccessData.builder()
.orderId(orderById.getId())
.build();
final var createOrderData = SocketMessage.<OrderCreateSuccessData>builder()
.type(MessageTypeEnum.ORDER)
.noticeType(NoticeTypeEnum.ORDER_CREATED)
.subject(NoticeTypeEnum.ORDER_CREATED.getDescription())
.message("有新的订单下单成功啦,快去查看吧~")
.data(orderCreateSuccessData)
.build();
final var clientOperatorIds = clientResourceTagServiceRpcClient.getOperatorIdsByStallIds(List.of(orderById.getStallId())).stream().map(SingleResourceLabelEntityRefsResponse::getEntityId).distinct().collect(Collectors.toList());
final var enterpriseOperatorIds = enterpriseResourceServiceRpcClient.getOperatorIdsByStallId(orderById.getEnterpriseId(), orderById.getStallId());
final var userAuthData = new ArrayList<UserAuthData>();
userAuthData.addAll(clientOperatorIds.stream().map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.CLIENT).build()).collect(Collectors.toList()));
userAuthData.addAll(enterpriseOperatorIds.stream().map(e -> UserAuthData.builder().operatorId(e).userType(UserTypeEnum.KDS).build()).collect(Collectors.toList()));
log.info("received userAuthData:{}", userAuthData);
try {
WebSocketServer.sendMessageByUserTypes(List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), userAuthData, createOrderData);
} catch (IOException e) {
log.error("Failed to send message to user", e);
}
}
}
return updateResponse.getIsUpdated();
} catch (JsonProcessingException e) {
......
......@@ -68,8 +68,8 @@ public class MenuServiceImpl implements MenuService {
}
@Override
public List<MenuDto> queryPublishedMenusByStallId(Integer enterpriseId, Integer stallId) {
final var response = menuServiceRpcClient.queryPublishedMenusByStallId(enterpriseId, stallId);
public List<MenuDto> queryPublishedMenusByStallId(Integer enterpriseId, List<Integer> stallIds) {
final var response = menuServiceRpcClient.queryPublishedMenusByStallId(enterpriseId, stallIds);
return response.getResponsesList().stream().map(menu ->
MenuDto.builder()
.id(menu.getId())
......@@ -199,7 +199,7 @@ public class MenuServiceImpl implements MenuService {
@Override
public List<Integer> queryMenuSkuIdsByStallId(int enterpriseId, int stallId) {
final var menuIds = menuServiceRpcClient.queryPublishedMenusByStallId(LoginContextHolder.getEnterpriseId(), stallId).getResponsesList().stream().map(SingleMenuRpcResponse::getId).collect(Collectors.toList());
final var menuIds = menuServiceRpcClient.queryPublishedMenusByStallId(LoginContextHolder.getEnterpriseId(), List.of(stallId)).getResponsesList().stream().map(SingleMenuRpcResponse::getId).collect(Collectors.toList());
return menuServiceRpcClient.queryMenuDetailsByMenuIds(LoginContextHolder.getEnterpriseId(), menuIds).getResponsesList().stream().map(SingleMenuDetailRpcResponse::getSkuId).distinct().collect(Collectors.toList());
}
......
......@@ -113,6 +113,7 @@ public class OrderServiceImpl implements OrderService {
createOrderDto.setCreationSource(OrderSourceEnum.STALL.getNumber());
createOrderDto.setEnterpriseId(operatorLoginInfo.getEnterpriseId());
createOrderDto.setOnlinePay(operatorCreateOrderDto.getOnlinePay());
createOrderDto.setStatus(OrderStatusEnum.PREPARING);
OrderTypeEnum orderType;
if (menu.getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.RESERVATION) {
orderType = OrderTypeEnum.DELIVERY;
......
......@@ -154,4 +154,8 @@ public final class DateUtil extends DateUtils {
return toDate(localDateTime);
}
public static LocalDate toLocalDate(long timestamp) {
return Instant.ofEpochMilli(timestamp).atZone(CHINA_ZONE).toLocalDate();
}
}
\ No newline at end of file
......
......@@ -19,6 +19,7 @@ service EnterpriseResourceTagServiceRpc {
rpc GetUsersByTagId (UsersGetByTagIdRequest) returns (UsersGetByTagIdResponse) {}
rpc CreateTag (TagCreationRpcRequest) returns (TagCreationRpcResponse) {}
rpc AddResourcesToTag (AddResourcesToTagRpcRequest) returns (AddResourcesToTagRpcResponse) {}
rpc GetOperatorIdsByStallId (GetOperatorIdsByStallIdRpcRequest) returns (GetOperatorIdsByStallIdRpcResponse) {}
}
message TagCreationRpcRequest {
......@@ -202,4 +203,13 @@ message AddResourcesToTagRpcRequest {
message AddResourcesToTagRpcResponse {
bool isSuccess = 1;
}
message GetOperatorIdsByStallIdRpcRequest {
int32 enterpriseId = 1;
int32 stallId = 2;
}
message GetOperatorIdsByStallIdRpcResponse {
repeated int32 operatorIds = 1;
}
\ No newline at end of file
......