mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-12 17:21:52 +08:00
code review:优惠劵逻辑
This commit is contained in:
@@ -42,6 +42,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
|
||||
@Validated
|
||||
@Slf4j
|
||||
public class AppBrokerageUserController {
|
||||
|
||||
@Resource
|
||||
private BrokerageUserService brokerageUserService;
|
||||
@Resource
|
||||
@@ -69,8 +70,7 @@ public class AppBrokerageUserController {
|
||||
@Operation(summary = "绑定推广员")
|
||||
@PreAuthenticated
|
||||
public CommonResult<Boolean> bindBrokerageUser(@Valid @RequestBody AppBrokerageUserBindReqVO reqVO) {
|
||||
MemberUserRespDTO user = memberUserApi.getUser(getLoginUserId());
|
||||
return success(brokerageUserService.bindBrokerageUser(user.getId(), reqVO.getBindUserId(), user.getCreateTime()));
|
||||
return success(brokerageUserService.bindBrokerageUser(getLoginUserId(), reqVO.getBindUserId()));
|
||||
}
|
||||
|
||||
@GetMapping("/get-summary")
|
||||
@@ -86,7 +86,7 @@ public class AppBrokerageUserController {
|
||||
Integer yesterdayPrice = brokerageRecordService.getSummaryPriceByUserId(brokerageUser.getId(),
|
||||
BrokerageRecordBizTypeEnum.ORDER.getType(), beginTime, endTime);
|
||||
// 统计用户提现的佣金
|
||||
Integer withdrawPrice = brokerageWithdrawService.getWithdrawSummaryByUserId(Collections.singleton(brokerageUser.getId()),
|
||||
Integer withdrawPrice = brokerageWithdrawService.getWithdrawSummaryListByUserId(Collections.singleton(brokerageUser.getId()),
|
||||
BrokerageWithdrawStatusEnum.AUDIT_SUCCESS).stream()
|
||||
.findFirst().map(UserWithdrawSummaryBO::getPrice).orElse(0);
|
||||
// 统计分销用户数量(一级)
|
||||
|
@@ -68,6 +68,7 @@ public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> {
|
||||
.eq(BrokerageRecordDO::getStatus, status)
|
||||
.groupBy(BrokerageRecordDO::getUserId));
|
||||
return BeanUtil.copyToList(list, UserBrokerageSummaryBO.class);
|
||||
// selectJoinList有BUG,会与租户插件冲突:解析SQL时,发生异常 https://gitee.com/best_handsome/mybatis-plus-join/issues/I84GYW
|
||||
// return selectJoinList(UserBrokerageSummaryBO.class, MPJWrappers.lambdaJoin(BrokerageRecordDO.class)
|
||||
// .select(BrokerageRecordDO::getUserId)
|
||||
// .selectCount(BrokerageRecordDO::getId, UserBrokerageSummaryBO::getCount)
|
||||
|
@@ -78,25 +78,25 @@ public interface BrokerageRecordService {
|
||||
int unfreezeRecord();
|
||||
|
||||
/**
|
||||
* 汇总用户佣金
|
||||
* 按照 userId,汇总每个用户的佣金
|
||||
*
|
||||
* @param userIds 用户编号
|
||||
* @param bizType 业务类型
|
||||
* @param status 佣金状态
|
||||
* @return 用户佣金汇总
|
||||
* @return 用户佣金汇总 List
|
||||
*/
|
||||
List<UserBrokerageSummaryBO> getUserBrokerageSummaryByUserId(Collection<Long> userIds, Integer bizType, Integer status);
|
||||
List<UserBrokerageSummaryBO> getUserBrokerageSummaryListByUserId(Collection<Long> userIds, Integer bizType, Integer status);
|
||||
|
||||
/**
|
||||
* 汇总用户佣金
|
||||
* 按照 userId,汇总每个用户的佣金
|
||||
*
|
||||
* @param userIds 用户编号
|
||||
* @param bizType 业务类型
|
||||
* @param status 佣金状态
|
||||
* @return 用户佣金汇总
|
||||
* @return 用户佣金汇总 Map
|
||||
*/
|
||||
default Map<Long, UserBrokerageSummaryBO> getUserBrokerageSummaryMapByUserId(Collection<Long> userIds, Integer bizType, Integer status) {
|
||||
return convertMap(getUserBrokerageSummaryByUserId(userIds, bizType, status), UserBrokerageSummaryBO::getUserId);
|
||||
return convertMap(getUserBrokerageSummaryListByUserId(userIds, bizType, status), UserBrokerageSummaryBO::getUserId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -232,7 +232,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserBrokerageSummaryBO> getUserBrokerageSummaryByUserId(Collection<Long> userIds, Integer bizType, Integer status) {
|
||||
public List<UserBrokerageSummaryBO> getUserBrokerageSummaryListByUserId(Collection<Long> userIds, Integer bizType, Integer status) {
|
||||
return brokerageRecordMapper.selectCountAndSumPriceByUserIdInAndBizTypeAndStatus(userIds, bizType, status);
|
||||
}
|
||||
|
||||
|
@@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokera
|
||||
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@@ -107,10 +106,9 @@ public interface BrokerageUserService {
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @param bindUserId 推广员编号
|
||||
* @param registerTime 用户注册时间
|
||||
* @return 是否绑定
|
||||
*/
|
||||
boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId, @NotNull LocalDateTime registerTime);
|
||||
boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId);
|
||||
|
||||
/**
|
||||
* 获取用户是否有分销资格
|
||||
|
@@ -7,6 +7,8 @@ import cn.hutool.core.util.BooleanUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
|
||||
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
|
||||
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
|
||||
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
|
||||
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
|
||||
@@ -48,6 +50,9 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||
@Resource
|
||||
private TradeConfigService tradeConfigService;
|
||||
|
||||
@Resource
|
||||
private MemberUserApi memberUserApi;
|
||||
|
||||
@Override
|
||||
public BrokerageUserDO getBrokerageUser(Long id) {
|
||||
return brokerageUserMapper.selectById(id);
|
||||
@@ -155,7 +160,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean bindBrokerageUser(Long userId, Long bindUserId, LocalDateTime registerTime) {
|
||||
public boolean bindBrokerageUser(Long userId, Long bindUserId) {
|
||||
// 1. 获得分销用户
|
||||
boolean isNewBrokerageUser = false;
|
||||
BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(userId);
|
||||
@@ -165,7 +170,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||
}
|
||||
|
||||
// 2.1 校验是否能绑定用户
|
||||
boolean validated = isUserCanBind(brokerageUser, registerTime);
|
||||
boolean validated = isUserCanBind(brokerageUser);
|
||||
if (!validated) {
|
||||
return false;
|
||||
}
|
||||
@@ -223,7 +228,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
|
||||
}
|
||||
|
||||
private boolean isUserCanBind(BrokerageUserDO user, LocalDateTime registerTime) {
|
||||
private boolean isUserCanBind(BrokerageUserDO user) {
|
||||
// 校验分销功能是否启用
|
||||
TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig();
|
||||
if (tradeConfig == null || !BooleanUtil.isTrue(tradeConfig.getBrokerageEnabled())) {
|
||||
@@ -237,9 +242,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||
|
||||
// 校验分销关系绑定模式
|
||||
if (BrokerageBindModeEnum.REGISTER.getMode().equals(tradeConfig.getBrokerageBindMode())) {
|
||||
// 判断是否为新用户:注册时间在30秒内的,都算新用户
|
||||
boolean isNotNewUser = LocalDateTimeUtils.beforeNow(registerTime.plusSeconds(30));
|
||||
if (isNotNewUser) {
|
||||
// 判断是否为新用户:注册时间在 30 秒内的,都算新用户
|
||||
if (!isNewRegisterUser(user.getId())) {
|
||||
throw exception(BROKERAGE_BIND_MODE_REGISTER); // 只有在注册时可以绑定
|
||||
}
|
||||
} else if (BrokerageBindModeEnum.ANYTIME.getMode().equals(tradeConfig.getBrokerageBindMode())) {
|
||||
@@ -247,14 +251,29 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
|
||||
throw exception(BROKERAGE_BIND_OVERRIDE); // 已绑定了推广人
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为新用户
|
||||
*
|
||||
* 标准:注册时间在 30 秒内的,都算新用户
|
||||
*
|
||||
* 疑问:为什么通过这样的方式实现?
|
||||
* 回答:因为注册在 member 模块,希望它和 trade 模块解耦,所以只能用这种约定的逻辑。
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @return 是否新用户
|
||||
*/
|
||||
private boolean isNewRegisterUser(Long userId) {
|
||||
MemberUserRespDTO user = memberUserApi.getUser(userId);
|
||||
return user != null && LocalDateTimeUtils.beforeNow(user.getCreateTime().plusSeconds(30));
|
||||
}
|
||||
|
||||
private void validateCanBindUser(BrokerageUserDO user, Long bindUserId) {
|
||||
// 校验要绑定的用户有无推广资格
|
||||
BrokerageUserDO bindUser = brokerageUserMapper.selectById(bindUserId);
|
||||
if (bindUser == null || !BooleanUtil.isTrue(bindUser.getBrokerageEnabled())) {
|
||||
if (bindUser == null || BooleanUtil.isFalse(bindUser.getBrokerageEnabled())) {
|
||||
throw exception(BROKERAGE_BIND_USER_NOT_ENABLED);
|
||||
}
|
||||
|
||||
|
@@ -56,22 +56,23 @@ public interface BrokerageWithdrawService {
|
||||
Long createBrokerageWithdraw(AppBrokerageWithdrawCreateReqVO createReqVO, Long userId);
|
||||
|
||||
/**
|
||||
* 汇总用户提现
|
||||
* 按照 userId,汇总每个用户的提现
|
||||
*
|
||||
* @param userIds 用户编号
|
||||
* @param status 提现状态
|
||||
* @return 用户提现汇总
|
||||
* @return 用户提现汇总 List
|
||||
*/
|
||||
List<UserWithdrawSummaryBO> getWithdrawSummaryByUserId(Collection<Long> userIds, BrokerageWithdrawStatusEnum status);
|
||||
List<UserWithdrawSummaryBO> getWithdrawSummaryListByUserId(Collection<Long> userIds, BrokerageWithdrawStatusEnum status);
|
||||
|
||||
/**
|
||||
* 汇总用户提现
|
||||
* 按照 userId,汇总每个用户的提现
|
||||
*
|
||||
* @param userIds 用户编号
|
||||
* @param status 提现状态
|
||||
* @return 用户提现汇总
|
||||
* @return 用户提现汇总 Map
|
||||
*/
|
||||
default Map<Long, UserWithdrawSummaryBO> getWithdrawSummaryMapByUserId(Set<Long> userIds, BrokerageWithdrawStatusEnum status) {
|
||||
return convertMap(getWithdrawSummaryByUserId(userIds, status), UserWithdrawSummaryBO::getUserId);
|
||||
return convertMap(getWithdrawSummaryListByUserId(userIds, status), UserWithdrawSummaryBO::getUserId);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -144,7 +144,7 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserWithdrawSummaryBO> getWithdrawSummaryByUserId(Collection<Long> userIds, BrokerageWithdrawStatusEnum status) {
|
||||
public List<UserWithdrawSummaryBO> getWithdrawSummaryListByUserId(Collection<Long> userIds, BrokerageWithdrawStatusEnum status) {
|
||||
return brokerageWithdrawMapper.selectCountAndSumPriceByUserIdAndStatus(userIds, status.getStatus());
|
||||
}
|
||||
|
||||
|
@@ -13,12 +13,13 @@ import lombok.NoArgsConstructor;
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class UserBrokerageSummaryBO {
|
||||
|
||||
/**
|
||||
* 用户编号
|
||||
*/
|
||||
private Long userId;
|
||||
/**
|
||||
* 佣金数量
|
||||
* 推广数量
|
||||
*/
|
||||
private Integer count;
|
||||
/**
|
||||
|
@@ -125,7 +125,6 @@ public interface TradeOrderUpdateService {
|
||||
*/
|
||||
void updateOrderItemWhenAfterSaleCreate(@NotNull Long id, @NotNull Long afterSaleId);
|
||||
|
||||
|
||||
/**
|
||||
* 当售后完成后,更新交易订单项的售后状态
|
||||
*
|
||||
|
@@ -753,6 +753,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||
|
||||
@Override
|
||||
public void updateOrderItemWhenAfterSaleCreate(Long id, Long afterSaleId) {
|
||||
// TODO @疯狂:这个可以直接在接口上,写 @Null 参数校验;
|
||||
if (afterSaleId == null) {
|
||||
throw new IllegalArgumentException(StrUtil.format("id({}) 退款发起,售后单编号不能为空", id));
|
||||
}
|
||||
@@ -765,6 +766,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateOrderItemWhenAfterSaleSuccess(Long id, Integer refundPrice) {
|
||||
// TODO @疯狂:这个可以直接在接口上,写 @Null 参数校验;
|
||||
if (refundPrice == null) {
|
||||
throw new IllegalArgumentException(StrUtil.format("id({}) 退款成功,退款金额不能为空", id));
|
||||
}
|
||||
@@ -787,15 +789,17 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||
}
|
||||
|
||||
// TODO 芋艿:这块扣减规则,需要在考虑下
|
||||
// 3.1 回滚数据:增加 SKU 库存
|
||||
// 3. 回滚数据:增加 SKU 库存
|
||||
productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem)));
|
||||
// 3.2 回滚数据:扣减用户积分(赠送的)
|
||||
|
||||
// 4.1 回滚数据:扣减用户积分(赠送的)
|
||||
reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId());
|
||||
// 3.3 回滚数据:增加用户积分(返还抵扣)
|
||||
// 4.2 回滚数据:增加用户积分(返还抵扣)
|
||||
addUserPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, orderItem.getAfterSaleId());
|
||||
// 3.4 回滚数据:扣减用户经验
|
||||
// 4.3 回滚数据:扣减用户经验
|
||||
getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, orderItem.getAfterSaleId());
|
||||
// 3.5 回滚数据:更新分佣记录为已失效
|
||||
|
||||
// 5. 回滚数据:更新分佣记录为已失效
|
||||
getSelf().cancelBrokerageAsync(order.getUserId(), id);
|
||||
}
|
||||
|
||||
@@ -826,7 +830,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
||||
couponApi.returnUsedCoupon(order.getCouponId());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 判断指定订单的所有订单项,是不是都售后成功
|
||||
*
|
||||
|
@@ -87,10 +87,11 @@ public class TradePointUsePriceCalculator implements TradePriceCalculator {
|
||||
if (config.getTradeDeductMaxPrice() != null && config.getTradeDeductMaxPrice() > 0) {
|
||||
usePoint = Math.min(usePoint, config.getTradeDeductMaxPrice());
|
||||
}
|
||||
// TODO @疯狂:这里应该是,抵扣到只剩下 0.01;
|
||||
// 积分优惠金额(分)
|
||||
int pointPrice = usePoint * config.getTradeDeductUnitPrice();
|
||||
if (result.getPrice().getPayPrice() <= pointPrice) {
|
||||
// 禁止0元购
|
||||
// 禁止 0 元购
|
||||
throw exception(PRICE_CALCULATE_PAY_PRICE_ILLEGAL);
|
||||
}
|
||||
// // 允许0 元购!!!:用户积分比较多时,积分可以抵扣的金额要大于支付金额,这时需要根据支付金额反推使用多少积分
|
||||
|
Reference in New Issue
Block a user