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;
}
......@@ -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
......