From c6b743f9e14f2fdc7f36367ee31bbf81466cdbbf Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Fri, 5 Jun 2026 16:59:13 +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 | 16 ++-- .../constant/DealingsRecordConstant.java | 2 +- .../main/java/cc/hiver/core/dao/UserDao.java | 2 +- .../cc/hiver/core/service/UserService.java | 2 +- .../core/serviceimpl/UserServiceImpl.java | 2 +- .../cc/hiver/mall/mq/OrderAsyncConsumer.java | 26 ++++++ .../mall/planet/constant/PlanetConstant.java | 1 + .../planet/controller/PlanetController.java | 73 +++++++++++++++ .../mall/planet/entity/PlanetDrawWinner.java | 8 ++ .../planet/entity/PlanetSearchRecord.java | 10 +++ .../hiver/mall/planet/pojo/PlanetHomeVo.java | 4 + .../planet/pojo/PlanetSearchResultVo.java | 1 + .../service/PlanetAdventurePkService.java | 8 ++ .../planet/service/PlanetDrawService.java | 10 +++ .../planet/service/PlanetHuntService.java | 7 ++ .../planet/service/PlanetOperateService.java | 3 + .../impl/PlanetAdventurePkServiceImpl.java | 50 +++++++---- .../service/impl/PlanetBoxServiceImpl.java | 14 +-- .../service/impl/PlanetDrawServiceImpl.java | 87 ++++++++++++++++-- .../service/impl/PlanetHuntServiceImpl.java | 74 +++++++-------- .../impl/PlanetOperateServiceImpl.java | 90 +++++++++++++++++-- .../service/impl/PlanetServiceImpl.java | 11 +-- .../mall/quartz/MerchantSettlementTask.java | 1 + .../quartz/PlanetAdventureSettleTask.java | 51 ++++++++++- .../mybatis/MallOrderServiceImpl.java | 20 ++--- .../mybatis/MallRefundRecordServiceImpl.java | 4 +- .../mybatis/MallUserCouponServiceImpl.java | 4 +- .../src/main/resources/sql/planet.sql | 3 + 28 files changed, 477 insertions(+), 107 deletions(-) diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index 00b991c2..430b10b6 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -ÁùÔÂ 04, 2026 16:50:32 +ÁùÔÂ 05, 2026 16:39:30
  • @@ -84,7 +84,7 @@

    passTest

    -

    16:50:32 ÏÂÎç / 0.018 secs

    +

    16:39:31 ÏÂÎç / 0.017 secs

    @@ -92,9 +92,9 @@
    #test-id=1
    passTest
    -06.04.2026 16:50:32 -06.04.2026 16:50:32 -0.018 secs +06.05.2026 16:39:31 +06.05.2026 16:39:31 +0.017 secs
    @@ -104,7 +104,7 @@ Pass - 16:50:32 + 16:39:31 Test passed @@ -128,13 +128,13 @@

    Started

    -

    ÁùÔÂ 04, 2026 16:50:32

    +

    ÁùÔÂ 05, 2026 16:39:30

    Ended

    -

    ÁùÔÂ 04, 2026 16:50:32

    +

    ÁùÔÂ 05, 2026 16:39:31

    diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java index a38e443b..571472ea 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java +++ b/hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java @@ -15,7 +15,7 @@ public interface DealingsRecordConstant { /** * */ - String[] TYPE_REMARK = {"é…é€è®¢å•佣金","å”®åŽé€€æ¬¾","é…逿ޒå奖励","商家æçް","é…é€å‘˜æçް","å…å•奖励","商家结算","用户æçް"}; + String[] TYPE_REMARK = {"é…é€è®¢å•佣金","å”®åŽé€€æ¬¾","é…逿ޒå奖励","商家æçް","é…é€å‘˜æçް","å…å•奖励","商家结算","用户æçް","白嫖中奖"}; /** *交易类型:0:增加 1 æçް 2消费 3å”®åŽ diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java index 2b98532c..6fd3b5fe 100644 --- a/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java +++ b/hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java @@ -45,7 +45,7 @@ public interface UserDao extends HiverBaseDao { * @return */ @Query("select u from User u where u.mobile = ?1 and u.type = ?2 ") - User findByMobile(String mobile,Integer type); + User findByMobile(String mobile,String type); /** * 通过邮件获å–用户 diff --git a/hiver-core/src/main/java/cc/hiver/core/service/UserService.java b/hiver-core/src/main/java/cc/hiver/core/service/UserService.java index 135a44f6..20151366 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/UserService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/UserService.java @@ -35,7 +35,7 @@ public interface UserService extends HiverBaseService { */ User findByMobile(String mobile); - User findByMobile(String mobile,Integer type); + User findByMobile(String mobile,String type); /** * 通过邮件和状æ€èŽ·å–用户 diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java index 873e6cd3..d08c1f05 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java @@ -79,7 +79,7 @@ public class UserServiceImpl implements UserService { } @Override - public User findByMobile(String mobile, Integer type) { + public User findByMobile(String mobile, String type) { final User user = userDao.findByMobile(mobile,type); return userToDTO(user); } 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 74d7b64e..e63aa20e 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 @@ -7,7 +7,9 @@ import cc.hiver.core.service.WorkerService; import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; import cc.hiver.mall.dao.mapper.MallOrderMapper; import cc.hiver.mall.entity.MallDeliveryOrder; +import cc.hiver.mall.entity.MallOrder; import cc.hiver.mall.ie.service.IeMatchService; +import cc.hiver.mall.planet.hook.PlanetRewardHook; import cc.hiver.mall.pojo.dto.CreateOrderDTO; import cc.hiver.mall.serviceimpl.mybatis.MallOrderServiceImpl; import cc.hiver.mall.utils.*; @@ -74,6 +76,9 @@ public class OrderAsyncConsumer { @Autowired private IeMatchService ieMatchService; + @Autowired + private PlanetRewardHook planetRewardHook; + // 微信模æ¿é…ç½® private static final String TEMPLATE_ID = "K15zpZSHBNivouTfpW5FK1XFz8GbYAK8b9dXXOP_Ka0"; @@ -195,6 +200,7 @@ public class OrderAsyncConsumer { if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(orderId)) { userPendingOrderCacheUtil.remove(userId, orderId); rewardIeMatchQuota(userId); + rewardPlanetOrderTicket(userId, orderId, body.getString("regionId")); } } } @@ -244,4 +250,24 @@ public class OrderAsyncConsumer { log.warn("é…é€å®Œæˆå¼‚步增加i/eåŒ¹é…æœºä¼šå¤±è´¥ï¼Œä¸å½±å“异步收尾 userId={}, reason={}", userId, e.getMessage()); } } + + private void rewardPlanetOrderTicket(String userId, String orderId, String fallbackRegionId) { + if (StringUtils.isBlank(userId) || StringUtils.isBlank(orderId)) { + return; + } + try { + String regionId = fallbackRegionId; + MallOrder order = mallOrderMapper.selectById(orderId); + if (order != null) { + regionId = StringUtils.defaultIfBlank(order.getRegionId(), regionId); + } + if (StringUtils.isBlank(regionId)) { + log.warn("[白嫖星çƒ] é…é€å®Œæˆå‘券缺少商圈 orderId={}, userId={}", orderId, userId); + return; + } + planetRewardHook.onOrderFinish(userId, regionId, orderId); + } catch (Exception e) { + log.warn("[白嫖星çƒ] é…é€å®Œæˆå‘券失败,ä¸å½±å“异步收尾 orderId={}, userId={}, reason={}", orderId, userId, e.getMessage()); + } + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/constant/PlanetConstant.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/constant/PlanetConstant.java index 7fe91b4a..d18fd0d7 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/constant/PlanetConstant.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/constant/PlanetConstant.java @@ -38,6 +38,7 @@ public class PlanetConstant { public static final String TICKET_TYPE_ADVENTURE_PK_ENTRY = "adventure_pk_entry"; public static final String TICKET_TYPE_ADVENTURE_PK_REFUND = "adventure_pk_refund"; public static final String TICKET_TYPE_ADVENTURE_PK_REWARD = "adventure_pk_reward"; + public static final String TICKET_TYPE_RANK_DAILY_REWARD = "rank_daily_reward"; /** 学院助推赛 */ public static final int ADVENTURE_SESSION_RUNNING = 0; 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 969d7131..ecbba0a7 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 @@ -114,6 +114,19 @@ public class PlanetController { } } + @ApiOperation(value = "å·å–过我的追æ•记录(分页)") + @RequestMapping(value = "/hunt/raiders", method = RequestMethod.POST) + public Result huntRaiders(@RequestBody PlanetQuery query) { + if (StringUtils.isEmpty(query.getUserId())) { + return ResultUtil.error("用户idä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isEmpty(query.getRegionId())) { + return ResultUtil.error(REGION_REQUIRED); + } + return new ResultUtil<>().setData( + huntService.raiders(query.getUserId(), query.getRegionId(), query.getPageNumber(), query.getPageSize())); + } + @ApiOperation(value = "开坿¯æ—¥å®ç®±") @RequestMapping(value = "/box/open", method = RequestMethod.POST) public Result openBox(@RequestBody PlanetQuery query) { @@ -263,6 +276,20 @@ public class PlanetController { } } + @ApiOperation(value = "标记中奖记录已读") + @RequestMapping(value = "/draw/read", method = RequestMethod.POST) + public Result markWinningRead(@RequestBody PlanetQuery query) { + if (StringUtils.isEmpty(query.getRegionId())) { + return ResultUtil.error("ç¼ºå°‘å•†åœˆå‚æ•°ï¼Œä»…坿 ‡è®°æœ¬åŒºåŸŸä¸­å¥–记录"); + } + try { + drawService.markWinningRead(query.getUserId(), query.getRegionId(), query.getWinnerId()); + return ResultUtil.success("已读æˆåŠŸ"); + } catch (HiverException e) { + return ResultUtil.error(e.getMessage()); + } + } + @ApiOperation(value = "我的星çƒåˆ¸æ˜Žç»†(分页)") @RequestMapping(value = "/ticket/log", method = RequestMethod.POST) public Result ticketLog(@RequestBody PlanetQuery query) { @@ -410,6 +437,19 @@ public class PlanetController { } } + @ApiOperation(value = "å·å–过我的掠夺者记录(分页)") + @RequestMapping(value = "/search/raiders", method = RequestMethod.POST) + public Result searchRaiders(@RequestBody PlanetQuery query) { + if (StringUtils.isEmpty(query.getUserId())) { + return ResultUtil.error("用户idä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isEmpty(query.getRegionId())) { + return ResultUtil.error(REGION_REQUIRED); + } + return new ResultUtil<>().setData( + operateService.raiders(query.getUserId(), query.getRegionId(), query.getPageNumber(), query.getPageSize())); + } + @ApiOperation(value = "体力é“具列表") @RequestMapping(value = "/stamina/items", method = RequestMethod.POST) public Result staminaItems(@RequestBody PlanetQuery query) { @@ -533,6 +573,39 @@ public class PlanetController { } } + @ApiOperation(value = "æ˜Ÿçƒæ“‚å°-我的房间") + @RequestMapping(value = "/adventure/pk/myRooms", method = RequestMethod.POST) + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Result adventurePkMyRooms(@RequestBody PlanetQuery query) { + try { + return new ResultUtil<>().setData(adventurePkService.myRooms(query.getUserId(), query.getRegionId(), query.getPageNumber(), query.getPageSize())); + } catch (HiverException e) { + return ResultUtil.error(e.getMessage()); + } + } + + @ApiOperation(value = "æ˜Ÿçƒæ“‚å°-我的战绩") + @RequestMapping(value = "/adventure/pk/myRecords", method = RequestMethod.POST) + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Result adventurePkMyRecords(@RequestBody PlanetQuery query) { + try { + return new ResultUtil<>().setData(adventurePkService.myRecords(query.getUserId(), query.getRegionId(), query.getPageNumber(), query.getPageSize())); + } catch (HiverException e) { + return ResultUtil.error(e.getMessage()); + } + } + + @ApiOperation(value = "æ˜Ÿçƒæ“‚å°-热门房间") + @RequestMapping(value = "/adventure/pk/hotRooms", method = RequestMethod.POST) + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Result adventurePkHotRooms(@RequestBody PlanetQuery query) { + try { + return new ResultUtil<>().setData(adventurePkService.hotRooms(query.getUserId(), query.getRegionId(), query.getPageNumber(), query.getPageSize())); + } catch (HiverException e) { + return ResultUtil.error(e.getMessage()); + } + } + @ApiOperation(value = "åˆ›å»ºæ˜Ÿçƒæ“‚å°æˆ¿é—´") @RequestMapping(value = "/adventure/pk/create", method = RequestMethod.POST) @Transactional(propagation = Propagation.NOT_SUPPORTED) diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetDrawWinner.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetDrawWinner.java index 6ccb8669..31a5d5bc 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetDrawWinner.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetDrawWinner.java @@ -71,6 +71,14 @@ public class PlanetDrawWinner implements Serializable { @ApiModelProperty(value = "领喿—¶é—´") private Date receivedTime; + @ApiModelProperty(value = "是å¦å·²è¯»/已弹窗 0å¦ 1是") + private Integer isRead; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "已读时间") + private Date readTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "创建时间") diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetSearchRecord.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetSearchRecord.java index c60dd3b9..c7e51ac5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetSearchRecord.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetSearchRecord.java @@ -1,5 +1,6 @@ package cc.hiver.mall.planet.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -20,7 +21,15 @@ public class PlanetSearchRecord implements Serializable { @TableId private String id; private String fromUserId; + @TableField(exist = false) + private String fromUserName; + @TableField(exist = false) + private String fromAvatar; private String toUserId; + @TableField(exist = false) + private String toUserName; + @TableField(exist = false) + private String toAvatar; private String regionId; private Integer staminaCost; private Integer towerLevel; @@ -28,6 +37,7 @@ public class PlanetSearchRecord implements Serializable { private Integer countered; private Integer staminaDamage; private Integer gainTickets; + private Integer counterDropTickets; private Integer targetPublicTicketsBefore; private String message; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") 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 30e29506..19d8f4b6 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 @@ -1,5 +1,6 @@ package cc.hiver.mall.planet.pojo; +import cc.hiver.mall.planet.entity.PlanetDrawWinner; import cc.hiver.mall.planet.entity.PlanetNews; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -95,4 +96,7 @@ public class PlanetHomeVo implements Serializable { @ApiModelProperty(value = "2åˆ†é’Ÿæ¯æ—¥é—­çޝ") private Object dailyLoop; + + @ApiModelProperty(value = "首页待弹窗中奖记录") + private PlanetDrawWinner unreadWinning; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetSearchResultVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetSearchResultVo.java index 65dae450..6e6b44a5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetSearchResultVo.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetSearchResultVo.java @@ -15,6 +15,7 @@ public class PlanetSearchResultVo implements Serializable { private Boolean intercepted; private Boolean countered; private Integer gainTickets; + private Integer counterDropTickets; private Integer staminaDamage; private Integer remainStamina; private Integer remainSearchCount; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetAdventurePkService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetAdventurePkService.java index 3f3e3bac..a85f503a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetAdventurePkService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetAdventurePkService.java @@ -1,10 +1,12 @@ package cc.hiver.mall.planet.service; import cc.hiver.mall.planet.entity.PlanetAdventureChallenge; +import cc.hiver.mall.planet.entity.PlanetAdventurePkPlayer; import cc.hiver.mall.planet.entity.PlanetAdventurePkRoom; import cc.hiver.mall.planet.pojo.PlanetAdventureChallengeResultVo; import cc.hiver.mall.planet.pojo.PlanetAdventurePkHallVo; import cc.hiver.mall.planet.pojo.PlanetAdventurePkPlayVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; @@ -12,6 +14,12 @@ public interface PlanetAdventurePkService { PlanetAdventurePkHallVo hall(String userId, String regionId, Integer pageNumber, Integer pageSize); + Page myRooms(String userId, String regionId, Integer pageNumber, Integer pageSize); + + Page myRecords(String userId, String regionId, Integer pageNumber, Integer pageSize); + + Page hotRooms(String userId, String regionId, Integer pageNumber, Integer pageSize); + PlanetAdventurePkRoom createRoom(String userId, String regionId, String nickname, String avatar, String college, String roomName, Integer maxPlayers, Integer publicFlag, String password, Integer entryTickets); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetDrawService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetDrawService.java index b223e743..2bdf4024 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetDrawService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetDrawService.java @@ -57,6 +57,16 @@ public interface PlanetDrawService { */ List myWinning(String userId, String regionId); + /** + * 首页待弹窗的未读中奖记录。 + */ + PlanetDrawWinner unreadWinning(String userId, String regionId); + + /** + * 标记中奖记录已读/已弹窗。 + */ + void markWinningRead(String userId, String regionId, String winnerId); + /** * 领å–中奖奖励(校验商圈一致) */ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetHuntService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetHuntService.java index f874a317..d9213393 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetHuntService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetHuntService.java @@ -1,6 +1,8 @@ package cc.hiver.mall.planet.service; +import cc.hiver.mall.planet.entity.PlanetHuntRecord; import cc.hiver.mall.planet.pojo.PlanetHuntResultVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; /** * 白嫖星çƒ-è¿½æ•æœåŠ¡ @@ -18,4 +20,9 @@ public interface PlanetHuntService { * ä»Šæ—¥å‰©ä½™è¿½æ•æ¬¡æ•° */ int remainHunt(String userId); + + /** + * å·è¿‡æˆ‘的追æ•记录分页 + */ + Page raiders(String userId, String regionId, Integer pageNumber, Integer pageSize); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetOperateService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetOperateService.java index 0019e02f..d99d575a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetOperateService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetOperateService.java @@ -2,6 +2,7 @@ package cc.hiver.mall.planet.service; import cc.hiver.mall.planet.entity.*; import cc.hiver.mall.planet.pojo.PlanetSearchResultVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; import java.util.Map; @@ -32,6 +33,8 @@ public interface PlanetOperateService { PlanetSearchResultVo searchTarget(String userId, String regionId, String targetUserId); + Page raiders(String userId, String regionId, Integer pageNumber, Integer pageSize); + List staminaItems(String regionId); PlanetUserState buyStaminaItem(String userId, String regionId, String itemId); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetAdventurePkServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetAdventurePkServiceImpl.java index 879137ec..84c532b6 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetAdventurePkServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetAdventurePkServiceImpl.java @@ -45,30 +45,44 @@ public class PlanetAdventurePkServiceImpl implements PlanetAdventurePkService { @Override public PlanetAdventurePkHallVo hall(String userId, String regionId, Integer pageNumber, Integer pageSize) { require(userId, regionId); - long current = pageNumber == null || pageNumber < 1 ? 1 : pageNumber; - long size = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 30); PlanetAdventurePkHallVo vo = new PlanetAdventurePkHallVo(); - Page hotPage = roomMapper.selectPage(new Page<>(current, size), new LambdaQueryWrapper() - .eq(PlanetAdventurePkRoom::getRegionId, regionId) - .eq(PlanetAdventurePkRoom::getPublicFlag, 1) - .in(PlanetAdventurePkRoom::getStatus, PlanetConstant.ADVENTURE_PK_ROOM_WAITING, PlanetConstant.ADVENTURE_PK_ROOM_PLAYING) - .orderByDesc(PlanetAdventurePkRoom::getPlayerCount) - .orderByDesc(PlanetAdventurePkRoom::getCreateTime)); + Page hotPage = hotRooms(userId, regionId, pageNumber, pageSize); vo.setHotRooms(hotPage.getRecords()); vo.setHotTotal(hotPage.getTotal()); vo.setHotTotalPages(hotPage.getPages()); vo.setHotPageNumber(hotPage.getCurrent()); - vo.setMyRooms(roomMapper.selectList(new LambdaQueryWrapper() + vo.setMyRooms(myRooms(userId, regionId, 1, 8).getRecords()); + vo.setMyRecords(myRecords(userId, regionId, 1, 10).getRecords()); + return vo; + } + + @Override + public Page myRooms(String userId, String regionId, Integer pageNumber, Integer pageSize) { + require(userId, regionId); + return roomMapper.selectPage(page(pageNumber, pageSize), new LambdaQueryWrapper() .eq(PlanetAdventurePkRoom::getRegionId, regionId) .eq(PlanetAdventurePkRoom::getOwnerUserId, userId) - .orderByDesc(PlanetAdventurePkRoom::getCreateTime) - .last("limit 8"))); - vo.setMyRecords(playerMapper.selectList(new LambdaQueryWrapper() + .orderByDesc(PlanetAdventurePkRoom::getCreateTime)); + } + + @Override + public Page myRecords(String userId, String regionId, Integer pageNumber, Integer pageSize) { + require(userId, regionId); + return playerMapper.selectPage(page(pageNumber, pageSize), new LambdaQueryWrapper() .eq(PlanetAdventurePkPlayer::getRegionId, regionId) .eq(PlanetAdventurePkPlayer::getUserId, userId) - .orderByDesc(PlanetAdventurePkPlayer::getCreateTime) - .last("limit 10"))); - return vo; + .orderByDesc(PlanetAdventurePkPlayer::getCreateTime)); + } + + @Override + public Page hotRooms(String userId, String regionId, Integer pageNumber, Integer pageSize) { + require(userId, regionId); + return roomMapper.selectPage(page(pageNumber, pageSize), new LambdaQueryWrapper() + .eq(PlanetAdventurePkRoom::getRegionId, regionId) + .eq(PlanetAdventurePkRoom::getPublicFlag, 1) + .in(PlanetAdventurePkRoom::getStatus, PlanetConstant.ADVENTURE_PK_ROOM_WAITING, PlanetConstant.ADVENTURE_PK_ROOM_PLAYING) + .orderByDesc(PlanetAdventurePkRoom::getPlayerCount) + .orderByDesc(PlanetAdventurePkRoom::getCreateTime)); } @Override @@ -333,6 +347,12 @@ public class PlanetAdventurePkServiceImpl implements PlanetAdventurePkService { if (StringUtils.isEmpty(regionId)) throw new HiverException("ç¼ºå°‘å•†åœˆå‚æ•°"); } + private Page page(Integer pageNumber, Integer pageSize) { + long current = pageNumber == null || pageNumber < 1 ? 1 : pageNumber; + long size = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 30); + return new Page<>(current, size); + } + private int nz(Integer v) { return v == null ? 0 : v; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetBoxServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetBoxServiceImpl.java index 0114885d..f191408d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetBoxServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetBoxServiceImpl.java @@ -50,23 +50,13 @@ public class PlanetBoxServiceImpl implements PlanetBoxService { ticketMapper.updateById(ticket); // 抽å–奖励:加æƒéšæœº - // 1券50% / 2券22% / 5券8% / 幸è¿BUFF6% / 防护BUFF6% / åŒå€BUFF5% / 掠夺BUFF3% + // 1券50% / 2券22% final int roll = ThreadLocalRandom.current().nextInt(100); final PlanetBoxResultVo vo = new PlanetBoxResultVo(); if (roll < 50) { grantTicket(userId, regionId, 1, vo, "幸è¿å®ç®±å¼€å‡º 1 张星çƒåˆ¸"); - } else if (roll < 72) { - grantTicket(userId, regionId, 2, vo, "幸è¿å®ç®±å¼€å‡º 2 张星çƒåˆ¸"); - } else if (roll < 80) { - grantTicket(userId, regionId, 5, vo, "幸è¿å®ç®±å¼€å‡º 5 张星çƒåˆ¸"); - } else if (roll < 86) { - grantBuff(userId, regionId, PlanetConstant.BUFF_LUCKY, "å¹¸è¿æ˜Ÿè¾°", vo); - } else if (roll < 92) { - grantBuff(userId, regionId, PlanetConstant.BUFF_SHIELD, "星际防护罩", vo); - } else if (roll < 97) { - grantBuff(userId, regionId, PlanetConstant.BUFF_DOUBLE, "åŒå€èƒ½é‡", vo); } else { - grantBuff(userId, regionId, PlanetConstant.BUFF_HUNT, "追猎雷达", vo); + grantTicket(userId, regionId, 2, vo, "幸è¿å®ç®±å¼€å‡º 2 张星çƒåˆ¸"); } newsService.addNews(regionId, PlanetConstant.NEWS_BOX, 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 c573da43..ef757187 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 @@ -1,11 +1,16 @@ package cc.hiver.mall.planet.service.impl; +import cc.hiver.core.common.constant.DealingsRecordConstant; import cc.hiver.core.common.exception.HiverException; +import cc.hiver.core.entity.User; +import cc.hiver.core.service.UserService; +import cc.hiver.mall.entity.DealingsRecord; import cc.hiver.mall.planet.constant.PlanetConstant; import cc.hiver.mall.planet.entity.*; import cc.hiver.mall.planet.mapper.*; import cc.hiver.mall.planet.pojo.PlanetDailyLoopVo; import cc.hiver.mall.planet.service.*; +import cc.hiver.mall.service.mybatis.DealingsRecordService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -67,6 +72,12 @@ public class PlanetDrawServiceImpl implements PlanetDrawService { @Autowired private PlanetTaskService taskService; + @Autowired + private UserService userService; + + @Autowired + private DealingsRecordService dealingsRecordService; + /** * 抽奖功能强制按商圈隔离:缺少 regionId 直接拒ç»ï¼Œæœç»è·¨åŒºåŸŸå¼€å¥–/查询。 */ @@ -371,19 +382,84 @@ public class PlanetDrawServiceImpl implements PlanetDrawService { } @Override - public void receive(String userId, String regionId, String winnerId) { + public PlanetDrawWinner unreadWinning(String userId, String regionId) { requireRegion(regionId); - final PlanetDrawWinner winner = drawWinnerMapper.selectById(winnerId); - if (winner == null || !userId.equals(winner.getUserId()) || !regionId.equals(winner.getRegionId())) { - throw new HiverException("中奖记录ä¸å­˜åœ¨"); + if (StringUtils.isEmpty(userId)) { + return null; } + final LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(PlanetDrawWinner::getUserId, userId) + .eq(PlanetDrawWinner::getRegionId, regionId) + .and(w -> w.isNull(PlanetDrawWinner::getIsRead).or().eq(PlanetDrawWinner::getIsRead, 0)) + .orderByDesc(PlanetDrawWinner::getCreateTime) + .last("limit 1"); + return drawWinnerMapper.selectOne(qw); + } + + @Override + public void markWinningRead(String userId, String regionId, String winnerId) { + requireRegion(regionId); + final PlanetDrawWinner winner = getOwnedWinner(userId, regionId, winnerId); + if (winner.getIsRead() != null && winner.getIsRead() == 1) { + return; + } + winner.setIsRead(1); + winner.setReadTime(new Date()); + drawWinnerMapper.updateById(winner); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void receive(String userId, String regionId, String winnerId) { + requireRegion(regionId); + final PlanetDrawWinner winner = getOwnedWinner(userId, regionId, winnerId); if (winner.getIsReceived() != null && winner.getIsReceived() == 1) { throw new HiverException("已领å–,请勿é‡å¤æ“作"); } + if (winner.getRewardType() != null && winner.getRewardType() != 0) { + throw new HiverException("æš‚ä¸æ”¯æŒè¯¥å¥–励类型领å–"); + } + final BigDecimal amount = winner.getAmount() == null ? BigDecimal.ZERO : winner.getAmount(); + if (amount.compareTo(BigDecimal.ZERO) <= 0) { + throw new HiverException("中奖金é¢å¼‚常"); + } + final User user = userService.findById(userId); + if (user == null) { + throw new HiverException("用户ä¸å­˜åœ¨"); + } + user.setDepoBal((user.getDepoBal() == null ? BigDecimal.ZERO : user.getDepoBal()).add(amount)); + userService.update(user); + winner.setIsReceived(1); winner.setReceivedTime(new Date()); + winner.setIsRead(1); + if (winner.getReadTime() == null) { + winner.setReadTime(new Date()); + } drawWinnerMapper.updateById(winner); - // TODO: 现金奖励å¯åœ¨æ­¤å¯¹æŽ¥é’±åŒ…入账;优惠券奖励å¯å¯¹æŽ¥å‘券逻辑 + + DealingsRecord dealingsRecord = new DealingsRecord(); + dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[8]); + dealingsRecord.setAmount(amount); + dealingsRecord.setDealingsTime(new Date()); + dealingsRecord.setLinkId(winner.getId()); + dealingsRecord.setLinkUserId(userId); + dealingsRecord.setRegionId(regionId); + dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]); + dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]); + dealingsRecord.setCreateBy(userId); + dealingsRecordService.save(dealingsRecord); + } + + private PlanetDrawWinner getOwnedWinner(String userId, String regionId, String winnerId) { + if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(winnerId)) { + throw new HiverException("中奖记录ä¸å­˜åœ¨"); + } + final PlanetDrawWinner winner = drawWinnerMapper.selectById(winnerId); + if (winner == null || !userId.equals(winner.getUserId()) || !regionId.equals(winner.getRegionId())) { + throw new HiverException("中奖记录ä¸å­˜åœ¨"); + } + return winner; } private void saveWinner(PlanetDrawRecord record, PlanetReward reward, PlanetPoolTicket ticket, Date now) { @@ -401,6 +477,7 @@ public class PlanetDrawServiceImpl implements PlanetDrawService { winner.setAmount(reward.getAmount()); winner.setCouponId(reward.getCouponId()); winner.setIsReceived(0); + winner.setIsRead(0); winner.setCreateTime(now); drawWinnerMapper.insert(winner); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetHuntServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetHuntServiceImpl.java index 9e74ad90..ceb1f22a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetHuntServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetHuntServiceImpl.java @@ -2,18 +2,20 @@ package cc.hiver.mall.planet.service.impl; import cc.hiver.core.common.exception.HiverException; import cc.hiver.mall.planet.constant.PlanetConstant; -import cc.hiver.mall.planet.entity.PlanetBuffRecord; import cc.hiver.mall.planet.entity.PlanetHuntRecord; import cc.hiver.mall.planet.entity.PlanetTicket; +import cc.hiver.mall.planet.entity.PlanetUserState; import cc.hiver.mall.planet.mapper.PlanetHuntRecordMapper; import cc.hiver.mall.planet.pojo.PlanetHuntResultVo; import cc.hiver.mall.planet.service.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; import java.util.UUID; @@ -41,10 +43,10 @@ public class PlanetHuntServiceImpl implements PlanetHuntService { private PlanetRankService rankService; @Autowired - private PlanetBuffService buffService; + private PlanetNewsService newsService; @Autowired - private PlanetNewsService newsService; + private PlanetOperateService operateService; @Override public PlanetHuntResultVo hunt(String fromUserId, String regionId, String toUserId) { @@ -77,29 +79,31 @@ public class PlanetHuntServiceImpl implements PlanetHuntService { vo.setBountyTickets(0); vo.setTotalGain(0); - // 目标防护罩:防护BUFF 或 ä»Šæ—¥å·²è¢«è¿½æ•æˆåŠŸè¾¾ä¸Šé™ - final int targetHuntedSuccess = countTodayHuntedSuccess(toUserId, today); - final boolean shielded = buffService.hasActiveBuff(toUserId, PlanetConstant.BUFF_SHIELD) - || targetHuntedSuccess >= PlanetConstant.HUNTED_SUCCESS_LIMIT; + final PlanetUserState targetState = operateService.getOrCreateState(toUserId, regionId); String result; - if (shielded) { + if (hit(targetState.getTowerInterceptRate())) { result = PlanetConstant.HUNT_SHIELD; - vo.setMessage("目标å¯åŠ¨äº†æ˜Ÿé™…é˜²æŠ¤ç½©ï¼Œæœ¬æ¬¡è¿½æ•æœªèƒ½ç¼´èŽ·"); + final boolean countered = hit(targetState.getTowerCounterRate()); + if (countered && from.getTicketCount() != null && from.getTicketCount() > 0) { + final String sourceId = UUID.randomUUID().toString().replace("-", ""); + ticketService.deductTickets(fromUserId, regionId, 1, + PlanetConstant.TICKET_TYPE_HUNT, sourceId + "_drop", + "被" + safeName(target.getNickname()) + "防御塔å击掉è½"); + ticketService.addTicketsWithoutBuff(toUserId, target.getRegionId(), 1, + PlanetConstant.TICKET_TYPE_HUNT, sourceId + "_counter", + "防御塔å击缴获" + safeName(from.getNickname())); + vo.setMessage("目标防御塔å击æˆåŠŸï¼ä½ ä¸ä»…没å·åˆ°ï¼Œè¿˜æŽ‰è½ 1 张星çƒåˆ¸"); + } else if (countered) { + vo.setMessage("目标防御塔å击æˆåŠŸï¼ä½†ä½ æ²¡æœ‰æ˜Ÿçƒåˆ¸å¯æŽ‰è½"); + } else { + vo.setMessage("目标防御塔拦截了本次掠夺"); + } } else if (target.getTicketCount() == null || target.getTicketCount() <= 0) { result = PlanetConstant.HUNT_FAIL; vo.setMessage("目标星çƒç©ºç©ºå¦‚也,未能缴获"); } else { - // æˆåŠŸçŽ‡ï¼šåŸºç¡€ + 追æ•BUFFåŠ æˆ - double rate = BASE_SUCCESS_RATE; - final PlanetBuffRecord huntBuff = firstActiveBuff(fromUserId, PlanetConstant.BUFF_HUNT); - if (huntBuff != null && huntBuff.getEffectValue() != null) { - rate += huntBuff.getEffectValue().doubleValue(); - } - if (rate > 1) { - rate = 1; - } - final boolean success = ThreadLocalRandom.current().nextDouble() < rate; + final boolean success = ThreadLocalRandom.current().nextDouble() < BASE_SUCCESS_RATE; if (success) { result = PlanetConstant.HUNT_SUCCESS; final int gain = 1; @@ -124,10 +128,6 @@ public class PlanetHuntServiceImpl implements PlanetHuntService { vo.setTotalGain(gain + bounty); vo.setMessage("è¿½æ•æˆåŠŸï¼ç¼´èŽ· " + gain + " 张星çƒåˆ¸" + (bounty > 0 ? ",é¢å¤–获得 " + bounty + " 张悬èµåˆ¸" : "")); - // 目标被追æˆåŠŸè¾¾ä¸Šé™è‡ªåŠ¨å¼€é˜²æŠ¤ç½© - if (targetHuntedSuccess + 1 >= PlanetConstant.HUNTED_SUCCESS_LIMIT) { - buffService.grantBuff(toUserId, target.getRegionId(), PlanetConstant.BUFF_SHIELD, "hunt"); - } // 快讯 newsService.addNews(regionId, PlanetConstant.NEWS_HUNT, safeName(target.getNickname()) + " é­é‡è¿½æ•,æŸå¤± " + (gain) + " 张星çƒåˆ¸", @@ -151,28 +151,30 @@ public class PlanetHuntServiceImpl implements PlanetHuntService { return Math.max(0, PlanetConstant.HUNT_DAILY_LIMIT - used); } - private int countTodayHunts(String userId, LocalDate date) { + @Override + public Page raiders(String userId, String regionId, Integer pageNumber, Integer pageSize) { + final int num = pageNumber == null || pageNumber <= 0 ? 1 : pageNumber; + final int size = pageSize == null || pageSize <= 0 ? 10 : Math.min(pageSize, 50); final LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(PlanetHuntRecord::getFromUserId, userId) - .eq(PlanetHuntRecord::getHuntDate, date); - return huntRecordMapper.selectCount(qw).intValue(); + qw.eq(PlanetHuntRecord::getToUserId, userId) + .eq(PlanetHuntRecord::getRegionId, regionId) + .gt(PlanetHuntRecord::getGainTickets, 0) + .orderByDesc(PlanetHuntRecord::getCreateTime); + return huntRecordMapper.selectPage(new Page<>(num, size), qw); } - private int countTodayHuntedSuccess(String userId, LocalDate date) { + private int countTodayHunts(String userId, LocalDate date) { final LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(PlanetHuntRecord::getToUserId, userId) - .eq(PlanetHuntRecord::getResult, PlanetConstant.HUNT_SUCCESS) + qw.eq(PlanetHuntRecord::getFromUserId, userId) .eq(PlanetHuntRecord::getHuntDate, date); return huntRecordMapper.selectCount(qw).intValue(); } - private PlanetBuffRecord firstActiveBuff(String userId, String type) { - for (PlanetBuffRecord r : buffService.activeBuffs(userId)) { - if (type.equals(r.getType())) { - return r; - } + private boolean hit(BigDecimal rate) { + if (rate == null || rate.compareTo(BigDecimal.ZERO) <= 0) { + return false; } - return null; + return BigDecimal.valueOf(ThreadLocalRandom.current().nextDouble() * 100).compareTo(rate) < 0; } private void saveHuntRecord(PlanetTicket from, PlanetTicket target, String regionId, String result, diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetOperateServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetOperateServiceImpl.java index a63f8b07..844ca2b3 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetOperateServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetOperateServiceImpl.java @@ -9,6 +9,7 @@ import cc.hiver.mall.planet.service.PlanetNewsService; import cc.hiver.mall.planet.service.PlanetOperateService; import cc.hiver.mall.planet.service.PlanetTicketService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -78,10 +79,11 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { state.setWarehouseLevel(1); state.setWarehouseCapacity(DEFAULT_WAREHOUSE_CAPACITY); state.setWarehouseTicketCount(0); + final PlanetTowerLevelConfig towerLevel = getTowerLevel(regionId, 1); state.setTowerLevel(1); - state.setTowerInterceptRate(BigDecimal.ZERO); - state.setTowerDamage(0); - state.setTowerCounterRate(BigDecimal.ZERO); + state.setTowerInterceptRate(towerLevel == null ? BigDecimal.ZERO : towerLevel.getInterceptRate()); + state.setTowerDamage(towerLevel == null ? 0 : towerLevel.getDamage()); + state.setTowerCounterRate(towerLevel == null ? BigDecimal.ZERO : towerLevel.getCounterRate()); state.setDailySearchCount(0); state.setDailySearchGain(0); state.setDailyPlantGain(0); @@ -181,7 +183,8 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { @Override public List treeOrders(String userId, String regionId) { final LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(PlanetTreeOrder::getUserId, userId).eq(PlanetTreeOrder::getRegionId, regionId).orderByDesc(PlanetTreeOrder::getCreateTime).last("limit 20"); + qw.eq(PlanetTreeOrder::getUserId, userId).ne(PlanetTreeOrder::getStatus, PlanetConstant.TREE_STATUS_HARVESTED). + eq(PlanetTreeOrder::getRegionId, regionId).orderByDesc(PlanetTreeOrder::getCreateTime).last("limit 20"); return treeOrderMapper.selectList(qw); } @@ -296,12 +299,25 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { boolean countered = false; int damage = 0; int gain = 0; + int counterDrop = 0; final int beforePublicTickets = nullToZero(target.getTicketCount()); fromState.setStamina(nullToZero(fromState.getStamina()) - cost); if (intercepted) { countered = hit(targetState.getTowerCounterRate()); damage = countered ? nullToZero(targetState.getTowerDamage()) : Math.max(1, nullToZero(targetState.getTowerDamage()) / 2); fromState.setStamina(Math.max(0, nullToZero(fromState.getStamina()) - damage)); + if (countered) { + PlanetTicket fromTicket = ticketMapper.selectOne(new LambdaQueryWrapper() + .eq(PlanetTicket::getRegionId, regionId).eq(PlanetTicket::getUserId, userId).last("limit 1")); + if (fromTicket != null && nullToZero(fromTicket.getTicketCount()) > 0) { + counterDrop = 1; + final String dropSourceId = genId(); + ticketService.deductTickets(userId, regionId, counterDrop, PlanetConstant.TICKET_TYPE_SEARCH, + dropSourceId + "_drop", "防御塔å击掉è½"); + ticketService.addTicketsWithoutBuff(target.getUserId(), regionId, counterDrop, PlanetConstant.TICKET_TYPE_SEARCH, + dropSourceId + "_gain", "防御塔å击缴获"); + } + } } else { gain = calcSearchGain(config, beforePublicTickets, fromState); if (gain > 0) { @@ -325,8 +341,9 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { record.setCountered(countered ? 1 : 0); record.setStaminaDamage(damage); record.setGainTickets(gain); + record.setCounterDropTickets(counterDrop); record.setTargetPublicTicketsBefore(beforePublicTickets); - record.setMessage(intercepted ? "目标防御塔拦截了æ¾é¼ å®‡èˆªå‘˜" : "æœæŸ¥æˆåŠŸï¼ŒèŽ·å¾—æ˜Ÿçƒåˆ¸"); + record.setMessage(buildSearchMessage(intercepted, countered, gain, counterDrop)); record.setCreateTime(new Date()); searchRecordMapper.insert(record); if (gain > 0) { @@ -340,6 +357,7 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { vo.setIntercepted(intercepted); vo.setCountered(countered); vo.setGainTickets(gain); + vo.setCounterDropTickets(counterDrop); vo.setStaminaDamage(damage); vo.setRemainStamina(fromState.getStamina()); vo.setRemainSearchCount(Math.max(0, dailyLimit - nullToZero(fromState.getDailySearchCount()))); @@ -347,6 +365,22 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { return vo; } + @Override + public Page raiders(String userId, String regionId, Integer pageNumber, Integer pageSize) { + final int num = pageNumber == null || pageNumber <= 0 ? 1 : pageNumber; + final int size = pageSize == null || pageSize <= 0 ? 10 : Math.min(pageSize, 50); + final Page page = new Page<>(num, size); + final LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(PlanetSearchRecord::getToUserId, userId); + if (StringUtils.isNotEmpty(regionId)) { + qw.eq(PlanetSearchRecord::getRegionId, regionId); + } + qw.orderByDesc(PlanetSearchRecord::getCreateTime); + final Page result = searchRecordMapper.selectPage(page, qw); + fillSearchUserInfo(result.getRecords(), regionId); + return result; + } + @Override public List staminaItems(String regionId) { final LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); @@ -490,6 +524,52 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { return list.get(new Random().nextInt(list.size())); } + private void fillSearchUserInfo(List records, String regionId) { + if (records == null || records.isEmpty()) { + return; + } + final Map users = new HashMap<>(); + for (PlanetSearchRecord record : records) { + putTicketUser(users, record.getFromUserId(), regionId); + putTicketUser(users, record.getToUserId(), regionId); + } + for (PlanetSearchRecord record : records) { + final PlanetTicket from = users.get(record.getFromUserId()); + if (from != null) { + record.setFromUserName(from.getNickname()); + record.setFromAvatar(from.getAvatar()); + } + final PlanetTicket to = users.get(record.getToUserId()); + if (to != null) { + record.setToUserName(to.getNickname()); + record.setToAvatar(to.getAvatar()); + } + } + } + + private void putTicketUser(Map users, String userId, String regionId) { + if (StringUtils.isEmpty(userId) || users.containsKey(userId)) { + return; + } + PlanetTicket ticket = ticketMapper.selectOne(new LambdaQueryWrapper() + .eq(PlanetTicket::getRegionId, regionId) + .eq(PlanetTicket::getUserId, userId) + .last("limit 1")); + if (ticket != null) { + users.put(userId, ticket); + } + } + + private String buildSearchMessage(boolean intercepted, boolean countered, int gain, int counterDrop) { + if (intercepted && countered) { + return counterDrop > 0 ? "é˜²å¾¡å¡”å‘½ä¸­ï¼æŽ å¤ºè€…æŽ‰è½ " + counterDrop + " 张星çƒåˆ¸" : "é˜²å¾¡å¡”å‘½ä¸­ï¼æŽ å¤ºè€…ç©ºæ‰‹è€Œå½’"; + } + if (intercepted) { + return "目标防御塔拦截了æ¾é¼ å®‡èˆªå‘˜"; + } + return gain > 0 ? "æœæŸ¥æˆåŠŸï¼ŒèŽ·å¾— " + gain + " 张星çƒåˆ¸" : "æœæŸ¥æˆåŠŸï¼Œä½†ç›®æ ‡æ²¡æœ‰å¯èŽ·å¾—çš„æ˜Ÿçƒåˆ¸"; + } + private int calcSearchGain(PlanetSearchConfig config, int targetTicket, PlanetUserState fromState) { int min = config.getMinGain() == null ? 1 : config.getMinGain(); int max = config.getMaxGain() == null ? 3 : config.getMaxGain(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetServiceImpl.java index f3cae0b2..9f818e83 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetServiceImpl.java @@ -1,10 +1,8 @@ package cc.hiver.mall.planet.service.impl; import cc.hiver.mall.planet.constant.PlanetConstant; -import cc.hiver.mall.planet.entity.PlanetBuffRecord; import cc.hiver.mall.planet.entity.PlanetPool; import cc.hiver.mall.planet.entity.PlanetTicket; -import cc.hiver.mall.planet.pojo.PlanetBuffVo; import cc.hiver.mall.planet.pojo.PlanetHomeVo; import cc.hiver.mall.planet.pojo.PlanetQuery; import cc.hiver.mall.planet.pojo.PlanetRankItemVo; @@ -14,9 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.Date; -import java.util.List; /** * 白嫖星çƒ-首页èšåˆæœåŠ¡å®žçŽ° @@ -87,7 +83,7 @@ public class PlanetServiceImpl implements PlanetService { vo.setMyRankNo(rankService.userRankNo(regionId, userId)); // 我生效的BUFF - final List myBuffs = new ArrayList<>(); + /*final List myBuffs = new ArrayList<>(); for (PlanetBuffRecord r : buffService.activeBuffs(userId)) { final PlanetBuffVo bv = new PlanetBuffVo(); bv.setId(r.getBuffId()); @@ -97,7 +93,7 @@ public class PlanetServiceImpl implements PlanetService { bv.setActiveEndTime(r.getEndTime()); myBuffs.add(bv); } - vo.setMyBuffs(myBuffs); + vo.setMyBuffs(myBuffs);*/ // 儿¿å— vo.setTasks(taskService.listTasks(userId, regionId)); @@ -107,9 +103,10 @@ public class PlanetServiceImpl implements PlanetService { vo.setRankTotalPages(rankPage.getPages()); vo.setRankPageNumber(rankPage.getCurrent()); vo.setBuffShop(buffService.shopList(userId, regionId)); - vo.setNewsList(newsService.latest(regionId, 20)); + vo.setNewsList(newsService.latest(regionId, 10)); vo.setOperate(operateService.overview(userId, regionId)); vo.setDailyLoop(drawService.dailyLoop(userId, regionId)); + vo.setUnreadWinning(drawService.unreadWinning(userId, regionId)); return vo; } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java index aaa77af4..772ac5aa 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java @@ -46,6 +46,7 @@ public class MerchantSettlementTask { LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); qw.in(MallOrder::getStatus, 5, 12); qw.eq(MallOrder::getSettlementStatus, 0); + qw.ne(MallOrder::getOtherOrder, 1); List orders = mallOrderService.list(qw); for (MallOrder order : orders) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/PlanetAdventureSettleTask.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/PlanetAdventureSettleTask.java index e1472f7b..dc409d9a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/PlanetAdventureSettleTask.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/PlanetAdventureSettleTask.java @@ -1,11 +1,20 @@ package cc.hiver.mall.quartz; +import cc.hiver.mall.planet.constant.PlanetConstant; +import cc.hiver.mall.planet.entity.PlanetTicket; +import cc.hiver.mall.planet.mapper.PlanetTicketMapper; import cc.hiver.mall.planet.service.PlanetAdventureService; +import cc.hiver.mall.planet.service.PlanetTicketService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + @Slf4j @Component public class PlanetAdventureSettleTask { @@ -13,13 +22,53 @@ public class PlanetAdventureSettleTask { @Autowired private PlanetAdventureService adventureService; + @Autowired + private PlanetTicketMapper ticketMapper; + + @Autowired + private PlanetTicketService ticketService; + @Scheduled(cron = "0 30 21 * * ?") public void settleAdventureRanks() { try { int count = adventureService.settleDueRanks(); - log.info("[白嫖星çƒ] å­¦é™¢åŠ©æŽ¨èµ›ç»“ç®—å®Œæˆ count={}", count); + int rewardCount = rewardRegionTopTickets(); + log.info("[白嫖星çƒ] å­¦é™¢åŠ©æŽ¨èµ›ç»“ç®—å®Œæˆ count={}, rankRewardCount={}", count, rewardCount); } catch (Exception e) { log.error("[白嫖星çƒ] 学院助推赛结算异常: {}", e.getMessage(), e); } } + + private int rewardRegionTopTickets() { + List regionIds = ticketMapper.selectList(new LambdaQueryWrapper() + .select(PlanetTicket::getRegionId) + .isNotNull(PlanetTicket::getRegionId) + .gt(PlanetTicket::getTicketCount, 0) + .groupBy(PlanetTicket::getRegionId)).stream() + .map(PlanetTicket::getRegionId) + .collect(Collectors.toList()); + int rewarded = 0; + String rewardDate = LocalDate.now().toString(); + for (String regionId : regionIds) { + List topList = ticketMapper.selectList(new LambdaQueryWrapper() + .eq(PlanetTicket::getRegionId, regionId) + .gt(PlanetTicket::getTicketCount, 0) + .orderByDesc(PlanetTicket::getTicketCount) + .orderByDesc(PlanetTicket::getTotalTicket) + .last("limit 5")); + for (int i = 0; i < topList.size(); i++) { + PlanetTicket ticket = topList.get(i); + int rankNo = i + 1; + int reward = 6 - rankNo; + int added = ticketService.addTicketsWithoutBuff(ticket.getUserId(), regionId, reward, + PlanetConstant.TICKET_TYPE_RANK_DAILY_REWARD, + rewardDate + "_" + regionId + "_" + ticket.getUserId(), + "æ˜ŸçƒæŽ’è¡Œæ¦œç¬¬" + rankNo + "åæ¯æ—¥å¥–åŠ±"); + if (added > 0) { + rewarded++; + } + } + } + return rewarded; + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java index 4ae940ec..61ca3056 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java @@ -1752,10 +1752,10 @@ public class MallOrderServiceImpl extends ServiceImpl item.getRefundAmount()) // æå– BigDecimal é‡‘é¢ .reduce(BigDecimal.ZERO, BigDecimal::add); - wechatPayUtil.refund(mallRefundRecord.getOrderId(), totalRefund.multiply(new BigDecimal(100)).longValue(), totalRefund.multiply(new BigDecimal(100)).longValue()); + wechatPayUtil.refund(mallRefundRecord.getOrderId(), order.getTotalAmount().multiply(new BigDecimal(100)).longValue(), totalRefund.multiply(new BigDecimal(100)).longValue()); if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){ //é…é€å‘˜åŒæ„é€€æ¬¾ã€‚æ‰£æŽ‰ä½™é¢ Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); @@ -556,7 +556,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl phones = Arrays.asList(userPhones.split(",")); phones.forEach(phone -> { for(int i = 0; i < giveNum; i++){ - User user = userService.findByMobile(phone,3); + User user = userService.findByMobile(phone,"0"); if(user != null){ - this.receiveCoupon(userService.findByMobile(phone,3).getId(), couponId); + this.receiveCoupon(userService.findByMobile(phone,"0").getId(), couponId); } } }); diff --git a/hiver-modules/hiver-mall/src/main/resources/sql/planet.sql b/hiver-modules/hiver-mall/src/main/resources/sql/planet.sql index 2a84df93..0a9b82c4 100644 --- a/hiver-modules/hiver-mall/src/main/resources/sql/planet.sql +++ b/hiver-modules/hiver-mall/src/main/resources/sql/planet.sql @@ -221,6 +221,8 @@ CREATE TABLE `t_planet_draw_winner` ( `coupon_id` varchar(64) DEFAULT NULL COMMENT '优惠券id', `is_received` int DEFAULT '0' COMMENT '是å¦å·²é¢†å– 0å¦ 1是', `received_time` datetime DEFAULT NULL COMMENT '领喿—¶é—´', + `is_read` int DEFAULT '0' COMMENT '是å¦å·²è¯»/已弹窗 0å¦ 1是', + `read_time` datetime DEFAULT NULL COMMENT '已读时间', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_user` (`user_id`), @@ -396,6 +398,7 @@ CREATE TABLE `t_planet_search_record` ( `countered` int DEFAULT '0' COMMENT '是å¦å击 0å¦1是', `stamina_damage` int DEFAULT '0' COMMENT 'é¢å¤–体力伤害', `gain_tickets` int DEFAULT '0' COMMENT '获得券数', + `counter_drop_tickets` int DEFAULT '0' COMMENT '防御塔å击掉è½åˆ¸æ•°', `target_public_tickets_before` int DEFAULT '0' COMMENT 'ç›®æ ‡å¯æœæŸ¥åˆ¸å¿«ç…§', `message` varchar(255) DEFAULT NULL COMMENT '结果文案', `create_time` datetime DEFAULT NULL,