code review:分销逻辑

This commit is contained in:
YunaiV 2023-09-25 09:39:39 +08:00
parent c92365128a
commit e384b810bf
13 changed files with 28 additions and 30 deletions

View File

@ -61,10 +61,13 @@ public class MoneyUtils {
/** /**
* 分转元字符串 * 分转元字符串
* *
* 例如说 fen 1 则结果为 0.01
*
* @param fen * @param fen
* @return * @return
*/ */
public static String fenToYuanStr(int fen) { public static String fenToYuanStr(int fen) {
return new Money(0, fen).toString(); return new Money(0, fen).toString();
} }
} }

View File

@ -147,4 +147,5 @@ public class ProductSpuRespDTO {
* true - 自行设置 * true - 自行设置
*/ */
private Boolean subCommissionType; private Boolean subCommissionType;
} }

View File

@ -179,6 +179,7 @@ public class ProductSpuDO extends BaseDO {
@TableField(typeHandler = JacksonTypeHandler.class) @TableField(typeHandler = JacksonTypeHandler.class)
private List<Long> giveCouponTemplateIds; private List<Long> giveCouponTemplateIds;
// TODO @puhui999字段估计要改成 brokerageType
/** /**
* 分销类型 * 分销类型
* *

View File

@ -8,4 +8,5 @@ package cn.iocoder.yudao.module.trade.enums;
public interface DictTypeConstants { public interface DictTypeConstants {
String BROKERAGE_WITHDRAW_STATUS = "brokerage_withdraw_status"; // 佣金提现状态 String BROKERAGE_WITHDRAW_STATUS = "brokerage_withdraw_status"; // 佣金提现状态
} }

View File

@ -92,6 +92,7 @@ public class BrokerageUserController {
Set<Long> userIds = convertSet(pageResult.getList(), BrokerageUserDO::getId); Set<Long> userIds = convertSet(pageResult.getList(), BrokerageUserDO::getId);
// 查询用户信息 // 查询用户信息
Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds); Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
// TODO @疯狂看看下面两个 getBrokerageUserCountByBindUserIdgetWithdrawSummaryByUserId 有没可能一次性出结果不然 n 次有点太花性能了
// 合计分佣订单 // 合计分佣订单
Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds, Map<Long, UserBrokerageSummaryBO> userOrderSummaryMap = convertMap(userIds,
userId -> userId, userId -> userId,
@ -101,13 +102,13 @@ public class BrokerageUserController {
Map<Long, Long> brokerageUserCountMap = convertMap(userIds, Map<Long, Long> brokerageUserCountMap = convertMap(userIds,
userId -> userId, userId -> userId,
userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId, null)); userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId, null));
// 合计提现 // 合计提现
Map<Long, UserWithdrawSummaryBO> withdrawMap = convertMap(userIds, Map<Long, UserWithdrawSummaryBO> withdrawMap = convertMap(userIds,
userId -> userId, userId -> userId,
userId -> brokerageWithdrawService.getWithdrawSummaryByUserId(userId, BrokerageWithdrawStatusEnum.AUDIT_SUCCESS)); userId -> brokerageWithdrawService.getWithdrawSummaryByUserId(userId, BrokerageWithdrawStatusEnum.AUDIT_SUCCESS));
// 拼接返回
return success(BrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap, userOrderSummaryMap, withdrawMap)); return success(BrokerageUserConvert.INSTANCE.convertPage(pageResult, userMap, brokerageUserCountMap,
userOrderSummaryMap, withdrawMap));
} }
} }

View File

@ -77,13 +77,15 @@ public class AppBrokerageUserController {
@PreAuthenticated @PreAuthenticated
public CommonResult<AppBrokerageUserMySummaryRespVO> getBrokerageUserSummary() { public CommonResult<AppBrokerageUserMySummaryRespVO> getBrokerageUserSummary() {
Long userId = getLoginUserId(); Long userId = getLoginUserId();
// TODO @疯狂后面这种要不也改成 convert感觉 controller 这样更容易看到整体核心其实是 868/879/909/91 这阶段
// 统计 yesterdayPricewithdrawPricefirstBrokerageUserCountsecondBrokerageUserCount 字段 // 统计 yesterdayPricewithdrawPricefirstBrokerageUserCountsecondBrokerageUserCount 字段
LocalDateTime yesterday = LocalDateTime.now().minusDays(1); LocalDateTime yesterday = LocalDateTime.now().minusDays(1);
LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(yesterday); LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(yesterday);
LocalDateTime endTime = LocalDateTimeUtil.endOfDay(yesterday); LocalDateTime endTime = LocalDateTimeUtil.endOfDay(yesterday);
AppBrokerageUserMySummaryRespVO respVO = new AppBrokerageUserMySummaryRespVO() AppBrokerageUserMySummaryRespVO respVO = new AppBrokerageUserMySummaryRespVO()
.setYesterdayPrice(brokerageRecordService.getSummaryPriceByUserId(userId, BrokerageRecordBizTypeEnum.ORDER.getType(), beginTime, endTime)) .setYesterdayPrice(brokerageRecordService.getSummaryPriceByUserId(userId, BrokerageRecordBizTypeEnum.ORDER.getType(), beginTime, endTime))
.setWithdrawPrice(Optional.ofNullable(brokerageWithdrawService.getWithdrawSummaryByUserId(userId, BrokerageWithdrawStatusEnum.AUDIT_SUCCESS)).map(UserWithdrawSummaryBO::getPrice).orElse(0)) .setWithdrawPrice(Optional.ofNullable(brokerageWithdrawService.getWithdrawSummaryByUserId(userId, BrokerageWithdrawStatusEnum.AUDIT_SUCCESS))
.map(UserWithdrawSummaryBO::getPrice).orElse(0))
.setBrokeragePrice(0).setFrozenPrice(0) .setBrokeragePrice(0).setFrozenPrice(0)
.setFirstBrokerageUserCount(brokerageUserService.getBrokerageUserCountByBindUserId(userId, 1)) .setFirstBrokerageUserCount(brokerageUserService.getBrokerageUserCountByBindUserId(userId, 1))
.setSecondBrokerageUserCount(brokerageUserService.getBrokerageUserCountByBindUserId(userId, 2)); .setSecondBrokerageUserCount(brokerageUserService.getBrokerageUserCountByBindUserId(userId, 2));

View File

@ -41,4 +41,5 @@ public interface BrokerageWithdrawMapper extends BaseMapperX<BrokerageWithdrawDO
"WHERE user_id = #{userId} AND status = #{status} AND deleted = FALSE") "WHERE user_id = #{userId} AND status = #{status} AND deleted = FALSE")
UserWithdrawSummaryBO selectCountAndSumPriceByUserIdAndStatus(@Param("userId") Long userId, UserWithdrawSummaryBO selectCountAndSumPriceByUserIdAndStatus(@Param("userId") Long userId,
@Param("status") Integer status); @Param("status") Integer status);
} }

View File

@ -315,37 +315,34 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
// 2.1 校验分销功能是否开启 // 2.1 校验分销功能是否开启
TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig(); TradeConfigDO tradeConfig = tradeConfigService.getTradeConfig();
if (tradeConfig == null || !BooleanUtil.isTrue(tradeConfig.getBrokerageEnabled())) { if (tradeConfig == null || BooleanUtil.isFalse(tradeConfig.getBrokerageEnabled())) {
return respVO; return respVO;
} }
// 2.2 校验用户是否有分销资格 // 2.2 校验用户是否有分销资格
respVO.setEnabled(brokerageUserService.getUserBrokerageEnabled(getLoginUserId())); respVO.setEnabled(brokerageUserService.getUserBrokerageEnabled(getLoginUserId()));
if (!BooleanUtil.isTrue(respVO.getEnabled())) { if (BooleanUtil.isFalse(respVO.getEnabled())) {
return respVO; return respVO;
} }
Integer fixedMinPrice = 0;
Integer fixedMaxPrice = 0;
Integer spuMinPrice = 0;
Integer spuMaxPrice = 0;
// 2.3 校验商品是否存在 // 2.3 校验商品是否存在
ProductSpuRespDTO spu = productSpuApi.getSpu(spuId); ProductSpuRespDTO spu = productSpuApi.getSpu(spuId);
if (spu == null) { if (spu == null) {
return respVO; return respVO;
} }
// 3.1 商品单独分佣模式
Integer fixedMinPrice = 0;
Integer fixedMaxPrice = 0;
Integer spuMinPrice = 0;
Integer spuMaxPrice = 0;
List<ProductSkuRespDTO> skuList = productSkuApi.getSkuListBySpuId(ListUtil.of(spuId)); List<ProductSkuRespDTO> skuList = productSkuApi.getSkuListBySpuId(ListUtil.of(spuId));
if (BooleanUtil.isTrue(spu.getSubCommissionType())) { if (BooleanUtil.isTrue(spu.getSubCommissionType())) {
// 3.1 商品单独分佣模式
fixedMinPrice = getMinValue(skuList, ProductSkuRespDTO::getFirstBrokeragePrice); fixedMinPrice = getMinValue(skuList, ProductSkuRespDTO::getFirstBrokeragePrice);
fixedMaxPrice = getMaxValue(skuList, ProductSkuRespDTO::getFirstBrokeragePrice); fixedMaxPrice = getMaxValue(skuList, ProductSkuRespDTO::getFirstBrokeragePrice);
// 3.2 全局分佣模式根据商品价格比例计算
} else { } else {
// 3.2 全局分佣模式根据商品价格比例计算
spuMinPrice = getMinValue(skuList, ProductSkuRespDTO::getPrice); spuMinPrice = getMinValue(skuList, ProductSkuRespDTO::getPrice);
spuMaxPrice = getMaxValue(skuList, ProductSkuRespDTO::getPrice); spuMaxPrice = getMaxValue(skuList, ProductSkuRespDTO::getPrice);
} }
respVO.setBrokerageMinPrice(calculatePrice(spuMinPrice, tradeConfig.getBrokerageFirstPercent(), fixedMinPrice)); respVO.setBrokerageMinPrice(calculatePrice(spuMinPrice, tradeConfig.getBrokerageFirstPercent(), fixedMinPrice));
respVO.setBrokerageMaxPrice(calculatePrice(spuMaxPrice, tradeConfig.getBrokerageFirstPercent(), fixedMaxPrice)); respVO.setBrokerageMaxPrice(calculatePrice(spuMaxPrice, tradeConfig.getBrokerageFirstPercent(), fixedMaxPrice));
return respVO; return respVO;

View File

@ -236,6 +236,7 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
// 校验分销关系绑定模式 // 校验分销关系绑定模式
if (BrokerageBindModeEnum.REGISTER.getMode().equals(tradeConfig.getBrokerageBindMode())) { if (BrokerageBindModeEnum.REGISTER.getMode().equals(tradeConfig.getBrokerageBindMode())) {
// TODO @疯狂是不是把 isNewUser 挪到这里好点呀
if (!BooleanUtil.isTrue(isNewUser)) { if (!BooleanUtil.isTrue(isNewUser)) {
throw exception(BROKERAGE_BIND_MODE_REGISTER); // 只有在注册时可以绑定 throw exception(BROKERAGE_BIND_MODE_REGISTER); // 只有在注册时可以绑定
} }

View File

@ -36,7 +36,7 @@ public class MemberUserRespDTO {
*/ */
private String mobile; private String mobile;
/** /**
* 创建时间 * 创建时间注册时间
*/ */
private LocalDateTime createTime; private LocalDateTime createTime;

View File

@ -31,7 +31,7 @@ public class AppDictDataController {
@GetMapping("/type") @GetMapping("/type")
@Operation(summary = "根据字典类型查询字典数据信息") @Operation(summary = "根据字典类型查询字典数据信息")
@Parameter(name = "type", description = "字典类型", required = true, example = "common_status") @Parameter(name = "type", description = "字典类型", required = true, example = "common_status")
public CommonResult<List<AppDictDataRespVO>> getDictDataListByType(@RequestParam String type) { public CommonResult<List<AppDictDataRespVO>> getDictDataListByType(@RequestParam("type") String type) {
List<DictDataDO> list = dictDataService.getEnabledDictDataListByType(type); List<DictDataDO> list = dictDataService.getEnabledDictDataListByType(type);
return success(DictDataConvert.INSTANCE.convertList03(list)); return success(DictDataConvert.INSTANCE.convertList03(list));
} }

View File

@ -6,7 +6,6 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
@Schema(description = "用户 App - 字典数据信息 Response VO") @Schema(description = "用户 App - 字典数据信息 Response VO")
@ -19,23 +18,12 @@ public class AppDictDataRespVO {
private Long id; private Long id;
@Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
@NotBlank(message = "字典标签不能为空")
@Size(max = 100, message = "字典标签长度不能超过100个字符")
private String label; private String label;
@Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder")
@NotBlank(message = "字典键值不能为空")
@Size(max = 100, message = "字典键值长度不能超过100个字符")
private String value; private String value;
@Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex")
@NotBlank(message = "字典类型不能为空")
@Size(max = 100, message = "字典类型长度不能超过100个字符")
private String dictType; private String dictType;
@Schema(description = "颜色类型,default、primary、success、info、warning、danger", example = "default")
private String colorType;
@Schema(description = "css 样式", example = "btn-visible")
private String cssClass;
} }

View File

@ -50,6 +50,8 @@ public interface DictDataMapper extends BaseMapperX<DictDataDO> {
default List<DictDataDO> selectListByTypeAndStatus(String dictType, Integer status) { default List<DictDataDO> selectListByTypeAndStatus(String dictType, Integer status) {
return selectList(new LambdaQueryWrapper<DictDataDO>() return selectList(new LambdaQueryWrapper<DictDataDO>()
.eq(DictDataDO::getDictType, dictType).eq(DictDataDO::getStatus, status)); .eq(DictDataDO::getDictType, dictType)
.eq(DictDataDO::getStatus, status));
} }
} }