From 75afab1f86c00f4e465ea6fd94de7fbd66bb5a5b Mon Sep 17 00:00:00 2001 From: chenchen <934298133@qq.com> Date: Sun, 25 Jun 2023 23:08:07 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=94=AE=E5=90=8E=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/aftersale/AfterSaleOperateTypeEnum.java | 15 +++++++++------ .../dataobject/aftersale/TradeAfterSaleLogDO.java | 1 - ...iguration.java => AfterSaleConfiguration.java} | 5 ++--- .../aftersalelog/core/aop/AfterSaleLogAspect.java | 7 ++++--- .../aftersale/TradeAfterSaleServiceImpl.java | 11 +---------- 5 files changed, 16 insertions(+), 23 deletions(-) rename yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/{AfterSaleLogConfiguration.java => AfterSaleConfiguration.java} (76%) diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java index da41c2b93..7e374e335 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleOperateTypeEnum.java @@ -1,26 +1,29 @@ package cn.iocoder.yudao.module.trade.enums.aftersale; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + /** * 售后操作类型的枚举 * * @author 陈賝 * @since 2023/6/13 13:53 */ -// TODO @chenchen:可以 lombok 简化构造方法,和 get 方法 +@RequiredArgsConstructor +@Getter public enum AfterSaleOperateTypeEnum { /** * 用户申请 */ - APPLY("用户申请"), + APPLY(0, "用户申请"), ; + // 类型 + private final Integer type; + // 描述 private final String description; - AfterSaleOperateTypeEnum(String description) { - this.description = description; - } - public String description() { return description; } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java index 56a0f0f32..168eb741f 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java @@ -49,7 +49,6 @@ public class TradeAfterSaleLogDO extends BaseDO { * 关联 {@link TradeAfterSaleDO#getId()} */ private Long afterSaleId; - // todo @CHENCHEN: 改成 Integer 哈;主要未来改文案,不好洗 log 存的字段; /** * 操作类型 * diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleConfiguration.java similarity index 76% rename from yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java rename to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleConfiguration.java index 1c382d24f..7c7fc7f4f 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleConfiguration.java @@ -4,15 +4,14 @@ import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.aop.AfterSaleLo import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -// TODO @chenchen:改成 aftersale 好点哈; /** - * trade 模块的 afterSaleLog 组件的 Configuration + * trade 模块的 afterSale 组件的 Configuration * * @author 陈賝 * @since 2023/6/18 11:09 */ @Configuration(proxyBeanMethods = false) -public class AfterSaleLogConfiguration { +public class AfterSaleConfiguration { @Bean public AfterSaleLogAspect afterSaleLogAspect() { diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java index 93186edf1..5ff16d38a 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java @@ -31,12 +31,13 @@ import static java.util.Arrays.asList; @Aspect public class AfterSaleLogAspect { + private final static String OPERATE_TYPE = "operateType"; + private final static String ID = "id"; + private final static String CONTENT = "content"; + @Resource private AfterSaleLogService afterSaleLogService; - // TODO chenchen: 这个分 3 行把; - private final static String OPERATE_TYPE = "operateType", ID = "id", CONTENT = "content"; - /** * 切面存入日志 */ diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java index fc86f230a..a5fa11c9e 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java @@ -398,14 +398,6 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa this.createLog(logDTO); } - // TODO @CHENCHEN:这个注释,写在接口就好了,补充重复写哈;@date 应该是 @since - /** - * 日志记录 - * - * @param logDTO 日志记录 - * @author 陈賝 - * @date 2023/6/12 14:18 - */ @Override @Async public void createLog(TradeAfterSaleLogCreateReqDTO logDTO) { @@ -417,8 +409,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa .setOperateType(logDTO.getOperateType()) .setContent(logDTO.getContent()); tradeAfterSaleLogMapper.insert(afterSaleLog); - // TODO @CHENCHEN:代码排版哈;空格要正确 - }catch (Exception exception){ + } catch (Exception exception) { log.error("[createLog][request({}) 日志记录错误]", toJsonString(logDTO), exception); } } From 2865c28a9f8768f805db262da10fdc5bdbb71477 Mon Sep 17 00:00:00 2001 From: chenchen <934298133@qq.com> Date: Tue, 27 Jun 2023 23:07:06 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=94=AE=E5=90=8E=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8Cmap->=E6=8A=BD=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aftersale/TradeAfterSaleLogDO.java | 2 +- .../core/aop/AfterSaleLogAspect.java | 65 +++++++++++++------ .../dto/TradeAfterSaleLogCreateReqDTO.java | 2 +- .../aftersale/TradeAfterSaleServiceImpl.java | 2 +- 4 files changed, 47 insertions(+), 24 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java index 168eb741f..1e18bf6e5 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java @@ -54,7 +54,7 @@ public class TradeAfterSaleLogDO extends BaseDO { * * 枚举 {@link AfterSaleOperateTypeEnum} */ - private String operateType; + private Integer operateType; /** * 操作明细 */ diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java index 5ff16d38a..cdb2c0a48 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java @@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog; import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO; import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService; @@ -47,13 +48,12 @@ public class AfterSaleLogAspect { // 日志对象拼接 Integer userType = WebFrameworkUtils.getLoginUserType(); Long id = WebFrameworkUtils.getLoginUserId(); - Map formatObj = spelFormat(joinPoint, info); TradeAfterSaleLogCreateReqDTO dto = new TradeAfterSaleLogCreateReqDTO() .setUserId(id) .setUserType(userType) - .setAfterSaleId(MapUtil.getLong(formatObj, ID)) - .setOperateType(MapUtil.getStr(formatObj, OPERATE_TYPE)) - .setContent(MapUtil.getStr(formatObj, CONTENT)); + .setAfterSaleId(getAfterSaleId(joinPoint, info, afterSaleLog.id())) + .setOperateType(afterSaleLog.operateType().getType()) + .setContent(getContent(joinPoint, info, afterSaleLog)); // 异步存入数据库 afterSaleLogService.createLog(dto); } catch (Exception exception) { @@ -64,26 +64,49 @@ public class AfterSaleLogAspect { /** * 获取描述信息 */ - public static Map spelFormat(JoinPoint joinPoint, Object info) { + private static Map spelFormat(JoinPoint joinPoint, Object info) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); AfterSaleLog afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLog.class); - HashMap result = Maps.newHashMapWithExpectedSize(2); - Map spelMap = SpringExpressionUtils.parseExpression(joinPoint, info, + return SpringExpressionUtils.parseExpression(joinPoint, info, asList(afterSaleLogPoint.id(), afterSaleLogPoint.content())); - // TODO @chenchen:是不是抽成 3 个方法好点;毕竟 map 太抽象了;; - // 售后ID - String id = MapUtil.getStr(spelMap, afterSaleLogPoint.id()); - result.put(ID, id); - // 操作类型 - String operateType = afterSaleLogPoint.operateType().description(); - result.put(OPERATE_TYPE, operateType); - // 日志内容 - String content = MapUtil.getStr(spelMap, afterSaleLogPoint.content()); - if (ObjectUtil.isNotNull(afterSaleLogPoint.operateType())) { - content += operateType; - } - result.put(CONTENT, content); - return result; } + /** + * 获取售后ID + */ + private static Long getAfterSaleId(JoinPoint joinPoint, Object info, String spel) { + Map spelMap = spelFormat(joinPoint, info); + return MapUtil.getLong(spelMap, spel); + } + + /** + * 获取解析后的日志内容 + */ + private static String getContent(JoinPoint joinPoint, Object info, AfterSaleLog afterSaleLog) { + Map spelMap = spelFormat(joinPoint, info); + StringBuilder content = new StringBuilder().append(MapUtil.getStr(spelMap, afterSaleLog.content())); + AfterSaleOperateTypeEnum afterSaleOperateTypeEnum = afterSaleLog.operateType(); + return ObjectUtil.isNotNull(afterSaleOperateTypeEnum) ? + content.append(afterSaleOperateTypeEnum.getDescription()).toString() : content.toString(); + } + + // public static Map spelFormat(JoinPoint joinPoint, Object info) { + // MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + // AfterSaleLog afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLog.class); + // HashMap result = Maps.newHashMapWithExpectedSize(2); + // Map spelMap = SpringExpressionUtils.parseExpression(joinPoint, info, + // asList(afterSaleLogPoint.id(), afterSaleLogPoint.content())); + // + // // 售后ID + // result.put(ID, MapUtil.getLong(spelMap, afterSaleLogPoint.id())); + // // 操作类型 + // result.put(OPERATE_TYPE, afterSaleLogPoint.operateType().getType()); + // // 日志内容 + // StringBuilder content = new StringBuilder().append(MapUtil.getStr(spelMap, afterSaleLogPoint.content())); + // + // result.put(CONTENT, ObjectUtil.isNotNull(afterSaleLogPoint.operateType()) ? + // content.append(afterSaleLogPoint.operateType().getDescription()).toString() : content.toString()); + // return result; + // } + } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java index 7beac68cf..1b2c640a2 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java @@ -37,7 +37,7 @@ public class TradeAfterSaleLogCreateReqDTO { /** * 操作类型 */ - private String operateType; + private Integer operateType; /** * 操作明细 */ diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java index a5fa11c9e..1ebfe5664 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java @@ -393,7 +393,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa .setUserId(userId) .setUserType(userType) .setAfterSaleId(afterSale.getId()) - .setOperateType(afterStatus.toString()); + .setOperateType(afterStatus); // TODO 废弃,待删除 this.createLog(logDTO); } From eaeb435459a42826980184a3fdf9ba7a810a4d56 Mon Sep 17 00:00:00 2001 From: chenchen <934298133@qq.com> Date: Thu, 29 Jun 2023 21:44:36 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BA=A4=E6=98=93=E6=97=A5=E5=BF=97sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/optional/mall_trade_log.sql | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 sql/mysql/optional/mall_trade_log.sql diff --git a/sql/mysql/optional/mall_trade_log.sql b/sql/mysql/optional/mall_trade_log.sql new file mode 100644 index 000000000..b3367416b --- /dev/null +++ b/sql/mysql/optional/mall_trade_log.sql @@ -0,0 +1,62 @@ +/* + Navicat Premium Data Transfer + + + Source Server : 127.0.0.1 MySQL + Source Server Type : MySQL + Source Server Version : 80030 + Source Host : localhost:3306 + + Target Server Type : MySQL + Target Server Version : 80030 + File Encoding : 65001 + + Date: 29/06/2023 21:05:23 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for trade_after_sale_log +-- ---------------------------- +DROP TABLE IF EXISTS `trade_after_sale_log`; +CREATE TABLE `trade_after_sale_log` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `after_sale_id` bigint NOT NULL COMMENT '售后服务单号', + `content` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '售后服务信息', + `operate_type` varchar(255) NOT NULL COMMENT '操作类型', + `user_id` bigint NOT NULL COMMENT '创建者ID', + `user_type` int NOT NULL COMMENT '创建者类型', + `creator` varchar(255) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='售后日志'; + +-- ---------------------------- +-- Table structure for trade_order_log +-- ---------------------------- +DROP TABLE IF EXISTS `trade_order_log`; +CREATE TABLE `trade_order_log` +( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `order_id` bigint NOT NULL COMMENT '订单号', + `content` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '订单日志信息', + `operate_type` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '操作类型', + `user_id` bigint NOT NULL COMMENT '创建者ID', + `user_type` int NOT NULL COMMENT '创建者类型', + `creator` varchar(255) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单日志'; + +SET FOREIGN_KEY_CHECKS = 1; From f492797fba881ccdffb11a624e79ccb7c3f988ca Mon Sep 17 00:00:00 2001 From: chenchen <934298133@qq.com> Date: Thu, 6 Jul 2023 16:04:18 +0800 Subject: [PATCH 4/5] =?UTF-8?q?update=20=E5=94=AE=E5=90=8E=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/aop/AfterSaleLogAspect.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java index cdb2c0a48..68444936e 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java @@ -32,10 +32,6 @@ import static java.util.Arrays.asList; @Aspect public class AfterSaleLogAspect { - private final static String OPERATE_TYPE = "operateType"; - private final static String ID = "id"; - private final static String CONTENT = "content"; - @Resource private AfterSaleLogService afterSaleLogService; @@ -90,23 +86,4 @@ public class AfterSaleLogAspect { content.append(afterSaleOperateTypeEnum.getDescription()).toString() : content.toString(); } - // public static Map spelFormat(JoinPoint joinPoint, Object info) { - // MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - // AfterSaleLog afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLog.class); - // HashMap result = Maps.newHashMapWithExpectedSize(2); - // Map spelMap = SpringExpressionUtils.parseExpression(joinPoint, info, - // asList(afterSaleLogPoint.id(), afterSaleLogPoint.content())); - // - // // 售后ID - // result.put(ID, MapUtil.getLong(spelMap, afterSaleLogPoint.id())); - // // 操作类型 - // result.put(OPERATE_TYPE, afterSaleLogPoint.operateType().getType()); - // // 日志内容 - // StringBuilder content = new StringBuilder().append(MapUtil.getStr(spelMap, afterSaleLogPoint.content())); - // - // result.put(CONTENT, ObjectUtil.isNotNull(afterSaleLogPoint.operateType()) ? - // content.append(afterSaleLogPoint.operateType().getDescription()).toString() : content.toString()); - // return result; - // } - } From 284506b3561205a8bb68631a464c3c2adb59a985 Mon Sep 17 00:00:00 2001 From: chenchen <934298133@qq.com> Date: Fri, 7 Jul 2023 14:06:32 +0800 Subject: [PATCH 5/5] =?UTF-8?q?mall=20=E4=B8=8B=E5=8D=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/aftersale/OrderOperateTypeEnum.java | 30 +++++++ .../app/order/AppTradeOrderController.java | 5 ++ .../dal/dataobject/order/OrderLogDO.java | 51 +++++++++++ .../trade/dal/mysql/order/OrderLogMapper.java | 16 ++++ .../order/config/TradeOrderConfig.java | 9 ++ .../order/core/annotations/OrderLog.java | 33 +++++++ .../order/core/aop/OrderLogAspect.java | 86 +++++++++++++++++++ .../core/dto/TradeOrderLogCreateReqDTO.java | 46 ++++++++++ .../order/core/service/OrderLogService.java | 22 +++++ .../service/order/TradeOrderServiceImpl.java | 31 ++++++- 10 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/OrderOperateTypeEnum.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/OrderLogDO.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/OrderLogMapper.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/OrderLog.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/OrderLogAspect.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/dto/TradeOrderLogCreateReqDTO.java create mode 100644 yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/service/OrderLogService.java diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/OrderOperateTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/OrderOperateTypeEnum.java new file mode 100644 index 000000000..04b137f8a --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/OrderOperateTypeEnum.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.trade.enums.aftersale; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 订单操作类型的枚举 + * + * @author 陈賝 + * @since 2023/7/6 15:31 + */ +@RequiredArgsConstructor +@Getter +public enum OrderOperateTypeEnum { + + /** + * 用户下单 + */ + ORDER(0, "用户下单"), + ; + + // 类型 + private final Integer type; + // 描述 + private final String description; + + public String description() { + return description; + } +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java index 6567e3169..2428922e0 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java @@ -14,8 +14,12 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderI import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; +import cn.iocoder.yudao.module.trade.enums.aftersale.OrderOperateTypeEnum; import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; +import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog; import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; +import cn.iocoder.yudao.module.trade.framework.order.core.annotations.OrderLog; import cn.iocoder.yudao.module.trade.service.order.TradeOrderService; import com.google.common.collect.Maps; import io.swagger.v3.oas.annotations.Operation; @@ -66,6 +70,7 @@ public class AppTradeOrderController { @PostMapping("/create") @Operation(summary = "创建订单") @PreAuthenticated + @OrderLog(id = "#info.id", content = "'创建订单:支付订单编号['+#info.payOrderId+'], 订单编号['+#info.id+'], '", operateType = OrderOperateTypeEnum.ORDER) public CommonResult createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO) { TradeOrderDO order = tradeOrderService.createOrder(getLoginUserId(), getClientIP(), createReqVO); return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId())); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/OrderLogDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/OrderLogDO.java new file mode 100644 index 000000000..c65acfe06 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/OrderLogDO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.trade.dal.dataobject.order; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 订单日志 DO + * + * @author 陈賝 + */ +@TableName("trade_order_log") +@KeySequence("trade_order_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderLogDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 订单号 + */ + private Long orderId; + /** + * 订单日志信息 + */ + private String content; + /** + * 操作类型 + */ + private Integer operateType; + /** + * 创建者ID + */ + private Long userId; + /** + * 创建者类型 + */ + private Integer userType; + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/OrderLogMapper.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/OrderLogMapper.java new file mode 100644 index 000000000..868a962d5 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/OrderLogMapper.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.trade.dal.mysql.order; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.trade.dal.dataobject.order.OrderLogDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单日志 Mapper + * + * @author 陈賝 + */ +@Mapper +public interface OrderLogMapper extends BaseMapperX { + + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderConfig.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderConfig.java index 715169275..86466fa92 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderConfig.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderConfig.java @@ -1,9 +1,13 @@ package cn.iocoder.yudao.module.trade.framework.order.config; +import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect; +import cn.iocoder.yudao.module.trade.framework.order.core.aop.OrderLogAspect; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; // TODO @LeeYan9: 可以直接给 TradeOrderProperties 一个 @Component生效哈 + /** * @author LeeYan9 * @since 2022-09-15 @@ -11,4 +15,9 @@ import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(TradeOrderProperties.class) public class TradeOrderConfig { + + @Bean + public OrderLogAspect orderLogAspect() { + return new OrderLogAspect(); + } } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/OrderLog.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/OrderLog.java new file mode 100644 index 000000000..994a6a368 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/OrderLog.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.trade.framework.order.core.annotations; + +import cn.iocoder.yudao.module.trade.enums.aftersale.OrderOperateTypeEnum; + +import java.lang.annotation.*; + +/** + * 订单日志AOP注解 + * + * @author 陈賝 + * @since 2023/7/6 15:37 + */ +@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface OrderLog { + + /** + * 日志内容 + */ + String content(); + + /** + * 订单编号 + */ + String id(); + + /** + * 操作类型 + */ + OrderOperateTypeEnum operateType(); + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/OrderLogAspect.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/OrderLogAspect.java new file mode 100644 index 000000000..460649c43 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/OrderLogAspect.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.trade.framework.order.core.aop; + + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; +import cn.iocoder.yudao.module.trade.enums.aftersale.OrderOperateTypeEnum; +import cn.iocoder.yudao.module.trade.framework.order.core.annotations.OrderLog; +import cn.iocoder.yudao.module.trade.framework.order.core.dto.TradeOrderLogCreateReqDTO; +import cn.iocoder.yudao.module.trade.framework.order.core.service.OrderLogService; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; + +import javax.annotation.Resource; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; +import static java.util.Arrays.asList; + +/** + * 记录订单操作日志的 AOP 切面 + * + * @author 陈賝 + * @since 2023/6/13 13:54 + */ +@Slf4j +@Aspect +public class OrderLogAspect { + + @Resource + private OrderLogService orderLogService; + + @AfterReturning(pointcut = "@annotation(orderLog)", returning = "info") + public void doAfterReturning(JoinPoint joinPoint, OrderLog orderLog, Object info) { + try { + // 日志对象拼接 + Integer userType = WebFrameworkUtils.getLoginUserType(); + Long id = WebFrameworkUtils.getLoginUserId(); + TradeOrderLogCreateReqDTO dto = new TradeOrderLogCreateReqDTO() + .setUserId(id) + .setUserType(userType) + .setOrderId(getAfterSaleId(joinPoint, info, orderLog.id())) + .setOperateType(orderLog.operateType().getType()) + .setContent(getContent(joinPoint, info, orderLog)); + // 异步存入数据库 + orderLogService.createLog(dto); + } catch (Exception exception) { + log.error("[doAfterReturning][orderLog({}) 订单日志错误]", toJsonString(orderLog), exception); + } + } + + /** + * 获取描述信息 + */ + private static Map spelFormat(JoinPoint joinPoint, Object info) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + OrderLog afterSaleLogPoint = signature.getMethod().getAnnotation(OrderLog.class); + return SpringExpressionUtils.parseExpression(joinPoint, info, + asList(afterSaleLogPoint.id(), afterSaleLogPoint.content())); + } + + + /** + * 获取订单ID + */ + private static Long getAfterSaleId(JoinPoint joinPoint, Object info, String spel) { + Map spelMap = spelFormat(joinPoint, info); + return MapUtil.getLong(spelMap, spel); + } + + /** + * 获取解析后的日志内容 + */ + private static String getContent(JoinPoint joinPoint, Object info, OrderLog afterSaleLog) { + Map spelMap = spelFormat(joinPoint, info); + StringBuilder content = new StringBuilder().append(MapUtil.getStr(spelMap, afterSaleLog.content())); + OrderOperateTypeEnum operateTypeEnum = afterSaleLog.operateType(); + return ObjectUtil.isNotNull(operateTypeEnum) ? + content.append(operateTypeEnum.getDescription()).toString() : content.toString(); + } + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/dto/TradeOrderLogCreateReqDTO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/dto/TradeOrderLogCreateReqDTO.java new file mode 100644 index 000000000..81d87711f --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/dto/TradeOrderLogCreateReqDTO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.trade.framework.order.core.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 订单日志的创建 Request DTO + * + * @author 陈賝 + * @since 2023/7/6 15:27 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TradeOrderLogCreateReqDTO { + + /** + * 编号 + */ + private Long id; + /** + * 用户编号 + *

+ * 关联 1:AdminUserDO 的 id 字段 + * 关联 2:MemberUserDO 的 id 字段 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 订单编号 + */ + private Long orderId; + /** + * 操作类型 + */ + private Integer operateType; + /** + * 操作明细 + */ + private String content; + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/service/OrderLogService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/service/OrderLogService.java new file mode 100644 index 000000000..0b7541ee6 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/service/OrderLogService.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.trade.framework.order.core.service; + +import cn.iocoder.yudao.module.trade.framework.order.core.dto.TradeOrderLogCreateReqDTO; + +/** + * 交易下单日志 Service 接口 + * + * @author 陈賝 + * @since 2023/7/6 15:44 + */ +public interface OrderLogService { + + /** + * 创建交易下单日志 + * + * @param logDTO 日志记录 + * @author 陈賝 + * @since 2023/7/6 15:45 + */ + void createLog(TradeOrderLogCreateReqDTO logDTO); + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java index d06987ba6..f79732891 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java @@ -31,16 +31,21 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageRe import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; import cn.iocoder.yudao.module.trade.dal.dataobject.cart.TradeCartDO; import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; +import cn.iocoder.yudao.module.trade.dal.dataobject.order.OrderLogDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; +import cn.iocoder.yudao.module.trade.dal.mysql.order.OrderLogMapper; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; import cn.iocoder.yudao.module.trade.enums.order.*; import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; +import cn.iocoder.yudao.module.trade.framework.order.core.dto.TradeOrderLogCreateReqDTO; +import cn.iocoder.yudao.module.trade.framework.order.core.service.OrderLogService; import cn.iocoder.yudao.module.trade.service.cart.TradeCartService; import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; import cn.iocoder.yudao.module.trade.service.price.TradePriceService; @@ -57,6 +62,7 @@ import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue; +import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_ORDER_NOT_FOUND; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; @@ -68,11 +74,13 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; */ @Service @Slf4j -public class TradeOrderServiceImpl implements TradeOrderService { +public class TradeOrderServiceImpl implements TradeOrderService, OrderLogService { @Resource private TradeOrderMapper tradeOrderMapper; @Resource + private OrderLogMapper orderLogMapper; + @Resource private TradeOrderItemMapper tradeOrderItemMapper; @Resource @@ -568,4 +576,25 @@ public class TradeOrderServiceImpl implements TradeOrderService { TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); } + /** + * 创建交易下单日志 + * + * @param logDTO 日志记录 + * @author 陈賝 + * @since 2023/7/6 15:45 + */ + @Override + public void createLog(TradeOrderLogCreateReqDTO logDTO) { + try { + OrderLogDO orderLogDO = new OrderLogDO() + .setUserId(logDTO.getUserId()) + .setUserType(logDTO.getUserType()) + .setOrderId(logDTO.getOrderId()) + .setOperateType(logDTO.getOperateType()) + .setContent(logDTO.getContent()); + orderLogMapper.insert(orderLogDO); + } catch (Exception exception) { + log.error("[createLog][request({}) 日志记录错误]", toJsonString(logDTO), exception); + } + } }