Commit fa526a98c0cd9a10e25418134ed8f1feee789972
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. 更新用户积分 |