Browse Source

对接拼团数据1

master
wangfukang 1 week 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> <a href="#"><span class="badge badge-primary">Hiver</span></a>
</li> </li>
<li class="m-r-10"> <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> </li>
</ul> </ul>
</div> </div>
@ -84,7 +84,7 @@
<div class="test-detail"> <div class="test-detail">
<span class="meta text-white badge badge-sm"></span> <span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p> <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>
<div class="test-contents d-none"> <div class="test-contents d-none">
<div class="detail-head"> <div class="detail-head">
@ -92,9 +92,9 @@
<div class="info"> <div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div> <div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5> <h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>06.04.2026 16:50:32</span> <span class='badge badge-success'>06.05.2026 16:39:31</span>
<span class='badge badge-danger'>06.04.2026 16:50:32</span> <span class='badge badge-danger'>06.05.2026 16:39:31</span>
<span class='badge badge-default'>0.018 secs</span> <span class='badge badge-default'>0.017 secs</span>
</div> </div>
<div class="m-t-10 m-l-5"></div> <div class="m-t-10 m-l-5"></div>
</div> </div>
@ -104,7 +104,7 @@
<tbody> <tbody>
<tr class="event-row"> <tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td> <td><span class="badge log pass-bg">Pass</span></td>
<td>16:50:32</td> <td>16:39:31</td>
<td> <td>
Test passed Test passed
</td> </td>
@ -128,13 +128,13 @@
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Started</p> <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>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Ended</p> <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>
</div> </div>
<div class="col-md-3"> <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售后 *交易类型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 * @return
*/ */
@Query("select u from User u where u.mobile = ?1 and u.type = ?2 ") @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);
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 @Override
public User findByMobile(String mobile, Integer type) { public User findByMobile(String mobile, String type) {
final User user = userDao.findByMobile(mobile,type); final User user = userDao.findByMobile(mobile,type);
return userToDTO(user); 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.MallDeliveryOrderMapper;
import cc.hiver.mall.dao.mapper.MallOrderMapper; import cc.hiver.mall.dao.mapper.MallOrderMapper;
import cc.hiver.mall.entity.MallDeliveryOrder; import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.ie.service.IeMatchService; 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.pojo.dto.CreateOrderDTO;
import cc.hiver.mall.serviceimpl.mybatis.MallOrderServiceImpl; import cc.hiver.mall.serviceimpl.mybatis.MallOrderServiceImpl;
import cc.hiver.mall.utils.*; import cc.hiver.mall.utils.*;
@ -74,6 +76,9 @@ public class OrderAsyncConsumer {
@Autowired @Autowired
private IeMatchService ieMatchService; private IeMatchService ieMatchService;
@Autowired
private PlanetRewardHook planetRewardHook;
// 微信模板配置 // 微信模板配置
private static final String TEMPLATE_ID = "K15zpZSHBNivouTfpW5FK1XFz8GbYAK8b9dXXOP_Ka0"; private static final String TEMPLATE_ID = "K15zpZSHBNivouTfpW5FK1XFz8GbYAK8b9dXXOP_Ka0";
@ -195,6 +200,7 @@ public class OrderAsyncConsumer {
if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(orderId)) { if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(orderId)) {
userPendingOrderCacheUtil.remove(userId, orderId); userPendingOrderCacheUtil.remove(userId, orderId);
rewardIeMatchQuota(userId); rewardIeMatchQuota(userId);
rewardPlanetOrderTicket(userId, orderId, body.getString("regionId"));
} }
} }
} }
@ -244,4 +250,24 @@ public class OrderAsyncConsumer {
log.warn("配送完成异步增加i/e匹配机会失败,不影响异步收尾 userId={}, reason={}", userId, e.getMessage()); 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_ENTRY = "adventure_pk_entry";
public static final String TICKET_TYPE_ADVENTURE_PK_REFUND = "adventure_pk_refund"; 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_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; 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 = "开启每日宝箱") @ApiOperation(value = "开启每日宝箱")
@RequestMapping(value = "/box/open", method = RequestMethod.POST) @RequestMapping(value = "/box/open", method = RequestMethod.POST)
public Result openBox(@RequestBody PlanetQuery query) { 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 = "我的星球券明细(分页)") @ApiOperation(value = "我的星球券明细(分页)")
@RequestMapping(value = "/ticket/log", method = RequestMethod.POST) @RequestMapping(value = "/ticket/log", method = RequestMethod.POST)
public Result ticketLog(@RequestBody PlanetQuery query) { 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 = "体力道具列表") @ApiOperation(value = "体力道具列表")
@RequestMapping(value = "/stamina/items", method = RequestMethod.POST) @RequestMapping(value = "/stamina/items", method = RequestMethod.POST)
public Result staminaItems(@RequestBody PlanetQuery query) { 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 = "创建星球擂台房间") @ApiOperation(value = "创建星球擂台房间")
@RequestMapping(value = "/adventure/pk/create", method = RequestMethod.POST) @RequestMapping(value = "/adventure/pk/create", method = RequestMethod.POST)
@Transactional(propagation = Propagation.NOT_SUPPORTED) @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 = "领取时间") @ApiModelProperty(value = "领取时间")
private Date receivedTime; 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") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建时间") @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; package cc.hiver.mall.planet.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -20,7 +21,15 @@ public class PlanetSearchRecord implements Serializable {
@TableId @TableId
private String id; private String id;
private String fromUserId; private String fromUserId;
@TableField(exist = false)
private String fromUserName;
@TableField(exist = false)
private String fromAvatar;
private String toUserId; private String toUserId;
@TableField(exist = false)
private String toUserName;
@TableField(exist = false)
private String toAvatar;
private String regionId; private String regionId;
private Integer staminaCost; private Integer staminaCost;
private Integer towerLevel; private Integer towerLevel;
@ -28,6 +37,7 @@ public class PlanetSearchRecord implements Serializable {
private Integer countered; private Integer countered;
private Integer staminaDamage; private Integer staminaDamage;
private Integer gainTickets; private Integer gainTickets;
private Integer counterDropTickets;
private Integer targetPublicTicketsBefore; private Integer targetPublicTicketsBefore;
private String message; private String message;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @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; package cc.hiver.mall.planet.pojo;
import cc.hiver.mall.planet.entity.PlanetDrawWinner;
import cc.hiver.mall.planet.entity.PlanetNews; import cc.hiver.mall.planet.entity.PlanetNews;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -95,4 +96,7 @@ public class PlanetHomeVo implements Serializable {
@ApiModelProperty(value = "2分钟每日闭环") @ApiModelProperty(value = "2分钟每日闭环")
private Object dailyLoop; 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 intercepted;
private Boolean countered; private Boolean countered;
private Integer gainTickets; private Integer gainTickets;
private Integer counterDropTickets;
private Integer staminaDamage; private Integer staminaDamage;
private Integer remainStamina; private Integer remainStamina;
private Integer remainSearchCount; 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; package cc.hiver.mall.planet.service;
import cc.hiver.mall.planet.entity.PlanetAdventureChallenge; 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.entity.PlanetAdventurePkRoom;
import cc.hiver.mall.planet.pojo.PlanetAdventureChallengeResultVo; import cc.hiver.mall.planet.pojo.PlanetAdventureChallengeResultVo;
import cc.hiver.mall.planet.pojo.PlanetAdventurePkHallVo; import cc.hiver.mall.planet.pojo.PlanetAdventurePkHallVo;
import cc.hiver.mall.planet.pojo.PlanetAdventurePkPlayVo; import cc.hiver.mall.planet.pojo.PlanetAdventurePkPlayVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List; import java.util.List;
@ -12,6 +14,12 @@ public interface PlanetAdventurePkService {
PlanetAdventurePkHallVo hall(String userId, String regionId, Integer pageNumber, Integer pageSize); 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, PlanetAdventurePkRoom createRoom(String userId, String regionId, String nickname, String avatar,
String college, String roomName, Integer maxPlayers, String college, String roomName, Integer maxPlayers,
Integer publicFlag, String password, Integer entryTickets); 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); 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; package cc.hiver.mall.planet.service;
import cc.hiver.mall.planet.entity.PlanetHuntRecord;
import cc.hiver.mall.planet.pojo.PlanetHuntResultVo; 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); 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.entity.*;
import cc.hiver.mall.planet.pojo.PlanetSearchResultVo; import cc.hiver.mall.planet.pojo.PlanetSearchResultVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -32,6 +33,8 @@ public interface PlanetOperateService {
PlanetSearchResultVo searchTarget(String userId, String regionId, String targetUserId); PlanetSearchResultVo searchTarget(String userId, String regionId, String targetUserId);
Page<PlanetSearchRecord> raiders(String userId, String regionId, Integer pageNumber, Integer pageSize);
List<PlanetStaminaItemConfig> staminaItems(String regionId); List<PlanetStaminaItemConfig> staminaItems(String regionId);
PlanetUserState buyStaminaItem(String userId, String regionId, String itemId); 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 @Override
public PlanetAdventurePkHallVo hall(String userId, String regionId, Integer pageNumber, Integer pageSize) { public PlanetAdventurePkHallVo hall(String userId, String regionId, Integer pageNumber, Integer pageSize) {
require(userId, regionId); 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(); PlanetAdventurePkHallVo vo = new PlanetAdventurePkHallVo();
Page<PlanetAdventurePkRoom> hotPage = roomMapper.selectPage(new Page<>(current, size), new LambdaQueryWrapper<PlanetAdventurePkRoom>() Page<PlanetAdventurePkRoom> hotPage = hotRooms(userId, regionId, pageNumber, pageSize);
.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));
vo.setHotRooms(hotPage.getRecords()); vo.setHotRooms(hotPage.getRecords());
vo.setHotTotal(hotPage.getTotal()); vo.setHotTotal(hotPage.getTotal());
vo.setHotTotalPages(hotPage.getPages()); vo.setHotTotalPages(hotPage.getPages());
vo.setHotPageNumber(hotPage.getCurrent()); 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::getRegionId, regionId)
.eq(PlanetAdventurePkRoom::getOwnerUserId, userId) .eq(PlanetAdventurePkRoom::getOwnerUserId, userId)
.orderByDesc(PlanetAdventurePkRoom::getCreateTime) .orderByDesc(PlanetAdventurePkRoom::getCreateTime));
.last("limit 8"))); }
vo.setMyRecords(playerMapper.selectList(new LambdaQueryWrapper<PlanetAdventurePkPlayer>()
@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::getRegionId, regionId)
.eq(PlanetAdventurePkPlayer::getUserId, userId) .eq(PlanetAdventurePkPlayer::getUserId, userId)
.orderByDesc(PlanetAdventurePkPlayer::getCreateTime) .orderByDesc(PlanetAdventurePkPlayer::getCreateTime));
.last("limit 10"))); }
return vo;
@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 @Override
@ -333,6 +347,12 @@ public class PlanetAdventurePkServiceImpl implements PlanetAdventurePkService {
if (StringUtils.isEmpty(regionId)) throw new HiverException("缺少商圈参数"); 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) { private int nz(Integer v) {
return v == null ? 0 : 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); 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 int roll = ThreadLocalRandom.current().nextInt(100);
final PlanetBoxResultVo vo = new PlanetBoxResultVo(); final PlanetBoxResultVo vo = new PlanetBoxResultVo();
if (roll < 50) { if (roll < 50) {
grantTicket(userId, regionId, 1, vo, "幸运宝箱开出 1 张星球券"); 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 { } else {
grantBuff(userId, regionId, PlanetConstant.BUFF_HUNT, "追猎雷达", vo); grantTicket(userId, regionId, 2, vo, "幸运宝箱开出 2 张星球券");
} }
newsService.addNews(regionId, PlanetConstant.NEWS_BOX, 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; 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.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.constant.PlanetConstant;
import cc.hiver.mall.planet.entity.*; import cc.hiver.mall.planet.entity.*;
import cc.hiver.mall.planet.mapper.*; import cc.hiver.mall.planet.mapper.*;
import cc.hiver.mall.planet.pojo.PlanetDailyLoopVo; import cc.hiver.mall.planet.pojo.PlanetDailyLoopVo;
import cc.hiver.mall.planet.service.*; import cc.hiver.mall.planet.service.*;
import cc.hiver.mall.service.mybatis.DealingsRecordService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -67,6 +72,12 @@ public class PlanetDrawServiceImpl implements PlanetDrawService {
@Autowired @Autowired
private PlanetTaskService taskService; private PlanetTaskService taskService;
@Autowired
private UserService userService;
@Autowired
private DealingsRecordService dealingsRecordService;
/** /**
* 抽奖功能强制按商圈隔离缺少 regionId 直接拒绝杜绝跨区域开奖/查询 * 抽奖功能强制按商圈隔离缺少 regionId 直接拒绝杜绝跨区域开奖/查询
*/ */
@ -371,19 +382,84 @@ public class PlanetDrawServiceImpl implements PlanetDrawService {
} }
@Override @Override
public void receive(String userId, String regionId, String winnerId) { public PlanetDrawWinner unreadWinning(String userId, String regionId) {
requireRegion(regionId); requireRegion(regionId);
final PlanetDrawWinner winner = drawWinnerMapper.selectById(winnerId); if (StringUtils.isEmpty(userId)) {
if (winner == null || !userId.equals(winner.getUserId()) || !regionId.equals(winner.getRegionId())) { return null;
throw new HiverException("中奖记录不存在"); }
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) { if (winner.getIsReceived() != null && winner.getIsReceived() == 1) {
throw new HiverException("已领取,请勿重复操作"); 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.setIsReceived(1);
winner.setReceivedTime(new Date()); winner.setReceivedTime(new Date());
winner.setIsRead(1);
if (winner.getReadTime() == null) {
winner.setReadTime(new Date());
}
drawWinnerMapper.updateById(winner); 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) { 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.setAmount(reward.getAmount());
winner.setCouponId(reward.getCouponId()); winner.setCouponId(reward.getCouponId());
winner.setIsReceived(0); winner.setIsReceived(0);
winner.setIsRead(0);
winner.setCreateTime(now); winner.setCreateTime(now);
drawWinnerMapper.insert(winner); 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.core.common.exception.HiverException;
import cc.hiver.mall.planet.constant.PlanetConstant; 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.PlanetHuntRecord;
import cc.hiver.mall.planet.entity.PlanetTicket; 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.mapper.PlanetHuntRecordMapper;
import cc.hiver.mall.planet.pojo.PlanetHuntResultVo; import cc.hiver.mall.planet.pojo.PlanetHuntResultVo;
import cc.hiver.mall.planet.service.*; import cc.hiver.mall.planet.service.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import java.util.UUID; import java.util.UUID;
@ -41,10 +43,10 @@ public class PlanetHuntServiceImpl implements PlanetHuntService {
private PlanetRankService rankService; private PlanetRankService rankService;
@Autowired @Autowired
private PlanetBuffService buffService; private PlanetNewsService newsService;
@Autowired @Autowired
private PlanetNewsService newsService; private PlanetOperateService operateService;
@Override @Override
public PlanetHuntResultVo hunt(String fromUserId, String regionId, String toUserId) { public PlanetHuntResultVo hunt(String fromUserId, String regionId, String toUserId) {
@ -77,29 +79,31 @@ public class PlanetHuntServiceImpl implements PlanetHuntService {
vo.setBountyTickets(0); vo.setBountyTickets(0);
vo.setTotalGain(0); vo.setTotalGain(0);
// 目标防护罩:防护BUFF 或 今日已被追捕成功达上限 final PlanetUserState targetState = operateService.getOrCreateState(toUserId, regionId);
final int targetHuntedSuccess = countTodayHuntedSuccess(toUserId, today);
final boolean shielded = buffService.hasActiveBuff(toUserId, PlanetConstant.BUFF_SHIELD)
|| targetHuntedSuccess >= PlanetConstant.HUNTED_SUCCESS_LIMIT;
String result; String result;
if (shielded) { if (hit(targetState.getTowerInterceptRate())) {
result = PlanetConstant.HUNT_SHIELD; 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) { } else if (target.getTicketCount() == null || target.getTicketCount() <= 0) {
result = PlanetConstant.HUNT_FAIL; result = PlanetConstant.HUNT_FAIL;
vo.setMessage("目标星球空空如也,未能缴获"); vo.setMessage("目标星球空空如也,未能缴获");
} else { } else {
// 成功率:基础 + 追捕BUFF加成 final boolean success = ThreadLocalRandom.current().nextDouble() < BASE_SUCCESS_RATE;
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;
if (success) { if (success) {
result = PlanetConstant.HUNT_SUCCESS; result = PlanetConstant.HUNT_SUCCESS;
final int gain = 1; final int gain = 1;
@ -124,10 +128,6 @@ public class PlanetHuntServiceImpl implements PlanetHuntService {
vo.setTotalGain(gain + bounty); vo.setTotalGain(gain + bounty);
vo.setMessage("追捕成功!缴获 " + gain + " 张星球券" + (bounty > 0 ? ",额外获得 " + 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, newsService.addNews(regionId, PlanetConstant.NEWS_HUNT,
safeName(target.getNickname()) + " 遭遇追捕,损失 " + (gain) + " 张星球券", safeName(target.getNickname()) + " 遭遇追捕,损失 " + (gain) + " 张星球券",
@ -151,28 +151,30 @@ public class PlanetHuntServiceImpl implements PlanetHuntService {
return Math.max(0, PlanetConstant.HUNT_DAILY_LIMIT - used); 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<>(); final LambdaQueryWrapper<PlanetHuntRecord> qw = new LambdaQueryWrapper<>();
qw.eq(PlanetHuntRecord::getFromUserId, userId) qw.eq(PlanetHuntRecord::getToUserId, userId)
.eq(PlanetHuntRecord::getHuntDate, date); .eq(PlanetHuntRecord::getRegionId, regionId)
return huntRecordMapper.selectCount(qw).intValue(); .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<>(); final LambdaQueryWrapper<PlanetHuntRecord> qw = new LambdaQueryWrapper<>();
qw.eq(PlanetHuntRecord::getToUserId, userId) qw.eq(PlanetHuntRecord::getFromUserId, userId)
.eq(PlanetHuntRecord::getResult, PlanetConstant.HUNT_SUCCESS)
.eq(PlanetHuntRecord::getHuntDate, date); .eq(PlanetHuntRecord::getHuntDate, date);
return huntRecordMapper.selectCount(qw).intValue(); return huntRecordMapper.selectCount(qw).intValue();
} }
private PlanetBuffRecord firstActiveBuff(String userId, String type) { private boolean hit(BigDecimal rate) {
for (PlanetBuffRecord r : buffService.activeBuffs(userId)) { if (rate == null || rate.compareTo(BigDecimal.ZERO) <= 0) {
if (type.equals(r.getType())) { return false;
return r;
}
} }
return null; return BigDecimal.valueOf(ThreadLocalRandom.current().nextDouble() * 100).compareTo(rate) < 0;
} }
private void saveHuntRecord(PlanetTicket from, PlanetTicket target, String regionId, String result, 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.PlanetOperateService;
import cc.hiver.mall.planet.service.PlanetTicketService; import cc.hiver.mall.planet.service.PlanetTicketService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -78,10 +79,11 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
state.setWarehouseLevel(1); state.setWarehouseLevel(1);
state.setWarehouseCapacity(DEFAULT_WAREHOUSE_CAPACITY); state.setWarehouseCapacity(DEFAULT_WAREHOUSE_CAPACITY);
state.setWarehouseTicketCount(0); state.setWarehouseTicketCount(0);
final PlanetTowerLevelConfig towerLevel = getTowerLevel(regionId, 1);
state.setTowerLevel(1); state.setTowerLevel(1);
state.setTowerInterceptRate(BigDecimal.ZERO); state.setTowerInterceptRate(towerLevel == null ? BigDecimal.ZERO : towerLevel.getInterceptRate());
state.setTowerDamage(0); state.setTowerDamage(towerLevel == null ? 0 : towerLevel.getDamage());
state.setTowerCounterRate(BigDecimal.ZERO); state.setTowerCounterRate(towerLevel == null ? BigDecimal.ZERO : towerLevel.getCounterRate());
state.setDailySearchCount(0); state.setDailySearchCount(0);
state.setDailySearchGain(0); state.setDailySearchGain(0);
state.setDailyPlantGain(0); state.setDailyPlantGain(0);
@ -181,7 +183,8 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
@Override @Override
public List<PlanetTreeOrder> treeOrders(String userId, String regionId) { public List<PlanetTreeOrder> treeOrders(String userId, String regionId) {
final LambdaQueryWrapper<PlanetTreeOrder> qw = new LambdaQueryWrapper<>(); 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); return treeOrderMapper.selectList(qw);
} }
@ -296,12 +299,25 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
boolean countered = false; boolean countered = false;
int damage = 0; int damage = 0;
int gain = 0; int gain = 0;
int counterDrop = 0;
final int beforePublicTickets = nullToZero(target.getTicketCount()); final int beforePublicTickets = nullToZero(target.getTicketCount());
fromState.setStamina(nullToZero(fromState.getStamina()) - cost); fromState.setStamina(nullToZero(fromState.getStamina()) - cost);
if (intercepted) { if (intercepted) {
countered = hit(targetState.getTowerCounterRate()); countered = hit(targetState.getTowerCounterRate());
damage = countered ? nullToZero(targetState.getTowerDamage()) : Math.max(1, nullToZero(targetState.getTowerDamage()) / 2); damage = countered ? nullToZero(targetState.getTowerDamage()) : Math.max(1, nullToZero(targetState.getTowerDamage()) / 2);
fromState.setStamina(Math.max(0, nullToZero(fromState.getStamina()) - damage)); 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 { } else {
gain = calcSearchGain(config, beforePublicTickets, fromState); gain = calcSearchGain(config, beforePublicTickets, fromState);
if (gain > 0) { if (gain > 0) {
@ -325,8 +341,9 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
record.setCountered(countered ? 1 : 0); record.setCountered(countered ? 1 : 0);
record.setStaminaDamage(damage); record.setStaminaDamage(damage);
record.setGainTickets(gain); record.setGainTickets(gain);
record.setCounterDropTickets(counterDrop);
record.setTargetPublicTicketsBefore(beforePublicTickets); record.setTargetPublicTicketsBefore(beforePublicTickets);
record.setMessage(intercepted ? "目标防御塔拦截了松鼠宇航员" : "搜查成功,获得星球券"); record.setMessage(buildSearchMessage(intercepted, countered, gain, counterDrop));
record.setCreateTime(new Date()); record.setCreateTime(new Date());
searchRecordMapper.insert(record); searchRecordMapper.insert(record);
if (gain > 0) { if (gain > 0) {
@ -340,6 +357,7 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
vo.setIntercepted(intercepted); vo.setIntercepted(intercepted);
vo.setCountered(countered); vo.setCountered(countered);
vo.setGainTickets(gain); vo.setGainTickets(gain);
vo.setCounterDropTickets(counterDrop);
vo.setStaminaDamage(damage); vo.setStaminaDamage(damage);
vo.setRemainStamina(fromState.getStamina()); vo.setRemainStamina(fromState.getStamina());
vo.setRemainSearchCount(Math.max(0, dailyLimit - nullToZero(fromState.getDailySearchCount()))); vo.setRemainSearchCount(Math.max(0, dailyLimit - nullToZero(fromState.getDailySearchCount())));
@ -347,6 +365,22 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
return vo; 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 @Override
public List<PlanetStaminaItemConfig> staminaItems(String regionId) { public List<PlanetStaminaItemConfig> staminaItems(String regionId) {
final LambdaQueryWrapper<PlanetStaminaItemConfig> qw = new LambdaQueryWrapper<>(); final LambdaQueryWrapper<PlanetStaminaItemConfig> qw = new LambdaQueryWrapper<>();
@ -490,6 +524,52 @@ public class PlanetOperateServiceImpl implements PlanetOperateService {
return list.get(new Random().nextInt(list.size())); 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) { private int calcSearchGain(PlanetSearchConfig config, int targetTicket, PlanetUserState fromState) {
int min = config.getMinGain() == null ? 1 : config.getMinGain(); int min = config.getMinGain() == null ? 1 : config.getMinGain();
int max = config.getMaxGain() == null ? 3 : config.getMaxGain(); 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; package cc.hiver.mall.planet.service.impl;
import cc.hiver.mall.planet.constant.PlanetConstant; 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.PlanetPool;
import cc.hiver.mall.planet.entity.PlanetTicket; 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.PlanetHomeVo;
import cc.hiver.mall.planet.pojo.PlanetQuery; import cc.hiver.mall.planet.pojo.PlanetQuery;
import cc.hiver.mall.planet.pojo.PlanetRankItemVo; import cc.hiver.mall.planet.pojo.PlanetRankItemVo;
@ -14,9 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 白嫖星球-首页聚合服务实现 * 白嫖星球-首页聚合服务实现
@ -87,7 +83,7 @@ public class PlanetServiceImpl implements PlanetService {
vo.setMyRankNo(rankService.userRankNo(regionId, userId)); vo.setMyRankNo(rankService.userRankNo(regionId, userId));
// 我生效的BUFF // 我生效的BUFF
final List<PlanetBuffVo> myBuffs = new ArrayList<>(); /*final List<PlanetBuffVo> myBuffs = new ArrayList<>();
for (PlanetBuffRecord r : buffService.activeBuffs(userId)) { for (PlanetBuffRecord r : buffService.activeBuffs(userId)) {
final PlanetBuffVo bv = new PlanetBuffVo(); final PlanetBuffVo bv = new PlanetBuffVo();
bv.setId(r.getBuffId()); bv.setId(r.getBuffId());
@ -97,7 +93,7 @@ public class PlanetServiceImpl implements PlanetService {
bv.setActiveEndTime(r.getEndTime()); bv.setActiveEndTime(r.getEndTime());
myBuffs.add(bv); myBuffs.add(bv);
} }
vo.setMyBuffs(myBuffs); vo.setMyBuffs(myBuffs);*/
// 各板块 // 各板块
vo.setTasks(taskService.listTasks(userId, regionId)); vo.setTasks(taskService.listTasks(userId, regionId));
@ -107,9 +103,10 @@ public class PlanetServiceImpl implements PlanetService {
vo.setRankTotalPages(rankPage.getPages()); vo.setRankTotalPages(rankPage.getPages());
vo.setRankPageNumber(rankPage.getCurrent()); vo.setRankPageNumber(rankPage.getCurrent());
vo.setBuffShop(buffService.shopList(userId, regionId)); 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.setOperate(operateService.overview(userId, regionId));
vo.setDailyLoop(drawService.dailyLoop(userId, regionId)); vo.setDailyLoop(drawService.dailyLoop(userId, regionId));
vo.setUnreadWinning(drawService.unreadWinning(userId, regionId));
return vo; 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<>(); LambdaQueryWrapper<MallOrder> qw = new LambdaQueryWrapper<>();
qw.in(MallOrder::getStatus, 5, 12); qw.in(MallOrder::getStatus, 5, 12);
qw.eq(MallOrder::getSettlementStatus, 0); qw.eq(MallOrder::getSettlementStatus, 0);
qw.ne(MallOrder::getOtherOrder, 1);
List<MallOrder> orders = mallOrderService.list(qw); List<MallOrder> orders = mallOrderService.list(qw);
for (MallOrder order : orders) { 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; 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.PlanetAdventureService;
import cc.hiver.mall.planet.service.PlanetTicketService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Component @Component
public class PlanetAdventureSettleTask { public class PlanetAdventureSettleTask {
@ -13,13 +22,53 @@ public class PlanetAdventureSettleTask {
@Autowired @Autowired
private PlanetAdventureService adventureService; private PlanetAdventureService adventureService;
@Autowired
private PlanetTicketMapper ticketMapper;
@Autowired
private PlanetTicketService ticketService;
@Scheduled(cron = "0 30 21 * * ?") @Scheduled(cron = "0 30 21 * * ?")
public void settleAdventureRanks() { public void settleAdventureRanks() {
try { try {
int count = adventureService.settleDueRanks(); int count = adventureService.settleDueRanks();
log.info("[白嫖星球] 学院助推赛结算完成 count={}", count); int rewardCount = rewardRegionTopTickets();
log.info("[白嫖星球] 学院助推赛结算完成 count={}, rankRewardCount={}", count, rewardCount);
} catch (Exception e) { } catch (Exception e) {
log.error("[白嫖星球] 学院助推赛结算异常: {}", e.getMessage(), 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(refundType == 3){
if(refundTypeStatus == 1){ if(refundTypeStatus == 1){
record.setLinkId(order.getShopId()); record.setLinkId(order.getShopId());
if(ratio != null){ /*if(ratio != null){
record.setRefundAmount(record.getRefundAmount() record.setRefundAmount(record.getRefundAmount()
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }*/
mallRefundRecordMapper.insert(record); mallRefundRecordMapper.insert(record);
//退款放到缓存 //退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),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()); jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款",order.getId());
}else if(refundTypeStatus == 2){ }else if(refundTypeStatus == 2){
record.setLinkId(workerId); record.setLinkId(workerId);
if(ratio != null){ /*if(ratio != null){
record.setRefundAmount(record.getRefundAmount() record.setRefundAmount(record.getRefundAmount()
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }*/
mallRefundRecordMapper.insert(record); mallRefundRecordMapper.insert(record);
//退款放到缓存 //退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record); refundOrderCacheUtil.put(record.getLinkId(),record);
@ -1779,11 +1779,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
}else if(refundTypeStatus == 3){ }else if(refundTypeStatus == 3){
//商家、配送员都加一条 //商家、配送员都加一条
record.setLinkId(order.getShopId()); record.setLinkId(order.getShopId());
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee())); record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).multiply(ratio).setScale(2, RoundingMode.HALF_UP));
if(ratio != null){ /*if(ratio != null){
record.setRefundAmount(record.getRefundAmount() record.setRefundAmount(record.getRefundAmount()
.subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(record.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }*/
mallRefundRecordMapper.insert(record); mallRefundRecordMapper.insert(record);
//退款放到缓存 //退款放到缓存
refundOrderCacheUtil.put(record.getLinkId(),record); refundOrderCacheUtil.put(record.getLinkId(),record);
@ -1794,11 +1794,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallRefundRecord mallRefundRecord1 = record; MallRefundRecord mallRefundRecord1 = record;
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString()); mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(workerId); mallRefundRecord1.setLinkId(workerId);
mallRefundRecord1.setRefundAmount(order.getDeliveryFee()); mallRefundRecord1.setRefundAmount(order.getDeliveryFee().multiply(ratio).setScale(2, RoundingMode.HALF_UP));
if(ratio != null){ /*if(ratio != null){
mallRefundRecord1.setRefundAmount(mallRefundRecord1.getRefundAmount() mallRefundRecord1.setRefundAmount(mallRefundRecord1.getRefundAmount()
.subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); .subtract(mallRefundRecord1.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
} }*/
mallRefundRecordMapper.insert(mallRefundRecord1); mallRefundRecordMapper.insert(mallRefundRecord1);
//退款放到缓存 //退款放到缓存
refundOrderCacheUtil.put(mallRefundRecord1.getLinkId(),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() BigDecimal totalRefund = result.getRecords().stream()
.map(item -> item.getRefundAmount()) // 提取 BigDecimal 金额 .map(item -> item.getRefundAmount()) // 提取 BigDecimal 金额
.reduce(BigDecimal.ZERO, BigDecimal::add); .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")){ if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
//配送员同意退款。扣掉余额 //配送员同意退款。扣掉余额
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
@ -556,7 +556,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId()); 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")){ if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId());
BigDecimal refundAmount = mallRefundRecord.getRefundAmount(); 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(",")); List<String> phones = Arrays.asList(userPhones.split(","));
phones.forEach(phone -> { phones.forEach(phone -> {
for(int i = 0; i < giveNum; i++){ for(int i = 0; i < giveNum; i++){
User user = userService.findByMobile(phone,3); User user = userService.findByMobile(phone,"0");
if(user != null){ 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', `coupon_id` varchar(64) DEFAULT NULL COMMENT '优惠券id',
`is_received` int DEFAULT '0' COMMENT '是否已领取 0否 1是', `is_received` int DEFAULT '0' COMMENT '是否已领取 0否 1是',
`received_time` datetime DEFAULT NULL COMMENT '领取时间', `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, `create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`), KEY `idx_user` (`user_id`),
@ -396,6 +398,7 @@ CREATE TABLE `t_planet_search_record` (
`countered` int DEFAULT '0' COMMENT '是否反击 0否1是', `countered` int DEFAULT '0' COMMENT '是否反击 0否1是',
`stamina_damage` int DEFAULT '0' COMMENT '额外体力伤害', `stamina_damage` int DEFAULT '0' COMMENT '额外体力伤害',
`gain_tickets` 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 '目标可搜查券快照', `target_public_tickets_before` int DEFAULT '0' COMMENT '目标可搜查券快照',
`message` varchar(255) DEFAULT NULL COMMENT '结果文案', `message` varchar(255) DEFAULT NULL COMMENT '结果文案',
`create_time` datetime DEFAULT NULL, `create_time` datetime DEFAULT NULL,

Loading…
Cancel
Save