Commit fa526a98c0cd9a10e25418134ed8f1feee789972

Authored by YunaiV
2 parents 9faee918 6ffb4ed1

Merge branch 'develop' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into master-jdk17

Showing 20 changed files with 115 additions and 32 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java
@@ -60,12 +60,13 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO @@ -60,12 +60,13 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO
60 // Backlog: 回款提醒类型 60 // Backlog: 回款提醒类型
61 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); 61 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
62 if (CrmReceivablePlanPageReqVO.REMIND_TYPE_NEEDED.equals(pageReqVO.getRemindType())) { // 待回款 62 if (CrmReceivablePlanPageReqVO.REMIND_TYPE_NEEDED.equals(pageReqVO.getRemindType())) { // 待回款
  63 + // 查询条件:未回款 + 提醒时间 <= 当前时间(反过来即当前时间 >= 提醒时间,已经到达提醒的时间点)
63 query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款 64 query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款
64 - .lt(CrmReceivablePlanDO::getReturnTime, beginOfToday) // 已逾期  
65 - .lt(CrmReceivablePlanDO::getRemindTime, beginOfToday); // 今天开始提醒  
66 - } else if (CrmReceivablePlanPageReqVO.REMIND_TYPE_EXPIRED.equals(pageReqVO.getRemindType())) { // 已逾期 65 + .le(CrmReceivablePlanDO::getRemindTime, beginOfToday); // 今天开始提醒
  66 + } else if (CrmReceivablePlanPageReqVO.REMIND_TYPE_EXPIRED.equals(pageReqVO.getRemindType())) { // 已逾期
  67 + // 查询条件:未回款 + 回款时间 < 当前时间(反过来即当前时间 > 回款时间,已经过了回款时间点)
67 query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款 68 query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款
68 - .ge(CrmReceivablePlanDO::getReturnTime, beginOfToday); // 已逾期 69 + .lt(CrmReceivablePlanDO::getReturnTime, beginOfToday); // 已逾期
69 } else if (CrmReceivablePlanPageReqVO.REMIND_TYPE_RECEIVED.equals(pageReqVO.getRemindType())) { // 已回款 70 } else if (CrmReceivablePlanPageReqVO.REMIND_TYPE_RECEIVED.equals(pageReqVO.getRemindType())) { // 已回款
70 query.isNotNull(CrmReceivablePlanDO::getReceivableId); 71 query.isNotNull(CrmReceivablePlanDO::getReceivableId);
71 } 72 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -270,7 +270,7 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -270,7 +270,7 @@ public class CrmContractServiceImpl implements CrmContractService {
270 } 270 }
271 271
272 @Override 272 @Override
273 - @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_FOLLOW_UP_SUB_TYPE, bizNo = "{{#id}", 273 + @LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_FOLLOW_UP_SUB_TYPE, bizNo = "{{#id}}",
274 success = CRM_CONTRACT_FOLLOW_UP_SUCCESS) 274 success = CRM_CONTRACT_FOLLOW_UP_SUCCESS)
275 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE) 275 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, bizId = "#id", level = CrmPermissionLevelEnum.WRITE)
276 public void updateContractFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent) { 276 public void updateContractFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent) {
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java
@@ -60,7 +60,8 @@ public class CrmPermissionUtils { @@ -60,7 +60,8 @@ public class CrmPermissionUtils {
60 } 60 }
61 query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) 61 query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
62 .eq(CrmPermissionDO::getBizId, bizId) 62 .eq(CrmPermissionDO::getBizId, bizId)
63 - .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel())); 63 + .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel())
  64 + .eq(CrmPermissionDO::getUserId,userId));
64 query.ne(ownerUserIdField, userId); 65 query.ne(ownerUserIdField, userId);
65 } 66 }
66 // 场景三:下属负责的数据(下属是负责人) 67 // 场景三:下属负责的数据(下属是负责人)
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuRespVO.java
@@ -48,4 +48,9 @@ public class AppProductSpuRespVO { @@ -48,4 +48,9 @@ public class AppProductSpuRespVO {
48 @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 48 @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
49 private Integer salesCount; 49 private Integer salesCount;
50 50
  51 + // ========== 物流相关字段 =========
  52 +
  53 + @Schema(description = "配送方式数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  54 + private List<Integer> deliveryTypes;
  55 +
51 } 56 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
@@ -78,7 +78,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -78,7 +78,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
78 @Transactional(rollbackFor = Exception.class) 78 @Transactional(rollbackFor = Exception.class)
79 public void updateSpu(ProductSpuSaveReqVO updateReqVO) { 79 public void updateSpu(ProductSpuSaveReqVO updateReqVO) {
80 // 校验 SPU 是否存在 80 // 校验 SPU 是否存在
81 - validateSpuExists(updateReqVO.getId()); 81 + ProductSpuDO spu = validateSpuExists(updateReqVO.getId());
82 // 校验分类、品牌 82 // 校验分类、品牌
83 validateCategory(updateReqVO.getCategoryId()); 83 validateCategory(updateReqVO.getCategoryId());
84 brandService.validateProductBrand(updateReqVO.getBrandId()); 84 brandService.validateProductBrand(updateReqVO.getBrandId());
@@ -87,7 +87,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -87,7 +87,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
87 productSkuService.validateSkuList(skuSaveReqList, updateReqVO.getSpecType()); 87 productSkuService.validateSkuList(skuSaveReqList, updateReqVO.getSpecType());
88 88
89 // 更新 SPU 89 // 更新 SPU
90 - ProductSpuDO updateObj = BeanUtils.toBean(updateReqVO, ProductSpuDO.class); 90 + ProductSpuDO updateObj = BeanUtils.toBean(updateReqVO, ProductSpuDO.class).setStatus(spu.getStatus());
91 initSpuFromSkus(updateObj, skuSaveReqList); 91 initSpuFromSkus(updateObj, skuSaveReqList);
92 productSpuMapper.updateById(updateObj); 92 productSpuMapper.updateById(updateObj);
93 // 批量更新 SKU 93 // 批量更新 SKU
@@ -176,10 +176,12 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -176,10 +176,12 @@ public class ProductSpuServiceImpl implements ProductSpuService {
176 productSkuService.deleteSkuBySpuId(id); 176 productSkuService.deleteSkuBySpuId(id);
177 } 177 }
178 178
179 - private void validateSpuExists(Long id) {  
180 - if (productSpuMapper.selectById(id) == null) { 179 + private ProductSpuDO validateSpuExists(Long id) {
  180 + ProductSpuDO spuDO = productSpuMapper.selectById(id);
  181 + if (spuDO == null) {
181 throw exception(SPU_NOT_EXISTS); 182 throw exception(SPU_NOT_EXISTS);
182 } 183 }
  184 + return spuDO;
183 } 185 }
184 186
185 @Override 187 @Override
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java
@@ -152,7 +152,7 @@ public class CouponServiceImpl implements CouponService { @@ -152,7 +152,7 @@ public class CouponServiceImpl implements CouponService {
152 findAndThen(userCouponIdsMap, userId, couponIds::addAll); 152 findAndThen(userCouponIdsMap, userId, couponIds::addAll);
153 } 153 }
154 } catch (Exception e) { 154 } catch (Exception e) {
155 - log.error("[takeCouponsByAdmin][coupon({}) 优惠券发放失败]", entry, e); 155 + log.error("[takeCouponsByAdmin][coupon({}) 优惠券发放失败 userId({})]", entry, userId, e);
156 } 156 }
157 } 157 }
158 return couponIds; 158 return couponIds;
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -93,6 +93,7 @@ public interface ErrorCodeConstants { @@ -93,6 +93,7 @@ public interface ErrorCodeConstants {
93 ErrorCode BROKERAGE_BIND_OVERRIDE = new ErrorCode(1_011_007_006, "已绑定了推广人"); 93 ErrorCode BROKERAGE_BIND_OVERRIDE = new ErrorCode(1_011_007_006, "已绑定了推广人");
94 ErrorCode BROKERAGE_BIND_LOOP = new ErrorCode(1_011_007_007, "下级不能绑定自己的上级"); 94 ErrorCode BROKERAGE_BIND_LOOP = new ErrorCode(1_011_007_007, "下级不能绑定自己的上级");
95 ErrorCode BROKERAGE_USER_LEVEL_NOT_SUPPORT = new ErrorCode(1_011_007_008, "目前只支持 level 小于等于 2"); 95 ErrorCode BROKERAGE_USER_LEVEL_NOT_SUPPORT = new ErrorCode(1_011_007_008, "目前只支持 level 小于等于 2");
  96 + ErrorCode BROKERAGE_CREATE_USER_EXISTS = new ErrorCode(1_011_007_009, "分销用户已存在");
96 97
97 // ========== 分销提现 模块 1-011-008-000 ========== 98 // ========== 分销提现 模块 1-011-008-000 ==========
98 ErrorCode BROKERAGE_WITHDRAW_NOT_EXISTS = new ErrorCode(1_011_008_000, "佣金提现记录不存在"); 99 ErrorCode BROKERAGE_WITHDRAW_NOT_EXISTS = new ErrorCode(1_011_008_000, "佣金提现记录不存在");
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java
@@ -47,6 +47,13 @@ public class BrokerageUserController { @@ -47,6 +47,13 @@ public class BrokerageUserController {
47 @Resource 47 @Resource
48 private MemberUserApi memberUserApi; 48 private MemberUserApi memberUserApi;
49 49
  50 + @PostMapping("/create")
  51 + @Operation(summary = "创建分销用户")
  52 + @PreAuthorize("@ss.hasPermission('trade:brokerage-user:create')")
  53 + public CommonResult<Long> createBrokerageUser(@Valid @RequestBody BrokerageUserCreateReqVO createReqVO) {
  54 + return success(brokerageUserService.createBrokerageUser(createReqVO));
  55 + }
  56 +
50 @PutMapping("/update-bind-user") 57 @PutMapping("/update-bind-user")
51 @Operation(summary = "修改推广员") 58 @Operation(summary = "修改推广员")
52 @PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-bind-user')") 59 @PreAuthorize("@ss.hasPermission('trade:brokerage-user:update-bind-user')")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import lombok.Data;
  6 +
  7 +@Schema(description = "管理后台 - 分销用户创建 Request VO")
  8 +@Data
  9 +public class BrokerageUserCreateReqVO {
  10 +
  11 + @Schema(description = "分销用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  12 + @NotNull(message = "分销用户编号不能为空")
  13 + private Long userId;
  14 +
  15 + @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4587")
  16 + private Long bindUserId;
  17 +
  18 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java
@@ -59,6 +59,9 @@ public interface BrokerageUserConvert { @@ -59,6 +59,9 @@ public interface BrokerageUserConvert {
59 } 59 }
60 60
61 default BrokerageUserRespVO copyTo(MemberUserRespDTO source, BrokerageUserRespVO target) { 61 default BrokerageUserRespVO copyTo(MemberUserRespDTO source, BrokerageUserRespVO target) {
  62 + if (target == null) {
  63 + return null;
  64 + }
62 Optional.ofNullable(source).ifPresent( 65 Optional.ofNullable(source).ifPresent(
63 user -> target.setNickname(user.getNickname()).setAvatar(user.getAvatar())); 66 user -> target.setNickname(user.getNickname()).setAvatar(user.getAvatar()));
64 return target; 67 return target;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
@@ -27,7 +27,7 @@ import java.util.Map; @@ -27,7 +27,7 @@ import java.util.Map;
27 * 27 *
28 * @author 芋道源码 28 * @author 芋道源码
29 */ 29 */
30 -@TableName("trade_order") 30 +@TableName(value = "trade_order", autoResultMap = true)
31 @KeySequence("trade_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 31 @KeySequence("trade_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
32 @Data 32 @Data
33 @EqualsAndHashCode(callSuper = true) 33 @EqualsAndHashCode(callSuper = true)
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
@@ -26,12 +26,12 @@ import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; @@ -26,12 +26,12 @@ import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
26 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO; 26 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryRespBO;
27 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; 27 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
28 import com.baomidou.mybatisplus.core.metadata.IPage; 28 import com.baomidou.mybatisplus.core.metadata.IPage;
  29 +import jakarta.annotation.Resource;
29 import lombok.extern.slf4j.Slf4j; 30 import lombok.extern.slf4j.Slf4j;
30 import org.springframework.stereotype.Service; 31 import org.springframework.stereotype.Service;
31 import org.springframework.transaction.annotation.Transactional; 32 import org.springframework.transaction.annotation.Transactional;
32 import org.springframework.validation.annotation.Validated; 33 import org.springframework.validation.annotation.Validated;
33 34
34 -import jakarta.annotation.Resource;  
35 import java.time.LocalDateTime; 35 import java.time.LocalDateTime;
36 import java.util.*; 36 import java.util.*;
37 37
@@ -79,7 +79,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -79,7 +79,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
79 TradeConfigDO memberConfig = tradeConfigService.getTradeConfig(); 79 TradeConfigDO memberConfig = tradeConfigService.getTradeConfig();
80 // 0 未启用分销功能 80 // 0 未启用分销功能
81 if (memberConfig == null || !BooleanUtil.isTrue(memberConfig.getBrokerageEnabled())) { 81 if (memberConfig == null || !BooleanUtil.isTrue(memberConfig.getBrokerageEnabled())) {
82 - log.warn("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({})", userId); 82 + log.error("[addBrokerage][增加佣金失败:brokerageEnabled 未配置,userId({}) bizType({}) list({})", userId, bizType, list);
83 return; 83 return;
84 } 84 }
85 85
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java
1 package cn.iocoder.yudao.module.trade.service.brokerage; 1 package cn.iocoder.yudao.module.trade.service.brokerage;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;
4 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO; 5 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
5 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO; 6 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
6 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO; 7 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
7 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO; 8 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
8 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO; 9 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
9 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; 10 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
  11 +import jakarta.validation.Valid;
10 import jakarta.validation.constraints.NotNull; 12 import jakarta.validation.constraints.NotNull;
11 13
12 /** 14 /**
@@ -108,6 +110,14 @@ public interface BrokerageUserService { @@ -108,6 +110,14 @@ public interface BrokerageUserService {
108 boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId); 110 boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId);
109 111
110 /** 112 /**
  113 + * 【管理员】创建分销用户
  114 + *
  115 + * @param createReqVO 请求
  116 + * @return 编号
  117 + */
  118 + Long createBrokerageUser(@Valid BrokerageUserCreateReqVO createReqVO);
  119 +
  120 + /**
111 * 获取用户是否有分销资格 121 * 获取用户是否有分销资格
112 * 122 *
113 * @param userId 用户编号 123 * @param userId 用户编号
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
@@ -8,9 +8,11 @@ import cn.hutool.core.util.ObjUtil; @@ -8,9 +8,11 @@ import cn.hutool.core.util.ObjUtil;
8 import cn.hutool.core.util.StrUtil; 8 import cn.hutool.core.util.StrUtil;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; 10 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
  11 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
11 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; 12 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
12 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 13 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
13 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 14 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  15 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;
14 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO; 16 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
15 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO; 17 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
16 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO; 18 import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
@@ -28,6 +30,7 @@ import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; @@ -28,6 +30,7 @@ import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
28 import com.baomidou.mybatisplus.core.metadata.IPage; 30 import com.baomidou.mybatisplus.core.metadata.IPage;
29 import jakarta.annotation.Resource; 31 import jakarta.annotation.Resource;
30 import org.springframework.stereotype.Service; 32 import org.springframework.stereotype.Service;
  33 +import org.springframework.transaction.annotation.Transactional;
31 import org.springframework.validation.annotation.Validated; 34 import org.springframework.validation.annotation.Validated;
32 35
33 import java.time.LocalDateTime; 36 import java.time.LocalDateTime;
@@ -110,7 +113,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -110,7 +113,6 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
110 if (brokerageUserDO == null) { 113 if (brokerageUserDO == null) {
111 throw exception(BROKERAGE_USER_NOT_EXISTS); 114 throw exception(BROKERAGE_USER_NOT_EXISTS);
112 } 115 }
113 -  
114 return brokerageUserDO; 116 return brokerageUserDO;
115 } 117 }
116 118
@@ -202,6 +204,24 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -202,6 +204,24 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
202 return true; 204 return true;
203 } 205 }
204 206
  207 + @Override
  208 + @Transactional(rollbackFor = Exception.class)
  209 + public Long createBrokerageUser(BrokerageUserCreateReqVO createReqVO) {
  210 + // 1.1 校验分销用户是否已存在
  211 + BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(createReqVO.getUserId());
  212 + if (brokerageUser != null) {
  213 + throw exception(BROKERAGE_CREATE_USER_EXISTS);
  214 + }
  215 + // 1.2 校验是否能绑定用户
  216 + brokerageUser = BeanUtils.toBean(createReqVO, BrokerageUserDO.class).setId(createReqVO.getUserId())
  217 + .setBrokerageTime(LocalDateTime.now());
  218 + validateCanBindUser(brokerageUser, createReqVO.getBindUserId());
  219 +
  220 + // 2. 创建分销人
  221 + brokerageUserMapper.insert(brokerageUser);
  222 + return brokerageUser.getId();
  223 + }
  224 +
205 /** 225 /**
206 * 补全绑定用户的字段 226 * 补全绑定用户的字段
207 * 227 *
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -329,7 +329,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -329,7 +329,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
329 /** 329 /**
330 * 校验支付订单的合法性 330 * 校验支付订单的合法性
331 * 331 *
332 - * @param order 交易订单 332 + * @param order 交易订单
333 * @param payOrderId 支付订单编号 333 * @param payOrderId 支付订单编号
334 * @return 支付订单 334 * @return 支付订单
335 */ 335 */
@@ -748,7 +748,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -748,7 +748,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
748 } 748 }
749 DeliveryPickUpStoreDO deliveryPickUpStore = pickUpStoreService.getDeliveryPickUpStore(order.getPickUpStoreId()); 749 DeliveryPickUpStoreDO deliveryPickUpStore = pickUpStoreService.getDeliveryPickUpStore(order.getPickUpStoreId());
750 if (deliveryPickUpStore == null 750 if (deliveryPickUpStore == null
751 - || !CollUtil.contains(deliveryPickUpStore.getVerifyUserIds(), userId)) { 751 + || !CollUtil.contains(deliveryPickUpStore.getVerifyUserIds(), userId)) {
752 throw exception(ORDER_PICK_UP_FAIL_NOT_VERIFY_USER); 752 throw exception(ORDER_PICK_UP_FAIL_NOT_VERIFY_USER);
753 } 753 }
754 754
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCouponOrderHandler.java
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
8 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; 8 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
9 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; 9 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
10 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
  11 +import lombok.extern.slf4j.Slf4j;
11 import org.springframework.context.annotation.Lazy; 12 import org.springframework.context.annotation.Lazy;
12 import org.springframework.stereotype.Component; 13 import org.springframework.stereotype.Component;
13 14
@@ -19,6 +20,7 @@ import java.util.List; @@ -19,6 +20,7 @@ import java.util.List;
19 * @author 芋道源码 20 * @author 芋道源码
20 */ 21 */
21 @Component 22 @Component
  23 +@Slf4j
22 public class TradeCouponOrderHandler implements TradeOrderHandler { 24 public class TradeCouponOrderHandler implements TradeOrderHandler {
23 25
24 @Resource 26 @Resource
@@ -46,11 +48,15 @@ public class TradeCouponOrderHandler implements TradeOrderHandler { @@ -46,11 +48,15 @@ public class TradeCouponOrderHandler implements TradeOrderHandler {
46 return; 48 return;
47 } 49 }
48 // 赠送优惠券 50 // 赠送优惠券
49 - List<Long> couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponTemplateCounts(), order.getUserId());  
50 - if (CollUtil.isEmpty(couponIds)) {  
51 - return; 51 + try {
  52 + List<Long> couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponTemplateCounts(), order.getUserId());
  53 + if (CollUtil.isEmpty(couponIds)) {
  54 + return;
  55 + }
  56 + orderUpdateService.updateOrderGiveCouponIds(order.getUserId(), order.getId(), couponIds);
  57 + } catch (Exception e) {
  58 + log.error("[afterPayOrder][order({}) 赠送优惠券({})失败,需要手工补偿]", order.getId(), order.getGiveCouponTemplateCounts(), e);
52 } 59 }
53 - orderUpdateService.updateOrderGiveCouponIds(order.getUserId(), order.getId(), couponIds);  
54 } 60 }
55 61
56 @Override 62 @Override
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
@@ -122,9 +122,13 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { @@ -122,9 +122,13 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
122 */ 122 */
123 private boolean isGlobalExpressFree(TradePriceCalculateRespBO result) { 123 private boolean isGlobalExpressFree(TradePriceCalculateRespBO result) {
124 TradeConfigDO config = tradeConfigService.getTradeConfig(); 124 TradeConfigDO config = tradeConfigService.getTradeConfig();
125 - return config == null  
126 - || Boolean.TRUE.equals(config.getDeliveryExpressFreeEnabled()) // 开启包邮  
127 - || result.getPrice().getPayPrice() >= config.getDeliveryExpressFreePrice(); // 满足包邮的价格 125 + // 情况一:交易中心配置不存在默认不包邮
  126 + if (config == null) {
  127 + return false;
  128 + }
  129 + // 情况二:开启了全局包邮 && 满足包邮金额
  130 + return Boolean.TRUE.equals(config.getDeliveryExpressFreeEnabled()) &&
  131 + result.getPrice().getPayPrice() >= config.getDeliveryExpressFreePrice();
128 } 132 }
129 133
130 private void calculateDeliveryPrice(List<OrderItem> selectedSkus, 134 private void calculateDeliveryPrice(List<OrderItem> selectedSkus,
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
@@ -4,11 +4,11 @@ import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; @@ -4,11 +4,11 @@ import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO;
4 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert; 4 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
5 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 5 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
6 import cn.iocoder.yudao.module.member.service.level.MemberLevelService; 6 import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
  7 +import jakarta.annotation.Resource;
  8 +import lombok.extern.slf4j.Slf4j;
7 import org.springframework.stereotype.Service; 9 import org.springframework.stereotype.Service;
8 import org.springframework.validation.annotation.Validated; 10 import org.springframework.validation.annotation.Validated;
9 11
10 -import jakarta.annotation.Resource;  
11 -  
12 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 12 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
13 import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT; 13 import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT;
14 14
@@ -17,6 +17,7 @@ import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE @@ -17,6 +17,7 @@ import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE
17 * 17 *
18 * @author owen 18 * @author owen
19 */ 19 */
  20 +@Slf4j
20 @Service 21 @Service
21 @Validated 22 @Validated
22 public class MemberLevelApiImpl implements MemberLevelApi { 23 public class MemberLevelApiImpl implements MemberLevelApi {
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java
@@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.member.api.point; @@ -3,11 +3,11 @@ package cn.iocoder.yudao.module.member.api.point;
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; 4 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
5 import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; 5 import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService;
  6 +import jakarta.annotation.Resource;
  7 +import lombok.extern.slf4j.Slf4j;
6 import org.springframework.stereotype.Service; 8 import org.springframework.stereotype.Service;
7 import org.springframework.validation.annotation.Validated; 9 import org.springframework.validation.annotation.Validated;
8 10
9 -import jakarta.annotation.Resource;  
10 -  
11 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 11 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
12 import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; 12 import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT;
13 13
@@ -16,6 +16,7 @@ import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECO @@ -16,6 +16,7 @@ import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECO
16 * 16 *
17 * @author owen 17 * @author owen
18 */ 18 */
  19 +@Slf4j
19 @Service 20 @Service
20 @Validated 21 @Validated
21 public class MemberPointApiImpl implements MemberPointApi { 22 public class MemberPointApiImpl implements MemberPointApi {
@@ -28,7 +29,9 @@ public class MemberPointApiImpl implements MemberPointApi { @@ -28,7 +29,9 @@ public class MemberPointApiImpl implements MemberPointApi {
28 Assert.isTrue(point > 0); 29 Assert.isTrue(point > 0);
29 MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); 30 MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType);
30 if (bizTypeEnum == null) { 31 if (bizTypeEnum == null) {
31 - throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); 32 + log.error("[addPoint][userId({}) point({}) bizType({}) bizId({}) {}]", userId, point, bizType, bizId,
  33 + POINT_RECORD_BIZ_NOT_SUPPORT);
  34 + return;
32 } 35 }
33 memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); 36 memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId);
34 } 37 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.member.service.point; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.member.service.point;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO; 6 import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordPageReqVO;
8 import cn.iocoder.yudao.module.member.controller.app.point.vo.AppMemberPointRecordPageReqVO; 7 import cn.iocoder.yudao.module.member.controller.app.point.vo.AppMemberPointRecordPageReqVO;
@@ -11,6 +10,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; @@ -11,6 +10,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
11 import cn.iocoder.yudao.module.member.dal.mysql.point.MemberPointRecordMapper; 10 import cn.iocoder.yudao.module.member.dal.mysql.point.MemberPointRecordMapper;
12 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; 11 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
13 import cn.iocoder.yudao.module.member.service.user.MemberUserService; 12 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
  13 +import jakarta.annotation.Resource;
14 import lombok.extern.slf4j.Slf4j; 14 import lombok.extern.slf4j.Slf4j;
15 import org.apache.commons.lang3.StringUtils; 15 import org.apache.commons.lang3.StringUtils;
16 import org.springframework.stereotype.Service; 16 import org.springframework.stereotype.Service;
@@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional; @@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional;
18 import org.springframework.util.CollectionUtils; 18 import org.springframework.util.CollectionUtils;
19 import org.springframework.validation.annotation.Validated; 19 import org.springframework.validation.annotation.Validated;
20 20
21 -import jakarta.annotation.Resource;  
22 import java.util.List; 21 import java.util.List;
23 import java.util.Set; 22 import java.util.Set;
24 23
@@ -75,7 +74,9 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { @@ -75,7 +74,9 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService {
75 Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); 74 Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0);
76 int totalPoint = userPoint + point; // 用户变动后的积分 75 int totalPoint = userPoint + point; // 用户变动后的积分
77 if (totalPoint < 0) { 76 if (totalPoint < 0) {
78 - throw exception(USER_POINT_NOT_ENOUGH); 77 + log.error("[createPointRecord][userId({}) point({}) bizType({}) bizId({}) {}]", userId, point, bizType, bizId,
  78 + USER_POINT_NOT_ENOUGH);
  79 + return;
79 } 80 }
80 81
81 // 2. 更新用户积分 82 // 2. 更新用户积分