zhuyifan

菜品售卖量接口

Showing 21 changed files with 643 additions and 49 deletions
1 package com.infoloop.tianting.controller; 1 package com.infoloop.tianting.controller;
2 2
3 import com.github.xiaoymin.knife4j.annotations.ApiSupport; 3 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
4 +import com.infoloop.tianting.annotation.RepeatSubmit;
4 import com.infoloop.tianting.model.dto.OrderDbDTO; 5 import com.infoloop.tianting.model.dto.OrderDbDTO;
5 import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse; 6 import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
6 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto; 7 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
...@@ -67,6 +68,7 @@ public class OrderController { ...@@ -67,6 +68,7 @@ public class OrderController {
67 @ApiOperation(value = "创建订单") 68 @ApiOperation(value = "创建订单")
68 @PostMapping("/orders") 69 @PostMapping("/orders")
69 @ResponseStatus(HttpStatus.OK) 70 @ResponseStatus(HttpStatus.OK)
71 + @RepeatSubmit(prefix = "createOrder")
70 public CreateOrderResponse createOrder(@Valid @RequestBody CreateOrderDto createOrderDto) { 72 public CreateOrderResponse createOrder(@Valid @RequestBody CreateOrderDto createOrderDto) {
71 return orderService.createOrder(createOrderDto); 73 return orderService.createOrder(createOrderDto);
72 } 74 }
...@@ -74,12 +76,11 @@ public class OrderController { ...@@ -74,12 +76,11 @@ public class OrderController {
74 @ApiOperation(value = "院区端创建订单") 76 @ApiOperation(value = "院区端创建订单")
75 @PostMapping("/operator/orders") 77 @PostMapping("/operator/orders")
76 @ResponseStatus(HttpStatus.OK) 78 @ResponseStatus(HttpStatus.OK)
77 - public CreateOrderResponse createOrderByOperator( 79 + @RepeatSubmit(prefix = "createOrder")
78 - @Valid @RequestBody OrderDbDTO.OperatorCreateOrderDto createOrderDto) { 80 + public CreateOrderResponse createOrderByOperator(@Valid @RequestBody OrderDbDTO.OperatorCreateOrderDto createOrderDto) {
79 return orderService.orderCreation(createOrderDto); 81 return orderService.orderCreation(createOrderDto);
80 } 82 }
81 83
82 - // @SaIgnore
83 @ApiOperation(value = "修改订单") 84 @ApiOperation(value = "修改订单")
84 @PatchMapping("/orders/modification") 85 @PatchMapping("/orders/modification")
85 @ResponseStatus(HttpStatus.OK) 86 @ResponseStatus(HttpStatus.OK)
...@@ -87,12 +88,10 @@ public class OrderController { ...@@ -87,12 +88,10 @@ public class OrderController {
87 return orderService.updateOrder(updateOrderDto); 88 return orderService.updateOrder(updateOrderDto);
88 } 89 }
89 90
90 - // @SaIgnore
91 @ApiOperation(value = "批量修改订单详情") 91 @ApiOperation(value = "批量修改订单详情")
92 @PatchMapping("/order_details/modification") 92 @PatchMapping("/order_details/modification")
93 @ResponseStatus(HttpStatus.OK) 93 @ResponseStatus(HttpStatus.OK)
94 - public BatchUpdateOrderDetailResponse batchUpdateOrderDetails( 94 + public BatchUpdateOrderDetailResponse batchUpdateOrderDetails(@Valid @RequestBody OrderDbDTO.OrderDetailBatchUpdateDto updateDto) {
95 - @Valid @RequestBody OrderDbDTO.OrderDetailBatchUpdateDto updateDto) {
96 return orderService.batchUpdateOrderDetails(updateDto); 95 return orderService.batchUpdateOrderDetails(updateDto);
97 } 96 }
98 97
......
...@@ -8,7 +8,6 @@ import com.infoloop.tianting.model.dto.SkuSellQuantityDTO; ...@@ -8,7 +8,6 @@ import com.infoloop.tianting.model.dto.SkuSellQuantityDTO;
8 import com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO; 8 import com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO;
9 import com.infoloop.tianting.model.vo.SkuSellQuantityVO; 9 import com.infoloop.tianting.model.vo.SkuSellQuantityVO;
10 import com.infoloop.tianting.service.SkuService; 10 import com.infoloop.tianting.service.SkuService;
11 -import com.infoloop.tianting.utils.PageUtil;
12 import io.swagger.annotations.Api; 11 import io.swagger.annotations.Api;
13 import io.swagger.annotations.ApiOperation; 12 import io.swagger.annotations.ApiOperation;
14 import lombok.RequiredArgsConstructor; 13 import lombok.RequiredArgsConstructor;
...@@ -25,7 +24,6 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -25,7 +24,6 @@ import org.springframework.web.bind.annotation.ResponseStatus;
25 import org.springframework.web.bind.annotation.RestController; 24 import org.springframework.web.bind.annotation.RestController;
26 25
27 import javax.validation.Valid; 26 import javax.validation.Valid;
28 -import java.util.Collections;
29 import java.util.List; 27 import java.util.List;
30 28
31 @Api(tags = "sku") 29 @Api(tags = "sku")
...@@ -41,7 +39,7 @@ public class SkuController { ...@@ -41,7 +39,7 @@ public class SkuController {
41 @ApiOperation(value = "根据sku ids获取") 39 @ApiOperation(value = "根据sku ids获取")
42 @PostMapping("/skus") 40 @PostMapping("/skus")
43 @ResponseStatus(HttpStatus.OK) 41 @ResponseStatus(HttpStatus.OK)
44 - public List<SkuDto> getOrderByCustomerId(@Valid @RequestBody SkuIdsDto skuIdsDto) { 42 + public List<SkuDto> getSkusByIds(@Valid @RequestBody SkuIdsDto skuIdsDto) {
45 return skuService.getSkusByIds(skuIdsDto.getIds()); 43 return skuService.getSkusByIds(skuIdsDto.getIds());
46 } 44 }
47 45
...@@ -49,29 +47,28 @@ public class SkuController { ...@@ -49,29 +47,28 @@ public class SkuController {
49 @GetMapping("/stall/{stallId}/skusellquantities/statistics") 47 @GetMapping("/stall/{stallId}/skusellquantities/statistics")
50 @ResponseStatus(HttpStatus.OK) 48 @ResponseStatus(HttpStatus.OK)
51 public SkuSellQuantityStatisticsVO querySkuSellQuantityStatistics(@PathVariable("stallId") int stallId) { 49 public SkuSellQuantityStatisticsVO querySkuSellQuantityStatistics(@PathVariable("stallId") int stallId) {
52 - return SkuSellQuantityStatisticsVO.builder().build(); 50 + return skuService.querySkuSellQuantityStatistics(stallId);
53 } 51 }
54 52
55 @ApiOperation(value = "分页查询菜品售卖量") 53 @ApiOperation(value = "分页查询菜品售卖量")
56 @PostMapping("/skusellquantities/query") 54 @PostMapping("/skusellquantities/query")
57 @ResponseStatus(HttpStatus.OK) 55 @ResponseStatus(HttpStatus.OK)
58 public PageResult<SkuSellQuantityVO> querySkuSellQuantity(@Valid @RequestBody SkuSellQuantityDTO.QuerySkuSellQuantityDTO querySkuSellQuantityDTO) { 56 public PageResult<SkuSellQuantityVO> querySkuSellQuantity(@Valid @RequestBody SkuSellQuantityDTO.QuerySkuSellQuantityDTO querySkuSellQuantityDTO) {
59 - SkuSellQuantityVO skuSellQuantityVO = SkuSellQuantityVO.builder().build(); 57 + return skuService.querySkuSellQuantity(querySkuSellQuantityDTO);
60 - return PageUtil.buildEmpty(skuSellQuantityVO);
61 } 58 }
62 59
63 @ApiOperation(value = "批量设置菜品售卖量") 60 @ApiOperation(value = "批量设置菜品售卖量")
64 @PutMapping("/stall/{stallId}/skusellquantities/batchset") 61 @PutMapping("/stall/{stallId}/skusellquantities/batchset")
65 @ResponseStatus(HttpStatus.CREATED) 62 @ResponseStatus(HttpStatus.CREATED)
66 - public void batchSetSkuSellQuantity(@PathVariable("stallId") int stallId, 63 + public boolean batchSetSkuSellQuantity(@PathVariable("stallId") int stallId,
67 @Valid @RequestBody SkuSellQuantityDTO.BatchSetSkuSellQuantityDTO batchSetSkuSellQuantityDTO) { 64 @Valid @RequestBody SkuSellQuantityDTO.BatchSetSkuSellQuantityDTO batchSetSkuSellQuantityDTO) {
68 - 65 + return skuService.batchSetSkuSellQuantity(stallId, batchSetSkuSellQuantityDTO);
69 } 66 }
70 67
71 @ApiOperation(value = "根据菜品ids批量查询菜品售卖量") 68 @ApiOperation(value = "根据菜品ids批量查询菜品售卖量")
72 @PostMapping("/skusellquantities/querybyskuids") 69 @PostMapping("/skusellquantities/querybyskuids")
73 @ResponseStatus(HttpStatus.OK) 70 @ResponseStatus(HttpStatus.OK)
74 public List<SkuSellQuantityVO> querySkuSellQuantityBySkuIds(@Valid @RequestBody SkuSellQuantityDTO.QuerySkuSellQuantityBySkuIdsDTO querySkuSellQuantityBySkuIdsDTO) { 71 public List<SkuSellQuantityVO> querySkuSellQuantityBySkuIds(@Valid @RequestBody SkuSellQuantityDTO.QuerySkuSellQuantityBySkuIdsDTO querySkuSellQuantityBySkuIdsDTO) {
75 - return Collections.emptyList(); 72 + return skuService.querySkuSellQuantityBySkuIds(querySkuSellQuantityBySkuIdsDTO);
76 } 73 }
77 } 74 }
......
...@@ -29,6 +29,10 @@ public enum ErrorCodeEnum implements BaseEnum { ...@@ -29,6 +29,10 @@ public enum ErrorCodeEnum implements BaseEnum {
29 ORDER_COUNT_LIMIT(406000005, "已超过该餐单预定次数"), 29 ORDER_COUNT_LIMIT(406000005, "已超过该餐单预定次数"),
30 30
31 QUERY_CLIENT_CUSTOMER_ERROR(406000006, "获取当日在住客户失败"), 31 QUERY_CLIENT_CUSTOMER_ERROR(406000006, "获取当日在住客户失败"),
32 +
33 + SKUS_SOLD_OUT_TODAY(406000007, "下单菜品今日售罄"),
34 +
35 + ORDER_CANCEL(406000008, "订单已自动取消")
32 ; 36 ;
33 private final int code; 37 private final int code;
34 38
......
1 +package com.infoloop.tianting.logic.delay;
2 +
3 +import lombok.extern.slf4j.Slf4j;
4 +import org.redisson.api.RBlockingQueue;
5 +import org.redisson.api.RedissonClient;
6 +
7 +import java.util.concurrent.ExecutorService;
8 +import java.util.concurrent.Executors;
9 +import java.util.concurrent.TimeUnit;
10 +
11 +@Slf4j
12 +public class DelayTaskQueueExecutor<T> {
13 +
14 + private final RedissonClient redissonClient;
15 + private final RBlockingQueue<T> blockingDeque;
16 + private final Processor<T> processor;
17 + private final ExecutorService executorService;
18 + private volatile boolean running = true;
19 +
20 + public interface Processor<T> {
21 + void process(T task) throws InterruptedException;
22 + }
23 +
24 + public DelayTaskQueueExecutor(String threadName, RedissonClient redissonClient, RBlockingQueue<T> blockingDeque, Processor<T> processor) {
25 + this.redissonClient = redissonClient;
26 + this.blockingDeque = blockingDeque;
27 + this.processor = processor;
28 + this.executorService = Executors.newSingleThreadExecutor(r -> {
29 + Thread t = new Thread(r);
30 + t.setName(threadName);
31 + return t;
32 + });
33 + this.executorService.submit(this::looper);
34 + }
35 +
36 + public void looper() {
37 + while (running) {
38 + try {
39 + if (redissonClient.isShutdown()) {
40 + shutdown();
41 + return;
42 + }
43 + T task = blockingDeque.take();
44 + processor.process(task);
45 + } catch (InterruptedException e) {
46 + Thread.currentThread().interrupt();
47 + break;
48 + } catch (Exception e) {
49 + log.error("Task processing error in thread: {}", Thread.currentThread().getName(), e);
50 + }
51 + }
52 + }
53 +
54 + public void shutdown() {
55 + running = false;
56 + executorService.shutdown();
57 + try {
58 + if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
59 + log.warn("Executor did not terminate in the specified time.");
60 + executorService.shutdownNow();
61 + }
62 + } catch (InterruptedException e) {
63 + log.error("Shutdown interrupted", e);
64 + executorService.shutdownNow();
65 + Thread.currentThread().interrupt();
66 + }
67 + }
68 +}
1 +package com.infoloop.tianting.logic.delay;
2 +
3 +import lombok.RequiredArgsConstructor;
4 +import lombok.extern.slf4j.Slf4j;
5 +import org.redisson.api.RBlockingQueue;
6 +import org.redisson.api.RDelayedQueue;
7 +import org.redisson.api.RedissonClient;
8 +import org.springframework.stereotype.Service;
9 +
10 +import java.util.List;
11 +import java.util.Map;
12 +import java.util.concurrent.ConcurrentHashMap;
13 +import java.util.concurrent.TimeUnit;
14 +import java.util.function.Consumer;
15 +
16 +@Slf4j
17 +@Service
18 +@RequiredArgsConstructor
19 +public class DelayedQueue<T> {
20 +
21 + private final RedissonClient redissonClient;
22 +
23 + private final Map<String, RDelayedQueue<T>> delayedQueues = new ConcurrentHashMap<>();
24 +
25 + /**
26 + * 初始化队列,传入队列名称和处理逻辑
27 + */
28 + public void initQueue(String queueName, Consumer<T> processMessage) {
29 + RBlockingQueue<T> blockingQueue = redissonClient.getBlockingQueue(queueName);
30 + RDelayedQueue<T> delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
31 + delayedQueues.put(queueName, delayedQueue);
32 + DelayTaskQueueExecutor.Processor<T> processor = task -> {
33 + try {
34 + processMessage.accept(task);
35 + } catch (Exception e) {
36 + log.error("Error processing task: {}", task, e);
37 + }
38 + };
39 + new DelayTaskQueueExecutor<>(queueName + " DELAY TASK", redissonClient, blockingQueue, processor);
40 + log.info("Initialized delay queue for {}", queueName);
41 + }
42 +
43 + public void addToQueue(String queueName, T message, long delay, TimeUnit timeUnit) {
44 + RDelayedQueue<T> queue = getDelayedQueue(queueName);
45 + queue.offer(message, delay, timeUnit);
46 + log.info("Added to queue: {}, msg: {}, delay: {} {}", queueName, message, delay, timeUnit);
47 + }
48 +
49 + public void addToQueue(String queueName, List<T> messages, long delay, TimeUnit timeUnit) {
50 + RDelayedQueue<T> queue = getDelayedQueue(queueName);
51 + messages.forEach(message -> {
52 + queue.offer(message, delay, timeUnit);
53 + log.info("Added to queue: {}, msg: {}, delay: {} {}", queueName, message, delay, timeUnit);
54 + });
55 + }
56 +
57 + private RDelayedQueue<T> getDelayedQueue(String queueName) {
58 + RDelayedQueue<T> queue = delayedQueues.get(queueName);
59 + if (queue == null) {
60 + throw new IllegalArgumentException("Queue not initialized: " + queueName);
61 + }
62 + return queue;
63 + }
64 +
65 +}
1 +package com.infoloop.tianting.logic.delay;
2 +
3 +import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
4 +import com.infoloop.tianting.logic.delay.param.AutoCancelParam;
5 +import com.infoloop.tianting.model.bo.AddSkusSellQuantityBO;
6 +import com.infoloop.tianting.service.client.OrderServiceRpcClient;
7 +import lombok.RequiredArgsConstructor;
8 +import lombok.extern.slf4j.Slf4j;
9 +import org.springframework.stereotype.Component;
10 +
11 +import javax.annotation.PostConstruct;
12 +import java.util.stream.Collectors;
13 +
14 +@Slf4j
15 +@Component
16 +@RequiredArgsConstructor
17 +public class OrderAutoCancelDelayTask {
18 +
19 + private final DelayedQueue<AutoCancelParam> delayedQueue;
20 +
21 + private final OrderServiceRpcClient orderServiceRpcClient;
22 +
23 + public static final String AUTO_CANCEL_ORDER_DELAY_QUEUE = "AUTO_CANCEL_ORDER_QUEUE";
24 +
25 + @PostConstruct
26 + public void init() {
27 + delayedQueue.initQueue(AUTO_CANCEL_ORDER_DELAY_QUEUE, this::execute);
28 + }
29 +
30 + private void execute(AutoCancelParam param) {
31 + try {
32 + final var orderById = orderServiceRpcClient.getOrderById(param.getOrderId());
33 + if (orderById == null) {
34 + log.error("Order not found, orderId: {}", param.getOrderId());
35 + return;
36 + }
37 + if (orderById.getPayStatus() == PayStatusEnum.PAY_CANCELED) {
38 + log.info("Order {} already canceled, skipping.", param.getOrderId());
39 + return;
40 + }
41 + if (orderById.getPayStatus() == PayStatusEnum.IN_PROGRESS || orderById.getPayStatus() == PayStatusEnum.SUCCEED) {
42 + log.info("Order {} already successful, skipping.", param.getOrderId());
43 + return;
44 + }
45 + final var isUpdated = orderServiceRpcClient.updateClientCustomerOrderCancel(orderById.getEnterpriseId(), orderById.getId());
46 + if (isUpdated) {
47 + final var orderDetails = orderServiceRpcClient.getOrderDetailsByOrderId(orderById.getId());
48 + final var isSuccess = orderServiceRpcClient.addSkusSellQuantities(orderById.getEnterpriseId(), orderById.getStallId(), orderDetails.stream().map(e -> AddSkusSellQuantityBO.builder()
49 + .skuId(e.getSkuId())
50 + .quantity(-e.getCount())
51 + .build()).collect(Collectors.toList()));
52 + log.info("Order {} addSkusSellQuantities result: {}", param.getOrderId(), isSuccess);
53 + }
54 + } catch (Exception e) {
55 + log.error("OrderAutoCancelDelayTask execute error", e);
56 + }
57 + }
58 +
59 +}
1 +package com.infoloop.tianting.logic.delay.param;
2 +
3 +import lombok.Data;
4 +
5 +@Data
6 +public class AutoCancelParam {
7 +
8 + private int orderId;
9 +
10 +}
1 +package com.infoloop.tianting.model.bo;
2 +
3 +import lombok.Builder;
4 +import lombok.Data;
5 +
6 +@Data
7 +@Builder
8 +public class AddSkusSellQuantityBO {
9 +
10 + private int skuId;
11 +
12 + private int quantity;
13 +}
1 +package com.infoloop.tianting.model.bo;
2 +
3 +import lombok.Builder;
4 +import lombok.Data;
5 +
6 +@Data
7 +@Builder
8 +public class SkuSellQuantityBO {
9 +
10 + private Integer id;
11 +
12 + private int skuId;
13 +
14 + private int maxSellQuantity;
15 +}
...@@ -41,6 +41,9 @@ public class SkuSellQuantityDTO { ...@@ -41,6 +41,9 @@ public class SkuSellQuantityDTO {
41 @ApiModelProperty("菜品售卖状态") 41 @ApiModelProperty("菜品售卖状态")
42 @NotNull 42 @NotNull
43 private SkuSellQuantityStatus status; 43 private SkuSellQuantityStatus status;
44 +
45 + @ApiModelProperty("关键字")
46 + private String keyword;
44 } 47 }
45 48
46 @Data 49 @Data
......
...@@ -11,7 +11,7 @@ import lombok.Data; ...@@ -11,7 +11,7 @@ import lombok.Data;
11 public class SkuSellQuantityStatisticsVO { 11 public class SkuSellQuantityStatisticsVO {
12 12
13 @ApiModelProperty("全部") 13 @ApiModelProperty("全部")
14 - private Long total; 14 + private int total;
15 15
16 @ApiModelProperty("售罄") 16 @ApiModelProperty("售罄")
17 private Long soldOut; 17 private Long soldOut;
......
...@@ -6,6 +6,7 @@ import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto; ...@@ -6,6 +6,7 @@ import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto;
6 import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDetailDto; 6 import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDetailDto;
7 import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDto; 7 import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDto;
8 import com.infoloop.tianting.model.dto.MenuDbDTO.MenuRefDto; 8 import com.infoloop.tianting.model.dto.MenuDbDTO.MenuRefDto;
9 +
9 import java.util.List; 10 import java.util.List;
10 11
11 public interface MenuService { 12 public interface MenuService {
...@@ -21,4 +22,6 @@ public interface MenuService { ...@@ -21,4 +22,6 @@ public interface MenuService {
21 List<MenuRefDto> getClientCustomerMenuRefsByCustomerId(Integer enterpriseId, Integer customerId); 22 List<MenuRefDto> getClientCustomerMenuRefsByCustomerId(Integer enterpriseId, Integer customerId);
22 23
23 BatchCreateMenuRefsResponseDto batchCreateMenuRefs(BatchCreateMenuRefsDto batchCreateMenuRefsDto); 24 BatchCreateMenuRefsResponseDto batchCreateMenuRefs(BatchCreateMenuRefsDto batchCreateMenuRefsDto);
25 +
26 + List<Integer> queryMenuSkuIdsByStallId(int enterpriseId, int stallId);
24 } 27 }
......
1 package com.infoloop.tianting.service; 1 package com.infoloop.tianting.service;
2 2
3 import com.infoloop.tianting.model.common.OrderPageResult; 3 import com.infoloop.tianting.model.common.OrderPageResult;
4 -import com.infoloop.tianting.model.common.PageResult;
5 import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse; 4 import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
6 -import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto;
7 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto; 5 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
8 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse; 6 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse;
9 import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto; 7 import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto;
...@@ -15,6 +13,8 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto; ...@@ -15,6 +13,8 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
15 import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto; 13 import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
16 import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto; 14 import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
17 import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse; 15 import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
16 +import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto;
17 +
18 import java.util.List; 18 import java.util.List;
19 19
20 public interface OrderService { 20 public interface OrderService {
......
1 package com.infoloop.tianting.service; 1 package com.infoloop.tianting.service;
2 2
3 +import com.infoloop.tianting.model.common.PageResult;
3 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto; 4 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto;
5 +import com.infoloop.tianting.model.dto.SkuSellQuantityDTO;
6 +import com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO;
7 +import com.infoloop.tianting.model.vo.SkuSellQuantityVO;
8 +
9 +import javax.validation.Valid;
4 import java.util.List; 10 import java.util.List;
5 11
6 public interface SkuService { 12 public interface SkuService {
7 13
8 List<SkuDto> getSkusByIds(List<Integer> ids); 14 List<SkuDto> getSkusByIds(List<Integer> ids);
9 15
16 + SkuSellQuantityStatisticsVO querySkuSellQuantityStatistics(int stallId);
17 +
18 + PageResult<SkuSellQuantityVO> querySkuSellQuantity(SkuSellQuantityDTO.QuerySkuSellQuantityDTO querySkuSellQuantityDTO);
19 +
20 + boolean batchSetSkuSellQuantity(int stallId, SkuSellQuantityDTO.BatchSetSkuSellQuantityDTO batchSetSkuSellQuantityDTO);
21 +
22 + List<SkuSellQuantityVO> querySkuSellQuantityBySkuIds(SkuSellQuantityDTO.@Valid QuerySkuSellQuantityBySkuIdsDTO querySkuSellQuantityBySkuIdsDTO);
10 } 23 }
......
...@@ -2,8 +2,10 @@ package com.infoloop.tianting.service.client; ...@@ -2,8 +2,10 @@ package com.infoloop.tianting.service.client;
2 2
3 import com.infoloop.tianting.SingleResponse; 3 import com.infoloop.tianting.SingleResponse;
4 import com.infoloop.tianting.SingleSpecialResponse; 4 import com.infoloop.tianting.SingleSpecialResponse;
5 +import com.infoloop.tianting.clientcustomerorderservice.AddSkusSellQuantitiesRpcRequest;
5 import com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperationRecordsRequest; 6 import com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperationRecordsRequest;
6 import com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperationRecordsResponse; 7 import com.infoloop.tianting.clientcustomerorderservice.BatchCreateOrderOperationRecordsResponse;
8 +import com.infoloop.tianting.clientcustomerorderservice.BatchSaveSkuSellQuantitiesRpcRequest;
7 import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest; 9 import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest;
8 import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcResponse; 10 import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcResponse;
9 import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreation; 11 import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreation;
...@@ -13,7 +15,6 @@ import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModif ...@@ -13,7 +15,6 @@ import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModif
13 import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc; 15 import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc;
14 import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType; 16 import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
15 import com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcRequest; 17 import com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcRequest;
16 -import com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcResponse;
17 import com.infoloop.tianting.clientcustomerorderservice.CustomerNotice; 18 import com.infoloop.tianting.clientcustomerorderservice.CustomerNotice;
18 import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderByIdRpcRequest; 19 import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderByIdRpcRequest;
19 import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByIdsRpcRequest; 20 import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByIdsRpcRequest;
...@@ -28,13 +29,26 @@ import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum; ...@@ -28,13 +29,26 @@ import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
28 import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByConditionRpcRequest; 29 import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByConditionRpcRequest;
29 import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcRequest; 30 import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcRequest;
30 import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcResponse; 31 import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcResponse;
32 +import com.infoloop.tianting.clientcustomerorderservice.QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest;
33 +import com.infoloop.tianting.clientcustomerorderservice.QuerySkuSellQuantitiesByStallRpcRequest;
31 import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum; 34 import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
32 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse; 35 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
33 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse; 36 import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
37 +import com.infoloop.tianting.clientcustomerorderservice.SingleSkuSellQuantityRpcResponse;
38 +import com.infoloop.tianting.clientcustomerorderservice.SkuSellQuantity;
39 +import com.infoloop.tianting.clientcustomerorderservice.SkuSellQuantityModification;
34 import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest; 40 import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest;
35 import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcResponse; 41 import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcResponse;
36 import com.infoloop.tianting.context.LoginContextHolder; 42 import com.infoloop.tianting.context.LoginContextHolder;
37 import com.infoloop.tianting.enums.OrderTypeEnum; 43 import com.infoloop.tianting.enums.OrderTypeEnum;
44 +import com.infoloop.tianting.exception.ClientEndExceptions;
45 +import com.infoloop.tianting.exception.ErrorCodeEnum;
46 +import com.infoloop.tianting.logic.delay.DelayedQueue;
47 +import com.infoloop.tianting.logic.delay.OrderAutoCancelDelayTask;
48 +import com.infoloop.tianting.logic.delay.param.AutoCancelParam;
49 +import com.infoloop.tianting.menuservice.CloseTimeTypeEnum;
50 +import com.infoloop.tianting.model.bo.AddSkusSellQuantityBO;
51 +import com.infoloop.tianting.model.bo.SkuSellQuantityBO;
38 import com.infoloop.tianting.model.dto.OperationDTO.BatchOperationDto; 52 import com.infoloop.tianting.model.dto.OperationDTO.BatchOperationDto;
39 import com.infoloop.tianting.model.dto.OperationDTO.SingleOperationDto; 53 import com.infoloop.tianting.model.dto.OperationDTO.SingleOperationDto;
40 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto; 54 import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto;
...@@ -60,6 +74,8 @@ import java.time.LocalDate; ...@@ -60,6 +74,8 @@ import java.time.LocalDate;
60 import java.time.ZoneOffset; 74 import java.time.ZoneOffset;
61 import java.util.ArrayList; 75 import java.util.ArrayList;
62 import java.util.List; 76 import java.util.List;
77 +import java.util.concurrent.TimeUnit;
78 +import java.util.function.Function;
63 import java.util.stream.Collectors; 79 import java.util.stream.Collectors;
64 80
65 @Slf4j 81 @Slf4j
...@@ -72,6 +88,7 @@ public class OrderServiceRpcClient { ...@@ -72,6 +88,7 @@ public class OrderServiceRpcClient {
72 private final SkuServiceRpcClient skuServiceRpcClient; 88 private final SkuServiceRpcClient skuServiceRpcClient;
73 private final OperatorServiceRpcClient operatorServiceRpcClient; 89 private final OperatorServiceRpcClient operatorServiceRpcClient;
74 private final RedissonClient redissonClient; 90 private final RedissonClient redissonClient;
91 + private final DelayedQueue<AutoCancelParam> delayedQueue;
75 92
76 @Nullable 93 @Nullable
77 public SingleClientCustomerOrderRpcResponse getOrderById(Integer orderId) { 94 public SingleClientCustomerOrderRpcResponse getOrderById(Integer orderId) {
...@@ -149,6 +166,23 @@ public class OrderServiceRpcClient { ...@@ -149,6 +166,23 @@ public class OrderServiceRpcClient {
149 return orderServiceRpcBlockingStub.updateClientCustomerOrder(request); 166 return orderServiceRpcBlockingStub.updateClientCustomerOrder(request);
150 } 167 }
151 168
169 + public boolean updateClientCustomerOrderCancel(int enterpriseId, int id) {
170 + final var modification = ClientCustomerOrderModification.newBuilder()
171 + .setId(id)
172 + .setShouldUpdateStatus(true)
173 + .setStatus(OrderStatusEnum.ORDER_CANCELED)
174 + .setShouldUpdatePayStatus(true)
175 + .setPayStatus(PayStatusEnum.PAY_CANCELED)
176 + .build();
177 + final var request = UpdateClientCustomerOrderRpcRequest.newBuilder()
178 + .setEnterpriseId(enterpriseId)
179 + .setUpdatedBy(0)
180 + .setUpdateSource(OrderSourceEnum.STALL)
181 + .setModification(modification)
182 + .build();
183 + return orderServiceRpcBlockingStub.updateClientCustomerOrder(request).getIsUpdated();
184 + }
185 +
152 public UpdateClientCustomerOrderRpcResponse updateClientCustomerOrderPaymentResult(SingleClientCustomerOrderRpcResponse order, ClientCustomerOrderModification modification) { 186 public UpdateClientCustomerOrderRpcResponse updateClientCustomerOrderPaymentResult(SingleClientCustomerOrderRpcResponse order, ClientCustomerOrderModification modification) {
153 final var request = UpdateClientCustomerOrderRpcRequest.newBuilder() 187 final var request = UpdateClientCustomerOrderRpcRequest.newBuilder()
154 .setEnterpriseId(order.getEnterpriseId()) 188 .setEnterpriseId(order.getEnterpriseId())
...@@ -164,12 +198,12 @@ public class OrderServiceRpcClient { ...@@ -164,12 +198,12 @@ public class OrderServiceRpcClient {
164 OrderDetailBatchUpdateDto orderDetailBatchUpdateDto) { 198 OrderDetailBatchUpdateDto orderDetailBatchUpdateDto) {
165 final var operatorLoginInfo = LoginContextHolder.getLoginInfo(); 199 final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
166 final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId()); 200 final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId());
167 - List<Integer> idsOfNeedUpdateMenuDetails = new ArrayList<>(); 201 + final var idsOfNeedUpdateMenuDetails = new ArrayList<Integer>();
168 - List<Integer> idsOfAddCount = new ArrayList<>(); 202 + final var idsOfAddCount = new ArrayList<Integer>();
169 - List<OrderDetailDto> orgionalOrderDetails = new ArrayList<>(); 203 + List<OrderDetailDto> originalOrderDetails = new ArrayList<>();
170 List<OrderDetailDto> newOrderDetails; 204 List<OrderDetailDto> newOrderDetails;
171 final var modifications = orderDetailBatchUpdateDto.getDetails().stream().map(d -> { 205 final var modifications = orderDetailBatchUpdateDto.getDetails().stream().map(d -> {
172 - MealDetail mealDetail = MealDetail.newBuilder().build(); 206 + var mealDetail = MealDetail.newBuilder().build();
173 Integer menuDetailId = 0; 207 Integer menuDetailId = 0;
174 int mealId = 0; 208 int mealId = 0;
175 int categoryId = 0; 209 int categoryId = 0;
...@@ -178,8 +212,7 @@ public class OrderServiceRpcClient { ...@@ -178,8 +212,7 @@ public class OrderServiceRpcClient {
178 if (d.getShouldUpdateMenuDetailId()) { 212 if (d.getShouldUpdateMenuDetailId()) {
179 idsOfNeedUpdateMenuDetails.add(d.getId()); 213 idsOfNeedUpdateMenuDetails.add(d.getId());
180 menuDetailId = d.getMenuDetailId(); 214 menuDetailId = d.getMenuDetailId();
181 - final var menuDetail = menuServiceRpcClient.getMenuDetailById( 215 + final var menuDetail = menuServiceRpcClient.getMenuDetailById(operatorLoginInfo.getEnterpriseId(), menuDetailId).getResponse();
182 - operatorLoginInfo.getEnterpriseId(), menuDetailId).getResponse();
183 mealId = menuDetail.getMealId(); 216 mealId = menuDetail.getMealId();
184 categoryId = menuDetail.getCategoryId(); 217 categoryId = menuDetail.getCategoryId();
185 skuId = menuDetail.getSkuId(); 218 skuId = menuDetail.getSkuId();
...@@ -249,7 +282,7 @@ public class OrderServiceRpcClient { ...@@ -249,7 +282,7 @@ public class OrderServiceRpcClient {
249 totalIds.addAll(idsOfAddCount); 282 totalIds.addAll(idsOfAddCount);
250 if (!idsOfNeedUpdateMenuDetails.isEmpty() || !idsOfAddCount.isEmpty()) { 283 if (!idsOfNeedUpdateMenuDetails.isEmpty() || !idsOfAddCount.isEmpty()) {
251 final var orgionalResponseList = getClientCustomerOrderDetailsByIds(totalIds); 284 final var orgionalResponseList = getClientCustomerOrderDetailsByIds(totalIds);
252 - orgionalOrderDetails = orgionalResponseList.stream().map(d -> 285 + originalOrderDetails = orgionalResponseList.stream().map(d ->
253 OrderDetailDto.builder() 286 OrderDetailDto.builder()
254 .id(d.getId()) 287 .id(d.getId())
255 .count(d.getCount()) 288 .count(d.getCount())
...@@ -326,16 +359,16 @@ public class OrderServiceRpcClient { ...@@ -326,16 +359,16 @@ public class OrderServiceRpcClient {
326 359
327 // 替换菜品的操作记录 360 // 替换菜品的操作记录
328 List<SingleOperationDto> operations = new ArrayList<>(); 361 List<SingleOperationDto> operations = new ArrayList<>();
329 - for (OrderDetailDto orgionalDetail : orgionalOrderDetails) { 362 + for (OrderDetailDto originalDetail : originalOrderDetails) {
330 OrderOperationType orderOperationType = OrderOperationType.UNKNOWN_OPERATION_TYPE; 363 OrderOperationType orderOperationType = OrderOperationType.UNKNOWN_OPERATION_TYPE;
331 - if (idsOfNeedUpdateMenuDetails.contains(orgionalDetail.getId())) { 364 + if (idsOfNeedUpdateMenuDetails.contains(originalDetail.getId())) {
332 orderOperationType = OrderOperationType.REPLACE_DISHES; 365 orderOperationType = OrderOperationType.REPLACE_DISHES;
333 - } else if (idsOfAddCount.contains(orgionalDetail.getId())) { 366 + } else if (idsOfAddCount.contains(originalDetail.getId())) {
334 orderOperationType = OrderOperationType.ADD_DISHES; 367 orderOperationType = OrderOperationType.ADD_DISHES;
335 } 368 }
336 - String orgionalDetailStr = ""; 369 + String originalDetailStr = "";
337 String newDetailStr = ""; 370 String newDetailStr = "";
338 - final var newDetail = newOrderDetails.stream().filter(n -> n.getId().equals(orgionalDetail.getId())).findFirst(); 371 + final var newDetail = newOrderDetails.stream().filter(n -> n.getId().equals(originalDetail.getId())).findFirst();
339 if (newDetail.isPresent()) { 372 if (newDetail.isPresent()) {
340 final var newOrderDetailOperation = OrderDetailOperationDto.builder() 373 final var newOrderDetailOperation = OrderDetailOperationDto.builder()
341 .id(newDetail.get().getId()) 374 .id(newDetail.get().getId())
...@@ -347,23 +380,23 @@ public class OrderServiceRpcClient { ...@@ -347,23 +380,23 @@ public class OrderServiceRpcClient {
347 .build(); 380 .build();
348 newDetailStr = JsonUtil.writeAsJson(List.of(newOrderDetailOperation)); 381 newDetailStr = JsonUtil.writeAsJson(List.of(newOrderDetailOperation));
349 } 382 }
350 - final var orgionalOrderDetailOperation = OrderDetailOperationDto.builder() 383 + final var originalOrderDetailOperation = OrderDetailOperationDto.builder()
351 - .id(orgionalDetail.getId()) 384 + .id(originalDetail.getId())
352 - .skuId(orgionalDetail.getSkuId()) 385 + .skuId(originalDetail.getSkuId())
353 - .skuName(orgionalDetail.getShowName()) 386 + .skuName(originalDetail.getShowName())
354 - .count(orgionalDetail.getCount()) 387 + .count(originalDetail.getCount())
355 - .adjustSkuRemark(orgionalDetail.getAdjustSkuRemark()) 388 + .adjustSkuRemark(originalDetail.getAdjustSkuRemark())
356 - .serveStatus(orgionalDetail.getServeStatus().name()) 389 + .serveStatus(originalDetail.getServeStatus().name())
357 .build(); 390 .build();
358 - orgionalDetailStr = JsonUtil.writeAsJson(List.of(orgionalOrderDetailOperation)); 391 + originalDetailStr = JsonUtil.writeAsJson(List.of(originalOrderDetailOperation));
359 final var operation = SingleOperationDto.builder() 392 final var operation = SingleOperationDto.builder()
360 - .orderId(orgionalDetail.getOrderId()) 393 + .orderId(originalDetail.getOrderId())
361 .shouldCreateAdjustOrderDetailJson(true) 394 .shouldCreateAdjustOrderDetailJson(true)
362 .shouldCreateOriginalOrderDetailJson(true) 395 .shouldCreateOriginalOrderDetailJson(true)
363 .shouldCreateAdjustOrderJson(false) 396 .shouldCreateAdjustOrderJson(false)
364 .shouldCreateOriginalOrderJson(false) 397 .shouldCreateOriginalOrderJson(false)
365 .adjustOrderDetailJson(newDetailStr) 398 .adjustOrderDetailJson(newDetailStr)
366 - .originalOrderDetailJson(orgionalDetailStr) 399 + .originalOrderDetailJson(originalDetailStr)
367 .type(orderOperationType) 400 .type(orderOperationType)
368 .build(); 401 .build();
369 operations.add(operation); 402 operations.add(operation);
...@@ -381,9 +414,7 @@ public class OrderServiceRpcClient { ...@@ -381,9 +414,7 @@ public class OrderServiceRpcClient {
381 return res; 414 return res;
382 } 415 }
383 416
384 - public BatchCreateOrderOperationRecordsResponse batchCreateOrderOperationRecords( 417 + public BatchCreateOrderOperationRecordsResponse batchCreateOrderOperationRecords(BatchOperationDto batchOperationDto) {
385 - BatchOperationDto batchOperationDto) {
386 -
387 final var request = BatchCreateOrderOperationRecordsRequest.newBuilder() 418 final var request = BatchCreateOrderOperationRecordsRequest.newBuilder()
388 .addAllCreations(batchOperationDto.getCreations().stream().map(c -> 419 .addAllCreations(batchOperationDto.getCreations().stream().map(c ->
389 OrderOperationRecordCreation.newBuilder() 420 OrderOperationRecordCreation.newBuilder()
...@@ -536,14 +567,81 @@ public class OrderServiceRpcClient { ...@@ -536,14 +567,81 @@ public class OrderServiceRpcClient {
536 .setShouldCreateOrderDetails(true) 567 .setShouldCreateOrderDetails(true)
537 .addAllOrderDetails(orderDetails) 568 .addAllOrderDetails(orderDetails)
538 .build(); 569 .build();
539 - CreateClientCustomerOrderRpcResponse orderResponse = orderServiceRpcBlockingStub 570 + final var menuById = menuServiceRpcClient.getMenuById(createOrderDto.getEnterpriseId(), createOrderDto.getMenuId());
571 + if (menuById.getResponse().getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.IMMEDIATELY) {
572 + final var skuIds = createOrderDto.getOrderDetailDtos().stream().map(CreateOrderDetailDto::getSkuId).collect(Collectors.toList());
573 + final var skuSellQuantities = this.querySkuSellQuantitiesByStallAndSkuIds(createOrderDto.getEnterpriseId(), createOrderDto.getStallId(), skuIds);
574 + final var skuSellQuantityMap = skuSellQuantities.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity()));
575 + for (var orderDetail : createOrderDto.getOrderDetailDtos()) {
576 + final var skuSellQuantityRpcResponse = skuSellQuantityMap.get(orderDetail.getSkuId());
577 + if (skuSellQuantityRpcResponse == null) {
578 + throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.SKUS_SOLD_OUT_TODAY);
579 + }
580 + if ((skuSellQuantityRpcResponse.getTodaySellQuantity() + orderDetail.getSkuId()) > skuSellQuantityRpcResponse.getMaxSellQuantity()) {
581 + throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.SKUS_SOLD_OUT_TODAY);
582 + }
583 + }
584 + }
585 + final var orderResponse = orderServiceRpcBlockingStub
540 .createClientCustomerOrder(CreateClientCustomerOrderRpcRequest.newBuilder() 586 .createClientCustomerOrder(CreateClientCustomerOrderRpcRequest.newBuilder()
541 .setCreation(creation) 587 .setCreation(creation)
542 .setCreationSource(OrderSourceEnum.forNumber(createOrderDto.getCreationSource())) 588 .setCreationSource(OrderSourceEnum.forNumber(createOrderDto.getCreationSource()))
543 .setEnterpriseId(createOrderDto.getEnterpriseId()) 589 .setEnterpriseId(createOrderDto.getEnterpriseId())
544 .setCreatedBy(createOrderDto.getCreatedBy()) 590 .setCreatedBy(createOrderDto.getCreatedBy())
545 .build()); 591 .build());
592 + if (orderResponse.getIsCreated() && menuById.getResponse().getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.IMMEDIATELY) {
593 + final var isSuccess = this.addSkusSellQuantities(createOrderDto.getEnterpriseId(), createOrderDto.getStallId(),
594 + orderDetails.stream().map(e -> AddSkusSellQuantityBO.builder()
595 + .skuId(e.getSkuId())
596 + .quantity(e.getCount())
597 + .build()).collect(Collectors.toList()));
598 + if (isSuccess) {
599 + final var autoCancelParam = new AutoCancelParam();
600 + autoCancelParam.setOrderId(orderResponse.getId());
601 + delayedQueue.addToQueue(OrderAutoCancelDelayTask.AUTO_CANCEL_ORDER_DELAY_QUEUE, autoCancelParam, 15, TimeUnit.MINUTES);
602 + }
603 + }
546 return CreateOrderResponse.builder().id(orderResponse.getId()).isCreated(true).build(); 604 return CreateOrderResponse.builder().id(orderResponse.getId()).isCreated(true).build();
547 } 605 }
548 606
607 +
608 + public List<SingleSkuSellQuantityRpcResponse> querySkuSellQuantitiesByStall(int enterpriseId, int stallId) {
609 + return orderServiceRpcBlockingStub.querySkuSellQuantitiesByStall(QuerySkuSellQuantitiesByStallRpcRequest.newBuilder()
610 + .setEnterpriseId(enterpriseId)
611 + .setStallId(stallId)
612 + .build()).getResponsesList();
613 + }
614 +
615 + public List<SingleSkuSellQuantityRpcResponse> querySkuSellQuantitiesByStallAndSkuIds(int enterpriseId, int stallId, List<Integer> skuIds) {
616 + return orderServiceRpcBlockingStub.querySkuSellQuantitiesByStallAndSkuIds(QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest.newBuilder()
617 + .setEnterpriseId(enterpriseId)
618 + .setStallId(stallId)
619 + .addAllSkuIds(skuIds)
620 + .build()).getResponsesList();
621 + }
622 +
623 + public boolean batchSaveSkuSellQuantities(int enterpriseId, int stallId, List<SkuSellQuantityBO> skuSellQuantityBOs) {
624 + return orderServiceRpcBlockingStub.batchSaveSkuSellQuantities(BatchSaveSkuSellQuantitiesRpcRequest.newBuilder()
625 + .setEnterpriseId(enterpriseId)
626 + .setUpdatedBy(stallId)
627 + .addAllSkuSellQuantityModifications(skuSellQuantityBOs.stream().map(e -> SkuSellQuantityModification.newBuilder()
628 + .setId(e.getId() == null ? 0 : e.getId())
629 + .setStallId(stallId)
630 + .setSkuId(e.getSkuId())
631 + .setMaxSellQuantity(e.getMaxSellQuantity())
632 + .build()).collect(Collectors.toList()))
633 + .build()).getIsSaved();
634 + }
635 +
636 + public boolean addSkusSellQuantities(int enterpriseId, int stallId, List<AddSkusSellQuantityBO> skuSellQuantityBOs) {
637 + return orderServiceRpcBlockingStub.addSkusSellQuantities(AddSkusSellQuantitiesRpcRequest.newBuilder()
638 + .setEnterpriseId(enterpriseId)
639 + .setStallId(stallId)
640 + .addAllSkuSellQuantities(skuSellQuantityBOs.stream().map(e -> SkuSellQuantity.newBuilder()
641 + .setSkuId(e.getSkuId())
642 + .setQuantity(e.getQuantity())
643 + .build()).collect(Collectors.toList()))
644 + .build()).getIsAdded();
645 + }
646 +
549 } 647 }
......
...@@ -8,8 +8,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -8,8 +8,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
8 import com.fasterxml.jackson.databind.PropertyNamingStrategy; 8 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
9 import com.fasterxml.jackson.dataformat.xml.XmlMapper; 9 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
10 import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification; 10 import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification;
11 +import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
11 import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum; 12 import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
12 import com.infoloop.tianting.config.BusinessConfig; 13 import com.infoloop.tianting.config.BusinessConfig;
14 +import com.infoloop.tianting.exception.ClientEndExceptions;
15 +import com.infoloop.tianting.exception.ErrorCodeEnum;
13 import com.infoloop.tianting.model.dto.PayDTO.PayInformRequestDto; 16 import com.infoloop.tianting.model.dto.PayDTO.PayInformRequestDto;
14 import com.infoloop.tianting.model.dto.PayDTO.PayResponseDto; 17 import com.infoloop.tianting.model.dto.PayDTO.PayResponseDto;
15 import com.infoloop.tianting.model.dto.PayDTO.ThirdPartyPayInformRequestDto; 18 import com.infoloop.tianting.model.dto.PayDTO.ThirdPartyPayInformRequestDto;
...@@ -49,6 +52,11 @@ public class PayServiceClient { ...@@ -49,6 +52,11 @@ public class PayServiceClient {
49 private String clientId; 52 private String clientId;
50 53
51 public PayResponseDto payInform(PayInformRequestDto payRequestDto) { 54 public PayResponseDto payInform(PayInformRequestDto payRequestDto) {
55 + final var orderById = orderServiceRpcClient.getOrderById(Integer.valueOf(payRequestDto.getOrderId()));
56 + if (orderById == null || orderById.getPayStatus() == PayStatusEnum.PAY_CANCELED || orderById.getStatus() == OrderStatusEnum.ORDER_CANCELED) {
57 + log.info("Order {} not found or canceled, skipping.", payRequestDto.getOrderId());
58 + throw ClientEndExceptions.BusinessException.build(ErrorCodeEnum.ORDER_CANCEL);
59 + }
52 String url = businessConfig.getPayUrl(); 60 String url = businessConfig.getPayUrl();
53 String requestDate = DateUtil.formatDate(LocalDateTime.now(), DateUtil.YMDHMS); 61 String requestDate = DateUtil.formatDate(LocalDateTime.now(), DateUtil.YMDHMS);
54 ThirdPartyPayInformRequestDto jsonData = buildRequestData(payRequestDto, requestDate); 62 ThirdPartyPayInformRequestDto jsonData = buildRequestData(payRequestDto, requestDate);
......
...@@ -2,6 +2,7 @@ package com.infoloop.tianting.service.client; ...@@ -2,6 +2,7 @@ package com.infoloop.tianting.service.client;
2 2
3 import com.infoloop.tianting.GeDishSkuByIdsRpcResponse; 3 import com.infoloop.tianting.GeDishSkuByIdsRpcResponse;
4 import com.infoloop.tianting.GetSkusByIdsRpcRequest; 4 import com.infoloop.tianting.GetSkusByIdsRpcRequest;
5 +import com.infoloop.tianting.SingleSkuResponse;
5 import com.infoloop.tianting.SkuServiceProtoRpcGrpc; 6 import com.infoloop.tianting.SkuServiceProtoRpcGrpc;
6 import lombok.RequiredArgsConstructor; 7 import lombok.RequiredArgsConstructor;
7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.beans.factory.annotation.Autowired;
...@@ -21,4 +22,12 @@ public class SkuServiceRpcClient { ...@@ -21,4 +22,12 @@ public class SkuServiceRpcClient {
21 .build(); 22 .build();
22 return skuServiceProtoRpcBlockingStub.getDishSkusByIds(request); 23 return skuServiceProtoRpcBlockingStub.getDishSkusByIds(request);
23 } 24 }
25 +
26 + public List<SingleSkuResponse> getSkusByIds(List<Integer> ids) {
27 + final var request = GetSkusByIdsRpcRequest.newBuilder()
28 + .addAllIds(ids)
29 + .setIncludeDeleted(false)
30 + .build();
31 + return skuServiceProtoRpcBlockingStub.getSkusByIds(request).getResponseList();
32 + }
24 } 33 }
......
1 package com.infoloop.tianting.service.impl; 1 package com.infoloop.tianting.service.impl;
2 2
3 +import com.infoloop.tianting.context.LoginContextHolder;
4 +import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
5 +import com.infoloop.tianting.menuservice.SingleMenuRpcResponse;
3 import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsDto; 6 import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsDto;
4 import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto; 7 import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto;
5 import com.infoloop.tianting.model.dto.MenuDbDTO.DishRuleJson; 8 import com.infoloop.tianting.model.dto.MenuDbDTO.DishRuleJson;
...@@ -197,4 +200,10 @@ public class MenuServiceImpl implements MenuService { ...@@ -197,4 +200,10 @@ public class MenuServiceImpl implements MenuService {
197 .build(); 200 .build();
198 } 201 }
199 202
203 + @Override
204 + public List<Integer> queryMenuSkuIdsByStallId(int enterpriseId, int stallId) {
205 + final var menuIds = menuServiceRpcClient.queryPublishedMenusByStallId(LoginContextHolder.getEnterpriseId(), stallId).getResponsesList().stream().map(SingleMenuRpcResponse::getId).collect(Collectors.toList());
206 + return menuServiceRpcClient.queryMenuDetailsByMenuIds(LoginContextHolder.getEnterpriseId(), menuIds).getResponsesList().stream().map(SingleMenuDetailRpcResponse::getSkuId).distinct().collect(Collectors.toList());
207 + }
208 +
200 } 209 }
......
...@@ -118,10 +118,7 @@ public class OrderServiceImpl implements OrderService { ...@@ -118,10 +118,7 @@ public class OrderServiceImpl implements OrderService {
118 createOrderDto.setCreationSource(OrderSourceEnum.STALL.getNumber()); 118 createOrderDto.setCreationSource(OrderSourceEnum.STALL.getNumber());
119 createOrderDto.setEnterpriseId(operatorLoginInfo.getEnterpriseId()); 119 createOrderDto.setEnterpriseId(operatorLoginInfo.getEnterpriseId());
120 // createOrderDto.setStallId(); 120 // createOrderDto.setStallId();
121 - var onlinePay = false; 121 + var onlinePay = menu.getOrderRuleJson().getModeOfPayment() == ModeOfPaymentEnum.ONLINE;
122 - if (menu.getOrderRuleJson().getModeOfPayment() == ModeOfPaymentEnum.ONLINE) {
123 - onlinePay = true;
124 - }
125 createOrderDto.setOnlinePay(onlinePay); 122 createOrderDto.setOnlinePay(onlinePay);
126 OrderTypeEnum orderType; 123 OrderTypeEnum orderType;
127 if (menu.getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.RESERVATION) { 124 if (menu.getOrderRuleJson().getCloseTimeType() == CloseTimeTypeEnum.RESERVATION) {
......
1 package com.infoloop.tianting.service.impl; 1 package com.infoloop.tianting.service.impl;
2 2
3 +import com.infoloop.tianting.SingleSkuResponse;
4 +import com.infoloop.tianting.clientcustomerorderservice.SingleSkuSellQuantityRpcResponse;
5 +import com.infoloop.tianting.context.LoginContextHolder;
6 +import com.infoloop.tianting.enums.SkuSellQuantityStatus;
7 +import com.infoloop.tianting.model.bo.SkuSellQuantityBO;
8 +import com.infoloop.tianting.model.common.PageResult;
3 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDetailSingleResponseDto; 9 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDetailSingleResponseDto;
4 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto; 10 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuDto;
5 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuSpecialDetailSingleResponseDto; 11 import com.infoloop.tianting.model.dto.SkuDbDTO.SkuSpecialDetailSingleResponseDto;
12 +import com.infoloop.tianting.model.dto.SkuSellQuantityDTO;
13 +import com.infoloop.tianting.model.vo.SkuSellQuantityStatisticsVO;
14 +import com.infoloop.tianting.model.vo.SkuSellQuantityVO;
15 +import com.infoloop.tianting.service.MenuService;
6 import com.infoloop.tianting.service.SkuService; 16 import com.infoloop.tianting.service.SkuService;
17 +import com.infoloop.tianting.service.client.OrderServiceRpcClient;
7 import com.infoloop.tianting.service.client.SkuServiceRpcClient; 18 import com.infoloop.tianting.service.client.SkuServiceRpcClient;
8 import com.infoloop.tianting.utils.DateUtil; 19 import com.infoloop.tianting.utils.DateUtil;
20 +import com.infoloop.tianting.utils.PageUtil;
9 import lombok.RequiredArgsConstructor; 21 import lombok.RequiredArgsConstructor;
10 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
11 import org.springframework.beans.factory.annotation.Autowired; 23 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Service; 24 import org.springframework.stereotype.Service;
13 25
26 +import java.util.Comparator;
14 import java.util.List; 27 import java.util.List;
28 +import java.util.function.Function;
15 import java.util.stream.Collectors; 29 import java.util.stream.Collectors;
16 30
17 @Slf4j 31 @Slf4j
18 @Service 32 @Service
19 @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 33 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
20 public class SkuServiceImpl implements SkuService { 34 public class SkuServiceImpl implements SkuService {
35 +
36 + private final MenuService menuService;
37 +
21 private final SkuServiceRpcClient skuServiceRpcClient; 38 private final SkuServiceRpcClient skuServiceRpcClient;
22 39
40 + private final OrderServiceRpcClient orderServiceRpcClient;
41 +
23 @Override 42 @Override
24 public List<SkuDto> getSkusByIds(List<Integer> ids) { 43 public List<SkuDto> getSkusByIds(List<Integer> ids) {
25 final var response = skuServiceRpcClient.getDishSkusByIds(ids); 44 final var response = skuServiceRpcClient.getDishSkusByIds(ids);
...@@ -56,4 +75,133 @@ public class SkuServiceImpl implements SkuService { ...@@ -56,4 +75,133 @@ public class SkuServiceImpl implements SkuService {
56 .build() 75 .build()
57 ).collect(Collectors.toList()); 76 ).collect(Collectors.toList());
58 } 77 }
78 +
79 + @Override
80 + public SkuSellQuantityStatisticsVO querySkuSellQuantityStatistics(int stallId) {
81 + final var skuIds = menuService.queryMenuSkuIdsByStallId(LoginContextHolder.getEnterpriseId(), stallId);
82 + final var responses = orderServiceRpcClient.querySkuSellQuantitiesByStall(LoginContextHolder.getEnterpriseId(), stallId);
83 + final var skuSellQuantitiesMap = responses.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity()));
84 + final var soldOut = skuIds.stream()
85 + .filter(e -> skuSellQuantitiesMap.get(e) == null || skuSellQuantitiesMap.get(e).getMaxSellQuantity() == skuSellQuantitiesMap.get(e).getTodaySellQuantity())
86 + .count();
87 + final int total = skuIds.size();
88 + return SkuSellQuantityStatisticsVO.builder()
89 + .total(total)
90 + .soldOut(soldOut)
91 + .onSale(total - soldOut)
92 + .build();
93 + }
94 +
95 + @Override
96 + public PageResult<SkuSellQuantityVO> querySkuSellQuantity(SkuSellQuantityDTO.QuerySkuSellQuantityDTO querySkuSellQuantityDTO) {
97 + final var stallId = querySkuSellQuantityDTO.getStallId();
98 + final var enterpriseId = LoginContextHolder.getEnterpriseId();
99 + final var skuIds = menuService.queryMenuSkuIdsByStallId(enterpriseId, stallId);
100 + var responses = orderServiceRpcClient.querySkuSellQuantitiesByStall(enterpriseId, stallId);
101 + final var skuSellQuantityMap = responses.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity()));
102 + responses = skuIds.stream()
103 + .map(skuId -> {
104 + var response = skuSellQuantityMap.get(skuId);
105 + if (response == null) {
106 + response = SingleSkuSellQuantityRpcResponse.newBuilder()
107 + .setSkuId(skuId)
108 + .setMaxSellQuantity(0)
109 + .setTodaySellQuantity(0)
110 + .build();
111 + }
112 + return response;
113 + })
114 + .collect(Collectors.toList());
115 + if (querySkuSellQuantityDTO.getStatus() != SkuSellQuantityStatus.ALL) {
116 + responses = responses.stream()
117 + .filter(e -> {
118 + switch (querySkuSellQuantityDTO.getStatus()) {
119 + case SOLD_OUT:
120 + return e.getMaxSellQuantity() == e.getTodaySellQuantity();
121 + case ON_SALE:
122 + return e.getMaxSellQuantity() != e.getTodaySellQuantity();
123 + default:
124 + return true;
125 + }
126 + })
127 + .collect(Collectors.toList());
128 + }
129 + final var skuList = skuServiceRpcClient.getSkusByIds(responses.stream().map(SingleSkuSellQuantityRpcResponse::getSkuId).collect(Collectors.toList()));
130 + final var skuMap = skuList.stream().collect(Collectors.toMap(SingleSkuResponse::getId, Function.identity()));
131 + final var keyword = querySkuSellQuantityDTO.getKeyword();
132 + if (keyword != null && !keyword.isEmpty()) {
133 + responses = responses.stream()
134 + .filter(e -> {
135 + var sku = skuMap.get(e.getSkuId());
136 + return sku != null && (sku.getCode().contains(keyword) || sku.getName().contains(keyword));
137 + })
138 + .collect(Collectors.toList());
139 + }
140 + final var skuSellQuantityVOS = responses.stream()
141 + .map(e -> {
142 + var sku = skuMap.get(e.getSkuId());
143 + return SkuSellQuantityVO.builder()
144 + .skuId(e.getSkuId())
145 + .skuName(sku != null ? sku.getName() : "")
146 + .skuCode(sku != null ? sku.getCode() : "")
147 + .maxSellQuantity(e.getMaxSellQuantity())
148 + .todaySellQuantity(e.getTodaySellQuantity())
149 + .soldOut(e.getMaxSellQuantity() == e.getTodaySellQuantity())
150 + .build();
151 + })
152 + .sorted(Comparator.comparing(SkuSellQuantityVO::getSkuCode))
153 + .collect(Collectors.toList());
154 + return PageUtil.subListPage(skuSellQuantityVOS, querySkuSellQuantityDTO.getPageNo(), querySkuSellQuantityDTO.getPageSize());
155 + }
156 +
157 + @Override
158 + public boolean batchSetSkuSellQuantity(int stallId, SkuSellQuantityDTO.BatchSetSkuSellQuantityDTO batchSetSkuSellQuantityDTO) {
159 + final var responses = orderServiceRpcClient.querySkuSellQuantitiesByStallAndSkuIds(LoginContextHolder.getEnterpriseId(), stallId, batchSetSkuSellQuantityDTO.getSkuIds());
160 + final var skuMap = responses.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity()));
161 + final var skuSellQuantityBOs = batchSetSkuSellQuantityDTO.getSkuIds().stream().map(skuId -> SkuSellQuantityBO.builder()
162 + .id(skuMap.get(skuId) == null ? null : skuMap.get(skuId).getId())
163 + .skuId(skuId)
164 + .maxSellQuantity(batchSetSkuSellQuantityDTO.getMaxSellQuantity())
165 + .build()
166 + ).collect(Collectors.toList());
167 + return orderServiceRpcClient.batchSaveSkuSellQuantities(LoginContextHolder.getEnterpriseId(), stallId, skuSellQuantityBOs);
168 + }
169 +
170 + @Override
171 + public List<SkuSellQuantityVO> querySkuSellQuantityBySkuIds(SkuSellQuantityDTO.QuerySkuSellQuantityBySkuIdsDTO querySkuSellQuantityBySkuIdsDTO) {
172 + final var stallId = querySkuSellQuantityBySkuIdsDTO.getStallId();
173 + final var enterpriseId = LoginContextHolder.getEnterpriseId();
174 + final var skuIds = menuService.queryMenuSkuIdsByStallId(enterpriseId, stallId);
175 + var responses = orderServiceRpcClient.querySkuSellQuantitiesByStall(enterpriseId, stallId);
176 + final var skuSellQuantityMap = responses.stream().collect(Collectors.toMap(SingleSkuSellQuantityRpcResponse::getSkuId, Function.identity()));
177 + responses = skuIds.stream()
178 + .map(skuId -> {
179 + var response = skuSellQuantityMap.get(skuId);
180 + if (response == null) {
181 + response = SingleSkuSellQuantityRpcResponse.newBuilder()
182 + .setSkuId(skuId)
183 + .setMaxSellQuantity(0)
184 + .setTodaySellQuantity(0)
185 + .build();
186 + }
187 + return response;
188 + })
189 + .collect(Collectors.toList());
190 + final var skuList = skuServiceRpcClient.getSkusByIds(responses.stream().map(SingleSkuSellQuantityRpcResponse::getSkuId).collect(Collectors.toList()));
191 + final var skuMap = skuList.stream().collect(Collectors.toMap(SingleSkuResponse::getId, Function.identity()));
192 + return responses.stream()
193 + .map(e -> {
194 + var sku = skuMap.get(e.getSkuId());
195 + return SkuSellQuantityVO.builder()
196 + .skuId(e.getSkuId())
197 + .skuName(sku != null ? sku.getName() : "")
198 + .skuCode(sku != null ? sku.getCode() : "")
199 + .maxSellQuantity(e.getMaxSellQuantity())
200 + .todaySellQuantity(e.getTodaySellQuantity())
201 + .soldOut(e.getMaxSellQuantity() == e.getTodaySellQuantity())
202 + .build();
203 + })
204 + .sorted(Comparator.comparing(SkuSellQuantityVO::getSkuCode))
205 + .collect(Collectors.toList());
206 + }
59 } 207 }
......
...@@ -33,6 +33,14 @@ service ClientCustomerOrderServiceRpc { ...@@ -33,6 +33,14 @@ service ClientCustomerOrderServiceRpc {
33 // 操作记录 33 // 操作记录
34 rpc GetOrderOperationRecordsByOrderId (GetOrderOperationRecordsByOrderIdRequest) returns (GetOrderOperationRecordsByOrderIdResponse) {} 34 rpc GetOrderOperationRecordsByOrderId (GetOrderOperationRecordsByOrderIdRequest) returns (GetOrderOperationRecordsByOrderIdResponse) {}
35 rpc BatchCreateOrderOperationRecords (BatchCreateOrderOperationRecordsRequest) returns (BatchCreateOrderOperationRecordsResponse) {} 35 rpc BatchCreateOrderOperationRecords (BatchCreateOrderOperationRecordsRequest) returns (BatchCreateOrderOperationRecordsResponse) {}
36 +
37 +
38 + // sku菜品库存
39 + rpc QuerySkuSellQuantitiesByStall(QuerySkuSellQuantitiesByStallRpcRequest) returns (QuerySkuSellQuantitiesByStallRpcResponse) {}
40 + rpc QuerySkuSellQuantitiesByStallAndSkuIds(QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest) returns (QuerySkuSellQuantitiesByStallAndSkuIdsRpcResponse) {}
41 + rpc BatchSaveSkuSellQuantities(BatchSaveSkuSellQuantitiesRpcRequest) returns (BatchSaveSkuSellQuantitiesRpcResponse) {}
42 + rpc AddSkusSellQuantities(AddSkusSellQuantitiesRpcRequest) returns (AddSkusSellQuantitiesRpcResponse) {}
43 +
36 } 44 }
37 45
38 enum OrderStatusEnum { 46 enum OrderStatusEnum {
...@@ -608,3 +616,71 @@ message BatchCreateOrderOperationRecordsResponse { ...@@ -608,3 +616,71 @@ message BatchCreateOrderOperationRecordsResponse {
608 bool isCreated = 1; 616 bool isCreated = 1;
609 repeated int32 ids = 2; 617 repeated int32 ids = 2;
610 } 618 }
619 +
620 +message SingleSkuSellQuantityRpcResponse {
621 + int32 id = 1;
622 + int32 enterpriseId = 2;
623 + int32 stallId = 3;
624 + int32 skuId = 4;
625 + int32 maxSellQuantity = 5;
626 + int32 todaySellQuantity = 6;
627 + int32 createdBy = 7;
628 + int64 createdAt = 8;
629 + int32 creationSource = 9;
630 + int32 updatedBy = 10;
631 + int64 updatedAt = 11;
632 + int32 updateSource = 12;
633 + bool isDeleted = 13;
634 +}
635 +
636 +message QuerySkuSellQuantitiesByStallRpcRequest {
637 + int32 enterpriseId = 1;
638 + int32 stallId = 2;
639 +}
640 +
641 +message QuerySkuSellQuantitiesByStallRpcResponse {
642 + repeated SingleSkuSellQuantityRpcResponse responses = 1;
643 +}
644 +
645 +message QuerySkuSellQuantitiesByStallAndSkuIdsRpcRequest {
646 + int32 enterpriseId = 1;
647 + int32 stallId = 2;
648 + repeated int32 skuIds = 3;
649 +}
650 +
651 +message QuerySkuSellQuantitiesByStallAndSkuIdsRpcResponse {
652 + repeated SingleSkuSellQuantityRpcResponse responses = 1;
653 +}
654 +
655 +message BatchSaveSkuSellQuantitiesRpcRequest {
656 + repeated SkuSellQuantityModification skuSellQuantityModifications = 1;
657 + int32 enterpriseId = 2;
658 + int32 updatedBy = 3;
659 + int32 updateSource = 4;
660 +}
661 +
662 +message SkuSellQuantityModification {
663 + int32 id = 1;
664 + int32 stallId = 2;
665 + int32 skuId = 3;
666 + int32 maxSellQuantity = 4;
667 +}
668 +
669 +message BatchSaveSkuSellQuantitiesRpcResponse {
670 + bool isSaved = 1;
671 +}
672 +
673 +message AddSkusSellQuantitiesRpcRequest {
674 + int32 enterpriseId = 1;
675 + int32 stallId = 2;
676 + repeated SkuSellQuantity skuSellQuantities = 3;
677 +}
678 +
679 +message SkuSellQuantity {
680 + int32 skuId = 1;
681 + int32 quantity = 2;
682 +}
683 +
684 +message AddSkusSellQuantitiesRpcResponse {
685 + bool isAdded = 1;
686 +}
......