zhuyifan

fix

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;
}
......@@ -80,10 +80,10 @@ public class WebSocketServer extends TextWebSocketHandler {
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(userSessionData -> userAuthData.isEmpty() || (userAuthData.stream().anyMatch(data -> String.valueOf(data.getOperatorId()).equals(userSessionData.getUserId()) && data.getUserType().equals(userSessionData.getUserType()))))
.collect(Collectors.toList());
sendMessageToUsers(keys, socketMessage);
}
......
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();
}
}
......
......@@ -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;
......@@ -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) {
......
......@@ -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
......