Browse Source

对接拼团数据1

master
wangfukang 14 hours ago
parent
commit
c6b743f9e1
  1. 16
      hiver-admin/test-output/test-report.html
  2. 2
      hiver-core/src/main/java/cc/hiver/core/common/constant/DealingsRecordConstant.java
  3. 2
      hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java
  4. 2
      hiver-core/src/main/java/cc/hiver/core/service/UserService.java
  5. 2
      hiver-core/src/main/java/cc/hiver/core/serviceimpl/UserServiceImpl.java
  6. 26
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java
  7. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/constant/PlanetConstant.java
  8. 73
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/controller/PlanetController.java
  9. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetDrawWinner.java
  10. 10
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/entity/PlanetSearchRecord.java
  11. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetHomeVo.java
  12. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/pojo/PlanetSearchResultVo.java
  13. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetAdventurePkService.java
  14. 10
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetDrawService.java
  15. 7
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetHuntService.java
  16. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetOperateService.java
  17. 50
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetAdventurePkServiceImpl.java
  18. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetBoxServiceImpl.java
  19. 87
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetDrawServiceImpl.java
  20. 74
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetHuntServiceImpl.java
  21. 90
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetOperateServiceImpl.java
  22. 11
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/impl/PlanetServiceImpl.java
  23. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java
  24. 51
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/PlanetAdventureSettleTask.java
  25. 20
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  26. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  27. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java
  28. 3
      hiver-modules/hiver-mall/src/main/resources/sql/planet.sql

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a>
</li>
<li class="m-r-10">
<a href="#"><span class="badge badge-primary">六月 04, 2026 16:50:32</span></a>
<a href="#"><span class="badge badge-primary">六月 05, 2026 16:39:30</span></a>
</li>
</ul>
</div>
@ -84,7 +84,7 @@
<div class="test-detail">
<span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p>
<p class="text-sm"><span>16:50:32 下午</span> / <span>0.018 secs</span></p>
<p class="text-sm"><span>16:39:31 下午</span> / <span>0.017 secs</span></p>
</div>
<div class="test-contents d-none">
<div class="detail-head">
@ -92,9 +92,9 @@
<div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>06.04.2026 16:50:32</span>
<span class='badge badge-danger'>06.04.2026 16:50:32</span>
<span class='badge badge-default'>0.018 secs</span>
<span class='badge badge-success'>06.05.2026 16:39:31</span>
<span class='badge badge-danger'>06.05.2026 16:39:31</span>
<span class='badge badge-default'>0.017 secs</span>
</div>
<div class="m-t-10 m-l-5"></div>
</div>
@ -104,7 +104,7 @@
<tbody>
<tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td>
<td>16:50:32</td>
<td>16:39:31</td>
<td>
Test passed
</td>
@ -128,13 +128,13 @@
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Started</p>
<h3>六月 04, 2026 16:50:32</h3>
<h3>六月 05, 2026 16:39:30</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>六月 04, 2026 16:50:32</h3>
<h3>六月 05, 2026 16:39:31</h3>
</div></div>
</div>
<div class="col-md-3">

2
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售后

2
hiver-core/src/main/java/cc/hiver/core/dao/UserDao.java

@ -45,7 +45,7 @@ public interface UserDao extends HiverBaseDao<User, String> {
* @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);
/**
* 通过邮件获取用户

2
hiver-core/src/main/java/cc/hiver/core/service/UserService.java

@ -35,7 +35,7 @@ public interface UserService extends HiverBaseService<User, String> {
*/
User findByMobile(String mobile);
User findByMobile(String mobile,Integer type);
User findByMobile(String mobile,String type);
/**
* 通过邮件和状态获取用户

2
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);
}

26
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());
}
}
}

1
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;

73
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)

8
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 = "创建时间")

10
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")

4
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;
}

1
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;

8
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<PlanetAdventurePkRoom> myRooms(String userId, String regionId, Integer pageNumber, Integer pageSize);
Page<PlanetAdventurePkPlayer> myRecords(String userId, String regionId, Integer pageNumber, Integer pageSize);
Page<PlanetAdventurePkRoom> 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);

10
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/planet/service/PlanetDrawService.java

@ -57,6 +57,16 @@ public interface PlanetDrawService {
*/
List<PlanetDrawWinner> myWinning(String userId, String regionId);
/**
* 首页待弹窗的未读中奖记录
*/
PlanetDrawWinner unreadWinning(String userId, String regionId);
/**
* 标记中奖记录已读/已弹窗
*/
void markWinningRead(String userId, String regionId, String winnerId);
/**
* 领取中奖奖励(校验商圈一致)
*/

7
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<PlanetHuntRecord> raiders(String userId, String regionId, Integer pageNumber, Integer pageSize);
}

3
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<PlanetSearchRecord> raiders(String userId, String regionId, Integer pageNumber, Integer pageSize);
List<PlanetStaminaItemConfig> staminaItems(String regionId);
PlanetUserState buyStaminaItem(String userId, String regionId, String itemId);

50
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<PlanetAdventurePkRoom> hotPage = roomMapper.selectPage(new Page<>(current, size), new LambdaQueryWrapper<PlanetAdventurePkRoom>()
.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<PlanetAdventurePkRoom> 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<PlanetAdventurePkRoom>()
vo.setMyRooms(myRooms(userId, regionId, 1, 8).getRecords());
vo.setMyRecords(myRecords(userId, regionId, 1, 10).getRecords());
return vo;
}
@Override
public Page<PlanetAdventurePkRoom> myRooms(String userId, String regionId, Integer pageNumber, Integer pageSize) {
require(userId, regionId);
return roomMapper.selectPage(page(pageNumber, pageSize), new LambdaQueryWrapper<PlanetAdventurePkRoom>()
.eq(PlanetAdventurePkRoom::getRegionId, regionId)
.eq(PlanetAdventurePkRoom::getOwnerUserId, userId)
.orderByDesc(PlanetAdventurePkRoom::getCreateTime)
.last("limit 8")));
vo.setMyRecords(playerMapper.selectList(new LambdaQueryWrapper<PlanetAdventurePkPlayer>()
.orderByDesc(PlanetAdventurePkRoom::getCreateTime));
}
@Override
public Page<PlanetAdventurePkPlayer> myRecords(String userId, String regionId, Integer pageNumber, Integer pageSize) {
require(userId, regionId);
return playerMapper.selectPage(page(pageNumber, pageSize), new LambdaQueryWrapper<PlanetAdventurePkPlayer>()
.eq(PlanetAdventurePkPlayer::getRegionId, regionId)
.eq(PlanetAdventurePkPlayer::getUserId, userId)
.orderByDesc(PlanetAdventurePkPlayer::getCreateTime)
.last("limit 10")));
return vo;
.orderByDesc(PlanetAdventurePkPlayer::getCreateTime));
}
@Override
public Page<PlanetAdventurePkRoom> hotRooms(String userId, String regionId, Integer pageNumber, Integer pageSize) {
require(userId, regionId);
return roomMapper.selectPage(page(pageNumber, pageSize), new LambdaQueryWrapper<PlanetAdventurePkRoom>()
.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 <T> Page<T> 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;
}

14
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,

87
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<PlanetDrawWinner> 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);
}

74
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<PlanetHuntRecord> 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<PlanetHuntRecord> 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<PlanetHuntRecord> 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,

90
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<PlanetTreeOrder> treeOrders(String userId, String regionId) {
final LambdaQueryWrapper<PlanetTreeOrder> 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<PlanetTicket>()
.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<PlanetSearchRecord> 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<PlanetSearchRecord> page = new Page<>(num, size);
final LambdaQueryWrapper<PlanetSearchRecord> qw = new LambdaQueryWrapper<>();
qw.eq(PlanetSearchRecord::getToUserId, userId);
if (StringUtils.isNotEmpty(regionId)) {
qw.eq(PlanetSearchRecord::getRegionId, regionId);
}
qw.orderByDesc(PlanetSearchRecord::getCreateTime);
final Page<PlanetSearchRecord> result = searchRecordMapper.selectPage(page, qw);
fillSearchUserInfo(result.getRecords(), regionId);
return result;
}
@Override
public List<PlanetStaminaItemConfig> staminaItems(String regionId) {
final LambdaQueryWrapper<PlanetStaminaItemConfig> qw = new LambdaQueryWrapper<>();
@ -490,6 +524,52 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
return list.get(new Random().nextInt(list.size()));
}
private void fillSearchUserInfo(List<PlanetSearchRecord> records, String regionId) {
if (records == null || records.isEmpty()) {
return;
}
final Map<String, PlanetTicket> 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<String, PlanetTicket> users, String userId, String regionId) {
if (StringUtils.isEmpty(userId) || users.containsKey(userId)) {
return;
}
PlanetTicket ticket = ticketMapper.selectOne(new LambdaQueryWrapper<PlanetTicket>()
.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();

11
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<PlanetBuffVo> myBuffs = new ArrayList<>();
/*final List<PlanetBuffVo> 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;
}
}

1
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/quartz/MerchantSettlementTask.java

@ -46,6 +46,7 @@ public class MerchantSettlementTask {
LambdaQueryWrapper<MallOrder> qw = new LambdaQueryWrapper<>();
qw.in(MallOrder::getStatus, 5, 12);
qw.eq(MallOrder::getSettlementStatus, 0);
qw.ne(MallOrder::getOtherOrder, 1);
List<MallOrder> orders = mallOrderService.list(qw);
for (MallOrder order : orders) {

51
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<String> regionIds = ticketMapper.selectList(new LambdaQueryWrapper<PlanetTicket>()
.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<PlanetTicket> topList = ticketMapper.selectList(new LambdaQueryWrapper<PlanetTicket>()
.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;
}
}

20
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -1752,10 +1752,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if(refundType == 3){
if(refundTypeStatus == 1){
record.setLinkId(order.getShopId());
if(ratio != null){
/*if(ratio != null){
record.setRefundAmount(record.getRefundAmount()
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
}
}*/
mallRefundRecordMapper.insert(record);
//退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record);
@ -1765,10 +1765,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款",order.getId());
}else if(refundTypeStatus == 2){
record.setLinkId(workerId);
if(ratio != null){
/*if(ratio != null){
record.setRefundAmount(record.getRefundAmount()
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
}
}*/
mallRefundRecordMapper.insert(record);
//退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record);
@ -1779,11 +1779,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
}else if(refundTypeStatus == 3){
//商家、配送员都加一条
record.setLinkId(order.getShopId());
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()));
if(ratio != null){
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).multiply(ratio).setScale(2, RoundingMode.HALF_UP));
/*if(ratio != null){
record.setRefundAmount(record.getRefundAmount()
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
}
}*/
mallRefundRecordMapper.insert(record);
//退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record);
@ -1794,11 +1794,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallRefundRecord mallRefundRecord1 = record;
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(workerId);
mallRefundRecord1.setRefundAmount(order.getDeliveryFee());
if(ratio != null){
mallRefundRecord1.setRefundAmount(order.getDeliveryFee().multiply(ratio).setScale(2, RoundingMode.HALF_UP));
/*if(ratio != null){
mallRefundRecord1.setRefundAmount(mallRefundRecord1.getRefundAmount()
.subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
}
}*/
mallRefundRecordMapper.insert(mallRefundRecord1);
//退款放到缓存
refundOrderCacheUtil.put(mallRefundRecord1.getLinkId(),mallRefundRecord1);

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java

@ -275,7 +275,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
BigDecimal totalRefund = result.getRecords().stream()
.map(item -> 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<MallRefundRecordMap
workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId());
}
}
wechatPayUtil.refund(mallRefundRecord.getOrderId(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue());
wechatPayUtil.refund(mallRefundRecord.getOrderId(), order.getTotalAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue());
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
BigDecimal refundAmount = mallRefundRecord.getRefundAmount();

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallUserCouponServiceImpl.java

@ -145,9 +145,9 @@ public class MallUserCouponServiceImpl extends ServiceImpl<MallUserCouponMapper,
List<String> 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);
}
}
});

3
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,

Loading…
Cancel
Save