From be29111c85c73b2a92dbc9c157e78d1585296230 Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Wed, 8 Jul 2026 17:45:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=8B=BC=E5=9B=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hiver-admin/test-output/test-report.html | 14 +- .../core/serviceimpl/JPushServiceImpl.java | 55 ++- .../mall/controller/CommentController.java | 27 +- .../mall/controller/MallCouponController.java | 17 + .../mall/controller/MallOrderController.java | 35 ++ .../hiver/mall/controller/ShopController.java | 2 +- .../mall/dao/mapper/MallUserCouponMapper.java | 3 + .../java/cc/hiver/mall/entity/MallOrder.java | 4 +- .../cc/hiver/mall/entity/MallUserCoupon.java | 5 + .../cc/hiver/mall/entity/ShopTakeaway.java | 2 +- .../java/cc/hiver/mall/ie/entity/IeRoom.java | 1 + .../hiver/mall/ie/entity/IeRoomMessage.java | 3 + .../ie/service/impl/IeChatServiceImpl.java | 65 ++- .../ie/service/impl/IeMatchServiceImpl.java | 1 + .../cc/hiver/mall/ie/vo/IeMessageAckVO.java | 1 + .../cc/hiver/mall/mq/OrderAsyncConsumer.java | 1 + .../planet/controller/PlanetController.java | 18 + .../hiver/mall/planet/pojo/PlanetHomeVo.java | 4 + .../service/impl/PlanetDrawServiceImpl.java | 4 +- .../query/MallDeliveryOrderPageQuery.java | 3 + .../pojo/query/MallRefundRecordPageQuery.java | 9 + .../mall/service/HomeReminderService.java | 4 + .../service/mybatis/MallOrderService.java | 10 + .../mybatis/MallUserCouponService.java | 1 + .../serviceimpl/HomeReminderServiceImpl.java | 58 ++- .../mybatis/MallDeliveryOrderServiceImpl.java | 8 +- .../mybatis/MallOrderGroupServiceImpl.java | 8 +- .../mybatis/MallOrderServiceImpl.java | 374 ++++++++++++++++-- .../mybatis/MallRefundRecordServiceImpl.java | 8 +- .../mybatis/MallUserCouponServiceImpl.java | 10 + .../mall/utils/WorkerOrderCacheUtil.java | 9 +- .../resources/db/ie_room_has_peer_reply.sql | 2 + .../mapper/MallDeliveryOrderMapper.xml | 11 +- .../main/resources/mapper/MallOrderMapper.xml | 2 +- .../mapper/MallRefundRecordMapper.xml | 16 +- .../resources/mapper/MallUserCouponMapper.xml | 51 +++ 36 files changed, 740 insertions(+), 106 deletions(-) create mode 100644 hiver-modules/hiver-mall/src/main/resources/db/ie_room_has_peer_reply.sql diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index c18efe96..143b4939 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -ÆßÔÂ 04, 2026 18:19:53 +ÆßÔÂ 08, 2026 11:47:38
  • @@ -84,7 +84,7 @@

    passTest

    -

    18:19:54 ÏÂÎç / 0.029 secs

    +

    11:47:39 ÉÏÎç / 0.029 secs

    @@ -92,8 +92,8 @@
    #test-id=1
    passTest
    -07.04.2026 18:19:54 -07.04.2026 18:19:54 +07.08.2026 11:47:39 +07.08.2026 11:47:39 0.029 secs
    @@ -104,7 +104,7 @@ Pass - 18:19:54 + 11:47:39 Test passed @@ -128,13 +128,13 @@

    Started

    -

    ÆßÔÂ 04, 2026 18:19:53

    +

    ÆßÔÂ 08, 2026 11:47:38

    Ended

    -

    ÆßÔÂ 04, 2026 18:19:54

    +

    ÆßÔÂ 08, 2026 11:47:39

    diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/JPushServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/JPushServiceImpl.java index e93abfd7..faeb9fd2 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/JPushServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/JPushServiceImpl.java @@ -9,12 +9,21 @@ import cn.jpush.api.push.model.notification.Notification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.PreDestroy; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + @Service public class JPushServiceImpl implements JPushService { + private static final long PUSH_DELAY_SECONDS = 10L; + @Autowired private JPushClient jPushClient; + private final ScheduledExecutorService pushScheduler = Executors.newSingleThreadScheduledExecutor(); + @Autowired public JPushServiceImpl(JPushClient jPushClient) { this.jPushClient = jPushClient; @@ -23,26 +32,38 @@ public class JPushServiceImpl implements JPushService { @Override public void sendPushNotification(String registrationId, String message,String orderId) { - PushPayload payload = PushPayload.newBuilder() - .setPlatform(cn.jpush.api.push.model.Platform.all()) - .setAudience(cn.jpush.api.push.model.audience.Audience.registrationId(registrationId)) - .setNotification(Notification.alert(message)) - .setMessage(Message.newBuilder() - .setMsgContent("消æ¯å†…容") - .addExtra("custom_key", "custom_value") // é¢å¤–傿•° - .addExtra("type", "订å•通知") - .addExtra("order_id",orderId) - .addExtra("timestamp", System.currentTimeMillis()) - .build()) - .build(); + // 这里获å–的是最åŽä¸€æ¬¡ç™»å½•的设备id,如果没有登录过,那么就ä¸å‘é€è®¢å• + if(registrationId == null || registrationId.isEmpty()){ + return; + } + + pushScheduler.schedule(() -> doSendPushNotification(registrationId, message, orderId), + PUSH_DELAY_SECONDS, TimeUnit.SECONDS); + } + + private void doSendPushNotification(String registrationId, String message, String orderId) { try { - // 这里获å–的是最åŽä¸€æ¬¡ç™»å½•的设备id,如果没有登录过,那么就ä¸å‘é€è®¢å• - if(registrationId != null && !registrationId.isEmpty()){ - PushResult result = jPushClient.sendPush(payload); - System.out.println("Push result: " + result); - } + PushPayload payload = PushPayload.newBuilder() + .setPlatform(cn.jpush.api.push.model.Platform.all()) + .setAudience(cn.jpush.api.push.model.audience.Audience.registrationId(registrationId)) + .setNotification(Notification.alert(message)) + .setMessage(Message.newBuilder() + .setMsgContent("消æ¯å†…容") + .addExtra("custom_key", "custom_value") // é¢å¤–傿•° + .addExtra("type", "订å•通知") + .addExtra("order_id",orderId) + .addExtra("timestamp", System.currentTimeMillis()) + .build()) + .build(); + PushResult result = jPushClient.sendPush(payload); + System.out.println("Push result: " + result); } catch (Exception e) { e.printStackTrace(); } } + + @PreDestroy + public void destroy() { + pushScheduler.shutdown(); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java index c06a91ed..0cfb3982 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/CommentController.java @@ -88,28 +88,29 @@ public class CommentController { @ApiOperation("ä¿å­˜") public Result save( @RequestBody List comment) { comment.forEach(e -> { - if(e.getScore() == null || e.getScore().compareTo(BigDecimal.ZERO) == 0){ + e.setCreateTime(new Date()); + if(StringUtils.isEmpty(e.getParentId())){ + e.setLevel(ShopConstant.SHOP_STATUS_LOCK); + }else{ + e.setLevel(ShopConstant.SHOP_STATUS_NORMAL); + } + if((e.getScore() == null || e.getScore().compareTo(BigDecimal.ZERO) == 0) && e.getLevel() == ShopConstant.SHOP_STATUS_LOCK){ e.setScore(BigDecimal.valueOf(5)); } - if(StringUtils.isEmpty(e.getRemark())){ - if(e.getScore().equals(5)){ + if(StringUtils.isEmpty(e.getRemark()) && e.getLevel() == ShopConstant.SHOP_STATUS_LOCK){ + if (e.getScore().compareTo(BigDecimal.valueOf(5)) == 0) { e.setRemark("该用户觉得很好,给出了5星好评"); - }else if(e.getScore().equals(4)){ + } else if (e.getScore().compareTo(BigDecimal.valueOf(4)) == 0) { e.setRemark("该用户觉得还å¯ä»¥ï¼Œç»™å‡ºäº†4星评价"); - }else if(e.getScore().equals(3)){ + } else if (e.getScore().compareTo(BigDecimal.valueOf(3)) == 0) { e.setRemark("该用户觉得一般,给出了3星评价"); - }else if(e.getScore().equals(2)){ + } else if (e.getScore().compareTo(BigDecimal.valueOf(2)) == 0) { e.setRemark("该用户觉得ä¸å¥½ï¼Œç»™å‡ºäº†2星评价"); - }else{ + } else { e.setRemark("该用户觉得很ä¸å¥½ï¼Œç»™å‡ºäº†1星差评"); } } - e.setCreateTime(new Date()); - if(StringUtils.isEmpty(e.getParentId())){ - e.setLevel(ShopConstant.SHOP_STATUS_LOCK); - }else{ - e.setLevel(ShopConstant.SHOP_STATUS_NORMAL); - } + if(e.getLevel() == ShopConstant.SHOP_STATUS_LOCK){ if(e.getShopId().toUpperCase().startsWith("W")){ //æ›´æ–°é…é€å‘˜è¯„分 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java index 6970d64f..04096d5d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java @@ -69,6 +69,15 @@ public class MallCouponController { private Integer pageSize = 10; } + @Data + public static class CouponIssuePageReq { + private String couponId; + private String regionId; + private String mobile; + private Integer pageNum = 1; + private Integer pageSize = 10; + } + @PostMapping("/add") @ApiOperation(value = "添加/å‘行优惠券") public Result addCoupon(@RequestBody MallCoupon coupon) { @@ -135,6 +144,14 @@ public class MallCouponController { ); } + @PostMapping("/issueRecords") + @ApiOperation(value = "获å–ä¼˜æƒ åˆ¸å‘æ”¾è®°å½•") + public Result> issueRecords(CouponIssuePageReq query) { + return new ResultUtil>().setData( + mallUserCouponService.selectCouponIssuePage(query.getCouponId(), query.getRegionId(), query.getMobile(), query.getPageNum(), query.getPageSize()) + ); + } + @PostMapping("/addFreeOrder") @ApiOperation(value = "å¼€å¯å…å•优惠") public Result addFreeOrder(@RequestBody MallOrderFreeVO freeOrder) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java index fb614bc0..773c6886 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java @@ -174,6 +174,22 @@ public class MallOrderController { } } + /** + * 商家批é‡å‡ºé¤ + */ + @PostMapping("/shopMakeTimeBatch") + @ApiOperation(value = "商家批é‡å‡ºé¤") + public Result shopMakeTimeBatch(@RequestBody Map> params) { + try { + List orderIdList = params == null ? null : params.get("orderIdList"); + mallOrderService.shopMakeTimeBatch(orderIdList); + return ResultUtil.success("å‡ºé¤æˆåŠŸ"); + } catch (Exception e) { + log.error("批é‡å‡ºé¤å¤±è´¥: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + /** * ç”¨æˆ·ç‚¹å‡»å‡ºé¤ */ @@ -223,6 +239,25 @@ public class MallOrderController { } } + /** + * 管ç†åŽå°å¼ºåˆ¶é€€æ¬¾ + */ + @PostMapping("/adminForceRefund") + @ApiOperation(value = "管ç†åŽå°å¼ºåˆ¶é€€æ¬¾") + public Result adminForceRefundOrder(@RequestParam String orderId, + @RequestParam(required = false) Integer refundType, + @RequestParam(required = false) Integer refundTypeStatus, + @RequestParam(required = false) String reason, + @RequestParam(required = false) String pictures) { + try { + mallOrderService.adminForceRefundOrder(orderId, refundType, refundTypeStatus, reason, pictures); + return ResultUtil.success("退款æˆåŠŸ"); + } catch (Exception e) { + log.error("åŽå°å¼ºåˆ¶é€€æ¬¾å¤±è´¥: {}", e.getMessage(), e); + return ResultUtil.error(e.getMessage()); + } + } + /** * 申请退款 diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java index 91107220..2f6e80e8 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java @@ -206,7 +206,7 @@ public class ShopController { if (shop.getYearFee() != null && shop.getYearFee().compareTo(BigDecimal.ZERO) > 0) { inviteLogService.updateInviteLogIsOpen(shop.getId()); } - shopService.refreshShopCache(shop.getId(), shop.getRegionId()); + shopService.refreshShopCache(oldShop.getId(), oldShop.getRegionId()); return ResultUtil.success("编辑æˆåŠŸ"); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallUserCouponMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallUserCouponMapper.java index fed487dd..7ddfa53d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallUserCouponMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/MallUserCouponMapper.java @@ -2,8 +2,11 @@ package cc.hiver.mall.dao.mapper; import cc.hiver.mall.entity.MallUserCoupon; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @Repository public interface MallUserCouponMapper extends BaseMapper { + IPage selectCouponIssuePage(IPage page, @Param("couponId") String couponId, @Param("regionId") String regionId, @Param("mobile") String mobile); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java index 8429b6c3..405c7a48 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java @@ -36,9 +36,9 @@ public class MallOrder implements Serializable { private Integer orderType; @ApiModelProperty(value = "订å•类型 null:å¤–å– 1:快递跑腿 2:团购 3:二手") private Integer otherOrder; - @ApiModelProperty(value = "é…逿–¹å¼ 1:外å–é…é€ 2:到店自å–") + @ApiModelProperty(value = "é…逿–¹å¼ 1:外å–é…é€ 2:到店消费") private Integer deliveryType; - @ApiModelProperty(value = "订å•çŠ¶æ€ 0:待支付 1:å¾…å•†å®¶æŽ¥å• 10:å¾…æˆå›¢ 2å¾…é…é€å‘˜æŽ¥å• 3:å¾…å–è´§(é…é€)/待消费(自å–) 4:é…é€ä¸­ 5:å·²å®Œæˆ 6:已喿¶ˆ 7:å¾…å•†å®¶åŒæ„退款 8:已退款 11: å”®åŽä¸­ 12已售åŽ") + @ApiModelProperty(value = "订å•çŠ¶æ€ 0:待支付 10:å¾…æˆå›¢ 2å¾…é…é€å‘˜æŽ¥å• 3:å¾…å–è´§(é…é€)/待消费(自å–) 4:é…é€ä¸­ 5:å·²å®Œæˆ 6:已喿¶ˆ 7:å¾…åŒæ„退款 8:已退款 11: å”®åŽä¸­ 12已售åŽ") private Integer status; @ApiModelProperty(value = "ç»“ç®—çŠ¶æ€ 0 未结算 1已结算") private Integer settlementStatus; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallUserCoupon.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallUserCoupon.java index dd377559..413e9cc1 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallUserCoupon.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallUserCoupon.java @@ -1,6 +1,7 @@ package cc.hiver.mall.entity; import cc.hiver.core.base.HiverBaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -58,4 +59,8 @@ public class MallUserCoupon extends HiverBaseEntity { @ApiModelProperty(value = "学校id") private String regionId; + + @TableField(exist = false) + @ApiModelProperty(value = "领å–用户手机å·") + private String mobile; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopTakeaway.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopTakeaway.java index e84de2db..56c22f98 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopTakeaway.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopTakeaway.java @@ -39,7 +39,7 @@ import java.math.BigDecimal; @DynamicUpdate @Table(name = "t_shop_takeaway") @TableName("t_shop_takeaway") -@ApiModel(value = "店铺外å–业务é…ç½®") +@ApiModel(value = "店铺业务é…ç½®") public class ShopTakeaway extends HiverBaseEntity { private static final long serialVersionUID = 1L; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoom.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoom.java index 525c46c2..60b71fda 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoom.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoom.java @@ -17,6 +17,7 @@ public class IeRoom extends IeBaseEntity { private String mode; private String mood; private Integer status; + private Boolean hasPeerReply; private Date startTime; private Date endTime; private Date expireTime; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoomMessage.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoomMessage.java index 3f9deb91..d4ed4d94 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoomMessage.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/entity/IeRoomMessage.java @@ -36,6 +36,9 @@ public class IeRoomMessage extends IeBaseEntity { @TableField(exist = false) private Boolean mine; + @TableField(exist = false) + private Boolean hasPeerReply; + @TableField(exist = false) private String auditTip; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeChatServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeChatServiceImpl.java index 108c75e7..b99e6302 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeChatServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeChatServiceImpl.java @@ -118,7 +118,7 @@ public class IeChatServiceImpl implements IeChatService { Long receiverId = room.getUserAId().equals(senderId) ? room.getUserBId() : room.getUserAId(); assertNotBlocked(senderId, receiverId); ensureMessageVisibleRecords(room, senderId, receiverId); - assertReplyWindow(senderId, receiverId, room.getId()); + assertReplyWindow(senderId, receiverId, room); Integer messageType = dto.getMessageType() == null ? 1 : dto.getMessageType(); assertMediaCapacity(senderId, room.getId(), messageType); validateMediaPayload(messageType, dto); @@ -171,8 +171,9 @@ public class IeChatServiceImpl implements IeChatService { message.setExpireTime(cleanupTime()); message.setCreateTime(new Date()); roomMessageMapper.insert(message); + refreshPeerReplyState(room, senderId, receiverId, message); - IeMessageAckVO ack = buildAck(message, dto.getClientMsgId()); + IeMessageAckVO ack = buildAck(message, dto.getClientMsgId(), room.getHasPeerReply()); messagingTemplate.convertAndSendToUser(String.valueOf(senderId), "/queue/ie/ack", ack); if (message.getIsBlocked() == 0 && !needMediaAudit) { @@ -248,7 +249,7 @@ public class IeChatServiceImpl implements IeChatService { } } - private IeMessageAckVO buildAck(IeRoomMessage message, String clientMsgId) { + private IeMessageAckVO buildAck(IeRoomMessage message, String clientMsgId, Boolean hasPeerReply) { IeMessageAckVO ack = new IeMessageAckVO(); ack.setClientMsgId(clientMsgId == null ? message.getClientMsgId() : clientMsgId); ack.setMessageId(message.getId()); @@ -264,6 +265,7 @@ public class IeChatServiceImpl implements IeChatService { ack.setMediaSize(message.getMediaSize()); ack.setMediaFormat(message.getMediaFormat()); ack.setMediaAuditStatus(message.getMediaAuditStatus()); + ack.setHasPeerReply(Boolean.TRUE.equals(hasPeerReply)); if (message.getMessageType() != null && message.getMessageType() == 5) { ack.setPoster(message.getMediaCheckUrl()); } @@ -285,18 +287,17 @@ public class IeChatServiceImpl implements IeChatService { publishEvent(IeChatEventType.MESSAGE_DELIVERED, message.getRoomId(), message.getId(), message.getSenderId(), message.getReceiverId(), message.getRiskLevel(), JSONUtil.toJsonStr(ack)); } - private void assertReplyWindow(Long senderId, Long receiverId, Long roomId) { - Long replyCount = roomMessageMapper.selectCount(new LambdaQueryWrapper() - .eq(IeRoomMessage::getRoomId, roomId) - .eq(IeRoomMessage::getSenderId, receiverId) - .eq(IeRoomMessage::getReceiverId, senderId) - .eq(IeRoomMessage::getIsBlocked, 0) - .last("limit 1")); - if (replyCount != null && replyCount > 0) { + private Boolean roomHasPeerReply(Long roomId) { + IeRoom room = getRoom(roomId); + return room != null && Boolean.TRUE.equals(room.getHasPeerReply()); + } + + private void assertReplyWindow(Long senderId, Long receiverId, IeRoom room) { + if (Boolean.TRUE.equals(room.getHasPeerReply())) { return; } Long sentBeforeReply = roomMessageMapper.selectCount(new LambdaQueryWrapper() - .eq(IeRoomMessage::getRoomId, roomId) + .eq(IeRoomMessage::getRoomId, room.getId()) .eq(IeRoomMessage::getSenderId, senderId) .eq(IeRoomMessage::getReceiverId, receiverId) .eq(IeRoomMessage::getIsBlocked, 0)); @@ -305,6 +306,33 @@ public class IeChatServiceImpl implements IeChatService { } } + private void refreshPeerReplyState(IeRoom room, Long senderId, Long receiverId, IeRoomMessage message) { + if (room == null || Boolean.TRUE.equals(room.getHasPeerReply()) || + message == null || !Integer.valueOf(0).equals(message.getIsBlocked())) { + return; + } + Long peerMessageCount = roomMessageMapper.selectCount(new LambdaQueryWrapper() + .eq(IeRoomMessage::getRoomId, room.getId()) + .eq(IeRoomMessage::getSenderId, receiverId) + .eq(IeRoomMessage::getReceiverId, senderId) + .eq(IeRoomMessage::getIsBlocked, 0) + .last("limit 1")); + if (peerMessageCount == null || peerMessageCount <= 0) { + return; + } + Date now = new Date(); + roomMapper.update(null, new LambdaUpdateWrapper() + .eq(IeRoom::getId, room.getId()) + .and(wrapper -> wrapper.isNull(IeRoom::getHasPeerReply) + .or() + .eq(IeRoom::getHasPeerReply, false)) + .set(IeRoom::getHasPeerReply, true) + .set(IeRoom::getUpdateTime, now)); + room.setHasPeerReply(true); + room.setUpdateTime(now); + redisService.deleteCachedRoom(room.getId()); + } + private IeAuditResult auditMessage(Long roomId, Long senderId, Integer messageType, IeRoomMessageDTO dto) { String content = dto.getContent(); if (messageType != null && (messageType == 2 || messageType == 4 || messageType == 5)) { @@ -528,9 +556,10 @@ public class IeChatServiceImpl implements IeChatService { @Override public IPage pageMessages(Long userId, Long roomId, Integer pageNumber, Integer pageSize) { - assertRoomParticipant(userId, roomId); + IeRoom room = assertRoomParticipant(userId, roomId); ensureRoomVisibleRecords(userId, roomId); markRead(userId, roomId); + boolean hasPeerReply = Boolean.TRUE.equals(room.getHasPeerReply()); Page page = new Page<>(safePageNumber(pageNumber), safePageSize(pageSize)); IPage result = roomMessageMapper.selectPage(page, new LambdaQueryWrapper() .eq(IeRoomMessage::getRoomId, roomId) @@ -542,6 +571,7 @@ public class IeChatServiceImpl implements IeChatService { .orderByDesc(IeRoomMessage::getCreateTime)); for (IeRoomMessage message : result.getRecords()) { message.setMine(message.getSenderId() != null && message.getSenderId().equals(userId)); + message.setHasPeerReply(hasPeerReply); fillAuditTip(message); } return result; @@ -652,7 +682,7 @@ public class IeChatServiceImpl implements IeChatService { log.warn("i/e媒体审核已有定论,忽略本次通过结果 messageId={}", message.getId()); return; } - IeMessageAckVO ack = buildAck(message, null); + IeMessageAckVO ack = buildAck(message, null, roomHasPeerReply(message.getRoomId())); deliverMessage(message, ack); homeReminderService.incrementIeUnread(message.getReceiverId()); messagingTemplate.convertAndSendToUser(String.valueOf(message.getSenderId()), "/queue/ie/ack", ack); @@ -685,7 +715,7 @@ public class IeChatServiceImpl implements IeChatService { return; } long riskCount = redisService.increaseRisk(message.getSenderId(), 3600); - IeMessageAckVO ack = buildAck(message, null); + IeMessageAckVO ack = buildAck(message, null, roomHasPeerReply(message.getRoomId())); ack.setIsBlocked(1); messagingTemplate.convertAndSendToUser(String.valueOf(message.getSenderId()), "/queue/ie/ack", ack); publishEvent(IeChatEventType.MESSAGE_BLOCKED, message.getRoomId(), message.getId(), message.getSenderId(), message.getReceiverId(), message.getRiskLevel(), (reason == null ? "media audit failed" : reason) + ", riskCount=" + riskCount); @@ -702,7 +732,7 @@ public class IeChatServiceImpl implements IeChatService { return; } long riskCount = redisService.increaseRisk(message.getSenderId(), 3600); - IeMessageAckVO ack = buildAck(message, null); + IeMessageAckVO ack = buildAck(message, null, roomHasPeerReply(message.getRoomId())); ack.setIsBlocked(1); messagingTemplate.convertAndSendToUser(String.valueOf(message.getSenderId()), "/queue/ie/ack", ack); publishEvent(IeChatEventType.MESSAGE_BLOCKED, message.getRoomId(), message.getId(), message.getSenderId(), message.getReceiverId(), message.getRiskLevel(), reason + ", riskCount=" + riskCount); @@ -1076,7 +1106,7 @@ public class IeChatServiceImpl implements IeChatService { return room; } - private void assertRoomParticipant(Long userId, Long roomId) { + private IeRoom assertRoomParticipant(Long userId, Long roomId) { IeRoom room = getRoom(roomId); if (room == null) { throw new RuntimeException("陪伴房间ä¸å­˜åœ¨"); @@ -1084,6 +1114,7 @@ public class IeChatServiceImpl implements IeChatService { if (!room.getUserAId().equals(userId) && !room.getUserBId().equals(userId)) { throw new RuntimeException("æ— æƒè®¿é—®è¯¥é™ªä¼´æˆ¿é—´"); } + return room; } private long safePageNumber(Integer pageNumber) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeMatchServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeMatchServiceImpl.java index 325715ab..e236e78c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeMatchServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeMatchServiceImpl.java @@ -640,6 +640,7 @@ public class IeMatchServiceImpl implements IeMatchService { room.setMode(mode); room.setMood(mood); room.setStatus(IeConstants.ROOM_STATUS_ACTIVE); + room.setHasPeerReply(false); room.setStartTime(now); room.setExpireTime(longTermExpireTime(now)); room.setCreateTime(now); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/vo/IeMessageAckVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/vo/IeMessageAckVO.java index cee493e1..6b53879c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/vo/IeMessageAckVO.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/vo/IeMessageAckVO.java @@ -19,6 +19,7 @@ public class IeMessageAckVO { private String mediaFormat; private Integer mediaAuditStatus; private String poster; + private Boolean hasPeerReply; /** ç»™å‘逿–¹å±•示的失败/审核说明,接收方å¯å¿½ç•¥ */ private String auditTip; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java index 7f583722..973515d8 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java @@ -274,6 +274,7 @@ public class OrderAsyncConsumer { Integer freeOrderCount = body.getInteger("freeOrderCount"); String freeOrderNumber = body.getString("freeOrderNumber"); if (freeOrderCount != null && freeOrderCount > 0 && StringUtils.isNotBlank(regionId) && StringUtils.isNotBlank(freeOrderNumber) + && !"0".equals(freeOrderNumber) && freeOrderCacheUtil.exists(regionId)) { for (int i = 0; i < freeOrderCount; i++) { stringRedisTemplate.execute( diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/controller/PlanetController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/controller/PlanetController.java index d2b97892..b3fec28f 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/controller/PlanetController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/controller/PlanetController.java @@ -7,6 +7,7 @@ import cc.hiver.mall.planet.entity.PlanetDrawRecord; import cc.hiver.mall.planet.entity.PlanetTicket; import cc.hiver.mall.planet.pojo.*; import cc.hiver.mall.planet.service.*; +import cc.hiver.mall.service.HomeReminderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -72,6 +73,9 @@ public class PlanetController { @Autowired private PlanetAdminService adminService; + @Autowired + private HomeReminderService homeReminderService; + @ApiOperation(value = "首页èšåˆæ•°æ®") @RequestMapping(value = "/home", method = RequestMethod.POST) public Result home(@RequestBody PlanetQuery query) { @@ -83,6 +87,7 @@ public class PlanetController { } try { final PlanetHomeVo vo = planetService.home(query); + vo.setHomeReminders(homeReminderService.homeReminders(query.getUserId(), query.getRegionId())); return new ResultUtil().setData(vo); } catch (HiverException e) { return ResultUtil.error(e.getMessage()); @@ -323,6 +328,19 @@ public class PlanetController { } } + @ApiOperation(value = "标记学院排ä½èµ›å¥–励æé†’已读") + @RequestMapping(value = "/rankTop/read", method = RequestMethod.POST) + public Result markRankTopRead(@RequestBody PlanetQuery query) { + if (StringUtils.isEmpty(query.getUserId())) { + return ResultUtil.error("用户idä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isEmpty(query.getRegionId())) { + return ResultUtil.error(REGION_REQUIRED); + } + homeReminderService.clearPlanetRankTopReminder(query.getUserId(), query.getRegionId()); + return ResultUtil.success("已读æˆåŠŸ"); + } + @ApiOperation(value = "我的星çƒåˆ¸æ˜Žç»†(分页)") @RequestMapping(value = "/ticket/log", method = RequestMethod.POST) public Result ticketLog(@RequestBody PlanetQuery query) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetHomeVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetHomeVo.java index 646dc250..e6cf9999 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetHomeVo.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetHomeVo.java @@ -11,6 +11,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; /** * 白嫖星çƒ-首页èšåˆæ•°æ® @@ -103,4 +104,7 @@ public class PlanetHomeVo implements Serializable { @ApiModelProperty(value = "首页待弹窗中奖记录") private PlanetDrawWinner unreadWinning; + + @ApiModelProperty(value = "首页æé†’") + private Map homeReminders; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetDrawServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetDrawServiceImpl.java index 33b85ab7..d942f9dd 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetDrawServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetDrawServiceImpl.java @@ -456,7 +456,7 @@ public class PlanetDrawServiceImpl implements PlanetDrawService { winner.setIsRead(1); winner.setReadTime(new Date()); drawWinnerMapper.updateById(winner); - homeReminderService.clearPlanetReminders(userId, regionId); + homeReminderService.clearPlanetDrawReminder(userId, regionId); } @Override @@ -488,7 +488,7 @@ public class PlanetDrawServiceImpl implements PlanetDrawService { winner.setReadTime(new Date()); } drawWinnerMapper.updateById(winner); - homeReminderService.clearPlanetReminders(userId, regionId); + homeReminderService.clearPlanetDrawReminder(userId, regionId); DealingsRecord dealingsRecord = new DealingsRecord(); dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[8]); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java index e9ce2d5c..39edcd79 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallDeliveryOrderPageQuery.java @@ -68,6 +68,9 @@ public class MallDeliveryOrderPageQuery extends HiverBasePageQuery { @ApiModelProperty("排åºè§„则(如果有值且为deliveryFee,则按佣金é™åºï¼‰") private String order; + @ApiModelProperty("ä¼ å…¥åŽå°†é€€æ¬¾ä¸­è®¢å•置底") + private Integer returnOrderLast; + @ApiModelProperty("外喿Тå•匹é…规则数组") private java.util.List waimaiData; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java index de0e81cc..2ba83a06 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/MallRefundRecordPageQuery.java @@ -26,6 +26,15 @@ public class MallRefundRecordPageQuery extends HiverBasePageQuery { @ApiModelProperty(value = "orderId") private String orderId; + @ApiModelProperty("创建开始时间 yyyy-MM-dd HH:mm:ss") + private String startDate; + + @ApiModelProperty("åˆ›å»ºç»“æŸæ—¶é—´ yyyy-MM-dd HH:mm:ss") + private String endDate; + + @ApiModelProperty("æ˜¯å¦æŒ‰åˆ›å»ºæ—¶é—´å€’åº") + private Boolean orderDesc; + @ApiModelProperty("多ç§çŠ¶æ€æŸ¥") private List statusList; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/HomeReminderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/HomeReminderService.java index e54b5a63..a36b1531 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/HomeReminderService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/HomeReminderService.java @@ -16,5 +16,9 @@ public interface HomeReminderService { void clearPlanetReminders(String userId, String regionId); + void clearPlanetDrawReminder(String userId, String regionId); + + void clearPlanetRankTopReminder(String userId, String regionId); + Map homeReminders(String userId, String regionId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java index 0cd33d5a..3f3df6d0 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java @@ -52,6 +52,11 @@ public interface MallOrderService extends IService { */ void cancelOrder(String orderId, String userId,Integer refundType, Integer refundTypeStatus, String reason, String pictures); + /** + * 管ç†åŽå°å¼ºåˆ¶é€€æ¬¾ï¼šæ²¿ç”¨å–消订å•的业务æµè½¬ï¼Œä½†è·³è¿‡ç”¨æˆ·ç«¯çжæ€é™åˆ¶ï¼Œç›´æŽ¥é€€æ¬¾ã€‚ + */ + void adminForceRefundOrder(String orderId, Integer refundType, Integer refundTypeStatus, String reason, String pictures); + /** * ç³»ç»Ÿè‡ªåŠ¨å–æ¶ˆè¶…时未支付订å•。 */ @@ -72,6 +77,11 @@ public interface MallOrderService extends IService { */ void shopMakeTime(String orderId); + /** + * 商家批é‡å‡ºé¤ + */ + void shopMakeTimeBatch(List orderIdList); + /** * ç”¨æˆ·è¦æ±‚å‡ºé¤ */ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallUserCouponService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallUserCouponService.java index 073b2a08..7d13f75a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallUserCouponService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallUserCouponService.java @@ -17,5 +17,6 @@ public interface MallUserCouponService extends IService { boolean refundCoupon(String orderId); IPage selectPageVO(MallCouponQuery q); IPage selectUserCouponPage(String userId, String regionId, Integer pageNum, Integer pageSize); + IPage selectCouponIssuePage(String couponId, String regionId, String mobile, Integer pageNum, Integer pageSize); void send(String userPhones,Integer type,String couponId,Integer giveNum); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/HomeReminderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/HomeReminderServiceImpl.java index 42526ef8..357baa16 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/HomeReminderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/HomeReminderServiceImpl.java @@ -1,8 +1,12 @@ package cc.hiver.mall.serviceimpl; +import cc.hiver.mall.planet.entity.PlanetDrawWinner; +import cc.hiver.mall.planet.mapper.PlanetDrawWinnerMapper; import cc.hiver.mall.service.HomeReminderService; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -23,6 +27,9 @@ public class HomeReminderServiceImpl implements HomeReminderService { @Autowired private StringRedisTemplate stringRedisTemplate; + @Autowired + private PlanetDrawWinnerMapper planetDrawWinnerMapper; + @Override public void incrementIeUnread(Long userId) { if (userId == null) { @@ -89,6 +96,30 @@ public class HomeReminderServiceImpl implements HomeReminderService { stringRedisTemplate.opsForHash().delete(userKey(userId), FIELD_PLANET_DRAW, FIELD_PLANET_RANK_TOP); } + @Override + public void clearPlanetDrawReminder(String userId, String regionId) { + if (StrUtil.isBlank(userId)) { + return; + } + Object draw = stringRedisTemplate.opsForHash().get(userKey(userId), FIELD_PLANET_DRAW); + Object drawPayload = parseJson(draw); + if (regionMatched(drawPayload, regionId)) { + stringRedisTemplate.opsForHash().delete(userKey(userId), FIELD_PLANET_DRAW); + } + } + + @Override + public void clearPlanetRankTopReminder(String userId, String regionId) { + if (StrUtil.isBlank(userId)) { + return; + } + Object rankTop = stringRedisTemplate.opsForHash().get(userKey(userId), FIELD_PLANET_RANK_TOP); + Object rankTopPayload = parseJson(rankTop); + if (regionMatched(rankTopPayload, regionId)) { + stringRedisTemplate.opsForHash().delete(userKey(userId), FIELD_PLANET_RANK_TOP); + } + } + @Override public Map homeReminders(String userId, String regionId) { Map result = new HashMap<>(); @@ -104,7 +135,7 @@ public class HomeReminderServiceImpl implements HomeReminderService { Object rankTop = stringRedisTemplate.opsForHash().get(key, FIELD_PLANET_RANK_TOP); Object drawPayload = parseJson(draw); Object rankTopPayload = parseJson(rankTop); - boolean hasPlanetDraw = regionMatched(drawPayload, regionId); + boolean hasPlanetDraw = validPlanetDrawReminder(userId, regionId, drawPayload); boolean hasRankTop = regionMatched(rankTopPayload, regionId); result.put("ieUnreadCount", ieUnread); result.put("ie", ieUnread > 0); @@ -147,4 +178,29 @@ public class HomeReminderServiceImpl implements HomeReminderService { String payloadRegionId = ((cn.hutool.json.JSONObject) payload).getStr("regionId"); return StrUtil.isBlank(regionId) || StrUtil.isBlank(payloadRegionId) || regionId.equals(payloadRegionId); } + + private boolean validPlanetDrawReminder(String userId, String regionId, Object payload) { + if (!(payload instanceof JSONObject) || !regionMatched(payload, regionId)) { + return false; + } + String recordId = ((JSONObject) payload).getStr("recordId"); + if (StrUtil.isBlank(recordId)) { + stringRedisTemplate.opsForHash().delete(userKey(userId), FIELD_PLANET_DRAW); + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(PlanetDrawWinner::getId, recordId) + .eq(PlanetDrawWinner::getUserId, userId) + .and(w -> w.isNull(PlanetDrawWinner::getIsRead).or().eq(PlanetDrawWinner::getIsRead, 0)) + .last("limit 1"); + if (StrUtil.isNotBlank(regionId)) { + wrapper.eq(PlanetDrawWinner::getRegionId, regionId); + } + PlanetDrawWinner winner = planetDrawWinnerMapper.selectOne(wrapper); + if (winner == null) { + stringRedisTemplate.opsForHash().delete(userKey(userId), FIELD_PLANET_DRAW); + return false; + } + return true; + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java index 6a9f4e2d..0a31c6ef 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java @@ -14,6 +14,7 @@ import cc.hiver.mall.mq.OrderAsyncProducer; import cc.hiver.mall.pojo.dto.ShopCacheDTO; import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery; +import cc.hiver.mall.pojo.vo.MallOrderFreeVO; import cc.hiver.mall.pojo.vo.MallOrderVO; import cc.hiver.mall.service.CommentService; import cc.hiver.mall.service.ShopService; @@ -861,9 +862,10 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl 0 && StringUtils.isNotBlank(delivery.getRegionId()) && freeOrderCacheUtil.exists(delivery.getRegionId())) { + MallOrderFreeVO freeOrder = freeOrderCacheUtil.get(delivery.getRegionId()); + if (freeOrderCount > 0 && freeOrder != null && freeOrder.getOrderNumber() != null && freeOrder.getOrderNumber() > 0) { params.put("freeOrderCount", freeOrderCount); - params.put("freeOrderNumber", String.valueOf(freeOrderCacheUtil.get(delivery.getRegionId()).getOrderNumber())); + params.put("freeOrderNumber", String.valueOf(freeOrder.getOrderNumber())); } Runnable sendTask = () -> orderAsyncProducer.sendWorkerCompleteAfterCommit(params); if (TransactionSynchronizationManager.isSynchronizationActive()) { @@ -1258,7 +1260,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl ouw = new LambdaUpdateWrapper<>(); //代表该拼团å­è®¢å•订å•选择到店 if(targetStatus == 3){ - String latestSeq = String.format("%s%s", - LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE), + String latestSeq = String.format("%s-%s", + LocalDate.now().format(DateTimeFormatter.ofPattern("MMdd")), merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2)); ouw.eq(MallOrder::getId, order.getId()) .eq(MallOrder::getStatus, ORDER_STATUS_WAIT_GROUP) @@ -480,6 +480,8 @@ public class MallOrderGroupServiceImpl extends ServiceImpl uw = new LambdaUpdateWrapper<>(); uw.eq(MallOrder::getId, orderId) @@ -1261,6 +1268,231 @@ public class MallOrderServiceImpl extends ServiceImpl guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, group.getId()) + .set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL) + .set(MallOrderGroup::getGroupOrderIds, ""); + mallOrderGroupMapper.update(null, guw); + return; + } + + if (order.getStatus() == STATUS_WAIT_GROUP) { + if (group.getCurrentMembers() <= 1) { + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, group.getId()) + .set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL) + .set(MallOrderGroup::getCurrentMembers, 0); + mallOrderGroupMapper.update(null, guw); + shopGroupOrderCacheUtil.remove(group.getShopId(), group.getId()); + if(order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){ + adminForceCancelDeliveryOrderByOrderId(order.getId()); + } + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消拼团退款", reason)); + restoreStock(order.getId()); + } else { + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消拼团退款", reason)); + restoreStock(order.getId()); + String remainingIds = removeOrderIdStr(group.getGroupOrderIds(), order.getId()); + if (isFace2Face && order.getDeliveryType() != null + && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) { + if (StringUtils.isNotBlank(remainingIds)) { + List memberOrderIds = Arrays.stream(remainingIds.split(",")) + .map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList()); + for (String memberOrderId : memberOrderIds) { + MallOrder memberOrder = getById(memberOrderId); + if (memberOrder != null && memberOrder.getStatus() != STATUS_CANCELLED + && memberOrder.getStatus() != STATUS_REFUNDED) { + autoRefund(memberOrder, appendCancelReason("åŽå°å¼ºåˆ¶å–消é¢å¯¹é¢å›¢æ‹¼å›¢é€€æ¬¾", reason)); + restoreStock(memberOrderId); + } + } + } + adminForceCancelDeliveryOrderByOrderId(order.getId()); + + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, group.getId()) + .set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL) + .set(MallOrderGroup::getGroupOrderIds, ""); + mallOrderGroupMapper.update(null, guw); + return; + }else{ + if(order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){ + adminForceCancelDeliveryOrderByOrderId(order.getId()); + } + } + transferGroupHead(group, order.getId(), remainingIds, true); + } + return; + } + + adminHandlePostGroupCancel(order, group, refundType, refundTypeStatus, reason, pictures); + } + + private void adminHandleGroupMemberCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus, String reason, String pictures) { + if (order.getStatus() == STATUS_WAIT_PAY) { + updateOrderStatus(order.getId(), STATUS_CANCELLED); + mallUserCouponService.refundCoupon(order.getId()); + userPendingOrderCacheUtil.remove(order.getUserId(), order.getId()); + if(order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){ + adminForceCancelDeliveryOrderByOrderId(order.getId()); + } + String remainingIds = removeOrderIdStr(group.getGroupOrderIds(), order.getId()); + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, group.getId()) + .set(MallOrderGroup::getGroupOrderIds, remainingIds); + mallOrderGroupMapper.update(null, guw); + return; + } + + if (order.getStatus() == STATUS_WAIT_GROUP) { + if(order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){ + adminForceCancelDeliveryOrderByOrderId(order.getId()); + } + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消拼团退款", reason)); + restoreStock(order.getId()); + String remainingIds = removeOrderIdStr(group.getGroupOrderIds(), order.getId()); + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, group.getId()) + .set(MallOrderGroup::getCurrentMembers, Math.max(group.getCurrentMembers() - 1, 0)) + .set(MallOrderGroup::getGroupOrderIds, remainingIds); + mallOrderGroupMapper.update(null, guw); + group.setCurrentMembers(Math.max(group.getCurrentMembers() - 1, 0)); + shopGroupOrderCacheUtil.update(group.getShopId(), group); + return; + } + + adminHandlePostGroupCancel(order, group, refundType, refundTypeStatus, reason, pictures); + } + + private void adminHandlePostGroupCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus, String reason, String pictures) { + boolean isFace2Face = (order.getOrderType() == ORDER_TYPE_FACETOFACE); + boolean isHead = order.getId().equals(group.getHeadOrderId()); + + if (isFace2Face && order.getDeliveryType() != null + && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) { + if (!isHead) { + throw new RuntimeException("é¢å¯¹é¢é…é€å›¢åªæœ‰å›¢é•¿å¯ä»¥å–消订å•"); + } + adminHandleFace2FaceDeliveryCancel(order, group, refundType, refundTypeStatus, reason, pictures); + return; + } + + if (order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) { + MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId()); + adminForceCancelDeliveryOrderByOrderId(order.getId()); + adminRemoveDeliveryOrderCache(delivery); + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消订å•退款", reason)); + restoreStock(order.getId()); + } else { + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消订å•退款", reason)); + restoreStock(order.getId()); + } + } + + private void adminHandleFace2FaceDeliveryCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus, String reason, String pictures) { + MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId()); + + List allOrderIds = Arrays.stream(group.getGroupOrderIds().split(",")) + .map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toList()); + for (String oid : allOrderIds) { + MallOrder subOrder = getById(oid); + if (subOrder != null && subOrder.getStatus() != STATUS_CANCELLED + && subOrder.getStatus() != STATUS_REFUNDED) { + subOrder.setGroupOrderIds(group.getGroupOrderIds()); + autoRefund(subOrder, appendCancelReason("åŽå°å¼ºåˆ¶å–消é¢å¯¹é¢å›¢è®¢å•退款", reason)); + restoreStock(oid); + } + } + adminForceCancelDeliveryOrderByOrderId(order.getId()); + adminRemoveDeliveryOrderCache(delivery); + + LambdaUpdateWrapper guw = new LambdaUpdateWrapper<>(); + guw.eq(MallOrderGroup::getId, group.getId()) + .set(MallOrderGroup::getStatus, GROUP_STATUS_FAIL); + mallOrderGroupMapper.update(null, guw); + } + + private void adminHandleDirectCancel(MallOrder order,Integer refundType,Integer refundTypeStatus, String reason, String pictures) { + if (order.getStatus() == STATUS_WAIT_PAY) { + updateOrderStatus(order.getId(), STATUS_CANCELLED); + mallUserCouponService.refundCoupon(order.getId()); + userPendingOrderCacheUtil.remove(order.getUserId(), order.getId()); + if(order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){ + adminForceCancelDeliveryOrderByOrderId(order.getId()); + } + return; + } + + if (order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) { + MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId()); + adminForceCancelDeliveryOrderByOrderId(order.getId()); + adminRemoveDeliveryOrderCache(delivery); + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消订å•退款", reason)); + restoreStock(order.getId()); + } else { + autoRefund(order, appendCancelReason("åŽå°å¼ºåˆ¶å–消订å•退款", reason)); + restoreStock(order.getId()); + } + } + + private void adminForceCancelDeliveryOrderByOrderId(String orderId) { + MallDeliveryOrder delivery = findDeliveryByOrderId(orderId); + LambdaUpdateWrapper duw = new LambdaUpdateWrapper<>(); + duw.eq(MallDeliveryOrder::getOrderId, orderId) + .set(MallDeliveryOrder::getStatus, 4); + mallDeliveryOrderMapper.update(null, duw); + adminRemoveDeliveryOrderCache(delivery); + } + + private void adminRemoveDeliveryOrderCache(MallDeliveryOrder delivery) { + if (delivery == null) { + return; + } + if (StringUtils.isNotBlank(delivery.getRegionId())) { + waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId()); + } + if (StringUtils.isNotBlank(delivery.getWorkerId())) { + workerOrderCacheUtil.remove(delivery.getWorkerId(), delivery.getId()); + } + } + @Override @Transactional(rollbackFor = Exception.class) public void applyRefund(String orderId, String userId, String reason, BigDecimal amount,Integer refundType,Integer refundTypeStatus) { @@ -1292,6 +1524,24 @@ public class MallOrderServiceImpl extends ServiceImpl orderIdList) { + if (orderIdList == null || orderIdList.isEmpty()) { + throw new RuntimeException("订å•列表ä¸èƒ½ä¸ºç©º"); + } + List ids = orderIdList.stream() + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + if (ids.isEmpty()) { + throw new RuntimeException("订å•列表ä¸èƒ½ä¸ºç©º"); + } + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.in(MallOrder::getId, ids).set(MallOrder::getShopMakeTime, new Date()); + this.update(uw); + } + //自å–订å•用户点击立å³å‡ºé¤ @Override @Transactional(rollbackFor = Exception.class) @@ -1349,11 +1599,12 @@ public class MallOrderServiceImpl extends ServiceImpl 0){ stringRedisTemplate.execute( redisLuaScripts.getIncrementScript(), Arrays.asList("free_order:count:" + order.getRegionId(), "free_order:flag:" + order.getRegionId()), // 两个 key:计数器和å…å•开关 - String.valueOf(freeOrderCacheUtil.get(order.getRegionId()).getOrderNumber()) + String.valueOf(freeOrder.getOrderNumber()) ); } } @@ -1555,10 +1806,21 @@ public class MallOrderServiceImpl extends ServiceImpl orderIds = records.stream() .map(MallOrderVO::getId) .collect(java.util.stream.Collectors.toList()); + List faceDeliveryOrderIds = records.stream() + .filter(order -> Objects.equals(order.getOrderType(), ORDER_TYPE_FACETOFACE) + && Objects.equals(order.getDeliveryType(), DELIVERY_TYPE_EXPRESS)) + .map(MallOrderVO::getId) + .collect(java.util.stream.Collectors.toList()); + java.util.Set faceDeliveryOrderIdSet = new java.util.HashSet<>(faceDeliveryOrderIds); + List normalDeliveryOrderIds = orderIds.stream() + .filter(orderId -> !faceDeliveryOrderIdSet.contains(orderId)) + .collect(java.util.stream.Collectors.toList()); // 2. 一次 IN æŸ¥è¯¢æ‰€æœ‰å•†å“æ˜Žç»† List allGoods = mallOrderGoodsMapper.selectPagesByOrderIds(orderIds); - List allDeliveryOrders = mallDeliveryOrderMapper.selectByOrderIds(orderIds); + List allDeliveryOrders = normalDeliveryOrderIds.isEmpty() + ? java.util.Collections.emptyList() + : mallDeliveryOrderMapper.selectByOrderIds(normalDeliveryOrderIds); if (allGoods == null) { allGoods = java.util.Collections.emptyList(); } @@ -1576,6 +1838,60 @@ public class MallOrderServiceImpl extends ServiceImpl delivery, (first, second) -> first )); + if (!faceDeliveryOrderIds.isEmpty()) { + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + groupQuery.and(wrapper -> { + boolean first = true; + for (String orderId : faceDeliveryOrderIds) { + if (!first) { + wrapper.or(); + } + wrapper.eq(MallOrderGroup::getHeadOrderId, orderId) + .or() + .apply("FIND_IN_SET({0}, group_order_ids)", orderId); + first = false; + } + }); + List faceGroups = mallOrderGroupMapper.selectList(groupQuery); + if (faceGroups != null && !faceGroups.isEmpty()) { + List groupIds = faceGroups.stream() + .map(MallOrderGroup::getId) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(java.util.stream.Collectors.toList()); + if (!groupIds.isEmpty()) { + LambdaQueryWrapper deliveryQuery = new LambdaQueryWrapper<>(); + deliveryQuery.in(MallDeliveryOrder::getGroupId, groupIds); + List faceDeliveryOrders = mallDeliveryOrderMapper.selectList(deliveryQuery); + java.util.Map groupDeliveryMap = faceDeliveryOrders == null + ? java.util.Collections.emptyMap() + : faceDeliveryOrders.stream() + .filter(delivery -> StringUtils.isNotBlank(delivery.getGroupId())) + .collect(java.util.stream.Collectors.toMap( + MallDeliveryOrder::getGroupId, + delivery -> delivery, + (first, second) -> first + )); + for (MallOrderGroup group : faceGroups) { + MallDeliveryOrder delivery = groupDeliveryMap.get(group.getId()); + if (delivery == null) { + continue; + } + if (faceDeliveryOrderIdSet.contains(group.getHeadOrderId())) { + deliveryMap.put(group.getHeadOrderId(), delivery); + } + if (StringUtils.isNotBlank(group.getGroupOrderIds())) { + for (String groupOrderId : group.getGroupOrderIds().split(",")) { + String orderId = groupOrderId.trim(); + if (faceDeliveryOrderIdSet.contains(orderId)) { + deliveryMap.put(orderId, delivery); + } + } + } + } + } + } + } // 4. 组装到æ¯ä¸ª VO for (MallOrderVO vo : records) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java index 2aaa067b..1a682588 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java @@ -180,10 +180,10 @@ public class MallRefundRecordServiceImpl extends ServiceImpl 0){ + /*if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() .subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.UP)); - } + }*/ if(mallRefundRecord.getRefundAmount().compareTo(order.getTotalAmount()) > 0){ mallRefundRecord.setRefundAmount(order.getTotalAmount()); } @@ -200,10 +200,10 @@ public class MallRefundRecordServiceImpl extends ServiceImpl 0){ + /*if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() .subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.UP)); - } + }*/ //订å•金é¢ä¼˜æƒ åŽ å˜æˆ0.01åŽé€€æ¬¾å˜æˆ0.01 if(order.getTotalAmount().compareTo(new BigDecimal("0.01")) == 0){ mallRefundRecord.setRefundAmount(BigDecimal.valueOf(0.01)); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java index 3880de31..33d90d49 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java @@ -155,6 +155,16 @@ public class MallUserCouponServiceImpl extends ServiceImpl(current, size), qw); } + @Override + public IPage selectCouponIssuePage(String couponId, String regionId, String mobile, Integer pageNum, Integer pageSize) { + if (StringUtils.isEmpty(couponId)) { + throw new HiverException("优惠券ä¸èƒ½ä¸ºç©º"); + } + int current = pageNum == null || pageNum < 1 ? 1 : pageNum; + int size = pageSize == null || pageSize < 1 ? 10 : pageSize; + return this.baseMapper.selectCouponIssuePage(new Page<>(current, size), couponId, regionId, mobile); + } + @Override public void send(String userPhones, Integer type,String couponId,Integer giveNum) { //ç²¾å‡†å‘æ”¾ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerOrderCacheUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerOrderCacheUtil.java index 15398caf..5f7d3ad0 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerOrderCacheUtil.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WorkerOrderCacheUtil.java @@ -232,8 +232,13 @@ public class WorkerOrderCacheUtil { return true; }) .collect(Collectors.toList()); - filteredList.sort(Comparator.comparing(MallDeliveryOrder::getMustFinishTime, - Comparator.nullsLast(Comparator.naturalOrder()))); + Comparator orderComparator = Comparator.comparing(MallDeliveryOrder::getMustFinishTime, + Comparator.nullsLast(Comparator.naturalOrder())); + if (q.getReturnOrderLast() != null) { + orderComparator = Comparator.comparing((MallDeliveryOrder order) -> + Integer.valueOf(1).equals(order.getIsReturn()) ? 1 : 0).thenComparing(orderComparator); + } + filteredList.sort(orderComparator); // 5. 内存分页 // åˆå§‹åŒ–分页对象 diff --git a/hiver-modules/hiver-mall/src/main/resources/db/ie_room_has_peer_reply.sql b/hiver-modules/hiver-mall/src/main/resources/db/ie_room_has_peer_reply.sql new file mode 100644 index 00000000..aa7b404c --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/resources/db/ie_room_has_peer_reply.sql @@ -0,0 +1,2 @@ +ALTER TABLE ie_room + ADD COLUMN has_peer_reply TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'åŒæ–¹æ˜¯å¦å·²ç»äº’相回å¤è¿‡'; diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml index da5545c6..3a1593e2 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml @@ -267,7 +267,12 @@ AND d.transfer_arrive_time IS NULL - ORDER BY (CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC + ORDER BY + + (CASE WHEN d.is_return = 1 THEN 1 ELSE 0 END) ASC, + + (CASE WHEN d.must_finish_time IS NULL THEN 1 ELSE 0 END) ASC, + d.must_finish_time ASC,d.delivery_fee DESC diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml index fe539fb1..735fc09e 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml @@ -33,6 +33,12 @@ AND region_id = #{q.regionId} + + AND create_time >= #{q.startDate} + + + AND create_time <= #{q.endDate} + AND status = #{q.status} @@ -43,7 +49,15 @@ - ORDER BY create_time ASC + ORDER BY create_time + + + DESC + + + ASC + + diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/MallUserCouponMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/MallUserCouponMapper.xml index e8917c05..f542bc86 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/MallUserCouponMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/MallUserCouponMapper.xml @@ -2,4 +2,55 @@ + + + + + + + + + + + + + + + + + + + +