zhuyifan

同步房间号

Showing 22 changed files with 420 additions and 71 deletions
......@@ -8,6 +8,7 @@ import com.infoloop.tianting.WOperatorServiceProtoRpcGrpc;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerServiceRpcGrpc;
import com.infoloop.tianting.clientinventoryservice.TiantingClientInventoryServiceRpcGrpc;
import com.infoloop.tianting.clientresourcetagservice.ClientResourceTagServiceRpcGrpc;
import com.infoloop.tianting.deliveryruleservice.TiantingDeliveryRuleServiceRpcGrpc;
import com.infoloop.tianting.enterpriseresourcetagservice.EnterpriseResourceTagServiceRpcGrpc;
import com.infoloop.tianting.menuservice.MenuServiceRpcGrpc;
......@@ -32,6 +33,9 @@ import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_CUSTOMER_SER
import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_INVENTORY_SERVICE_CHANNEL;
import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_INVENTORY_SERVICE_RPC_PORT;
import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_INVENTORY_SERVICE_RPC_URL;
import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_RESOURCE_SERVICE_CHANNEL;
import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_RESOURCE_SERVICE_RPC_PORT;
import static com.infoloop.tianting.constant.ConfigConstants.CLIENT_RESOURCE_SERVICE_RPC_URL;
import static com.infoloop.tianting.constant.ConfigConstants.DELIVERY_SERVICE_CHANNEL;
import static com.infoloop.tianting.constant.ConfigConstants.DELIVERY_SERVICE_RPC_PORT;
import static com.infoloop.tianting.constant.ConfigConstants.DELIVERY_SERVICE_RPC_URL;
......@@ -268,4 +272,21 @@ public class GrpcConfig {
public MeiZhongYiHeServiceRpcGrpc.MeiZhongYiHeServiceRpcBlockingStub meiZhongYiHeServiceRpcBlockingStub(@Autowired @Qualifier(MEIZHONGYIHE_SERVICE_CHANNEL) final ManagedChannel channel) {
return MeiZhongYiHeServiceRpcGrpc.newBlockingStub(channel);
}
@Bean(CLIENT_RESOURCE_SERVICE_CHANNEL)
public ManagedChannel clientResourceServiceChannel(@Value(CLIENT_RESOURCE_SERVICE_RPC_URL) final String url,
@Value(CLIENT_RESOURCE_SERVICE_RPC_PORT) final int port,
@Autowired final ClientInterceptor clientInterceptor) {
return NettyChannelBuilder.forAddress(url, port)
.idleTimeout(DEFAULT_TIMEOUT_DAYS, TimeUnit.DAYS)
.intercept(clientInterceptor)
.usePlaintext()
.maxInboundMessageSize(Integer.MAX_VALUE)
.build();
}
@Bean
public ClientResourceTagServiceRpcGrpc.ClientResourceTagServiceRpcBlockingStub clientResourceTagServiceRpcBlockingStub(@Autowired @Qualifier(CLIENT_RESOURCE_SERVICE_CHANNEL) final ManagedChannel channel) {
return ClientResourceTagServiceRpcGrpc.newBlockingStub(channel);
}
}
......
......@@ -76,6 +76,10 @@ public interface ConfigConstants {
String MEIZHONGYIHE_SERVICE_RPC_PORT = "${grpc.meizhongyihe-service.port}";
String MEIZHONGYIHE_SERVICE_CHANNEL = "meizhongyihe-service-channel";
String CLIENT_RESOURCE_SERVICE_RPC_URL = "${grpc.client-resource-service.url}";
String CLIENT_RESOURCE_SERVICE_RPC_PORT = "${grpc.client-resource-service.port}";
String CLIENT_RESOURCE_SERVICE_CHANNEL = "client-resource-tag-service-channel";
String ASYNC_EXECUTOR = "asyncExecutor";
String SCHEDULED_TASK_EXECUTOR = "scheduledTaskExecutor";
......
package com.infoloop.tianting.context;
import com.infoloop.tianting.enums.LoginSourceEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
......@@ -61,6 +62,8 @@ public class LoginContextHolder {
@Builder.Default
private String openId = "";
private LoginSourceEnum loginSource;
}
}
......
......@@ -14,10 +14,12 @@ import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.List;
@Api(tags = "ClientCustomer")
......@@ -28,57 +30,64 @@ import java.util.List;
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ClientCustomerController {
private final ClientCustomerService clientCustomerService;
private final ClientCustomerService clientCustomerService;
@ApiOperation(value = "根据hisCustomerId获取ClientCustomer")
@GetMapping("/customers/his/{hisCustomerId}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByHISCustomerId(@PathVariable String hisCustomerId) {
return clientCustomerService.getClientCustomerByHISCustomerId(hisCustomerId);
}
@ApiOperation(value = "根据hisCustomerId获取ClientCustomer")
@GetMapping("/customers/his/{hisCustomerId}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByHISCustomerId(@PathVariable String hisCustomerId) {
return clientCustomerService.getClientCustomerByHISCustomerId(hisCustomerId);
}
@ApiOperation(value = "根据hisCustomerNo获取ClientCustomer")
@GetMapping("/his/customer/{hisCustomerNo}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByHISCustomerNo(@PathVariable String hisCustomerNo) {
return clientCustomerService.getClientCustomerByHISCustomerNo(hisCustomerNo);
}
@ApiOperation(value = "根据hisCustomerNo获取ClientCustomer")
@GetMapping("/his/customer/{hisCustomerNo}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByHISCustomerNo(@PathVariable String hisCustomerNo) {
return clientCustomerService.getClientCustomerByHISCustomerNo(hisCustomerNo);
}
@ApiOperation(value = "根据customerId获取ClientCustomer")
@GetMapping("/customers/{customerId}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByCustomerId(@PathVariable Integer customerId) {
return clientCustomerService.getClientCustomerByCustomerId(customerId);
}
@ApiOperation(value = "根据customerId获取ClientCustomer")
@GetMapping("/customers/{customerId}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByCustomerId(@PathVariable Integer customerId) {
return clientCustomerService.getClientCustomerByCustomerId(customerId);
}
@ApiOperation(value = "根据phone获取ClientCustomer")
@GetMapping("/customers/phone/{phone}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByPhone(@PathVariable String phone) {
return clientCustomerService.getClientCustomerByPhone(phone);
}
@ApiOperation(value = "根据phone获取ClientCustomer")
@GetMapping("/customers/phone/{phone}")
@ResponseStatus(HttpStatus.OK)
public ClientCustomerDto getClientCustomerByPhone(@PathVariable String phone) {
return clientCustomerService.getClientCustomerByPhone(phone);
}
@ApiOperation(value = "根据customerId获取住院记录")
@GetMapping("/enterprise/{enterpriseId}/hospitalRecords/customers/{customerId}")
@ResponseStatus(HttpStatus.OK)
public List<HospitalRecordDto> getHospitalRecords(@PathVariable Integer enterpriseId,
@PathVariable Integer customerId) {
return clientCustomerService.getClientCustomerHospitalRecordsByCustomerId(
enterpriseId, customerId);
}
@ApiOperation(value = "根据customerId获取住院记录")
@GetMapping("/enterprise/{enterpriseId}/hospitalRecords/customers/{customerId}")
@ResponseStatus(HttpStatus.OK)
public List<HospitalRecordDto> getHospitalRecords(@PathVariable Integer enterpriseId,
@PathVariable Integer customerId) {
return clientCustomerService.getClientCustomerHospitalRecordsByCustomerId(
enterpriseId, customerId);
}
@ApiOperation(value = "获取今日在住")
@GetMapping("/clientCustomers/today/statistic")
@ResponseStatus(HttpStatus.OK)
public TodayOrderDto getClientCustomerTodayOrderStatistic(@RequestParam String customerToken) {
return clientCustomerService.getTodayOrderStatistic(customerToken);
}
@ApiOperation(value = "获取今日在住")
@GetMapping("/clientCustomers/today/statistic")
@ResponseStatus(HttpStatus.OK)
public TodayOrderDto getClientCustomerTodayOrderStatistic(@RequestParam String customerToken) {
return clientCustomerService.getTodayOrderStatistic(customerToken);
}
@ApiOperation(value = "获取his今日在住")
@GetMapping("/hisClientCustomers/today/statistic")
@ResponseStatus(HttpStatus.OK)
public TodayOrderDto getHisClientCustomerTodayOrderStatistic(@RequestParam String customerToken) {
return clientCustomerService.getTodayOrderStatisticForHis(customerToken);
}
@ApiOperation(value = "获取his今日在住")
@GetMapping("/hisClientCustomers/today/statistic")
@ResponseStatus(HttpStatus.OK)
public TodayOrderDto getHisClientCustomerTodayOrderStatistic(@RequestParam String customerToken) {
return clientCustomerService.getTodayOrderStatisticForHis(customerToken);
}
@ApiOperation(value = "同步his客户信息")
@PostMapping("/hisclientcustomers/synchronization")
@ResponseStatus(HttpStatus.OK)
public void synchronizationHisClientCustomer() throws IOException {
clientCustomerService.synchronizationHisClientCustomer();
}
}
......
......@@ -67,7 +67,6 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
StpUtil.checkLogin();
final var enterpriseId = Convert.toInt(StpUtil.getExtra(CommonConstants.ENTERPRISE_ID));
final var loginSource = Convert.toInt(StpUtil.getExtra(CommonConstants.LOGIN_SOURCE));
log.info("Login success, enterpriseId: {}, loginSource: {}", enterpriseId, loginSource);
if (loginSource.equals(LoginSourceEnum.CUSTOMER.getValue())) {
final var openId = Convert.toStr(StpUtil.getExtra(CommonConstants.OPEN_ID));
final var loginId = StpUtil.getLoginIdAsInt();
......@@ -77,8 +76,7 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
ResponseUtil.write(response, ResponseResult.failed(ErrorCodeEnum.VALIDATE_FAILED));
return false;
}
log.info("Customer login success, customerId: {}, enterpriseId: {}, openId:{}", loginId, enterpriseId, openId);
builder.id(loginId).enterpriseId(enterpriseId).name(customer.getResponse().getName()).openId(openId);
builder.id(loginId).enterpriseId(enterpriseId).name(customer.getResponse().getName()).openId(openId).loginSource(LoginSourceEnum.CUSTOMER);
return true;
} else if (loginSource.equals(LoginSourceEnum.OPERATOR.getValue())){
final var loginId = StpUtil.getLoginIdAsInt();
......@@ -88,20 +86,19 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
ResponseUtil.write(response, ResponseResult.failed(ErrorCodeEnum.VALIDATE_FAILED));
return false;
}
builder.id(loginId).enterpriseId(enterpriseId).name(opeartor.getName());
builder.id(loginId).enterpriseId(enterpriseId).name(opeartor.getName()).loginSource(LoginSourceEnum.OPERATOR);
return true;
} else if (loginSource.equals(LoginSourceEnum.KDS.getValue())) {
final var loginId = StpUtil.getLoginIdAsInt();
final var operator = wOperatorServiceRpcClient.getWOperatorById(loginId).getResponse();
if (operator.getId() == 0) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
}
builder.id(loginId).enterpriseId(enterpriseId).name(operator.getName());
builder.id(loginId).enterpriseId(enterpriseId).name(operator.getName()).loginSource(LoginSourceEnum.KDS);
return true;
} else {
final var loginId = StpUtil.getLoginIdAsString();
builder.openId(loginId).enterpriseId(enterpriseId);
builder.openId(loginId).enterpriseId(enterpriseId).loginSource(LoginSourceEnum.MINI_PROGRAM);
return true;
}
}
......
package com.infoloop.tianting.intercepter;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert;
import com.infoloop.tianting.constant.CommonConstants;
import com.infoloop.tianting.enums.LoginSourceEnum;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.util.StringUtils;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
......@@ -17,15 +14,15 @@ public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
final var authorization = request.getHeaders().getFirst(CommonConstants.AUTHORIZATION);
if (StringUtils.isEmpty(authorization)) {
return false;
if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
String userType = servletRequest.getServletRequest().getParameter(CommonConstants.USER_TYPE);
String userId = servletRequest.getServletRequest().getParameter(CommonConstants.USER_ID);
attributes.put(CommonConstants.USER_TYPE, userType);
attributes.put(CommonConstants.USER_ID, userId);
return true;
}
final var loginSource = Convert.toInt(StpUtil.getExtra(CommonConstants.LOGIN_SOURCE));
final var loginSourceEnum = LoginSourceEnum.getByValue(loginSource);
attributes.put(CommonConstants.USER_TYPE, loginSourceEnum.getUserType().name());
attributes.put(CommonConstants.USER_ID, StpUtil.getLoginIdAsString());
return true;
return false;
}
@Override
......
package com.infoloop.tianting.logic.async;
import com.infoloop.rpc.meizhongyiheservice.Customer;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcResponse;
import com.infoloop.tianting.clientinventoryservice.SingleClientRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.model.dto.OrderDbDTO;
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.CustomerAlterRoomNoData;
import com.infoloop.tianting.server.session.UserSessionKey;
import com.infoloop.tianting.server.session.UserTypeEnum;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.ClientResourceTagServiceRpcClient;
import com.infoloop.tianting.service.client.InventoryServiceRpcClient;
import com.infoloop.tianting.service.client.MeiZhongYiHeServiceClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.infoloop.tianting.constant.ConfigConstants.ASYNC_EXECUTOR;
@Slf4j
@Component
@RequiredArgsConstructor
public class HisCustomerRoomNoTask {
private final OperatorServiceRpcClient operatorServiceRpcClient;
private final ClientResourceTagServiceRpcClient clientResourceTagServiceRpcClient;
private final InventoryServiceRpcClient inventoryServiceRpcClient;
private final MeiZhongYiHeServiceClient meiZhongYiHeServiceClient;
private final OrderServiceRpcClient orderServiceRpcClient;
private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
@Async(ASYNC_EXECUTOR)
public void synchronization(LoginContextHolder.LoginInfo loginInfo) throws IOException {
final var cOperatorById = operatorServiceRpcClient.getCOperatorById(loginInfo.getId());
final var stallIdsList = clientResourceTagServiceRpcClient
.getUserResources(cOperatorById.getEnterpriseId(), cOperatorById.getClientId(), cOperatorById.getId())
.getStallIdsList();
final var stalls = inventoryServiceRpcClient
.getStallsByIds(cOperatorById.getEnterpriseId(), stallIdsList)
.getClientsList();
final var stallCodes = stalls.stream()
.filter(e -> !e.getIsDelivery())
.map(SingleClientRpcResponse::getCode)
.collect(Collectors.toList());
final var customersList = meiZhongYiHeServiceClient.getCustomersByCondition(stallCodes);
final var hisCustomerIds = customersList.stream().map(Customer::getCustomerId).collect(Collectors.toList());
final var customerMap = customersList.stream()
.collect(Collectors.toMap(Customer::getCustomerId, Function.identity(), (a, b) -> a));
final var queryOrderDto = OrderDbDTO.QueryOrderByConditionDto.builder()
.shouldFilterStallIds(true)
.stallIds(stallIdsList)
.shouldFilterStatues(true)
.statues(List.of(OrderStatusEnum.TO_PREPARE, OrderStatusEnum.PREPARING))
.build();
final var orders = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
final var clientCustomerMap = clientCustomerServiceRpcClient.getClientCustomersByHISCustomerIds(hisCustomerIds)
.getResponsesList()
.stream()
.collect(Collectors.toMap(SingleClientCustomerRpcResponse::getId, Function.identity(), (a, b) -> a));
final var alterRoomNoCustomers = orders.stream()
.map(order -> {
final var singleClientCustomerRpcResponse = clientCustomerMap.get(order.getCustomerId());
if (singleClientCustomerRpcResponse == null) {
return null;
}
final var customer = customerMap.get(singleClientCustomerRpcResponse.getHISCustomerId());
if (customer == null) {
log.error("customer is null for HIS customerId: {}", singleClientCustomerRpcResponse.getHISCustomerId());
return null;
}
final var syncRoomNo = customer.getCustomerHospitalRecord().getRoomNo();
if (!syncRoomNo.equals(order.getRoomNo())) {
return CustomerAlterRoomNoData.AlterRoomNoCustomer.builder()
.orderId(order.getId())
.customerId(singleClientCustomerRpcResponse.getId())
.roomNo(order.getRoomNo())
.alterRoomNo(syncRoomNo)
.build();
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 记录找不到 HIS 客户 ID 的错误日志
final var missingCustomerIds = orders.stream()
.map(order -> clientCustomerMap.get(order.getCustomerId()))
.filter(Objects::nonNull)
.map(SingleClientCustomerRpcResponse::getHISCustomerId)
.filter(hisId -> !customerMap.containsKey(hisId))
.collect(Collectors.toList());
if (!missingCustomerIds.isEmpty()) {
log.error("customer is null for HIS customerIds: {}", missingCustomerIds);
}
if (alterRoomNoCustomers.isEmpty()) {
return;
}
final var isUpdated = orderServiceRpcClient.batchUpdateClientCustomerOrders(
loginInfo,
alterRoomNoCustomers.stream()
.map(e -> ClientCustomerOrderModification.newBuilder()
.setId(e.getOrderId())
.setShouldUpdateSyncRoomNo(true)
.setSyncRoomNo(e.getAlterRoomNo())
.build())
.collect(Collectors.toList()));
if (!isUpdated) {
log.error("OrderServiceRpcClient.batchUpdateClientCustomerOrders error");
return;
}
final var affectedCustomers = alterRoomNoCustomers.stream()
.map(CustomerAlterRoomNoData.AlterRoomNoCustomer::getCustomerId)
.distinct()
.count();
final var data = SocketMessage.<CustomerAlterRoomNoData>builder()
.type(MessageTypeEnum.CUSTOMER)
.noticeType(NoticeTypeEnum.CUSTOMER_ALTER_ROOM_NO)
.subject(NoticeTypeEnum.CUSTOMER_ALTER_ROOM_NO.getDescription())
.message("有" + affectedCustomers + " 个客户房间号发生了变更,系统已显示最新房间号。")
.data(CustomerAlterRoomNoData.builder().alterRoomNoCustomers(alterRoomNoCustomers).build())
.build();
WebSocketServer.sendMessageToUser(
UserSessionKey.builder()
.userId(String.valueOf(loginInfo.getId()))
.userType(UserTypeEnum.CLIENT)
.build(),
data
);
}
}
......@@ -123,6 +123,10 @@ public class OrderDbDTO {
private Boolean shouldFilterPayStatus = false;
@Builder.Default
private PayStatusEnum payStatus = PayStatusEnum.UNKNOWN_PAY_STATUS;
@Builder.Default
private Boolean shouldFilterStatues = false;
@Builder.Default
private List<OrderStatusEnum> statues = new ArrayList<>();
}
@Data
......
......@@ -80,6 +80,14 @@ public class WebSocketServer extends TextWebSocketHandler {
sendMessageToUsers(keys, socketMessage);
}
public static <T> void sendMessageByUserTypes(List<UserTypeEnum> userTypes, List<String> authUserIds, SocketMessage<T> socketMessage) throws IOException {
final var keys = userSessions.keySet().stream()
.filter(userSessionData -> userTypes.contains(userSessionData.getUserType()))
.filter(userSessionData -> authUserIds.contains(userSessionData.getUserId()))
.collect(Collectors.toList());
sendMessageToUsers(keys, socketMessage);
}
public static void closeConnection(UserSessionKey key) {
final var userData = userSessions.get(key);
if (userData != null) {
......
......@@ -5,7 +5,8 @@ import lombok.Getter;
@Getter
public enum MessageTypeEnum {
ORDER("订单类型消息");
ORDER("订单类型消息"),
CUSTOMER("客户类型消息");;
private final String description;
......
......@@ -5,8 +5,10 @@ import lombok.Getter;
@Getter
public enum NoticeTypeEnum {
ORDER_CREATED("下单成功", MessageTypeEnum.ORDER),
ORDER_PAYMENT_SUCCESS("支付成功", MessageTypeEnum.ORDER);
ORDER_PAYMENT_SUCCESS("支付成功", MessageTypeEnum.ORDER),
CUSTOMER_ALTER_ROOM_NO("客户变更房间号", MessageTypeEnum.CUSTOMER),
;
private final String description;
private final MessageTypeEnum messageType;
......
package com.infoloop.tianting.server.message.data;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class CustomerAlterRoomNoData {
private List<AlterRoomNoCustomer> alterRoomNoCustomers;
@Data
@Builder
public static class AlterRoomNoCustomer {
private int orderId;
private int customerId;
private String roomNo;
private String alterRoomNo;
}
}
......@@ -9,6 +9,7 @@ import com.infoloop.tianting.model.dto.ClientLabelDTO.BatchDeleteCustomerLabelRe
import com.infoloop.tianting.model.dto.ClientLabelDTO.BatchDeleteCustomerLabelRefResponseDto;
import com.infoloop.tianting.model.dto.ClientLabelDTO.CustomerLabelRefDetailDto;
import java.io.IOException;
import java.util.List;
public interface ClientCustomerService {
......@@ -36,4 +37,6 @@ public interface ClientCustomerService {
TodayOrderDto getTodayOrderStatisticForHis(String token);
ClientCustomerDto getClientCustomerByHISCustomerNo(String hisCustomerNo);
void synchronizationHisClientCustomer() throws IOException;
}
......
......@@ -2,7 +2,11 @@ package com.infoloop.tianting.service.client;
import com.infoloop.tianting.clientcustomerservice.BatchCreateClientCustomerLabelRefsRpcRequest;
import com.infoloop.tianting.clientcustomerservice.BatchCreateClientCustomerLabelRefsRpcResponse;
import com.infoloop.tianting.clientcustomerservice.BatchCreateClientCustomerOperationRecordsRpcRequest;
import com.infoloop.tianting.clientcustomerservice.BatchUpdateClientCustomersRpcRequest;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerLabelRefCreation;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerModification;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerOperationRecordCreation;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerServiceRpcGrpc;
import com.infoloop.tianting.clientcustomerservice.DeleteClientCustomerLabelRefsByIdsRpcRequest;
import com.infoloop.tianting.clientcustomerservice.DeleteClientCustomerLabelRefsRpcResponse;
......@@ -24,6 +28,7 @@ import com.infoloop.tianting.clientcustomerservice.GetClientCustomersByIdsRpcReq
import com.infoloop.tianting.clientcustomerservice.GetClientCustomersByIdsRpcResponse;
import com.infoloop.tianting.clientcustomerservice.QueryClientCustomerLabelRefsByConditionRpcRequest;
import com.infoloop.tianting.clientcustomerservice.QueryClientCustomerLabelRefsByConditionRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.model.dto.ClientLabelDTO.BatchCreateCustomerLabelRefDto;
import com.infoloop.tianting.model.dto.ClientLabelDTO.BatchDeleteCustomerLabelRefRequestDto;
import lombok.RequiredArgsConstructor;
......@@ -145,4 +150,24 @@ public class ClientCustomerServiceRpcClient {
.build();
return clientCustomerServiceRpcBlockingStub.deleteClientCustomerLabelRefsByIds(request);
}
public boolean batchUpdateClientCustomers(LoginContextHolder.LoginInfo loginInfo, List<ClientCustomerModification> modifications) {
final var request = BatchUpdateClientCustomersRpcRequest.newBuilder()
.setEnterpriseId(loginInfo.getEnterpriseId())
.setUpdatedBy(loginInfo.getId())
.setUpdateSource(loginInfo.getLoginSource().getValue())
.addAllModifications(modifications)
.build();
return clientCustomerServiceRpcBlockingStub.batchUpdateClientCustomers(request).getIsUpdated();
}
public boolean batchCreateClientCustomerOperationRecords(LoginContextHolder.LoginInfo loginInfo, List<ClientCustomerOperationRecordCreation> creations) {
final var request = BatchCreateClientCustomerOperationRecordsRpcRequest.newBuilder()
.setEnterpriseId(loginInfo.getEnterpriseId())
.setCreatedBy(loginInfo.getId())
.setCreationSource(loginInfo.getLoginSource().getValue())
.addAllCreations(creations)
.build();
return clientCustomerServiceRpcBlockingStub.batchCreateClientCustomerOperationRecords(request).getIsCreated();
}
}
......
package com.infoloop.tianting.service.client;
import com.infoloop.tianting.clientresourcetagservice.ClientResourceTagServiceRpcGrpc;
import com.infoloop.tianting.clientresourcetagservice.ResourceOperatorIdsGetByStallIdsRequest;
import com.infoloop.tianting.clientresourcetagservice.SingleResourceLabelEntityRefsResponse;
import com.infoloop.tianting.clientresourcetagservice.UserTagsAndResourcesGetRequest;
import com.infoloop.tianting.clientresourcetagservice.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 ClientResourceTagServiceRpcClient {
private final ClientResourceTagServiceRpcGrpc.ClientResourceTagServiceRpcBlockingStub clientResourceTagServiceRpcBlockingStub;
public List<SingleResourceLabelEntityRefsResponse> getOperatorIdsByStallIds(List<Integer> stallIds) {
return clientResourceTagServiceRpcBlockingStub.getOperatorIdsByStallIds(ResourceOperatorIdsGetByStallIdsRequest.newBuilder()
.addAllStallIds(stallIds)
.build()).getLabelEntityRefsList();
}
public UserTagsAndResourcesGetResponse getUserResources(int enterpriseId, int clientId, int operatorId) {
return clientResourceTagServiceRpcBlockingStub.getUserResources(UserTagsAndResourcesGetRequest.newBuilder()
.setEnterpriseId(enterpriseId)
.setUserId(operatorId)
.setClientId(clientId)
.build());
}
}
......@@ -6,6 +6,7 @@ import com.infoloop.rpc.meizhongyiheservice.GetCustomerAllergiesByCustomerIdsRpc
import com.infoloop.rpc.meizhongyiheservice.GetCustomerDetailByIdRpcRequest;
import com.infoloop.rpc.meizhongyiheservice.GetCustomerMedicalAdvicesByHospitalRecordIdsRpcRequest;
import com.infoloop.rpc.meizhongyiheservice.GetCustomerMedicalAdvicesByHospitalRecordIdsRpcResponse;
import com.infoloop.rpc.meizhongyiheservice.GetCustomersByConditionRpcRequest;
import com.infoloop.rpc.meizhongyiheservice.MeiZhongYiHeServiceRpcGrpc;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -44,4 +45,11 @@ public class MeiZhongYiHeServiceClient {
}
return customer.getCustomer();
}
public List<Customer> getCustomersByCondition(List<String> stallCodes) {
final var request = GetCustomersByConditionRpcRequest.newBuilder()
.addAllDeptCode(stallCodes)
.build();
return meiZhongYiHeServiceRpcBlockingStub.getCustomersByCondition(request).getCustomersList();
}
}
......
......@@ -21,7 +21,7 @@ public class OperatorServiceRpcClient {
return cOperatorServiceProtoRpcBlockingStub.getCOperatorByMobileOrEmail(request).getResponse();
}
public SingleCOperatorRpcResponse getCOperatorById(Integer id) {
public SingleCOperatorRpcResponse getCOperatorById(int id) {
final var request = GetCOperatorByIdRpcRequest.newBuilder().setId(id).build();
return cOperatorServiceProtoRpcBlockingStub.getCOperatorById(request).getResponse();
}
......
......@@ -9,6 +9,7 @@ import com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperatio
import com.infoloop.tianting.clientcustomerorderservice.BatchSaveSkuSellQuantitiesRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrdersRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreation;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderDetailCreation;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderDetailModification;
......@@ -43,6 +44,7 @@ import com.infoloop.tianting.clientcustomerorderservice.SkuSellQuantity;
import com.infoloop.tianting.clientcustomerorderservice.SkuSellQuantityModification;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientresourcetagservice.SingleResourceLabelEntityRefsResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.exception.ErrorCodeEnum;
......@@ -102,6 +104,7 @@ public class OrderServiceRpcClient {
private final MenuServiceRpcClient menuServiceRpcClient;
private final SkuServiceRpcClient skuServiceRpcClient;
private final OperatorServiceRpcClient operatorServiceRpcClient;
private final ClientResourceTagServiceRpcClient clientResourceTagServiceRpcClient;
private final RedissonClient redissonClient;
private final DelayedQueue<AutoCancelParam> delayedQueue;
......@@ -119,8 +122,7 @@ public class OrderServiceRpcClient {
GetClientCustomerOrdersByCustomerIdRpcRequest.newBuilder().setCustomerId(customerId).build()).getResponsesList();
}
public List<SingleClientCustomerOrderRpcResponse> getOrdersByCondition(
QueryOrderByConditionDto queryOrderDto) {
public List<SingleClientCustomerOrderRpcResponse> getOrdersByCondition(QueryOrderByConditionDto queryOrderDto) {
final var request = QueryClientCustomerOrdersByConditionRpcRequest.newBuilder()
.setEnterpriseId(queryOrderDto.getEnterpriseId())
.setShouldFilterOpenIds(queryOrderDto.getShouldFilterOpenId())
......@@ -147,6 +149,8 @@ public class OrderServiceRpcClient {
.addAllOpenIds(List.of(queryOrderDto.getOpenId()))
.setShouldFilterPayStatus(queryOrderDto.getShouldFilterPayStatus())
.setPayStatus(queryOrderDto.getPayStatus())
.setShouldFilterStatues(queryOrderDto.getShouldFilterStatues())
.addAllStatues(queryOrderDto.getStatues())
.build();
return orderServiceRpcBlockingStub.queryClientCustomerOrdersByCondition(request).getResponsesList();
}
......@@ -601,6 +605,7 @@ 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();
......@@ -612,7 +617,7 @@ public class OrderServiceRpcClient {
.data(orderCreateSuccessData)
.build();
try {
WebSocketServer.sendMessageByUserTypes(List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), data);
WebSocketServer.sendMessageByUserTypes(List.of(UserTypeEnum.CLIENT, UserTypeEnum.KDS), userIds, data);
} catch (IOException e) {
log.error("Failed to send message to user", e);
}
......@@ -636,6 +641,15 @@ public class OrderServiceRpcClient {
return CreateOrderResponse.builder().id(orderResponse.getId()).isCreated(true).build();
}
public boolean batchUpdateClientCustomerOrders(LoginContextHolder.LoginInfo loginInfo, List<ClientCustomerOrderModification> modifications) {
return orderServiceRpcBlockingStub.batchUpdateClientCustomerOrders(BatchUpdateClientCustomerOrdersRpcRequest.newBuilder()
.setEnterpriseId(loginInfo.getEnterpriseId())
.setUpdatedBy(loginInfo.getId())
.setUpdateSource(OrderSourceEnum.forNumber(loginInfo.getLoginSource().getValue()))
.addAllModifications(modifications)
.build()).getIsUpdated();
}
public List<SingleSkuSellQuantityRpcResponse> querySkuSellQuantitiesByStall(int enterpriseId, int stallId) {
return orderServiceRpcBlockingStub.querySkuSellQuantitiesByStall(QuerySkuSellQuantitiesByStallRpcRequest.newBuilder()
......
......@@ -3,6 +3,7 @@ package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.logic.async.HisCustomerRoomNoTask;
import com.infoloop.tianting.menuservice.SingleClientCustomerMenuRefRpcResponse;
import com.infoloop.tianting.model.dto.ClientCustomerDbDTO.ClientCustomerDto;
import com.infoloop.tianting.model.dto.ClientCustomerDbDTO.CurrentClientCustomerDto;
......@@ -29,6 +30,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
......@@ -45,6 +47,7 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
private final ClientCustomerServiceHttpClient clientCustomerServiceHttpClient;
private final OrderServiceRpcClient orderServiceRpcClient;
private final MenuServiceRpcClient menuServiceRpcClient;
private final HisCustomerRoomNoTask hisCustomerRoomNoTask;
@Override
public ClientCustomerDto getClientCustomerByHISCustomerId(String hisCustomerId) {
......@@ -575,4 +578,9 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
.build();
}
@Override
public void synchronizationHisClientCustomer() throws IOException {
hisCustomerRoomNoTask.synchronization(LoginContextHolder.getLoginInfo());
}
}
......
......@@ -138,6 +138,7 @@ message SingleClientCustomerOrderRpcResponse {
bool isRead = 33;
bool isConfirm = 34;
bool isAllocation = 35;
string syncRoomNo = 36;
}
message GetClientCustomerOrderByIdRpcRequest {
......@@ -243,6 +244,8 @@ message QueryClientCustomerOrdersByConditionRpcRequest {
bool isConfirm = 45;
bool shouldFilterIsAllocation = 46;
bool isAllocation = 47;
bool shouldFilterStatues = 48;
repeated OrderStatusEnum statues = 49;
}
message QueryClientCustomerOrdersByConditionRpcResponse {
......@@ -370,6 +373,8 @@ message ClientCustomerOrderModification {
bool isConfirm = 51;
bool shouldUpdateIsAllocation = 52;
bool isAllocation = 53;
bool shouldUpdateSyncRoomNo = 54;
string syncRoomNo = 55;
}
message UpdateClientCustomerOrderRpcRequest {
......
......@@ -40,6 +40,7 @@ service ClientCustomerServiceRpc {
rpc GetClientCustomerHospitalRecordByCustomerId (GetClientCustomerHospitalRecordByCustomerIdRpcRequest) returns (GetClientCustomerHospitalRecordByCustomerIdRpcResponse) {}
//根据客户IDS查询住院记录
rpc GetClientCustomerHospitalRecordsByCustomerIds (GetClientCustomerHospitalRecordsByCustomerIdsRpcRequest) returns (GetClientCustomerHospitalRecordsByCustomerIdsRpcResponse) {}
rpc GetClientCustomerHospitalRecordsByHISCustomerIds (GetClientCustomerHospitalRecordsByHISCustomerIdsRpcRequest) returns (GetClientCustomerHospitalRecordsByHISCustomerIdsRpcResponse) {}
rpc QueryClientCustomerHospitalRecordsByCondition (QueryClientCustomerHospitalRecordsByConditionRpcRequest) returns (QueryClientCustomerHospitalRecordsByConditionRpcResponse) {}
rpc CreateClientCustomerHospitalRecord (CreateClientCustomerHospitalRecordRpcRequest) returns (CreateClientCustomerHospitalRecordRpcResponse) {}
rpc BatchCreateClientCustomerHospitalRecords (BatchCreateClientCustomerHospitalRecordsRpcRequest) returns (BatchCreateClientCustomerHospitalRecordsRpcResponse) {}
......@@ -385,6 +386,16 @@ message GetClientCustomerHospitalRecordsByCustomerIdsRpcResponse {
repeated SingleClientCustomerHospitalRecordRpcResponse responses = 1;
}
message GetClientCustomerHospitalRecordsByHISCustomerIdsRpcRequest {
repeated string HISCustomerIds = 1;
int32 enterpriseId = 2;
bool includeDeleted = 3;
}
message GetClientCustomerHospitalRecordsByHISCustomerIdsRpcResponse {
repeated SingleClientCustomerHospitalRecordRpcResponse responses = 1;
}
message QueryClientCustomerHospitalRecordsByConditionRpcRequest {
int32 enterpriseId = 1;
bool shouldFilterClientIds = 2;
......
......@@ -58,7 +58,7 @@ grpc.meal-service.port=3017
grpc.delivery-service.url=47.101.193.136
grpc.delivery-service.port=3017
grpc.operator-service.url=47.101.193.136
grpc.operator-service.url=115.190.92.112
grpc.operator-service.port=3031
grpc.woperator-service.url=47.101.193.136
......@@ -67,6 +67,9 @@ grpc.woperator-service.port=3028
grpc.enterprise-resource-service.url=47.101.193.136
grpc.enterprise-resource-service.port=3026
grpc.client-resource-service.url=47.101.193.136
grpc.client-resource-service.port=3019
grpc.meizhongyihe-service.url=47.101.193.136
grpc.meizhongyihe-service.port=3040
......