Showing
14 changed files
with
256 additions
and
56 deletions
| ... | @@ -67,14 +67,14 @@ public class ClientCustomerController { | ... | @@ -67,14 +67,14 @@ public class ClientCustomerController { |
| 67 | @GetMapping("/clientCustomers/today/statistic") | 67 | @GetMapping("/clientCustomers/today/statistic") |
| 68 | @ResponseStatus(HttpStatus.OK) | 68 | @ResponseStatus(HttpStatus.OK) |
| 69 | public TodayOrderDto getClientCustomerTodayOrderStatistic(@RequestParam String customerToken) { | 69 | public TodayOrderDto getClientCustomerTodayOrderStatistic(@RequestParam String customerToken) { |
| 70 | - return clientCustomerService.getTodayOrderStatistic(customerToken, false); | 70 | + return clientCustomerService.getTodayOrderStatistic(customerToken); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | @ApiOperation(value = "获取his今日在住") | 73 | @ApiOperation(value = "获取his今日在住") |
| 74 | @GetMapping("/hisClientCustomers/today/statistic") | 74 | @GetMapping("/hisClientCustomers/today/statistic") |
| 75 | @ResponseStatus(HttpStatus.OK) | 75 | @ResponseStatus(HttpStatus.OK) |
| 76 | public TodayOrderDto getHisClientCustomerTodayOrderStatistic(@RequestParam String customerToken) { | 76 | public TodayOrderDto getHisClientCustomerTodayOrderStatistic(@RequestParam String customerToken) { |
| 77 | - return clientCustomerService.getTodayOrderStatistic(customerToken, true); | 77 | + return clientCustomerService.getTodayOrderStatisticForHis(customerToken); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | } | 80 | } | ... | ... |
| ... | @@ -15,6 +15,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse; | ... | @@ -15,6 +15,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse; |
| 15 | import com.infoloop.tianting.service.OrderService; | 15 | import com.infoloop.tianting.service.OrderService; |
| 16 | import io.swagger.annotations.Api; | 16 | import io.swagger.annotations.Api; |
| 17 | import io.swagger.annotations.ApiOperation; | 17 | import io.swagger.annotations.ApiOperation; |
| 18 | +import io.swagger.models.auth.In; | ||
| 18 | import java.util.List; | 19 | import java.util.List; |
| 19 | import javax.validation.Valid; | 20 | import javax.validation.Valid; |
| 20 | import lombok.RequiredArgsConstructor; | 21 | import lombok.RequiredArgsConstructor; |
| ... | @@ -98,12 +99,12 @@ public class OrderController { | ... | @@ -98,12 +99,12 @@ public class OrderController { |
| 98 | return orderService.batchUpdateOrderDetails(updateDto); | 99 | return orderService.batchUpdateOrderDetails(updateDto); |
| 99 | } | 100 | } |
| 100 | 101 | ||
| 101 | - @ApiOperation(value = "检查是否预定过该餐单") | 102 | + @ApiOperation(value = "获取已预定该餐单的次数") |
| 102 | @PostMapping("/order/check") | 103 | @PostMapping("/order/check") |
| 103 | @ResponseStatus(HttpStatus.OK) | 104 | @ResponseStatus(HttpStatus.OK) |
| 104 | - public Boolean checkOrder( | 105 | + public Integer checkOrder( |
| 105 | - @Valid @RequestBody OrderDbDTO.CheckIfOrderedDto checkIfOrderedDto) { | 106 | + @Valid @RequestBody OrderDbDTO.getMenuOrderCountDto checkIfOrderedDto) { |
| 106 | - return orderService.checkIfOrdered(checkIfOrderedDto); | 107 | + return orderService.getMenuOrderCount(checkIfOrderedDto); |
| 107 | } | 108 | } |
| 108 | 109 | ||
| 109 | } | 110 | } | ... | ... |
| ... | @@ -26,6 +26,7 @@ public enum ErrorCodeEnum implements BaseEnum { | ... | @@ -26,6 +26,7 @@ public enum ErrorCodeEnum implements BaseEnum { |
| 26 | 26 | ||
| 27 | GENERATE_EXCEL_ERROR(406000004, "生成excel失败"), | 27 | GENERATE_EXCEL_ERROR(406000004, "生成excel失败"), |
| 28 | 28 | ||
| 29 | + ORDER_COUNT_LIMIT(406000005, "已超过该餐单预定次数"), | ||
| 29 | ; | 30 | ; |
| 30 | private final int code; | 31 | private final int code; |
| 31 | 32 | ... | ... |
| ... | @@ -575,7 +575,7 @@ public class OrderDbDTO { | ... | @@ -575,7 +575,7 @@ public class OrderDbDTO { |
| 575 | @Builder | 575 | @Builder |
| 576 | @ToString | 576 | @ToString |
| 577 | @ApiModel(description = "检查是否已预定过某一餐单") | 577 | @ApiModel(description = "检查是否已预定过某一餐单") |
| 578 | - public static class CheckIfOrderedDto { | 578 | + public static class getMenuOrderCountDto { |
| 579 | private Integer customerId; | 579 | private Integer customerId; |
| 580 | private Integer menuId; | 580 | private Integer menuId; |
| 581 | private LocalDateTime mealTime; | 581 | private LocalDateTime mealTime; | ... | ... |
| ... | @@ -2,6 +2,8 @@ package com.infoloop.tianting.model.dto; | ... | @@ -2,6 +2,8 @@ package com.infoloop.tianting.model.dto; |
| 2 | 2 | ||
| 3 | import com.infoloop.tianting.enums.SettlementDimensionEnum; | 3 | import com.infoloop.tianting.enums.SettlementDimensionEnum; |
| 4 | import io.swagger.annotations.ApiModel; | 4 | import io.swagger.annotations.ApiModel; |
| 5 | +import java.util.ArrayList; | ||
| 6 | +import java.util.Map; | ||
| 5 | import lombok.Builder; | 7 | import lombok.Builder; |
| 6 | import lombok.Data; | 8 | import lombok.Data; |
| 7 | 9 | ||
| ... | @@ -17,9 +19,14 @@ public class SettlementDTO { | ... | @@ -17,9 +19,14 @@ public class SettlementDTO { |
| 17 | @ApiModel(description = "SettlementRequestDto") | 19 | @ApiModel(description = "SettlementRequestDto") |
| 18 | public static class SettlementRequestDto { | 20 | public static class SettlementRequestDto { |
| 19 | 21 | ||
| 20 | - private int enterpriseId; | 22 | + @Builder.Default |
| 23 | + private int enterpriseId = 0; | ||
| 21 | 24 | ||
| 22 | - private List<Integer> stallIds; | 25 | + @Builder.Default |
| 26 | + private List<Integer> stallIds = new ArrayList<>(); | ||
| 27 | + | ||
| 28 | + @Builder.Default | ||
| 29 | + private int clientId = 0; | ||
| 23 | 30 | ||
| 24 | private SettlementDimensionEnum dimension; | 31 | private SettlementDimensionEnum dimension; |
| 25 | 32 | ||
| ... | @@ -32,13 +39,23 @@ public class SettlementDTO { | ... | @@ -32,13 +39,23 @@ public class SettlementDTO { |
| 32 | @Builder | 39 | @Builder |
| 33 | @ApiModel(description = "SettlementRequestDto") | 40 | @ApiModel(description = "SettlementRequestDto") |
| 34 | public static class SettlementMenuSkuDto { | 41 | public static class SettlementMenuSkuDto { |
| 35 | - | ||
| 36 | private String skuCode; | 42 | private String skuCode; |
| 37 | private String showName; | 43 | private String showName; |
| 38 | private Integer count; | 44 | private Integer count; |
| 39 | private Integer price; | 45 | private Integer price; |
| 40 | private Integer totalPrice; | 46 | private Integer totalPrice; |
| 41 | } | 47 | } |
| 48 | + | ||
| 49 | + @Data | ||
| 50 | + @Builder | ||
| 51 | + @ApiModel(description = "SettlementRequestDto") | ||
| 52 | + public static class SettlementDataDto { | ||
| 53 | + private String client; | ||
| 54 | + private String startTime; | ||
| 55 | + private String endTime; | ||
| 56 | + private Map<String, Map<String, List<SettlementMenuSkuDto>>> classifyOrders; | ||
| 57 | + } | ||
| 58 | + | ||
| 42 | } | 59 | } |
| 43 | 60 | ||
| 44 | 61 | ... | ... |
| ... | @@ -28,6 +28,8 @@ public interface ClientCustomerService { | ... | @@ -28,6 +28,8 @@ public interface ClientCustomerService { |
| 28 | BatchDeleteCustomerLabelRefResponseDto deleteClientCustomerLabelRefsByIds( | 28 | BatchDeleteCustomerLabelRefResponseDto deleteClientCustomerLabelRefsByIds( |
| 29 | BatchDeleteCustomerLabelRefRequestDto deleteRequestDto); | 29 | BatchDeleteCustomerLabelRefRequestDto deleteRequestDto); |
| 30 | 30 | ||
| 31 | - TodayOrderDto getTodayOrderStatistic(String token, boolean isHis); | 31 | + TodayOrderDto getTodayOrderStatistic(String token); |
| 32 | + | ||
| 33 | + TodayOrderDto getTodayOrderStatisticForHis(String token); | ||
| 32 | 34 | ||
| 33 | } | 35 | } | ... | ... |
| ... | @@ -3,7 +3,7 @@ package com.infoloop.tianting.service; | ... | @@ -3,7 +3,7 @@ package com.infoloop.tianting.service; |
| 3 | import com.infoloop.tianting.model.common.OrderPageResult; | 3 | import com.infoloop.tianting.model.common.OrderPageResult; |
| 4 | import com.infoloop.tianting.model.common.PageResult; | 4 | import com.infoloop.tianting.model.common.PageResult; |
| 5 | import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse; | 5 | import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse; |
| 6 | -import com.infoloop.tianting.model.dto.OrderDbDTO.CheckIfOrderedDto; | 6 | +import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto; |
| 7 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto; | 7 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto; |
| 8 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse; | 8 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse; |
| 9 | import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto; | 9 | import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto; |
| ... | @@ -26,5 +26,5 @@ public interface OrderService { | ... | @@ -26,5 +26,5 @@ public interface OrderService { |
| 26 | CreateOrderResponse orderCreation(OperatorCreateOrderDto createOrderDto); | 26 | CreateOrderResponse orderCreation(OperatorCreateOrderDto createOrderDto); |
| 27 | UpdateOrderResponse updateOrder(UpdateOrderDto updateOrderDto); | 27 | UpdateOrderResponse updateOrder(UpdateOrderDto updateOrderDto); |
| 28 | BatchUpdateOrderDetailResponse batchUpdateOrderDetails(OrderDetailBatchUpdateDto batchUpdateDto); | 28 | BatchUpdateOrderDetailResponse batchUpdateOrderDetails(OrderDetailBatchUpdateDto batchUpdateDto); |
| 29 | - Boolean checkIfOrdered(CheckIfOrderedDto checkIfOrdered); | 29 | + Integer getMenuOrderCount(getMenuOrderCountDto checkIfOrdered); |
| 30 | } | 30 | } | ... | ... |
| ... | @@ -77,7 +77,7 @@ public class OrderServiceRpcClient { | ... | @@ -77,7 +77,7 @@ public class OrderServiceRpcClient { |
| 77 | .setMealTimeEnd(queryOrderDto.getMealTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli()) | 77 | .setMealTimeEnd(queryOrderDto.getMealTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli()) |
| 78 | .setShouldFilterCreatedAtStart(queryOrderDto.getShouldFilterCreatedAtTimeStart()) | 78 | .setShouldFilterCreatedAtStart(queryOrderDto.getShouldFilterCreatedAtTimeStart()) |
| 79 | .setCreatedAtStart(queryOrderDto.getCreatedAtTimeStart().toInstant(ZoneOffset.UTC).toEpochMilli()) | 79 | .setCreatedAtStart(queryOrderDto.getCreatedAtTimeStart().toInstant(ZoneOffset.UTC).toEpochMilli()) |
| 80 | - .setShouldFilterCreatedAtStart(queryOrderDto.getShouldFilterCreatedAtTimeEnd()) | 80 | + .setShouldFilterCreatedAtEnd(queryOrderDto.getShouldFilterCreatedAtTimeEnd()) |
| 81 | .setCreatedAtEnd(queryOrderDto.getCreatedAtTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli()) | 81 | .setCreatedAtEnd(queryOrderDto.getCreatedAtTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli()) |
| 82 | .setShouldFilterClientIds(queryOrderDto.getShouldFilterClientIds()) | 82 | .setShouldFilterClientIds(queryOrderDto.getShouldFilterClientIds()) |
| 83 | .addAllClientIds(queryOrderDto.getClientIds()) | 83 | .addAllClientIds(queryOrderDto.getClientIds()) | ... | ... |
| ... | @@ -282,31 +282,16 @@ public class ClientCustomerServiceImpl implements ClientCustomerService { | ... | @@ -282,31 +282,16 @@ public class ClientCustomerServiceImpl implements ClientCustomerService { |
| 282 | // } | 282 | // } |
| 283 | 283 | ||
| 284 | @Override | 284 | @Override |
| 285 | - public TodayOrderDto getTodayOrderStatistic(String token, boolean isHis) { | 285 | + public TodayOrderDto getTodayOrderStatistic(String token) { |
| 286 | List<CurrentClientCustomerDto> currentCustomers = new ArrayList<>(); | 286 | List<CurrentClientCustomerDto> currentCustomers = new ArrayList<>(); |
| 287 | List<Integer> customerIds = new ArrayList<>(); | 287 | List<Integer> customerIds = new ArrayList<>(); |
| 288 | - | 288 | + currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, false); |
| 289 | - // 没有找到clientCustomer的hisCustomerIds | ||
| 290 | - List<CurrentClientCustomerDto> notOrderedHisCustomers = new ArrayList<>(); | ||
| 291 | - if (isHis){ | ||
| 292 | - currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, true); | ||
| 293 | - final var hisCustomerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).distinct() | ||
| 294 | - .collect(Collectors.toList()); | ||
| 295 | - final var currentClientCustomers = clientCustomerServiceRpcClient.getClientCustomersByHISCustomerIds(hisCustomerIds).getResponsesList(); | ||
| 296 | - customerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getId).distinct().collect(Collectors.toList()); | ||
| 297 | - final var mappingHisCustomerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getHISCustomerId).collect(Collectors.toList()); | ||
| 298 | -// final var notOrderedHisCustomerIds = hisCustomerIds.stream().filter(i -> !mappingHisCustomerIds.contains(i)).collect(Collectors.toList()); | ||
| 299 | - notOrderedHisCustomers = currentCustomers.stream().filter(c -> !mappingHisCustomerIds.contains(c.getId())).collect( | ||
| 300 | - Collectors.toList()); | ||
| 301 | - } else { | ||
| 302 | - currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, false); | ||
| 303 | customerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).map(id -> {try{ | 289 | customerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).map(id -> {try{ |
| 304 | return Integer.valueOf(id); | 290 | return Integer.valueOf(id); |
| 305 | } catch (NumberFormatException e) { | 291 | } catch (NumberFormatException e) { |
| 306 | return null; | 292 | return null; |
| 307 | } | 293 | } |
| 308 | }).filter(Objects::nonNull).distinct().collect(Collectors.toList()); | 294 | }).filter(Objects::nonNull).distinct().collect(Collectors.toList()); |
| 309 | - } | ||
| 310 | 295 | ||
| 311 | if (customerIds.isEmpty()) { | 296 | if (customerIds.isEmpty()) { |
| 312 | return TodayOrderDto.builder() | 297 | return TodayOrderDto.builder() |
| ... | @@ -400,8 +385,129 @@ public class ClientCustomerServiceImpl implements ClientCustomerService { | ... | @@ -400,8 +385,129 @@ public class ClientCustomerServiceImpl implements ClientCustomerService { |
| 400 | .build(); | 385 | .build(); |
| 401 | resNotOrderCustomers.add(resNotOrderCustomer); | 386 | resNotOrderCustomers.add(resNotOrderCustomer); |
| 402 | } | 387 | } |
| 403 | - if (isHis) { | 388 | + |
| 404 | - for (CurrentClientCustomerDto currentClientCustomer: notOrderedHisCustomers) { | 389 | + return TodayOrderDto.builder() |
| 390 | + .totalCurrentCustomerCount(currentCustomers.size()) | ||
| 391 | + .notOrderCustomers(resNotOrderCustomers) | ||
| 392 | + .build(); | ||
| 393 | + } | ||
| 394 | + | ||
| 395 | + @Override | ||
| 396 | + public TodayOrderDto getTodayOrderStatisticForHis(String token) { | ||
| 397 | + List<CurrentClientCustomerDto> currentCustomers = new ArrayList<>(); | ||
| 398 | + List<Integer> customerIds = new ArrayList<>(); | ||
| 399 | + | ||
| 400 | + // 没有找到clientCustomer的hisCustomerIds | ||
| 401 | + List<CurrentClientCustomerDto> notOrderedHisCustomers = new ArrayList<>(); | ||
| 402 | + currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, true); | ||
| 403 | + final var hisCustomerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).distinct() | ||
| 404 | + .collect(Collectors.toList()); | ||
| 405 | + final var currentClientCustomers = clientCustomerServiceRpcClient.getClientCustomersByHISCustomerIds(hisCustomerIds).getResponsesList(); | ||
| 406 | + customerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getId).distinct().collect(Collectors.toList()); | ||
| 407 | + final var mappingHisCustomerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getHISCustomerId).collect(Collectors.toList()); | ||
| 408 | +// final var notOrderedHisCustomerIds = hisCustomerIds.stream().filter(i -> !mappingHisCustomerIds.contains(i)).collect(Collectors.toList()); | ||
| 409 | + notOrderedHisCustomers = currentCustomers.stream().filter(c -> !mappingHisCustomerIds.contains(c.getId())).collect( | ||
| 410 | + Collectors.toList()); | ||
| 411 | + | ||
| 412 | + if (customerIds.isEmpty()) { | ||
| 413 | + return TodayOrderDto.builder() | ||
| 414 | + .totalCurrentCustomerCount(0) | ||
| 415 | + .notOrderCustomers(new ArrayList<>()) | ||
| 416 | + .build(); | ||
| 417 | + } | ||
| 418 | + | ||
| 419 | + final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); | ||
| 420 | + LocalDate today = LocalDate.now(); | ||
| 421 | + LocalDateTime todayZero = today.atStartOfDay(); | ||
| 422 | + LocalDate tomorrow = today.plusDays(1); | ||
| 423 | + LocalDateTime tomorrowZero = tomorrow.atStartOfDay(); | ||
| 424 | + final var queryOrderDto = QueryOrderByConditionDto.builder() | ||
| 425 | + .enterpriseId(operatorLoginInfo.getEnterpriseId()) | ||
| 426 | + .shouldFilterCustomerIds(true) | ||
| 427 | + .customerIds(customerIds) | ||
| 428 | + .shouldFilterMealTimeStart(true) | ||
| 429 | + .mealTimeStart(todayZero) | ||
| 430 | + .shouldFilterMealTimeEnd(true) | ||
| 431 | + .mealTimeEnd(tomorrowZero) | ||
| 432 | + .build(); | ||
| 433 | + final var orderedResponseList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); | ||
| 434 | + List<Integer> uniqueOrderedCustomerIds = orderedResponseList.stream().map( | ||
| 435 | + SingleClientCustomerOrderRpcResponse::getCustomerId).distinct() | ||
| 436 | + .collect(Collectors.toList()); | ||
| 437 | + List<Integer> notOrderedCustomerIds = customerIds.stream().filter(id -> !uniqueOrderedCustomerIds.contains(id)).collect( | ||
| 438 | + Collectors.toList()); | ||
| 439 | + // 根据customerIds 获取到menuRef列表 | ||
| 440 | + final var menuRefs = menuServiceRpcClient.getClientCustomerMenuRefsByCustomerIds( | ||
| 441 | + operatorLoginInfo.getEnterpriseId(), notOrderedCustomerIds).getResponsesList(); | ||
| 442 | + final var menuIds = menuRefs.stream().map(SingleClientCustomerMenuRefRpcResponse::getMenuId) | ||
| 443 | + .collect(Collectors.toList()); | ||
| 444 | + final var menus = menuServiceRpcClient.getMenusByIds(operatorLoginInfo.getEnterpriseId(), | ||
| 445 | + menuIds).getResponsesList(); | ||
| 446 | + | ||
| 447 | + List<NotOrderCustomerDto> resNotOrderCustomers = new ArrayList<>(); | ||
| 448 | + // 在customers里找到未下单的用户 | ||
| 449 | + final var notOrderCustomers = currentClientCustomers.stream().filter(c -> | ||
| 450 | + notOrderedCustomerIds.contains(c.getId())).collect(Collectors.toList()); | ||
| 451 | + | ||
| 452 | + for(SingleClientCustomerRpcResponse notOrderCustomer: notOrderCustomers) { | ||
| 453 | + | ||
| 454 | + // 在ref里找到这个用户的menu ids | ||
| 455 | + final var notOrderCustomerId = Integer.valueOf(notOrderCustomer.getId()); | ||
| 456 | + final var curMenuIds = menuRefs.stream().filter(r -> r.getCustomerId() == notOrderCustomerId) | ||
| 457 | + .map(SingleClientCustomerMenuRefRpcResponse::getMenuId).collect(Collectors.toList()); | ||
| 458 | + // 根据menu ids找到 menus | ||
| 459 | + final var curMenus = menus.stream().filter(m -> curMenuIds.contains(m.getId())) | ||
| 460 | + .collect(Collectors.toList()); | ||
| 461 | + | ||
| 462 | + final var curMenuDtos = curMenus.stream().map(menu -> | ||
| 463 | + MenuDto.builder() | ||
| 464 | + .id(menu.getId()) | ||
| 465 | + .code(menu.getCode()) | ||
| 466 | + .enterpriseId(menu.getEnterpriseId()) | ||
| 467 | + .name(menu.getName()) | ||
| 468 | + .status(menu.getStatusValue()) | ||
| 469 | + .customerScope(menu.getCustomerScope()) | ||
| 470 | + .nutritionPromotion(menu.getNutritionPromotion()) | ||
| 471 | + .nutritionalStatistics(menu.getNutritionalStatistics()) | ||
| 472 | + .dishRuleJson(DishRuleJson.builder() | ||
| 473 | + .days(menu.getDishRuleJson().getDays()) | ||
| 474 | + .dishType(menu.getDishRuleJson().getDishType()) | ||
| 475 | + .mealIds(menu.getDishRuleJson().getMealIdsList()) | ||
| 476 | + .build()) | ||
| 477 | + .orderRuleJson(OrderRuleJson.builder() | ||
| 478 | + .allowMicroPlaceOrder(menu.getOrderRuleJson().getAllowMicroPlaceOrder()) | ||
| 479 | + .closeTimeType(menu.getOrderRuleJson().getCloseTimeType()) | ||
| 480 | + .dishSelectRule(menu.getOrderRuleJson().getDishSelectRule()) | ||
| 481 | + .earlyDays(menu.getOrderRuleJson().getEarlyDays()) | ||
| 482 | + .modeOfPayment(menu.getOrderRuleJson().getModeOfPayment()) | ||
| 483 | + .placeOrderCount(menu.getOrderRuleJson().getPlaceOrderCount()) | ||
| 484 | + .startTime(menu.getOrderRuleJson().getStartTime()) | ||
| 485 | + .endTime(menu.getOrderRuleJson().getEndTime()) | ||
| 486 | + .deadline(menu.getOrderRuleJson().getDeadline()) | ||
| 487 | + .build()) | ||
| 488 | + .createdBy(menu.getCreatedBy()) | ||
| 489 | + .creationSource(menu.getCreationSource()) | ||
| 490 | + .createdAt(DateUtil.formatDate(menu.getCreatedAt())) | ||
| 491 | + .updatedBy(menu.getUpdatedBy()) | ||
| 492 | + .updateSource(menu.getUpdateSource()) | ||
| 493 | + .updatedAt(DateUtil.formatDate(menu.getUpdatedAt())) | ||
| 494 | + .publishAt(DateUtil.formatDate(menu.getPublishAt())) | ||
| 495 | + .build()).collect(Collectors.toList()); | ||
| 496 | + final var hisCustomer = currentCustomers.stream().filter(c -> c.getId().equals(notOrderCustomer.getHISCustomerId())).findFirst(); | ||
| 497 | + String roomNo = ""; | ||
| 498 | + if (hisCustomer.isPresent()) { | ||
| 499 | + roomNo = hisCustomer.get().getRoomNo(); | ||
| 500 | + } | ||
| 501 | + final var resNotOrderCustomer = NotOrderCustomerDto.builder() | ||
| 502 | + .id(notOrderCustomerId.toString()) | ||
| 503 | + .name(notOrderCustomer.getName()) | ||
| 504 | + .roomNo(roomNo) | ||
| 505 | + .menuList(curMenuDtos) | ||
| 506 | + .build(); | ||
| 507 | + resNotOrderCustomers.add(resNotOrderCustomer); | ||
| 508 | + } | ||
| 509 | + | ||
| 510 | + for(CurrentClientCustomerDto currentClientCustomer: notOrderedHisCustomers) { | ||
| 405 | final var resNotOrderCustomer = NotOrderCustomerDto.builder() | 511 | final var resNotOrderCustomer = NotOrderCustomerDto.builder() |
| 406 | .id(currentClientCustomer.getId()) | 512 | .id(currentClientCustomer.getId()) |
| 407 | .name(currentClientCustomer.getName()) | 513 | .name(currentClientCustomer.getName()) |
| ... | @@ -411,8 +517,6 @@ public class ClientCustomerServiceImpl implements ClientCustomerService { | ... | @@ -411,8 +517,6 @@ public class ClientCustomerServiceImpl implements ClientCustomerService { |
| 411 | resNotOrderCustomers.add(resNotOrderCustomer); | 517 | resNotOrderCustomers.add(resNotOrderCustomer); |
| 412 | } | 518 | } |
| 413 | 519 | ||
| 414 | - } | ||
| 415 | - | ||
| 416 | return TodayOrderDto.builder() | 520 | return TodayOrderDto.builder() |
| 417 | .totalCurrentCustomerCount(currentCustomers.size()) | 521 | .totalCurrentCustomerCount(currentCustomers.size()) |
| 418 | .notOrderCustomers(resNotOrderCustomers) | 522 | .notOrderCustomers(resNotOrderCustomers) | ... | ... |
| 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.ServeStatusEnum; | ||
| 4 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse; | 5 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse; |
| 5 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse; | 6 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse; |
| 6 | import com.infoloop.tianting.context.LoginContextHolder; | 7 | import com.infoloop.tianting.context.LoginContextHolder; |
| ... | @@ -268,9 +269,9 @@ public class KdsServiceImpl implements KdsService { | ... | @@ -268,9 +269,9 @@ public class KdsServiceImpl implements KdsService { |
| 268 | if (meal.isPresent()) { | 269 | if (meal.isPresent()) { |
| 269 | mealName = meal.get().getName(); | 270 | mealName = meal.get().getName(); |
| 270 | } | 271 | } |
| 271 | - | 272 | + final var serveStatusToFilter = List.of(ServeStatusEnum.SERVE_FINISHED, ServeStatusEnum.SERVE_NOT_START); |
| 272 | final var totalCount = orderDetailList.stream() | 273 | final var totalCount = orderDetailList.stream() |
| 273 | - .filter(od -> od.getMealId() == mealId) | 274 | + .filter(od -> od.getMealId() == mealId && serveStatusToFilter.contains(od.getServeStatus())) |
| 274 | .mapToInt(SingleClientCustomerOrderDetailRpcResponse::getCount) | 275 | .mapToInt(SingleClientCustomerOrderDetailRpcResponse::getCount) |
| 275 | .sum(); | 276 | .sum(); |
| 276 | final var mealDetail = KdsMealDetailDto.builder() | 277 | final var mealDetail = KdsMealDetailDto.builder() | ... | ... |
| 1 | package com.infoloop.tianting.service.impl; | 1 | package com.infoloop.tianting.service.impl; |
| 2 | 2 | ||
| 3 | +import com.infoloop.rpc.meizhongyiheservice.MedicalAdviceTypeEnum; | ||
| 3 | import com.infoloop.tianting.SingleResponse; | 4 | import com.infoloop.tianting.SingleResponse; |
| 4 | import com.infoloop.tianting.SingleSpecialResponse; | 5 | import com.infoloop.tianting.SingleSpecialResponse; |
| 5 | import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType; | 6 | import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType; |
| ... | @@ -12,13 +13,18 @@ import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcRespon | ... | @@ -12,13 +13,18 @@ import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcRespon |
| 12 | import com.infoloop.tianting.context.LoginContextHolder; | 13 | import com.infoloop.tianting.context.LoginContextHolder; |
| 13 | import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum; | 14 | import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum; |
| 14 | import com.infoloop.tianting.deliveryruleservice.SingleClientLabelRpcResponse; | 15 | import com.infoloop.tianting.deliveryruleservice.SingleClientLabelRpcResponse; |
| 16 | +import com.infoloop.tianting.exception.ClientEndExceptions; | ||
| 17 | +import com.infoloop.tianting.exception.ErrorCodeEnum; | ||
| 15 | import com.infoloop.tianting.menuservice.CloseTimeTypeEnum; | 18 | import com.infoloop.tianting.menuservice.CloseTimeTypeEnum; |
| 16 | import com.infoloop.tianting.menuservice.ModeOfPaymentEnum; | 19 | import com.infoloop.tianting.menuservice.ModeOfPaymentEnum; |
| 17 | import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse; | 20 | import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse; |
| 18 | import com.infoloop.tianting.model.common.OrderPageResult; | 21 | import com.infoloop.tianting.model.common.OrderPageResult; |
| 19 | import com.infoloop.tianting.model.common.PageResult; | 22 | import com.infoloop.tianting.model.common.PageResult; |
| 23 | +import com.infoloop.tianting.model.dto.ClientLabelDTO.HisAllergy; | ||
| 24 | +import com.infoloop.tianting.model.dto.ClientLabelDTO.HisMedicalAdviceDto; | ||
| 25 | +import com.infoloop.tianting.model.dto.ClientLabelDTO.QueryLabelsDto; | ||
| 20 | import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse; | 26 | import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse; |
| 21 | -import com.infoloop.tianting.model.dto.OrderDbDTO.CheckIfOrderedDto; | 27 | +import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto; |
| 22 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto; | 28 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto; |
| 23 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto; | 29 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto; |
| 24 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse; | 30 | import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse; |
| ... | @@ -37,9 +43,11 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto; | ... | @@ -37,9 +43,11 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto; |
| 37 | import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto; | 43 | import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto; |
| 38 | import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse; | 44 | import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse; |
| 39 | import com.infoloop.tianting.service.ClientCustomerService; | 45 | import com.infoloop.tianting.service.ClientCustomerService; |
| 46 | +import com.infoloop.tianting.service.MeiZhongYiHeService; | ||
| 40 | import com.infoloop.tianting.service.OrderService; | 47 | import com.infoloop.tianting.service.OrderService; |
| 41 | import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient; | 48 | import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient; |
| 42 | import com.infoloop.tianting.service.client.DeliveryRuleServiceRpcClient; | 49 | import com.infoloop.tianting.service.client.DeliveryRuleServiceRpcClient; |
| 50 | +import com.infoloop.tianting.service.client.MeiZhongYiHeServiceClient; | ||
| 43 | import com.infoloop.tianting.service.client.MenuServiceRpcClient; | 51 | import com.infoloop.tianting.service.client.MenuServiceRpcClient; |
| 44 | import com.infoloop.tianting.service.client.OperatorServiceRpcClient; | 52 | import com.infoloop.tianting.service.client.OperatorServiceRpcClient; |
| 45 | import com.infoloop.tianting.service.client.OrderServiceRpcClient; | 53 | import com.infoloop.tianting.service.client.OrderServiceRpcClient; |
| ... | @@ -52,6 +60,7 @@ import java.util.ArrayList; | ... | @@ -52,6 +60,7 @@ import java.util.ArrayList; |
| 52 | import java.util.List; | 60 | import java.util.List; |
| 53 | import java.util.Optional; | 61 | import java.util.Optional; |
| 54 | import java.util.stream.Collectors; | 62 | import java.util.stream.Collectors; |
| 63 | +import java.util.stream.Stream; | ||
| 55 | import lombok.RequiredArgsConstructor; | 64 | import lombok.RequiredArgsConstructor; |
| 56 | import lombok.extern.slf4j.Slf4j; | 65 | import lombok.extern.slf4j.Slf4j; |
| 57 | import org.springframework.beans.factory.annotation.Autowired; | 66 | import org.springframework.beans.factory.annotation.Autowired; |
| ... | @@ -67,6 +76,7 @@ public class OrderServiceImpl implements OrderService { | ... | @@ -67,6 +76,7 @@ public class OrderServiceImpl implements OrderService { |
| 67 | private final MenuServiceRpcClient menuServiceRpcClient; | 76 | private final MenuServiceRpcClient menuServiceRpcClient; |
| 68 | private final SkuServiceRpcClient skuServiceRpcClient; | 77 | private final SkuServiceRpcClient skuServiceRpcClient; |
| 69 | private final DeliveryRuleServiceRpcClient deliveryRuleServiceRpcClient; | 78 | private final DeliveryRuleServiceRpcClient deliveryRuleServiceRpcClient; |
| 79 | + private final MeiZhongYiHeService meiZhongYiHeService; | ||
| 70 | 80 | ||
| 71 | @Override | 81 | @Override |
| 72 | public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) { | 82 | public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) { |
| ... | @@ -75,6 +85,12 @@ public class OrderServiceImpl implements OrderService { | ... | @@ -75,6 +85,12 @@ public class OrderServiceImpl implements OrderService { |
| 75 | 85 | ||
| 76 | @Override | 86 | @Override |
| 77 | public CreateOrderResponse orderCreation(OperatorCreateOrderDto operatorCreateOrderDto) { | 87 | public CreateOrderResponse orderCreation(OperatorCreateOrderDto operatorCreateOrderDto) { |
| 88 | + final var getMenuOrderCountReq = getMenuOrderCountDto.builder() | ||
| 89 | + .customerId(operatorCreateOrderDto.getCustomerId()) | ||
| 90 | + .mealTime(operatorCreateOrderDto.getMealTime()) | ||
| 91 | + .menuId(operatorCreateOrderDto.getMenuId()) | ||
| 92 | + .build(); | ||
| 93 | + final var menuOrderCount = this.getMenuOrderCount(getMenuOrderCountReq); | ||
| 78 | final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); | 94 | final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); |
| 79 | final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId()); | 95 | final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId()); |
| 80 | final var customer = clientCustomerServiceRpcClient.getClientCustomerById(operator.getEnterpriseId(), operatorCreateOrderDto.getCustomerId()).getResponse(); | 96 | final var customer = clientCustomerServiceRpcClient.getClientCustomerById(operator.getEnterpriseId(), operatorCreateOrderDto.getCustomerId()).getResponse(); |
| ... | @@ -94,6 +110,10 @@ public class OrderServiceImpl implements OrderService { | ... | @@ -94,6 +110,10 @@ public class OrderServiceImpl implements OrderService { |
| 94 | createOrderDto.setPayPrice(0); | 110 | createOrderDto.setPayPrice(0); |
| 95 | final var menu = menuServiceRpcClient.getMenuById(operator.getEnterpriseId(), | 111 | final var menu = menuServiceRpcClient.getMenuById(operator.getEnterpriseId(), |
| 96 | createOrderDto.getMenuId()).getResponse(); | 112 | createOrderDto.getMenuId()).getResponse(); |
| 113 | + final var placeOrderCount = menu.getOrderRuleJson().getPlaceOrderCount(); | ||
| 114 | + if (placeOrderCount != 0 && menuOrderCount >= placeOrderCount) { | ||
| 115 | + throw ClientEndExceptions.OperationForbidden.build(ErrorCodeEnum.ORDER_COUNT_LIMIT.name()); | ||
| 116 | + } | ||
| 97 | createOrderDto.setCloseTimeType( | 117 | createOrderDto.setCloseTimeType( |
| 98 | CloseTimeType.forNumber(menu.getOrderRuleJson().getCloseTimeType().getNumber())); | 118 | CloseTimeType.forNumber(menu.getOrderRuleJson().getCloseTimeType().getNumber())); |
| 99 | createOrderDto.setRoomNo(record.getRoomNo()); | 119 | createOrderDto.setRoomNo(record.getRoomNo()); |
| ... | @@ -120,11 +140,22 @@ public class OrderServiceImpl implements OrderService { | ... | @@ -120,11 +140,22 @@ public class OrderServiceImpl implements OrderService { |
| 120 | final var labels = deliveryRuleServiceRpcClient.GetClientLabelsByIds(customer.getEnterpriseId(), labelIds).getResponsesList(); | 140 | final var labels = deliveryRuleServiceRpcClient.GetClientLabelsByIds(customer.getEnterpriseId(), labelIds).getResponsesList(); |
| 121 | final var avoids = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_AVOID).map( | 141 | final var avoids = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_AVOID).map( |
| 122 | SingleClientLabelRpcResponse::getName).collect(Collectors.toList()); | 142 | SingleClientLabelRpcResponse::getName).collect(Collectors.toList()); |
| 143 | + final var hisAllergies = meiZhongYiHeService.getHisCustomerAllergiesByCustomerId(customer.getHISCustomerId()); | ||
| 144 | + final var allergyCodes = hisAllergies.stream().map(HisAllergy::getAllergyCode).collect(Collectors.toList()); | ||
| 145 | + final var allLabels = deliveryRuleServiceRpcClient.getLabelsByTypes(QueryLabelsDto.builder() | ||
| 146 | + .enterpriseId(operatorLoginInfo.getEnterpriseId()) | ||
| 147 | + .types(List.of(ClientLabelTypeEnum.CLIENT_LABEL_TYPE_AVOID, ClientLabelTypeEnum.CLIENT_LABEL_TYPE_DOCTOR, ClientLabelTypeEnum.CLIENT_LABEL_TYPE_ALLERGENS)) | ||
| 148 | + .build()); | ||
| 149 | + final var mappingAllergies = allLabels.getResponsesList().stream().filter(l -> allergyCodes.contains(l.getCode())).map(SingleClientLabelRpcResponse::getName).collect(Collectors.toList()); | ||
| 150 | + | ||
| 151 | + final var origionalHisDoctors = meiZhongYiHeService.getHisCustomerMedicalAdvicesByContractNo(record.getContractNo()); | ||
| 152 | + final var dietDoctors = origionalHisDoctors.stream().filter(d -> d.getMedicalAdviceType().equals( | ||
| 153 | + MedicalAdviceTypeEnum.DIET)).map(HisMedicalAdviceDto::getConnotation).collect(Collectors.toList()); | ||
| 123 | final var doctors = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_DOCTOR).map( | 154 | final var doctors = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_DOCTOR).map( |
| 124 | SingleClientLabelRpcResponse::getName).collect(Collectors.toList()); | 155 | SingleClientLabelRpcResponse::getName).collect(Collectors.toList()); |
| 125 | final var customerNotice = CustomerNotice.builder() | 156 | final var customerNotice = CustomerNotice.builder() |
| 126 | - .avoids(avoids) | 157 | + .avoids(Stream.of(avoids, mappingAllergies).flatMap(List::stream).collect(Collectors.toList())) |
| 127 | - .doctors(doctors) | 158 | + .doctors(Stream.of(doctors, dietDoctors).flatMap(List::stream).collect(Collectors.toList())) |
| 128 | .build(); | 159 | .build(); |
| 129 | createOrderDto.setCustomerNoticeJson(customerNotice); | 160 | createOrderDto.setCustomerNoticeJson(customerNotice); |
| 130 | 161 | ||
| ... | @@ -207,7 +238,7 @@ public class OrderServiceImpl implements OrderService { | ... | @@ -207,7 +238,7 @@ public class OrderServiceImpl implements OrderService { |
| 207 | } | 238 | } |
| 208 | 239 | ||
| 209 | @Override | 240 | @Override |
| 210 | - public Boolean checkIfOrdered(CheckIfOrderedDto checkIfOrdered) { | 241 | + public Integer getMenuOrderCount(getMenuOrderCountDto checkIfOrdered) { |
| 211 | final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); | 242 | final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); |
| 212 | final var mealTimeStart = checkIfOrdered.getMealTime().toLocalDate().atStartOfDay(); | 243 | final var mealTimeStart = checkIfOrdered.getMealTime().toLocalDate().atStartOfDay(); |
| 213 | LocalDate tomorrow = checkIfOrdered.getMealTime().toLocalDate().plusDays(1); | 244 | LocalDate tomorrow = checkIfOrdered.getMealTime().toLocalDate().plusDays(1); |
| ... | @@ -224,11 +255,7 @@ public class OrderServiceImpl implements OrderService { | ... | @@ -224,11 +255,7 @@ public class OrderServiceImpl implements OrderService { |
| 224 | .customerIds(List.of(checkIfOrdered.getCustomerId())) | 255 | .customerIds(List.of(checkIfOrdered.getCustomerId())) |
| 225 | .build(); | 256 | .build(); |
| 226 | final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); | 257 | final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); |
| 227 | - if (orderList.isEmpty()) { | 258 | + return orderList.size(); |
| 228 | - return false; | ||
| 229 | - } else { | ||
| 230 | - return true; | ||
| 231 | - } | ||
| 232 | } | 259 | } |
| 233 | 260 | ||
| 234 | @Override | 261 | @Override | ... | ... |
| 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.SingleClientCustomerOrderDetailRpcResponse; | 4 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse; |
| 4 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse; | 5 | import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse; |
| 5 | import com.infoloop.tianting.context.LoginContextHolder; | 6 | import com.infoloop.tianting.context.LoginContextHolder; |
| ... | @@ -7,13 +8,18 @@ import com.infoloop.tianting.exception.ClientEndExceptions.BusinessException; | ... | @@ -7,13 +8,18 @@ import com.infoloop.tianting.exception.ClientEndExceptions.BusinessException; |
| 7 | import com.infoloop.tianting.exception.ErrorCodeEnum; | 8 | import com.infoloop.tianting.exception.ErrorCodeEnum; |
| 8 | import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse; | 9 | import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse; |
| 9 | import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto; | 10 | import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto; |
| 11 | +import com.infoloop.tianting.model.dto.SettlementDTO; | ||
| 12 | +import com.infoloop.tianting.model.dto.SettlementDTO.SettlementDataDto; | ||
| 10 | import com.infoloop.tianting.model.dto.SettlementDTO.SettlementMenuSkuDto; | 13 | import com.infoloop.tianting.model.dto.SettlementDTO.SettlementMenuSkuDto; |
| 11 | import com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto; | 14 | import com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto; |
| 12 | import com.infoloop.tianting.service.SettlementService; | 15 | import com.infoloop.tianting.service.SettlementService; |
| 16 | +import com.infoloop.tianting.service.client.InventoryServiceRpcClient; | ||
| 13 | import com.infoloop.tianting.service.client.MenuServiceRpcClient; | 17 | import com.infoloop.tianting.service.client.MenuServiceRpcClient; |
| 18 | +import com.infoloop.tianting.service.client.OperatorServiceRpcClient; | ||
| 14 | import com.infoloop.tianting.service.client.OrderServiceRpcClient; | 19 | import com.infoloop.tianting.service.client.OrderServiceRpcClient; |
| 15 | import com.infoloop.tianting.service.client.SkuServiceRpcClient; | 20 | import com.infoloop.tianting.service.client.SkuServiceRpcClient; |
| 16 | import com.infoloop.tianting.utils.DateUtil; | 21 | import com.infoloop.tianting.utils.DateUtil; |
| 22 | +import java.util.Comparator; | ||
| 17 | import lombok.RequiredArgsConstructor; | 23 | import lombok.RequiredArgsConstructor; |
| 18 | import lombok.extern.slf4j.Slf4j; | 24 | import lombok.extern.slf4j.Slf4j; |
| 19 | import org.apache.poi.ss.usermodel.Cell; | 25 | import org.apache.poi.ss.usermodel.Cell; |
| ... | @@ -40,23 +46,27 @@ public class SettlementServiceImpl implements SettlementService { | ... | @@ -40,23 +46,27 @@ public class SettlementServiceImpl implements SettlementService { |
| 40 | private final OrderServiceRpcClient orderServiceRpcClient; | 46 | private final OrderServiceRpcClient orderServiceRpcClient; |
| 41 | private final MenuServiceRpcClient menuServiceRpcClient; | 47 | private final MenuServiceRpcClient menuServiceRpcClient; |
| 42 | private final SkuServiceRpcClient skuServiceRpcClient; | 48 | private final SkuServiceRpcClient skuServiceRpcClient; |
| 49 | + private final InventoryServiceRpcClient inventoryServiceRpcClient; | ||
| 43 | 50 | ||
| 44 | @Override | 51 | @Override |
| 45 | public ByteArrayOutputStream generateOrderSettlementExcel(SettlementRequestDto settlementRequest) { | 52 | public ByteArrayOutputStream generateOrderSettlementExcel(SettlementRequestDto settlementRequest) { |
| 46 | 53 | ||
| 54 | + final var startDate = settlementRequest.getTimeStart().toLocalDate().atStartOfDay(); | ||
| 55 | + final var endDate = settlementRequest.getTimeEnd().toLocalDate().plusDays(1).atStartOfDay(); | ||
| 47 | final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); | 56 | final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); |
| 48 | final var queryOrderDto = QueryOrderByConditionDto.builder() | 57 | final var queryOrderDto = QueryOrderByConditionDto.builder() |
| 49 | .enterpriseId(LoginContextHolder.hasLogin() ? operatorLoginInfo.getEnterpriseId() : settlementRequest.getEnterpriseId()) | 58 | .enterpriseId(LoginContextHolder.hasLogin() ? operatorLoginInfo.getEnterpriseId() : settlementRequest.getEnterpriseId()) |
| 50 | .shouldFilterCreatedAtTimeStart(true) | 59 | .shouldFilterCreatedAtTimeStart(true) |
| 51 | - .createdAtTimeStart(settlementRequest.getTimeStart()) | 60 | + .createdAtTimeStart(startDate) |
| 52 | .shouldFilterCreatedAtTimeEnd(true) | 61 | .shouldFilterCreatedAtTimeEnd(true) |
| 53 | - .createdAtTimeEnd(settlementRequest.getTimeEnd()) | 62 | + .createdAtTimeEnd(endDate) |
| 54 | .shouldFilterStallIds(!settlementRequest.getStallIds().isEmpty()) | 63 | .shouldFilterStallIds(!settlementRequest.getStallIds().isEmpty()) |
| 55 | .stallIds(settlementRequest.getStallIds()) | 64 | .stallIds(settlementRequest.getStallIds()) |
| 56 | .build(); | 65 | .build(); |
| 57 | final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); | 66 | final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto); |
| 58 | - List<Integer> orderIds = orderList.stream().map( | 67 | + List<Integer> orderIds = orderList.stream() |
| 59 | - SingleClientCustomerOrderRpcResponse::getId).distinct() | 68 | + .filter(o -> !o.getStatus().equals(OrderStatusEnum.ORDER_CANCELED)) |
| 69 | + .map(SingleClientCustomerOrderRpcResponse::getId).distinct() | ||
| 60 | .collect(Collectors.toList()); | 70 | .collect(Collectors.toList()); |
| 61 | final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds); | 71 | final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds); |
| 62 | List<Integer> skuIds = orderDetailList.stream() | 72 | List<Integer> skuIds = orderDetailList.stream() |
| ... | @@ -78,7 +88,8 @@ public class SettlementServiceImpl implements SettlementService { | ... | @@ -78,7 +88,8 @@ public class SettlementServiceImpl implements SettlementService { |
| 78 | 88 | ||
| 79 | //找出所有需要的日期 | 89 | //找出所有需要的日期 |
| 80 | final var dates = orderList.stream() | 90 | final var dates = orderList.stream() |
| 81 | - .map(o -> DateUtil.formatDate(o.getCreatedAt(), DateUtil.YYYY_MM_DD)) | 91 | + .sorted(Comparator.comparingLong(SingleClientCustomerOrderRpcResponse::getCreatedAt)) |
| 92 | + .map(o -> DateUtil.formatDateOfUtc(o.getCreatedAt(), DateUtil.YYYY_MM_DD_UTC)) | ||
| 82 | .distinct() | 93 | .distinct() |
| 83 | .collect(Collectors.toList()); | 94 | .collect(Collectors.toList()); |
| 84 | for(String date: dates) { | 95 | for(String date: dates) { |
| ... | @@ -90,7 +101,7 @@ public class SettlementServiceImpl implements SettlementService { | ... | @@ -90,7 +101,7 @@ public class SettlementServiceImpl implements SettlementService { |
| 90 | 101 | ||
| 91 | // 找出当天所有的订单 | 102 | // 找出当天所有的订单 |
| 92 | final var curOrderList = orderList.stream() | 103 | final var curOrderList = orderList.stream() |
| 93 | - .filter(o -> DateUtil.formatDate(o.getCreatedAt(), DateUtil.YYYY_MM_DD).equals(date)) | 104 | + .filter(o -> DateUtil.formatDateOfUtc(o.getCreatedAt(), DateUtil.YYYY_MM_DD_UTC).equals(date)) |
| 94 | .collect(Collectors.toList()); | 105 | .collect(Collectors.toList()); |
| 95 | final var curOrderIds = curOrderList.stream() | 106 | final var curOrderIds = curOrderList.stream() |
| 96 | .map(SingleClientCustomerOrderRpcResponse::getId) | 107 | .map(SingleClientCustomerOrderRpcResponse::getId) |
| ... | @@ -142,7 +153,17 @@ public class SettlementServiceImpl implements SettlementService { | ... | @@ -142,7 +153,17 @@ public class SettlementServiceImpl implements SettlementService { |
| 142 | String skuCode = ""; | 153 | String skuCode = ""; |
| 143 | if (curSku.isPresent()) { | 154 | if (curSku.isPresent()) { |
| 144 | skuCode = curSku.get().getCode(); | 155 | skuCode = curSku.get().getCode(); |
| 156 | + final var existSku = menuSkuList.stream().filter(s -> s.getSkuCode().equals(curSku.get().getCode())).findFirst(); | ||
| 157 | + if (existSku.isPresent()) { | ||
| 158 | + final var originalSku = existSku.get(); | ||
| 159 | + final var count = existSku.get().getCount(); | ||
| 160 | + final var newCount = count + countTotal; | ||
| 161 | + originalSku.setCount(newCount); | ||
| 162 | + originalSku.setTotalPrice(m.getPrice() * newCount); | ||
| 163 | + continue; | ||
| 164 | + } | ||
| 145 | } | 165 | } |
| 166 | + | ||
| 146 | final var settlementMenuSku = SettlementMenuSkuDto.builder() | 167 | final var settlementMenuSku = SettlementMenuSkuDto.builder() |
| 147 | .skuCode(skuCode) | 168 | .skuCode(skuCode) |
| 148 | .count(countTotal) | 169 | .count(countTotal) |
| ... | @@ -157,9 +178,16 @@ public class SettlementServiceImpl implements SettlementService { | ... | @@ -157,9 +178,16 @@ public class SettlementServiceImpl implements SettlementService { |
| 157 | 178 | ||
| 158 | } | 179 | } |
| 159 | } | 180 | } |
| 160 | - | 181 | + final var client = inventoryServiceRpcClient.getClientById(operatorLoginInfo.getEnterpriseId(), |
| 182 | + settlementRequest.getClientId()).getClient(); | ||
| 183 | + final var settlementDataDto = SettlementDataDto.builder() | ||
| 184 | + .classifyOrders(classifyOrders) | ||
| 185 | + .client(client.getName()) | ||
| 186 | + .startTime(DateUtil.formatDate(settlementRequest.getTimeStart(), DateUtil.YYYY_MM_DD)) | ||
| 187 | + .endTime(DateUtil.formatDate(settlementRequest.getTimeEnd(), DateUtil.YYYY_MM_DD)) | ||
| 188 | + .build(); | ||
| 161 | try { | 189 | try { |
| 162 | - final var bytes = writeToExcel(classifyOrders); | 190 | + final var bytes = writeToExcel(settlementDataDto); |
| 163 | return bytes; | 191 | return bytes; |
| 164 | } catch (IOException e) { | 192 | } catch (IOException e) { |
| 165 | throw BusinessException.build(ErrorCodeEnum.GENERATE_EXCEL_ERROR); | 193 | throw BusinessException.build(ErrorCodeEnum.GENERATE_EXCEL_ERROR); |
| ... | @@ -167,12 +195,21 @@ public class SettlementServiceImpl implements SettlementService { | ... | @@ -167,12 +195,21 @@ public class SettlementServiceImpl implements SettlementService { |
| 167 | 195 | ||
| 168 | } | 196 | } |
| 169 | 197 | ||
| 170 | - public static ByteArrayOutputStream writeToExcel(Map<String, Map<String, List<SettlementMenuSkuDto>>> classifyOrders) | 198 | + public static ByteArrayOutputStream writeToExcel(SettlementDataDto settlementDataDto) |
| 171 | throws IOException { | 199 | throws IOException { |
| 172 | Workbook workbook = new XSSFWorkbook(); | 200 | Workbook workbook = new XSSFWorkbook(); |
| 173 | Sheet sheet = workbook.createSheet("订单数据"); | 201 | Sheet sheet = workbook.createSheet("订单数据"); |
| 174 | 202 | ||
| 203 | + final var classifyOrders = settlementDataDto.getClassifyOrders(); | ||
| 204 | + | ||
| 175 | int rowNum = 0; | 205 | int rowNum = 0; |
| 206 | + Row sheetTitleRow = sheet.createRow(rowNum++); | ||
| 207 | + Cell sheetTitleCell = sheetTitleRow.createCell(0); | ||
| 208 | + sheetTitleCell.setCellValue(settlementDataDto.getClient()); | ||
| 209 | + Row dateRangeRow = sheet.createRow(rowNum++); | ||
| 210 | + Cell dateRangeCell = dateRangeRow.createCell(0); | ||
| 211 | + final var dateRange = settlementDataDto.getStartTime() + "至" + settlementDataDto.getEndTime(); | ||
| 212 | + dateRangeCell.setCellValue(dateRange); | ||
| 176 | Row titleRow = sheet.createRow(rowNum++); | 213 | Row titleRow = sheet.createRow(rowNum++); |
| 177 | Cell dateTitleCell = titleRow.createCell(0); | 214 | Cell dateTitleCell = titleRow.createCell(0); |
| 178 | dateTitleCell.setCellValue("点餐日期"); | 215 | dateTitleCell.setCellValue("点餐日期"); | ... | ... |
| ... | @@ -32,7 +32,7 @@ public class SettlementController { | ... | @@ -32,7 +32,7 @@ public class SettlementController { |
| 32 | private final SettlementService settlementService; | 32 | private final SettlementService settlementService; |
| 33 | 33 | ||
| 34 | @ApiIgnore | 34 | @ApiIgnore |
| 35 | - @ApiOperation(value = "结算账单生成excel") | 35 | + @ApiOperation(value = "企业端结算账单生成excel") |
| 36 | @PostMapping("/enterprise/settlement/generate-excel") | 36 | @PostMapping("/enterprise/settlement/generate-excel") |
| 37 | @ResponseStatus(HttpStatus.OK) | 37 | @ResponseStatus(HttpStatus.OK) |
| 38 | public ResponseEntity<byte[]> enterpriseSettlementGenerateExcel(@Valid @RequestBody SettlementRequestDto settlementRequestDto) { | 38 | public ResponseEntity<byte[]> enterpriseSettlementGenerateExcel(@Valid @RequestBody SettlementRequestDto settlementRequestDto) { | ... | ... |
| ... | @@ -36,6 +36,8 @@ public final class DateUtil extends DateUtils { | ... | @@ -36,6 +36,8 @@ public final class DateUtil extends DateUtils { |
| 36 | public final static DateTimeFormatter YYYY_MM_DD = DateTimeFormatter | 36 | public final static DateTimeFormatter YYYY_MM_DD = DateTimeFormatter |
| 37 | .ofPattern("yyyy-MM-dd") | 37 | .ofPattern("yyyy-MM-dd") |
| 38 | .withZone(CHINA_ZONE); | 38 | .withZone(CHINA_ZONE); |
| 39 | + public final static DateTimeFormatter YYYY_MM_DD_UTC = DateTimeFormatter | ||
| 40 | + .ofPattern("yyyy-MM-dd"); | ||
| 39 | public final static DateTimeFormatter YYYY_MM_DD_LEFT_SYMBOL = DateTimeFormatter | 41 | public final static DateTimeFormatter YYYY_MM_DD_LEFT_SYMBOL = DateTimeFormatter |
| 40 | .ofPattern("yyyy/MM/dd") | 42 | .ofPattern("yyyy/MM/dd") |
| 41 | .withZone(CHINA_ZONE); | 43 | .withZone(CHINA_ZONE); |
| ... | @@ -89,6 +91,14 @@ public final class DateUtil extends DateUtils { | ... | @@ -89,6 +91,14 @@ public final class DateUtil extends DateUtils { |
| 89 | .format(formatter); | 91 | .format(formatter); |
| 90 | } | 92 | } |
| 91 | 93 | ||
| 94 | + public static String formatDateOfUtc(final long epochMillis, DateTimeFormatter formatter) { | ||
| 95 | + if (epochMillis == 0L) { | ||
| 96 | + return null; | ||
| 97 | + } | ||
| 98 | + return Instant.ofEpochMilli(epochMillis).atOffset(ZoneOffset.UTC) | ||
| 99 | + .format(formatter); | ||
| 100 | + } | ||
| 101 | + | ||
| 92 | public static String formatDate(final LocalDate localDate, DateTimeFormatter formatter) { | 102 | public static String formatDate(final LocalDate localDate, DateTimeFormatter formatter) { |
| 93 | if (localDate == null) { | 103 | if (localDate == null) { |
| 94 | return null; | 104 | return null; | ... | ... |
-
Please register or login to post a comment