From 41fa28775bab03fddcd2e88a8ec1e2029f85592c Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 29 Jul 2026 15:01:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=A2=84=E8=AE=A1=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/dto/order/HardCarDto.java | 1 + .../hard/api/dto/order/HardOrderDto.java | 1 + .../api/entity/order/HardOrderEntity.java | 4 +- .../order/HardCanteenApptTotalController.java | 2 + .../controller/order/HardOrderController.java | 4 +- .../impl/ReservationMenuQueryServiceImpl.java | 11 +++-- .../impl/VerificationRecordServiceImpl.java | 1 + .../impl/hard/HardThirdSelfZyServiceImpl.java | 2 + .../impl/order/HardAfterSaleServiceImpl.java | 3 +- .../HardOnlineCanteenStatsServiceImpl.java | 1 + .../impl/order/HardOrderServiceImpl.java | 42 +++++++++++-------- .../impl/order/HardOrderSyncServiceImpl.java | 5 +++ .../impl/third/HardThirdPayServiceImpl.java | 2 + .../mapper/order/HardOrderMapper.xml | 1 + .../ReservationMenuQueryServiceImplTest.java | 17 ++++++++ 15 files changed, 69 insertions(+), 28 deletions(-) diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java index cbda23dd..7c1ea2a2 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java @@ -28,6 +28,7 @@ public class HardCarDto extends HardCarEntity implements BaseIsIncludeTreeInterf private List mchIds; + /** 预计使用日期范围。 */ private LocalDateTime[] apptUseDateTimeList; /** diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java index 9b63da90..e7ba33ec 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java @@ -45,6 +45,7 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn private LocalDateTime[] refundTimeList; + /** 预计使用日期范围。 */ private LocalDateTime[] apptUseDateTimeList; /** 预约用餐日期下限,用于查询今天及之后的未核销预约。 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java index cbb3d767..2b48f497 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java @@ -136,9 +136,9 @@ public class HardOrderEntity extends Model { private Long apptRuleId; /** - * 预约使用时间(天) + * 预计使用日期,食堂预约订单取预约目标日期,其他订单取下单当天,精确到天 */ - @Schema(description = "预约使用时间(天)") + @Schema(description = "预计使用日期,食堂预约订单取预约目标日期,其他订单取下单当天,精确到天") private LocalDate apptUseDate; /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenApptTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenApptTotalController.java index 7453957e..1554bd6b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenApptTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenApptTotalController.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.controller.order; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.api.encrypt.annotation.crypto.ApiCryptoAes; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; @@ -46,6 +47,7 @@ public class HardCanteenApptTotalController { /* ************************************* start app start ************************************* */ @Operation(summary = "App食堂菜品预约统计", description = "App食堂菜品预约统计") + @ApiCryptoAes @PostMapping("/app/proudct-reserv-total") public R> appProductReservTotal(@ParameterObject Page page, @RequestBody HardOrderDto dto) { // 查询商户 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java index c28f3e7d..f6ae810a 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java @@ -78,7 +78,6 @@ import java.time.LocalDate; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -155,7 +154,7 @@ public class HardOrderController { @GetMapping("/app/user-appt-list") public R> userApptList(@RequestParam(required = false) List dinerUserIds) { HardOrderDto dto = new HardOrderDto(); - LocalDate today = LocalDate.now(ZoneId.of("Asia/Shanghai")); + LocalDate today = LocalDate.now(); PjcloudUser user = SecurityUtils.getUser(); dto.setUserIds(ObjectUtil.isEmpty(dinerUserIds) @@ -163,6 +162,7 @@ public class HardOrderController { : hardwareOrderService.validateReserveDinerUserIds(user.getId(), dinerUserIds)); dto.setIsFindCarList(true); dto.setIsFindApptList(true); + dto.setApptIdOrApptRuleIdNotNull(true); dto.setApptUseDateStart(today.atStartOfDay()); dto.setOrderType(HardOrderTypeEnum.RESERVE.getType()); dto.setOrderStatusCodes(List.of(HardOrderStatusEnum.PAY.getType())); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImpl.java index 29c5aa42..2d547cef 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImpl.java @@ -33,7 +33,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.time.LocalDate; -import java.time.ZoneId; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedHashMap; @@ -47,8 +46,6 @@ import java.util.TreeMap; @RequiredArgsConstructor public class ReservationMenuQueryServiceImpl implements ReservationMenuQueryService { - private static final ZoneId BUSINESS_ZONE = ZoneId.of("Asia/Shanghai"); - private final HardManagerService hardManagerService; private final HardApiService hardApiService; private final HardOrderService hardOrderService; @@ -67,7 +64,8 @@ public class ReservationMenuQueryServiceImpl implements ReservationMenuQueryServ query.setOrderType(HardOrderTypeEnum.RESERVE.getType()); query.setOrderStatusCodes(List.of(HardOrderStatusEnum.PAY.getType())); query.setRefundStatusCodes(List.of(HardRefundStatusEnum.NONE.getStatus(), HardRefundStatusEnum.REJECT.getStatus())); - query.setApptUseDateStart(LocalDate.now(BUSINESS_ZONE).atStartOfDay()); + query.setApptIdOrApptRuleIdNotNull(true); + query.setApptUseDateStart(LocalDate.now().atStartOfDay()); query.setIsFindCarList(true); query.setIsFindApptList(true); @@ -85,13 +83,14 @@ public class ReservationMenuQueryServiceImpl implements ReservationMenuQueryServ public Boolean cancel(ReservationMenuCancelDto dto, Long hardId) { HardOrderEntity order = hardOrderService.getById(dto.getOrderId()); if (order == null) throw new RuntimeException("预约订单不存在"); - if (!Objects.equals(order.getOrderType(), HardOrderTypeEnum.RESERVE.getType()) || !Objects.equals(order.getOrderStatus(), HardOrderStatusEnum.PAY.getType())) { + boolean isAppointmentOrder = order.getApptId() != null || order.getApptRuleId() != null; + if (!isAppointmentOrder || !Objects.equals(order.getOrderType(), HardOrderTypeEnum.RESERVE.getType()) || !Objects.equals(order.getOrderStatus(), HardOrderStatusEnum.PAY.getType())) { throw new RuntimeException("该预约订单当前不可核销"); } if (!isCancelableRefundStatus(order.getRefundStatus())) { throw new RuntimeException("该预约订单正在退款或已退款,不能核销"); } - if (order.getApptUseDate() == null || order.getApptUseDate().isBefore(LocalDate.now(BUSINESS_ZONE))) { + if (order.getApptUseDate() == null || order.getApptUseDate().isBefore(LocalDate.now())) { throw new RuntimeException("该预约订单已失效"); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/VerificationRecordServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/VerificationRecordServiceImpl.java index 83e37e25..c4a17493 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/VerificationRecordServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/VerificationRecordServiceImpl.java @@ -53,6 +53,7 @@ public class VerificationRecordServiceImpl implements VerificationRecordService HardOrderDto query = new HardOrderDto(); query.setHardId(hard.getId()); query.setOrderType(HardOrderTypeEnum.RESERVE.getType()); + query.setApptIdOrApptRuleIdNotNull(true); query.setOrderStatusCodes(List.of(HardOrderStatusEnum.CANCEL.getType())); // 活动核销历史上复用了预约订单类型,支付方式范围需明确排除 ACT_CANCEL。 query.setExcludeOrderPayTypeCodes(List.of(HardPayTypeEnum.ACT_CANCEL.getType())); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java index 1b530058..1b9958b1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.LocalDate; import java.time.LocalDateTime; @@ -102,6 +103,7 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { .extraPrice(0) .payPrice(totalPrice) .isOfflineOrder(YesNoEnum.NO.getCode()) + .apptUseDate(LocalDate.now()) .productDesc(subject) .walletId(wallet.getId()) .build(); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java index 90f080a8..2cb9df71 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java @@ -200,7 +200,8 @@ public class HardAfterSaleServiceImpl extends ServiceImpl countMap = baseMapper.selectList(new LambdaQueryWrapper() .select(HardOrderEntity::getUserId) .in(HardOrderEntity::getUserId, distinctUserIds) .eq(HardOrderEntity::getOrderType, HardOrderTypeEnum.RESERVE.getType()) .eq(HardOrderEntity::getOrderStatus, HardOrderStatusEnum.PAY.getType()) + .and(wrapper -> wrapper.isNotNull(HardOrderEntity::getApptId) + .or() + .isNotNull(HardOrderEntity::getApptRuleId)) .ge(HardOrderEntity::getApptUseDate, today)) .stream() .collect(Collectors.groupingBy(HardOrderEntity::getUserId, LinkedHashMap::new, Collectors.counting())); @@ -564,7 +566,8 @@ public class HardOrderServiceImpl extends ServiceImpl 3) { throw new RuntimeException("您有" + reserveCount + "笔未核销的预约订单,请先核销"); @@ -917,14 +915,9 @@ public class HardOrderServiceImpl extends ServiceImpl wrapper.isNotNull(HardOrderEntity::getApptId) + .or() + .isNotNull(HardOrderEntity::getApptRuleId)) .eq(HardOrderEntity::getApptUseDate, reservation.apptDate()) .eq(HardOrderEntity::getHourType, reservation.hourType())); if (existingCount > 0) { @@ -1293,12 +1289,12 @@ public class HardOrderServiceImpl extends ServiceImpl wrapper.isNotNull(HardOrderEntity::getApptId) + .or() + .isNotNull(HardOrderEntity::getApptRuleId)) ); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java index 8481239d..7f9d55f6 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java @@ -33,6 +33,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -197,6 +199,9 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { res.setIsOfflineOrder(YesNoEnum.YES.getCode()); res.setProductDesc(order.getProductDesc()); res.setHourType(order.getHourType()); + LocalDateTime orderTime = Optional.ofNullable(order.getCreateTime()).orElse(order.getPayTime()); + // 离线订单优先保留设备原始下单日期,旧终端未传时才使用同步当天。 + res.setApptUseDate(orderTime == null ? LocalDate.now() : orderTime.toLocalDate()); return res; } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java index 3fe30e23..1a3a809a 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java @@ -47,6 +47,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -150,6 +151,7 @@ public class HardThirdPayServiceImpl implements HardThirdPayService { .extraPrice(dto.getPrice() - orderTotalPrice) .payPrice(dto.getPrice()) .isOfflineOrder(YesNoEnum.NO.getCode()) + .apptUseDate(LocalDate.now()) .productDesc(subject) .walletId(wallet.getId()) .build(); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index 65eb1d4b..10a3fc4d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -219,6 +219,7 @@ a.merchant_type = '1' and a.sys_type = '2' and a.order_type = '2' + and (a.appt_id is not null or a.appt_rule_id is not null) and ( p.user_id = #{dto.appViewerUserId} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImplTest.java b/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImplTest.java index 1c03959f..c59e2740 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImplTest.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/test/java/com/bsd/pjcloud/hard/service/impl/ReservationMenuQueryServiceImplTest.java @@ -77,6 +77,7 @@ class ReservationMenuQueryServiceImplTest { assertEquals(200L, query.getMerchantId()); assertEquals(HardOrderTypeEnum.RESERVE.getType(), query.getOrderType()); assertEquals(List.of(HardOrderStatusEnum.PAY.getType()), query.getOrderStatusCodes()); + assertTrue(query.getApptIdOrApptRuleIdNotNull()); assertTrue(query.getIsFindCarList()); assertTrue(query.getIsFindApptList()); assertEquals("林*", result.getMaskedName()); @@ -185,6 +186,20 @@ class ReservationMenuQueryServiceImplTest { verify(hardOrderService).getById(1L); } + @Test + void cancelRejectsOrderTypeReserveWithoutAppointmentRelation() { + HardOrderEntity order = HardOrderEntity.builder() + .id(1L) + .orderType(HardOrderTypeEnum.RESERVE.getType()) + .orderStatus(HardOrderStatusEnum.PAY.getType()) + .apptUseDate(LocalDate.now().plusDays(1)) + .build(); + when(hardOrderService.getById(1L)).thenReturn(order); + + assertThrows(RuntimeException.class, () -> service.cancel(cancel(1L))); + verify(hardOrderService).getById(1L); + } + @Test void cancelUsesOnlyOrderIdAndDelegatesExistingCancellationFlow() { HardOrderEntity order = HardOrderEntity.builder() @@ -194,6 +209,7 @@ class ReservationMenuQueryServiceImplTest { .orderType(HardOrderTypeEnum.RESERVE.getType()) .orderStatus(HardOrderStatusEnum.PAY.getType()) .refundStatus(HardRefundStatusEnum.NONE.getStatus()) + .apptId(10L) .apptUseDate(LocalDate.now().plusDays(1)) .build(); when(hardOrderService.getById(1L)).thenReturn(order); @@ -215,6 +231,7 @@ class ReservationMenuQueryServiceImplTest { .orderType(HardOrderTypeEnum.RESERVE.getType()) .orderStatus(HardOrderStatusEnum.PAY.getType()) .refundStatus(HardRefundStatusEnum.APPLY.getStatus()) + .apptId(10L) .apptUseDate(LocalDate.now()) .build(); when(hardOrderService.getById(1L)).thenReturn(order);