Commit 1b9a3f9f637e6665e48d26ca45f147c4c9b7ce53

Authored by YunaiV
2 parents 9358639c 284506b3

code review:调整操作日志的封装

Showing 11 changed files with 381 additions and 0 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java
@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.promotion.api.combination; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.promotion.api.combination;
2 2
3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO; 3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;
4 import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService; 4 import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
  5 +import org.springframework.stereotype.Service;
  6 +import org.springframework.validation.annotation.Validated;
5 7
6 import javax.annotation.Resource; 8 import javax.annotation.Resource;
7 9
@@ -10,6 +12,8 @@ import javax.annotation.Resource; @@ -10,6 +12,8 @@ import javax.annotation.Resource;
10 * 12 *
11 * @author HUIHUI 13 * @author HUIHUI
12 */ 14 */
  15 +@Service
  16 +@Validated
13 public class CombinationApiImpl implements CombinationApi { 17 public class CombinationApiImpl implements CombinationApi {
14 18
15 @Resource 19 @Resource
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
@@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivi @@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivi
22 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper; 22 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper;
23 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; 23 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
24 import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi; 24 import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi;
  25 +import org.springframework.context.annotation.Lazy;
25 import org.springframework.stereotype.Service; 26 import org.springframework.stereotype.Service;
26 import org.springframework.transaction.annotation.Transactional; 27 import org.springframework.transaction.annotation.Transactional;
27 import org.springframework.validation.annotation.Validated; 28 import org.springframework.validation.annotation.Validated;
@@ -52,7 +53,9 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -52,7 +53,9 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
52 private CombinationActivityMapper combinationActivityMapper; 53 private CombinationActivityMapper combinationActivityMapper;
53 @Resource 54 @Resource
54 private CombinationProductMapper combinationProductMapper; 55 private CombinationProductMapper combinationProductMapper;
  56 +
55 @Resource 57 @Resource
  58 + @Lazy // TODO @puhui999:我感觉 validateCombination 可以挪到 CombinationRecordServiceImpl 中,因为它更偏向能不能创建拼团记录;
56 private CombinationRecordService combinationRecordService; 59 private CombinationRecordService combinationRecordService;
57 60
58 @Resource 61 @Resource
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderOperateTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.enums.order;
  2 +
  3 +import lombok.Getter;
  4 +import lombok.RequiredArgsConstructor;
  5 +
  6 +/**
  7 + * 订单操作类型的枚举
  8 + *
  9 + * @author 陈賝
  10 + * @since 2023/7/6 15:31
  11 + */
  12 +@RequiredArgsConstructor
  13 +@Getter
  14 +public enum TradeOrderOperateTypeEnum {
  15 +
  16 + MEMBER_CREATE(1, "用户下单"),
  17 + TEST(2, "用户({nickname})做了({thing})"),
  18 + ;
  19 +
  20 + /**
  21 + * 类型
  22 + */
  23 + private final Integer type;
  24 + /**
  25 + * 类型
  26 + */
  27 + private final String content;
  28 +
  29 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
1 package cn.iocoder.yudao.module.trade.controller.app.order; 1 package cn.iocoder.yudao.module.trade.controller.app.order;
2 2
  3 +import cn.hutool.core.map.MapUtil;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; 6 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
@@ -11,8 +12,11 @@ import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; @@ -11,8 +12,11 @@ import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
11 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; 12 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
12 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 13 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
13 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 14 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  15 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderOperateTypeEnum;
14 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 16 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
15 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 17 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
  18 +import cn.iocoder.yudao.module.trade.framework.order.core.annotations.TradeOrderLog;
  19 +import cn.iocoder.yudao.module.trade.framework.order.core.utils.TradeOrderLogUtils;
16 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; 20 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
17 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; 21 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
18 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; 22 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
@@ -61,7 +65,10 @@ public class AppTradeOrderController { @@ -61,7 +65,10 @@ public class AppTradeOrderController {
61 @PostMapping("/create") 65 @PostMapping("/create")
62 @Operation(summary = "创建订单") 66 @Operation(summary = "创建订单")
63 @PreAuthenticated 67 @PreAuthenticated
  68 + @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.TEST)
64 public CommonResult<AppTradeOrderCreateRespVO> createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO) { 69 public CommonResult<AppTradeOrderCreateRespVO> createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO) {
  70 + TradeOrderLogUtils.setOrderInfo(10L, 1, 2,
  71 + MapUtil.<String, Object>builder().put("nickname", "小明").put("thing", "种土豆").build());
65 TradeOrderDO order = tradeOrderUpdateService.createOrder(getLoginUserId(), getClientIP(), createReqVO); 72 TradeOrderDO order = tradeOrderUpdateService.createOrder(getLoginUserId(), getClientIP(), createReqVO);
66 return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId())); 73 return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId()));
67 } 74 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderLogDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.dal.dataobject.order;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  4 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  5 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderOperateTypeEnum;
  6 +import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableId;
  8 +import com.baomidou.mybatisplus.annotation.TableName;
  9 +import lombok.*;
  10 +
  11 +/**
  12 + * 订单日志 DO
  13 + *
  14 + * @author 陈賝
  15 + */
  16 +@TableName("trade_order_log")
  17 +@KeySequence("trade_order_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  18 +@Data
  19 +@EqualsAndHashCode(callSuper = true)
  20 +@ToString(callSuper = true)
  21 +@Builder
  22 +@NoArgsConstructor
  23 +@AllArgsConstructor
  24 +public class TradeOrderLogDO extends BaseDO {
  25 +
  26 + /**
  27 + * 用户类型 - 系统
  28 + *
  29 + * 例如说:Job 自动过期订单时,通过系统自动操作
  30 + */
  31 + public static final Integer USER_TYPE_SYSTEM = 0;
  32 + /**
  33 + * 用户编号 - 系统
  34 + */
  35 + public static final Long USER_ID_SYSTEM = 0L;
  36 +
  37 + /**
  38 + * 编号
  39 + */
  40 + @TableId
  41 + private Long id;
  42 + /**
  43 + * 用户编号
  44 + *
  45 + * 关联 AdminUserDO 的 id 字段、或者 MemberUserDO 的 id 字段
  46 + */
  47 + private Long userId;
  48 + /**
  49 + * 用户类型
  50 + *
  51 + * 枚举 {@link UserTypeEnum}
  52 + */
  53 + private Integer userType;
  54 +
  55 + /**
  56 + * 订单号
  57 + *
  58 + * 关联 {@link TradeOrderDO#getId()}
  59 + */
  60 + private Long orderId;
  61 + /**
  62 + * 操作前状态
  63 + */
  64 + private Integer beforeStatus;
  65 + /**
  66 + * 操作后状态
  67 + */
  68 + private Integer afterStatus;
  69 +
  70 + /**
  71 + * 操作类型
  72 + *
  73 + * {@link TradeOrderOperateTypeEnum}
  74 + */
  75 + private Integer operateType;
  76 + /**
  77 + * 订单日志信息
  78 + */
  79 + private String content;
  80 +
  81 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/TradeOrderLog.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.order.core.annotations;
  2 +
  3 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderOperateTypeEnum;
  4 +
  5 +import java.lang.annotation.*;
  6 +
  7 +import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
  8 +import static java.lang.annotation.ElementType.METHOD;
  9 +
  10 +/**
  11 + * 交易订单的操作日志 AOP 注解
  12 + *
  13 + * @author 陈賝
  14 + * @since 2023/7/6 15:37
  15 + */
  16 +@Target({METHOD, ANNOTATION_TYPE})
  17 +@Retention(RetentionPolicy.RUNTIME)
  18 +@Documented
  19 +public @interface TradeOrderLog {
  20 +
  21 + /**
  22 + * 操作类型
  23 + */
  24 + TradeOrderOperateTypeEnum operateType();
  25 +
  26 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/TradeOrderLogAspect.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.order.core.aop;
  2 +
  3 +
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.hutool.core.util.StrUtil;
  6 +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO;
  8 +import cn.iocoder.yudao.module.trade.framework.order.core.annotations.TradeOrderLog;
  9 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderLogService;
  10 +import cn.iocoder.yudao.module.trade.service.order.bo.logger.TradeOrderLogCreateReqBO;
  11 +import lombok.extern.slf4j.Slf4j;
  12 +import org.aspectj.lang.JoinPoint;
  13 +import org.aspectj.lang.annotation.AfterReturning;
  14 +import org.aspectj.lang.annotation.Aspect;
  15 +import org.springframework.stereotype.Component;
  16 +
  17 +import javax.annotation.Resource;
  18 +import java.util.Map;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
  21 +import static java.util.Collections.emptyMap;
  22 +
  23 +/**
  24 + * 交易订单的操作日志的记录 AOP 切面
  25 + *
  26 + * @author 陈賝
  27 + * @since 2023/6/13 13:54
  28 + */
  29 +@Component
  30 +@Aspect
  31 +@Slf4j
  32 +public class TradeOrderLogAspect {
  33 +
  34 + /**
  35 + * 订单编号
  36 + */
  37 + private static final ThreadLocal<Long> ORDER_ID = new ThreadLocal<>();
  38 + /**
  39 + * 操作前的状态
  40 + */
  41 + private static final ThreadLocal<Integer> BEFORE_STATUS = new ThreadLocal<>();
  42 + /**
  43 + * 操作后的状态
  44 + */
  45 + private static final ThreadLocal<Integer> AFTER_STATUS = new ThreadLocal<>();
  46 + /**
  47 + * 拓展参数 Map,用于格式化操作内容
  48 + */
  49 + private static final ThreadLocal<Map<String, Object>> EXTS = new ThreadLocal<>();
  50 +
  51 + public TradeOrderLogAspect() {
  52 + System.out.println();
  53 + }
  54 +
  55 + @Resource
  56 + private TradeOrderLogService orderLogService;
  57 +
  58 + @AfterReturning("@annotation(orderLog)")
  59 + public void doAfterReturning(JoinPoint joinPoint, TradeOrderLog orderLog) {
  60 + try {
  61 + // 1.1 操作用户
  62 + Integer userType = getUserType();
  63 + Long userId = getUserId();
  64 + // 1.2 订单信息
  65 + Long orderId = ORDER_ID.get();
  66 + Integer beforeStatus = BEFORE_STATUS.get();
  67 + Integer afterStatus = AFTER_STATUS.get();
  68 + Map<String, Object> exts = ObjectUtil.defaultIfNull(EXTS.get(), emptyMap());
  69 + String content = StrUtil.format(orderLog.operateType().getContent(), exts);
  70 +
  71 + // 2.1 记录日志
  72 + TradeOrderLogCreateReqBO createBO = new TradeOrderLogCreateReqBO()
  73 + .setUserId(userId).setUserType(userType)
  74 + .setOrderId(orderId).setBeforeStatus(beforeStatus).setAfterStatus(afterStatus)
  75 + .setOperateType(orderLog.operateType().getType()).setContent(content);
  76 + orderLogService.createOrderLog(createBO);
  77 + } catch (Exception ex) {
  78 + // todo 芋艿:清理上下文
  79 + log.error("[doAfterReturning][orderLog({}) 订单日志错误]", toJsonString(orderLog), ex);
  80 + }
  81 + }
  82 +
  83 + /**
  84 + * 获得用户类型
  85 + *
  86 + * 如果没有,则约定为 {@link TradeOrderLogDO#getUserType()} 系统
  87 + *
  88 + * @return 用户类型
  89 + */
  90 + private static Integer getUserType() {
  91 + return ObjectUtil.defaultIfNull(WebFrameworkUtils.getLoginUserType(), TradeOrderLogDO.USER_TYPE_SYSTEM);
  92 + }
  93 +
  94 + /**
  95 + * 获得用户编号
  96 + *
  97 + * 如果没有,则约定为 {@link TradeOrderLogDO#getUserId()} 系统
  98 + *
  99 + * @return 用户类型
  100 + */
  101 + private static Long getUserId() {
  102 + return ObjectUtil.defaultIfNull(WebFrameworkUtils.getLoginUserId(), TradeOrderLogDO.USER_ID_SYSTEM);
  103 + }
  104 +
  105 + public static void setOrderInfo(Long id, Integer beforeStatus, Integer afterStatus, Map<String, Object> exts) {
  106 + ORDER_ID.set(id);
  107 + BEFORE_STATUS.set(beforeStatus);
  108 + AFTER_STATUS.set(afterStatus);
  109 + EXTS.set(exts);
  110 + }
  111 +
  112 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/utils/TradeOrderLogUtils.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.order.core.utils;
  2 +
  3 +import cn.iocoder.yudao.module.trade.framework.order.core.aop.TradeOrderLogAspect;
  4 +
  5 +import java.util.Map;
  6 +
  7 +/**
  8 + * 交易订单的操作日志 Utils
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +public class TradeOrderLogUtils {
  13 +
  14 + public static void setOrderInfo(Long id, Integer beforeStatus, Integer afterStatus) {
  15 + TradeOrderLogAspect.setOrderInfo(id, beforeStatus, afterStatus, null);
  16 + }
  17 +
  18 + public static void setOrderInfo(Long id, Integer beforeStatus, Integer afterStatus,
  19 + Map<String, Object> exts) {
  20 + TradeOrderLogAspect.setOrderInfo(id, beforeStatus, afterStatus, exts);
  21 + }
  22 +
  23 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderLogService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order;
  2 +
  3 +import cn.iocoder.yudao.module.trade.service.order.bo.logger.TradeOrderLogCreateReqBO;
  4 +import org.springframework.scheduling.annotation.Async;
  5 +
  6 +/**
  7 + * 交易下单日志 Service 接口
  8 + *
  9 + * @author 陈賝
  10 + * @since 2023/7/6 15:44
  11 + */
  12 +public interface TradeOrderLogService {
  13 +
  14 + /**
  15 + * 创建交易下单日志
  16 + *
  17 + * @param logDTO 日志记录
  18 + * @author 陈賝
  19 + * @since 2023/7/6 15:45
  20 + */
  21 + @Async
  22 + void createOrderLog(TradeOrderLogCreateReqBO logDTO);
  23 +
  24 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderLogServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order;
  2 +
  3 +import cn.iocoder.yudao.module.trade.service.order.bo.logger.TradeOrderLogCreateReqBO;
  4 +import org.springframework.stereotype.Service;
  5 +
  6 +/**
  7 + * 交易下单日志 Service 实现类
  8 + *
  9 + * @author 陈賝
  10 + * @since 2023/7/6 15:44
  11 + */
  12 +@Service
  13 +public class TradeOrderLogServiceImpl implements TradeOrderLogService {
  14 +
  15 + @Override
  16 + public void createOrderLog(TradeOrderLogCreateReqBO createReqBO) {
  17 + // TODO 芋艿:存储还没搞
  18 + System.out.println();
  19 + }
  20 +
  21 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/logger/TradeOrderLogCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.bo.logger;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import javax.validation.constraints.NotNull;
  6 +
  7 +/**
  8 + * 订单日志的创建 Request BO
  9 + *
  10 + * @author 陈賝
  11 + * @since 2023/7/6 15:27
  12 + */
  13 +@Data
  14 +public class TradeOrderLogCreateReqBO {
  15 +
  16 + /**
  17 + * 用户编号
  18 + */
  19 + @NotNull(message = "用户编号不能为空")
  20 + private Long userId;
  21 + /**
  22 + * 用户类型
  23 + */
  24 + @NotNull(message = "用户类型不能为空")
  25 + private Integer userType;
  26 +
  27 + /**
  28 + * 订单编号
  29 + */
  30 + @NotNull(message = "订单编号")
  31 + private Long orderId;
  32 + /**
  33 + * 操作前状态
  34 + */
  35 + private Integer beforeStatus;
  36 + /**
  37 + * 操作后状态
  38 + */
  39 + @NotNull(message = "操作后的状态不能为空")
  40 + private Integer afterStatus;
  41 +
  42 + /**
  43 + * 操作类型
  44 + */
  45 + private Integer operateType;
  46 + /**
  47 + * 操作明细
  48 + */
  49 + private String content;
  50 +
  51 +}