diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constants/CanteenDeliveryScheduleConstants.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constants/CanteenDeliveryScheduleConstants.java new file mode 100644 index 000000000..37a29219a --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constants/CanteenDeliveryScheduleConstants.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.canteen.constants; + +/** + * 预约外送:在「预约时段开始」之前多久触发骑手派单/推送、商家提醒。 + * 分钟数来自 {@code sys_public_param}({@link #PARAM_RIDER_NOTIFY_BEFORE_MINUTES} 等),未配置则用默认值。 + */ +public final class CanteenDeliveryScheduleConstants { + + private CanteenDeliveryScheduleConstants() { + } + + /** 与 db/1019 中 public_key 一致 */ + public static final String PARAM_RIDER_NOTIFY_BEFORE_MINUTES = "CANTEEN_DELIVERY_SCHEDULED_RIDER_NOTIFY_BEFORE_MINUTES"; + public static final String PARAM_MERCHANT_NOTIFY_BEFORE_MINUTES = "CANTEEN_DELIVERY_SCHEDULED_MERCHANT_NOTIFY_BEFORE_MINUTES"; + + public static final int DEFAULT_RIDER_NOTIFY_BEFORE_MINUTES = 60; + public static final int DEFAULT_MERCHANT_NOTIFY_BEFORE_MINUTES = 60; + + /** 预约单:未到派单时间 */ + public static final String EXPECT_TYPE_SCHEDULED = "SCHEDULED"; + public static final String EXPECT_TYPE_IMMEDIATE = "IMMEDIATE"; +} diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDeliveryOrderController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDeliveryOrderController.java index 2f8546d40..6cbcae4fb 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDeliveryOrderController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDeliveryOrderController.java @@ -4,8 +4,10 @@ import com.bsd.pjcloud.canteen.dto.delivery.CanteenDeliveryOrderSyncDTO; import com.bsd.pjcloud.canteen.dto.delivery.CanteenDeliveryPhotoDTO; import com.bsd.pjcloud.canteen.push.CanteenDeliveryRiderPushPublisher; import com.bsd.pjcloud.canteen.service.CanteenDeliveryOrderService; +import com.bsd.pjcloud.canteen.entity.CanteenDeliveryOrderEntity; import com.bsd.pjcloud.canteen.vo.app.CanteenDeliveryOrderAppVO; import com.bsd.pjcloud.common.core.util.R; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -17,8 +19,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; - -import java.util.List; +import org.springdoc.core.annotations.ParameterObject; /** * 食堂外送:订单同步 + 骑手 App @@ -65,10 +66,12 @@ public class CanteenDeliveryOrderController { } @GetMapping("/app/list") - @Operation(summary = "骑手端-我的配送单", description = "tab: pending待配送 | all全部 | completed已完成 | cancelled已取消") - public R> appList(@RequestParam(defaultValue = "pending") String tab) { + @Operation(summary = "骑手端-我的配送单", + description = "tab: pending待配送 | all全部 | completed已完成 | cancelled已取消。分页参数与 MyBatis-Plus Page 一致:current(页码,默认1)、size(每页条数,默认10,最大100)。") + public R> appList(@RequestParam(defaultValue = "pending") String tab, + @ParameterObject Page page) { Long uid = SecurityUtils.getUser().getId(); - return R.ok(canteenDeliveryOrderService.listForRider(uid, tab)); + return R.ok(canteenDeliveryOrderService.pageForRider(uid, tab, page)); } @GetMapping("/app/{id}") diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/CanteenDeliveryScheduledJob.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/CanteenDeliveryScheduledJob.java new file mode 100644 index 000000000..8d0b32cfe --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/CanteenDeliveryScheduledJob.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.canteen.job; + +import com.bsd.pjcloud.canteen.service.CanteenDeliveryOrderService; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 预约外送:到达配置的「时段开始前 N 分钟」后,通知商家、向骑手派单并推送 WS。 + *

+ * XXL-JOB 管理端注册 Handler 名:{@value #HANDLER_NAME},建议 Cron 每分钟一次。 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CanteenDeliveryScheduledJob { + + public static final String HANDLER_NAME = "canteenDeliveryScheduledDispatchJobHandler"; + + private final CanteenDeliveryOrderService canteenDeliveryOrderService; + + @XxlJob(HANDLER_NAME) + public void canteenDeliveryScheduledDispatchJobHandler() { + try { + canteenDeliveryOrderService.runDueScheduledDeliveryTasks(); + XxlJobHelper.handleSuccess(); + } catch (Exception e) { + log.error("canteenDeliveryScheduledDispatchJobHandler 执行异常", e); + XxlJobHelper.handleFail(e.getMessage()); + } + } +} diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/push/CanteenDeliveryMerchantNotifyPublisher.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/push/CanteenDeliveryMerchantNotifyPublisher.java new file mode 100644 index 000000000..0cb72a961 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/push/CanteenDeliveryMerchantNotifyPublisher.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.canteen.push; + +import com.bsd.pjcloud.canteen.entity.CanteenDeliveryOrderEntity; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 预约外送单到达「通知商家」时间点时的扩展点:当前仅打日志,后续可接 MQ、站内信、商户端 WebSocket 等。 + */ +@Slf4j +@Component +public class CanteenDeliveryMerchantNotifyPublisher { + + public void publishScheduledOrderNotice(CanteenDeliveryOrderEntity order) { + if (order == null) { + return; + } + log.info( + "预约外送-商家提醒(占位实现,可扩展): deliveryOrderId={} merchantId={} sourceOrderId={} expectDate={} expectStart={} expectEnd={}", + order.getId(), + order.getMerchantId(), + order.getSourceOrderId(), + order.getExpectDeliveryDate(), + order.getExpectDeliveryStart(), + order.getExpectDeliveryEnd()); + } +} diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDeliveryOrderService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDeliveryOrderService.java index ffcf1d750..7f7788184 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDeliveryOrderService.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDeliveryOrderService.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.canteen.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.canteen.dto.delivery.CanteenDeliveryOrderSyncDTO; import com.bsd.pjcloud.canteen.dto.delivery.CanteenDeliveryPhotoDTO; @@ -7,8 +8,6 @@ import com.bsd.pjcloud.canteen.entity.CanteenDeliveryOrderEntity; import com.bsd.pjcloud.canteen.vo.app.CanteenDeliveryOrderAppVO; import com.bsd.pjcloud.common.core.util.R; -import java.util.List; - public interface CanteenDeliveryOrderService extends IService { /** @@ -20,8 +19,9 @@ public interface CanteenDeliveryOrderService extends IService listForRider(Long riderUserId, String tab); + Page pageForRider(Long riderUserId, String tab, Page page); CanteenDeliveryOrderAppVO detailForRider(Long riderUserId, Long id); diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDeliveryOrderServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDeliveryOrderServiceImpl.java index bf9952d1e..6a0951555 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDeliveryOrderServiceImpl.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDeliveryOrderServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.canteen.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysDept; @@ -305,8 +306,19 @@ public class CanteenDeliveryOrderServiceImpl extends ServiceImpl listForRider(Long riderUserId, String tab) { + public Page pageForRider(Long riderUserId, String tab, Page page) { + Page p = page != null ? page : new Page<>(1, 10); + if (p.getCurrent() < 1) { + p.setCurrent(1); + } + if (p.getSize() < 1) { + p.setSize(10); + } else if (p.getSize() > RIDER_LIST_MAX_PAGE_SIZE) { + p.setSize(RIDER_LIST_MAX_PAGE_SIZE); + } String t = StrUtil.emptyToDefault(tab, "all"); var q = Wrappers.lambdaQuery() .eq(CanteenDeliveryOrderEntity::getRiderUserId, riderUserId); @@ -319,8 +331,10 @@ public class CanteenDeliveryOrderServiceImpl extends ServiceImpl list = list(q); - return list.stream().map(this::toAppVoWithCart).toList(); + Page entityPage = page(p, q); + Page voPage = new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); + voPage.setRecords(entityPage.getRecords().stream().map(this::toAppVoWithCart).toList()); + return voPage; } @Override