zhuyifan

fix

...@@ -17,6 +17,8 @@ import lombok.NoArgsConstructor; ...@@ -17,6 +17,8 @@ import lombok.NoArgsConstructor;
17 import lombok.ToString; 17 import lombok.ToString;
18 18
19 import javax.validation.Valid; 19 import javax.validation.Valid;
20 +import javax.validation.constraints.NotEmpty;
21 +import javax.validation.constraints.NotNull;
20 import java.time.LocalDateTime; 22 import java.time.LocalDateTime;
21 import java.util.ArrayList; 23 import java.util.ArrayList;
22 import java.util.List; 24 import java.util.List;
...@@ -117,6 +119,10 @@ public class OrderDbDTO { ...@@ -117,6 +119,10 @@ public class OrderDbDTO {
117 private Boolean shouldFilterMenuId = false; 119 private Boolean shouldFilterMenuId = false;
118 @Builder.Default 120 @Builder.Default
119 private Integer menuId = 0; 121 private Integer menuId = 0;
122 + @Builder.Default
123 + private Boolean shouldFilterPayStatus = false;
124 + @Builder.Default
125 + private PayStatusEnum payStatus;
120 } 126 }
121 127
122 @Data 128 @Data
...@@ -206,15 +212,19 @@ public class OrderDbDTO { ...@@ -206,15 +212,19 @@ public class OrderDbDTO {
206 212
207 @RequestKeyParam 213 @RequestKeyParam
208 @ApiModelProperty(value = "档口 ID") 214 @ApiModelProperty(value = "档口 ID")
215 + @NotNull(message = "档口 ID不能为空")
209 private Integer stallId; 216 private Integer stallId;
210 217
211 @ApiModelProperty(value = "客户 ID") 218 @ApiModelProperty(value = "客户 ID")
219 + @NotNull(message = "客户 ID不能为空")
212 private Integer customerId; 220 private Integer customerId;
213 221
214 @ApiModelProperty(value = "餐单 id") 222 @ApiModelProperty(value = "餐单 id")
223 + @NotNull(message = "餐单 id不能为空")
215 private Integer menuId; 224 private Integer menuId;
216 225
217 @ApiModelProperty(value = "用餐日期") 226 @ApiModelProperty(value = "用餐日期")
227 + @NotNull(message = "用餐日期不能为空")
218 private LocalDateTime mealTime; 228 private LocalDateTime mealTime;
219 229
220 @ApiModelProperty(value = "桌号") 230 @ApiModelProperty(value = "桌号")
...@@ -224,9 +234,11 @@ public class OrderDbDTO { ...@@ -224,9 +234,11 @@ public class OrderDbDTO {
224 private String remark; 234 private String remark;
225 235
226 @ApiModelProperty(value = "支付方式") 236 @ApiModelProperty(value = "支付方式")
237 + @NotNull(message = "支付方式不能为空")
227 private OnlinePayEnum onlinePay; 238 private OnlinePayEnum onlinePay;
228 239
229 @ApiModelProperty(value = "订单菜品详情列表") 240 @ApiModelProperty(value = "订单菜品详情列表")
241 + @NotEmpty(message = "订单菜品详情列表不能为空")
230 private List<OperatorCreateOrderDetailDto> orderDetailDtos; 242 private List<OperatorCreateOrderDetailDto> orderDetailDtos;
231 } 243 }
232 244
...@@ -240,10 +252,12 @@ public class OrderDbDTO { ...@@ -240,10 +252,12 @@ public class OrderDbDTO {
240 private Integer enterpriseId; 252 private Integer enterpriseId;
241 253
242 @ApiModelProperty(value = "院区 ID") 254 @ApiModelProperty(value = "院区 ID")
255 + @NotNull(message = "院区 ID不能为空")
243 private Integer clientId; 256 private Integer clientId;
244 257
245 @RequestKeyParam 258 @RequestKeyParam
246 @ApiModelProperty(value = "档口 ID") 259 @ApiModelProperty(value = "档口 ID")
260 + @NotNull(message = "档口 ID不能为空")
247 private Integer stallId; 261 private Integer stallId;
248 262
249 @ApiModelProperty(value = "需要创建客户 ID") 263 @ApiModelProperty(value = "需要创建客户 ID")
...@@ -256,6 +270,7 @@ public class OrderDbDTO { ...@@ -256,6 +270,7 @@ public class OrderDbDTO {
256 private Integer status; 270 private Integer status;
257 271
258 @ApiModelProperty(value = "餐单 id") 272 @ApiModelProperty(value = "餐单 id")
273 + @NotNull(message = "餐单 id不能为空")
259 private Integer menuId; 274 private Integer menuId;
260 275
261 @ApiModelProperty(value = "订单商品总数") 276 @ApiModelProperty(value = "订单商品总数")
...@@ -265,6 +280,7 @@ public class OrderDbDTO { ...@@ -265,6 +280,7 @@ public class OrderDbDTO {
265 private Integer payPrice; 280 private Integer payPrice;
266 281
267 @ApiModelProperty(value = "支付方式") 282 @ApiModelProperty(value = "支付方式")
283 + @NotNull(message = "支付方式不能为空")
268 private OnlinePayEnum onlinePay; 284 private OnlinePayEnum onlinePay;
269 285
270 @ApiModelProperty(value = "支付时间") 286 @ApiModelProperty(value = "支付时间")
...@@ -280,6 +296,7 @@ public class OrderDbDTO { ...@@ -280,6 +296,7 @@ public class OrderDbDTO {
280 private String transactionId; 296 private String transactionId;
281 297
282 @ApiModelProperty(value = "用餐日期") 298 @ApiModelProperty(value = "用餐日期")
299 + @NotNull(message = "用餐日期不能为空")
283 private LocalDateTime mealTime; 300 private LocalDateTime mealTime;
284 301
285 @ApiModelProperty(value = "订餐地址") 302 @ApiModelProperty(value = "订餐地址")
...@@ -309,7 +326,6 @@ public class OrderDbDTO { ...@@ -309,7 +326,6 @@ public class OrderDbDTO {
309 @ApiModelProperty(value = "修改人 ID,修改人可能是院区端登陆的用户,也可能是 KDS 端登陆用户") 326 @ApiModelProperty(value = "修改人 ID,修改人可能是院区端登陆的用户,也可能是 KDS 端登陆用户")
310 private Integer updatedBy; 327 private Integer updatedBy;
311 328
312 -
313 @ApiModelProperty(value = "更新来源:小程序点餐=1;院区端=2;kds=3;业务中台 = 4") 329 @ApiModelProperty(value = "更新来源:小程序点餐=1;院区端=2;kds=3;业务中台 = 4")
314 private Integer updateSource; 330 private Integer updateSource;
315 331
...@@ -317,6 +333,7 @@ public class OrderDbDTO { ...@@ -317,6 +333,7 @@ public class OrderDbDTO {
317 private CloseTimeType closeTimeType; 333 private CloseTimeType closeTimeType;
318 334
319 @ApiModelProperty(value = "订单菜品详情列表") 335 @ApiModelProperty(value = "订单菜品详情列表")
336 + @NotEmpty(message = "订单菜品详情列表不能为空")
320 private List<CreateOrderDetailDto> orderDetailDtos; 337 private List<CreateOrderDetailDto> orderDetailDtos;
321 } 338 }
322 339
......
...@@ -24,7 +24,7 @@ import java.util.stream.Collectors; ...@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
24 public class WebSocketServer extends TextWebSocketHandler { 24 public class WebSocketServer extends TextWebSocketHandler {
25 25
26 private static final ConcurrentHashMap<UserSessionKey, UserSessionData> userSessions = new ConcurrentHashMap<>(); 26 private static final ConcurrentHashMap<UserSessionKey, UserSessionData> userSessions = new ConcurrentHashMap<>();
27 - private static final long INACTIVITY_TIMEOUT = 2 * 60 * 60 * 1000; 27 + private static final long INACTIVITY_TIMEOUT = 60 * 60 * 1000;
28 private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 28 private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
29 29
30 static { 30 static {
...@@ -34,6 +34,7 @@ public class WebSocketServer extends TextWebSocketHandler { ...@@ -34,6 +34,7 @@ public class WebSocketServer extends TextWebSocketHandler {
34 private static void cleanInactiveSessions() { 34 private static void cleanInactiveSessions() {
35 final var currentTime = System.currentTimeMillis(); 35 final var currentTime = System.currentTimeMillis();
36 final var iterator = userSessions.entrySet().iterator(); 36 final var iterator = userSessions.entrySet().iterator();
37 + log.info("cleanInactiveSessions; sessions:{}", userSessions.keySet());
37 while (iterator.hasNext()) { 38 while (iterator.hasNext()) {
38 final var entry = iterator.next(); 39 final var entry = iterator.next();
39 final var key = entry.getKey(); 40 final var key = entry.getKey();
...@@ -108,8 +109,17 @@ public class WebSocketServer extends TextWebSocketHandler { ...@@ -108,8 +109,17 @@ public class WebSocketServer extends TextWebSocketHandler {
108 public void afterConnectionEstablished(WebSocketSession session) { 109 public void afterConnectionEstablished(WebSocketSession session) {
109 final var key = getUserSessionKey(session); 110 final var key = getUserSessionKey(session);
110 if (key != null) { 111 if (key != null) {
112 + final var existingSession = userSessions.remove(key);
113 + if (existingSession != null) {
114 + try {
115 + existingSession.closeSession();
116 + log.info("WebSocket old connect closed,userId : {}, userType : {}", key.getUserId(), key.getUserType());
117 + } catch (IOException e) {
118 + log.error("old WebSocket close failed,userId : {}, userType : {}", key.getUserId(), key.getUserType(), e);
119 + }
120 + }
111 userSessions.put(key, new UserSessionData(session)); 121 userSessions.put(key, new UserSessionData(session));
112 - log.info("WebSocket connect success: userId : {}, userType : {}", key.getUserId(), key.getUserType()); 122 + log.info("WebSocket connect success, userId : {}, userType : {}", key.getUserId(), key.getUserType());
113 } else { 123 } else {
114 log.warn("WebSocket connect failed,unable to get valid user information"); 124 log.warn("WebSocket connect failed,unable to get valid user information");
115 } 125 }
......
...@@ -145,6 +145,8 @@ public class OrderServiceRpcClient { ...@@ -145,6 +145,8 @@ public class OrderServiceRpcClient {
145 .addAllMenuIds(List.of(queryOrderDto.getMenuId())) 145 .addAllMenuIds(List.of(queryOrderDto.getMenuId()))
146 .setShouldFilterOpenIds(queryOrderDto.getShouldFilterOpenId()) 146 .setShouldFilterOpenIds(queryOrderDto.getShouldFilterOpenId())
147 .addAllOpenIds(List.of(queryOrderDto.getOpenId())) 147 .addAllOpenIds(List.of(queryOrderDto.getOpenId()))
148 + .setShouldFilterPayStatus(queryOrderDto.getShouldFilterPayStatus())
149 + .setPayStatus(queryOrderDto.getPayStatus())
148 .build(); 150 .build();
149 return orderServiceRpcBlockingStub.queryClientCustomerOrdersByCondition(request).getResponsesList(); 151 return orderServiceRpcBlockingStub.queryClientCustomerOrdersByCondition(request).getResponsesList();
150 } 152 }
...@@ -539,8 +541,11 @@ public class OrderServiceRpcClient { ...@@ -539,8 +541,11 @@ public class OrderServiceRpcClient {
539 .build(); 541 .build();
540 final var menuById = menuServiceRpcClient.getMenuById(createOrderDto.getEnterpriseId(), createOrderDto.getMenuId()); 542 final var menuById = menuServiceRpcClient.getMenuById(createOrderDto.getEnterpriseId(), createOrderDto.getMenuId());
541 OrderStatusEnum orderStatus = OrderStatusEnum.TO_PREPARE; 543 OrderStatusEnum orderStatus = OrderStatusEnum.TO_PREPARE;
542 - if (menuById.getResponse().getOrderRuleJson().getModeOfPayment() == ModeOfPaymentEnum.ONLINE && menuById.getResponse().getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.IMMEDIATELY) { 544 + if (createOrderDto.getOnlinePay() != OnlinePayEnum.ONLINE) {
543 - orderStatus = OrderStatusEnum.PREPARING; 545 + var orderRuleJson = menuById.getResponse().getOrderRuleJson();
546 + if (orderRuleJson.getModeOfPayment() == ModeOfPaymentEnum.ONLINE && orderRuleJson.getCloseTimeType() == CloseTimeTypeEnum.IMMEDIATELY) {
547 + orderStatus = OrderStatusEnum.PREPARING;
548 + }
544 } 549 }
545 final var creation = ClientCustomerOrderCreation.newBuilder() 550 final var creation = ClientCustomerOrderCreation.newBuilder()
546 .setShouldCreateCustomerId(createOrderDto.getShouldCreateCustomerId()) 551 .setShouldCreateCustomerId(createOrderDto.getShouldCreateCustomerId())
...@@ -553,7 +558,7 @@ public class OrderServiceRpcClient { ...@@ -553,7 +558,7 @@ public class OrderServiceRpcClient {
553 .setShouldCreateRoomNo(!createOrderDto.getRoomNo().isEmpty()).setRoomNo(createOrderDto.getRoomNo()) 558 .setShouldCreateRoomNo(!createOrderDto.getRoomNo().isEmpty()).setRoomNo(createOrderDto.getRoomNo())
554 .setShouldCreateTableCode(createOrderDto.getCloseTimeType().equals(CloseTimeType.IMMEDIATELY) || StringUtils.isNotEmpty(createOrderDto.getTableCode())).setTableCode(createOrderDto.getTableCode() == null ? "" : createOrderDto.getTableCode()) 559 .setShouldCreateTableCode(createOrderDto.getCloseTimeType().equals(CloseTimeType.IMMEDIATELY) || StringUtils.isNotEmpty(createOrderDto.getTableCode())).setTableCode(createOrderDto.getTableCode() == null ? "" : createOrderDto.getTableCode())
555 .setShouldCreateOnlinePay(true).setOnlinePay(createOrderDto.getOnlinePay()) 560 .setShouldCreateOnlinePay(true).setOnlinePay(createOrderDto.getOnlinePay())
556 - .setShouldCreatePayStatus(true).setPayStatus(createOrderDto.getOnlinePay() == OnlinePayEnum.ONLINE || createOrderDto.getOnlinePay() == OnlinePayEnum.LEAVE_HOSPITAL ? PayStatusEnum.TO_PAY : PayStatusEnum.SUCCEED) 561 + .setShouldCreatePayStatus(true).setPayStatus(createOrderDto.getOnlinePay() == OnlinePayEnum.ONLINE ? PayStatusEnum.TO_PAY : PayStatusEnum.SUCCEED)
557 .setMenuId(createOrderDto.getMenuId()) 562 .setMenuId(createOrderDto.getMenuId())
558 .setTotalNum(createOrderDto.getTotalNum()) 563 .setTotalNum(createOrderDto.getTotalNum())
559 .setShouldCreatePayPrice(createOrderDto.getOnlinePay() == OnlinePayEnum.LEAVE_HOSPITAL).setPayPrice(createOrderDto.getPayPrice()) 564 .setShouldCreatePayPrice(createOrderDto.getOnlinePay() == OnlinePayEnum.LEAVE_HOSPITAL).setPayPrice(createOrderDto.getPayPrice())
...@@ -571,13 +576,10 @@ public class OrderServiceRpcClient { ...@@ -571,13 +576,10 @@ public class OrderServiceRpcClient {
571 final var skuSellQuantities = this.querySkuSellQuantitiesByStallAndSkuIds(createOrderDto.getEnterpriseId(), createOrderDto.getStallId(), skuIds); 576 final var skuSellQuantities = this.querySkuSellQuantitiesByStallAndSkuIds(createOrderDto.getEnterpriseId(), createOrderDto.getStallId(), skuIds);
572 final var skuSellQuantityMap = skuSellQuantities.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity())); 577 final var skuSellQuantityMap = skuSellQuantities.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity()));
573 final var skuMap = skuServiceRpcClient.getSkusByIds(skuIds).stream().collect(Collectors.toMap(SingleSkuResponse::getId, Function.identity())); 578 final var skuMap = skuServiceRpcClient.getSkusByIds(skuIds).stream().collect(Collectors.toMap(SingleSkuResponse::getId, Function.identity()));
574 - final var soldOutSkus = new ArrayList<String>();
575 final var skuStockMap = new HashMap<String, Integer>(); 579 final var skuStockMap = new HashMap<String, Integer>();
576 for (var orderDetail : createOrderDto.getOrderDetailDtos()) { 580 for (var orderDetail : createOrderDto.getOrderDetailDtos()) {
577 final var skuSellQuantityRpcResponse = skuSellQuantityMap.get(orderDetail.getSkuId()); 581 final var skuSellQuantityRpcResponse = skuSellQuantityMap.get(orderDetail.getSkuId());
578 if (skuSellQuantityRpcResponse == null) { 582 if (skuSellQuantityRpcResponse == null) {
579 - log.error("skuSellQuantityRpcResponse is null; stallId:{}, skuId:{}", createOrderDto.getStallId(), orderDetail.getSkuId());
580 - soldOutSkus.add(skuMap.get(orderDetail.getSkuId()).getName());
581 continue; 583 continue;
582 } 584 }
583 if ((skuSellQuantityRpcResponse.getTodaySellQuantity() + orderDetail.getCount()) > skuSellQuantityRpcResponse.getMaxSellQuantity()) { 585 if ((skuSellQuantityRpcResponse.getTodaySellQuantity() + orderDetail.getCount()) > skuSellQuantityRpcResponse.getMaxSellQuantity()) {
...@@ -585,9 +587,6 @@ public class OrderServiceRpcClient { ...@@ -585,9 +587,6 @@ public class OrderServiceRpcClient {
585 skuStockMap.put(skuMap.get(orderDetail.getSkuId()).getName(), skuSellQuantityRpcResponse.getMaxSellQuantity() - skuSellQuantityRpcResponse.getTodaySellQuantity()); 587 skuStockMap.put(skuMap.get(orderDetail.getSkuId()).getName(), skuSellQuantityRpcResponse.getMaxSellQuantity() - skuSellQuantityRpcResponse.getTodaySellQuantity());
586 } 588 }
587 } 589 }
588 - if (!soldOutSkus.isEmpty()) {
589 - throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.SKUS_SOLD_OUT_TODAY, String.join(",", soldOutSkus));
590 - }
591 if (!skuStockMap.isEmpty()) { 590 if (!skuStockMap.isEmpty()) {
592 final var noEnoughSkus = String.join(", ", skuStockMap.keySet()); 591 final var noEnoughSkus = String.join(", ", skuStockMap.keySet());
593 throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.SKUS_STOCK_NO_ENOUGH_TODAY, noEnoughSkus); 592 throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.SKUS_STOCK_NO_ENOUGH_TODAY, noEnoughSkus);
...@@ -609,7 +608,7 @@ public class OrderServiceRpcClient { ...@@ -609,7 +608,7 @@ public class OrderServiceRpcClient {
609 .type(MessageTypeEnum.ORDER) 608 .type(MessageTypeEnum.ORDER)
610 .noticeType(NoticeTypeEnum.ORDER_CREATED) 609 .noticeType(NoticeTypeEnum.ORDER_CREATED)
611 .subject(NoticeTypeEnum.ORDER_CREATED.getDescription()) 610 .subject(NoticeTypeEnum.ORDER_CREATED.getDescription())
612 - .message("下单成功啦,快去查看吧~") 611 + .message("有新的订单下单成功啦,快去查看吧~")
613 .data(orderCreateSuccessData) 612 .data(orderCreateSuccessData)
614 .build(); 613 .build();
615 try { 614 try {
......
1 package com.infoloop.tianting.service.impl; 1 package com.infoloop.tianting.service.impl;
2 2
3 import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum; 3 import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
4 +import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
4 import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum; 5 import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
5 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse; 6 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
6 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse; 7 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
...@@ -51,7 +52,6 @@ public class KdsServiceImpl implements KdsService { ...@@ -51,7 +52,6 @@ public class KdsServiceImpl implements KdsService {
51 52
52 @Override 53 @Override
53 public List<KdsOrderSkuDto> getOrderDetailBySku(KdsOrderSkuQueryDto queryDto) { 54 public List<KdsOrderSkuDto> getOrderDetailBySku(KdsOrderSkuQueryDto queryDto) {
54 -
55 // 获取当日所有的订单 和 订单明细 55 // 获取当日所有的订单 和 订单明细
56 LocalDate today = LocalDate.now(); 56 LocalDate today = LocalDate.now();
57 LocalDateTime todayZero = today.atStartOfDay(); 57 LocalDateTime todayZero = today.atStartOfDay();
...@@ -64,8 +64,7 @@ public class KdsServiceImpl implements KdsService { ...@@ -64,8 +64,7 @@ public class KdsServiceImpl implements KdsService {
64 final var operator = wOperatorServiceRpcClient.getWOperatorById(operatorLoginInfo.getId()).getResponse(); 64 final var operator = wOperatorServiceRpcClient.getWOperatorById(operatorLoginInfo.getId()).getResponse();
65 if (!operator.getIsSuper()) { 65 if (!operator.getIsSuper()) {
66 shouldFilterStallIds = true; 66 shouldFilterStallIds = true;
67 - final var userResource = enterpriseResourceServiceRpcClient.getUserResources( 67 + final var userResource = enterpriseResourceServiceRpcClient.getUserResources(operatorLoginInfo.getEnterpriseId(), operatorLoginInfo.getId());
68 - operatorLoginInfo.getEnterpriseId(), operatorLoginInfo.getId());
69 stallIds.addAll(userResource.getStallIdsList()); 68 stallIds.addAll(userResource.getStallIdsList());
70 } 69 }
71 70
...@@ -77,6 +76,8 @@ public class KdsServiceImpl implements KdsService { ...@@ -77,6 +76,8 @@ public class KdsServiceImpl implements KdsService {
77 .mealTimeStart(todayZero) 76 .mealTimeStart(todayZero)
78 .shouldFilterMealTimeEnd(true) 77 .shouldFilterMealTimeEnd(true)
79 .mealTimeEnd(tomorrowZero) 78 .mealTimeEnd(tomorrowZero)
79 + .shouldFilterPayStatus(true)
80 + .payStatus(PayStatusEnum.SUCCEED)
80 .build(); 81 .build();
81 final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); 82 final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
82 List<Integer> orderIds = orderList.stream() 83 List<Integer> orderIds = orderList.stream()
...@@ -309,6 +310,8 @@ public class KdsServiceImpl implements KdsService { ...@@ -309,6 +310,8 @@ public class KdsServiceImpl implements KdsService {
309 .mealTimeEnd(tomorrowZero) 310 .mealTimeEnd(tomorrowZero)
310 .shouldFilterStatus(true) 311 .shouldFilterStatus(true)
311 .status(queryDto.getOrderStatus()) 312 .status(queryDto.getOrderStatus())
313 + .shouldFilterPayStatus(true)
314 + .payStatus(PayStatusEnum.SUCCEED)
312 .build(); 315 .build();
313 316
314 final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); 317 final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
......