From 10a5f1c903f54a374f973b5cc5ea4368030af60c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B2=A8=E9=B1=BC?= Date: Wed, 18 Dec 2024 18:01:41 +0800 Subject: [PATCH] 123 --- doc/v5.sql | 21 +++++ .../web/controller/cai/app/PayController.java | 15 ++++ .../cai/controller/OrderLogsController.java | 54 +++++++++++ .../java/com/ruoyi/cai/domain/OrderLogs.java | 54 +++++++++++ .../com/ruoyi/cai/domain/RechargeOrder.java | 1 + .../com/ruoyi/cai/mapper/OrderLogsMapper.java | 14 +++ .../ruoyi/cai/service/OrderLogsService.java | 25 ++++++ .../service/impl/OrderLogsServiceImpl.java | 89 +++++++++++++++++++ .../service/impl/PayTrdConfigServiceImpl.java | 3 + .../impl/RechargeOrderServiceImpl.java | 3 + .../com/ruoyi/cai/trdpay/TrdPayManager.java | 11 ++- .../java/com/ruoyi/cai/util/VersionUtil.java | 20 +++++ .../resources/mapper/cai/OrderLogsMapper.xml | 17 ++++ .../com/ruoyi/common/utils/StringUtils.java | 11 +++ 14 files changed, 334 insertions(+), 4 deletions(-) create mode 100644 doc/v5.sql create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/OrderLogsMapper.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/service/OrderLogsService.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/OrderLogsServiceImpl.java create mode 100644 ruoyi-cai/src/main/resources/mapper/cai/OrderLogsMapper.xml diff --git a/doc/v5.sql b/doc/v5.sql new file mode 100644 index 00000000..5bd71ec3 --- /dev/null +++ b/doc/v5.sql @@ -0,0 +1,21 @@ +ALTER TABLE `cai_recharge_order` + ADD COLUMN `device_type` varchar(255) NULL COMMENT '设备' AFTER `appid`; + + +DROP TABLE cai_order_logs; +CREATE TABLE `cai_order_logs` +( + `id` bigint NOT NULL AUTO_INCREMENT, + `order_no` varchar(100) NOT NULL COMMENT '订单号', + `step_name` varchar(100) NOT NULL COMMENT '操作名称', + `flag_name` varchar(100) NULL COMMENT '标识1', + `in_params` JSON COMMENT '入参', + `out_params` JSON COMMENT '出参', + `remark` varchar(2100) NULL COMMENT '备注', + `success` varchar(100) NULL COMMENT '成功', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_order` (`order_no`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1; + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java index 2f5f6fe8..0047edc1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/app/PayController.java @@ -14,11 +14,13 @@ import com.ijpay.core.kit.HttpKit; import com.ijpay.core.kit.WxPayKit; import com.ijpay.wxpay.WxPayApi; import com.ijpay.wxpay.model.UnifiedOrderModel; +import com.ruoyi.cai.domain.OrderLogs; import com.ruoyi.cai.domain.PayConfig; import com.ruoyi.cai.dto.app.vo.pay.OrderPayStatusResp; import com.ruoyi.cai.enums.SystemConfigEnum; import com.ruoyi.cai.manager.SystemConfigManager; import com.ruoyi.cai.pay.*; +import com.ruoyi.cai.service.OrderLogsService; import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.cai.trdpay.TrdPayManager; import com.ruoyi.cai.trdpay.TrdPayProperties; @@ -27,6 +29,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; @@ -57,6 +60,8 @@ public class PayController { private static final String NOTIFY_ALI_URL = "/api/pay/ali/notify"; @Autowired private SystemConfigManager systemConfigManager; + @Autowired + private OrderLogsService orderLogsService; // @GetMapping(value = "/checkPay") @@ -92,12 +97,15 @@ public class PayController { try { boolean openAliPay = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_ALI_PAY); if(!openAliPay){ + orderLogsService.createBaseFail(dto.getOrderNo(),"四方支付宝支付","第四方支付宝未开启"); return R.fail(600,"支付宝支付失败!未开启支付宝通道!"); } log.info("支付宝聚合支付 使用第三方支付 dto={}",JSON.toJSONString(dto)); PayReturnResp orderAli = payTrdConfigService.createOrderAli(payOrderInfo); + orderLogsService.createBaseSuccess(dto.getOrderNo(),"四方支付宝支付"); return R.ok(orderAli); }catch (Exception e){ + orderLogsService.createBaseFail(dto.getOrderNo(),"四方支付宝支付",StringUtils.cat(e.getMessage(),2000)); log.error("支付宝聚合支付 使用第三方支付失败! dto={}",JSON.toJSONString(dto), e); return R.fail(600,"支付宝支付失败!"); } @@ -105,12 +113,14 @@ public class PayController { try { boolean openSourceAliPay = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.OPEN_SOURCE_ALI_PAY); if(!openSourceAliPay){ + orderLogsService.createBaseFail(dto.getOrderNo(),"支付宝支付","支付宝支付失败!未开启原生支付宝通道!"); return R.fail(600,"支付宝支付失败!未开启原生支付宝通道!"); } log.info("支付宝聚合支付 使用原生支付 dto={}",JSON.toJSONString(dto)); boolean b = payConfigManager.initAliPay(); if(!b){ log.error("支付失败,未找到可用的支付宝配置"); + orderLogsService.createBaseFail(dto.getOrderNo(),"支付宝支付","支付失败,未找到可用的支付宝配置"); return R.fail(600,"支付失败!未开通支付宝支付!"); } AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); @@ -121,9 +131,11 @@ public class PayController { model.setTotalAmount(payOrderInfo.getPrice().toString()); String notifyUrl = AliPayApiConfigKit.getAliPayApiConfig().getDomain(); String orderInfo = AliPayApi.appPayToResponse(model, notifyUrl+NOTIFY_ALI_URL).getBody(); + orderLogsService.createBaseSuccess(dto.getOrderNo(),"支付宝支付"); return R.ok(PayReturnResp.createApp(orderInfo)); } catch (AlipayApiException e) { log.error("支付宝聚合支付 使用原生支付失败! dto={}",JSON.toJSONString(dto),e); + orderLogsService.createBaseFail(dto.getOrderNo(),"支付宝支付",StringUtils.cat(e.getMessage(),2000)); return R.fail("支付宝支付失败,请联系客服"); } } @@ -172,11 +184,13 @@ public class PayController { String returnMsg = result.get("return_msg"); if (!WxPayKit.codeIsOk(returnCode)) { log.error("微信支付失败 returnMsg={}",returnMsg); + orderLogsService.createBaseFail(dto.getOrderNo(),"微信支付",StringUtils.cat(returnMsg,2000)); return R.fail("微信支付失败,请联系客服"); } String resultCode = result.get("result_code"); if (!WxPayKit.codeIsOk(resultCode)) { log.error("微信支付失败 returnMsg={}",returnMsg); + orderLogsService.createBaseFail(dto.getOrderNo(),"微信支付",StringUtils.cat(returnMsg,2000)); return R.fail("微信支付失败,请联系客服"); } // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回 @@ -187,6 +201,7 @@ public class PayController { log.info("返回apk的参数:" + jsonStr); PayReturnResp resp = new PayReturnResp(); resp.setData(jsonStr); + orderLogsService.createBaseSuccess(dto.getOrderNo(),"微信支付"); return R.ok(resp); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java new file mode 100644 index 00000000..cd90fb79 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/OrderLogsController.java @@ -0,0 +1,54 @@ +package com.ruoyi.cai.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.cai.domain.OrderLogs; +import com.ruoyi.cai.service.OrderLogsService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 订单日志 + * + * @author 77 + * @date 2024-12-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/orderLogs") +public class OrderLogsController extends BaseController { + + private final OrderLogsService orderLogsService; + + /** + * 查询订单日志列表 + */ + @GetMapping("/allByOrderNo") + public R> list(OrderLogs bo) { + List list = orderLogsService.list(Wrappers.lambdaQuery(OrderLogs.class).eq(OrderLogs::getOrderNo, bo.getOrderNo()) + .orderByAsc(OrderLogs::getCreateTime)); + return R.ok(list); + } + + /** + * 获取订单日志详细信息 + * + * @param id 主键 + */ + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(orderLogsService.getById(id)); + } + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java new file mode 100644 index 00000000..060d2607 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/OrderLogs.java @@ -0,0 +1,54 @@ +package com.ruoyi.cai.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 订单日志对象 cai_order_logs + * + * @author 77 + * @date 2024-12-13 + */ +@Data +@TableName("cai_order_logs") +public class OrderLogs implements Serializable { + + private static final long serialVersionUID=1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + /** + * 订单号 + */ + private String orderNo; + /** + * 操作名称 + */ + private String stepName; + /** + * 入参 + */ + private String inParams; + /** + * 出参 + */ + private String outParams; + /** + * 标识名称 + */ + private String flagName; + + private String remark; + + private String success; + + private LocalDateTime createTime; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java index 859d6271..84f8b5aa 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/RechargeOrder.java @@ -26,6 +26,7 @@ public class RechargeOrder implements Serializable { */ @TableId(value = "id",type = IdType.AUTO) private Long id; + private String deviceType; /** * 用户ID */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/OrderLogsMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/OrderLogsMapper.java new file mode 100644 index 00000000..6fd8ad45 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/OrderLogsMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cai.domain.OrderLogs; + +/** + * 订单日志Mapper接口 + * + * @author 77 + * @date 2024-12-13 + */ +public interface OrderLogsMapper extends BaseMapper { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/OrderLogsService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/OrderLogsService.java new file mode 100644 index 00000000..b2b30a81 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/OrderLogsService.java @@ -0,0 +1,25 @@ +package com.ruoyi.cai.service; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cai.domain.OrderLogs; +import com.ruoyi.cai.trdpay.TrdPayTypeEnum; + +/** + * 订单日志Service接口 + * + * @author 77 + * @date 2024-12-13 + */ +public interface OrderLogsService extends IService { + + void createOrderLogs(String orderNo, String stepName, String flag, String inParams, String outParams); + + void createOrderLogsNoFlag(String orderNo, String stepName, String inParams, String outParams); + + void createBaseFail(String orderNo, String stepName, String remark); + + void createBaseSuccess(String orderNo, String stepName); + + void createAliPayLogs(String orderNo, String inParams, JSONObject jsonObject, TrdPayTypeEnum typeEnum); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/OrderLogsServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/OrderLogsServiceImpl.java new file mode 100644 index 00000000..cb0438c8 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/OrderLogsServiceImpl.java @@ -0,0 +1,89 @@ +package com.ruoyi.cai.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.domain.OrderLogs; +import com.ruoyi.cai.mapper.OrderLogsMapper; +import com.ruoyi.cai.service.OrderLogsService; +import com.ruoyi.cai.trdpay.TrdPayTypeEnum; +import lombok.Data; +import org.springframework.stereotype.Service; + +/** + * 订单日志Service业务层处理 + * + * @author 77 + * @date 2024-12-13 + */ +@Service +public class OrderLogsServiceImpl extends ServiceImpl implements OrderLogsService { + + @Override + public void createOrderLogs(String orderNo, String stepName, String flag, String inParams, String outParams){ + + } + + @Override + public void createOrderLogsNoFlag(String orderNo, String stepName, String inParams, String outParams){ + + } + + @Override + public void createBaseFail(String orderNo, String stepName, String remark){ + OrderLogs orderLogs = new OrderLogs(); + orderLogs.setOrderNo(orderNo); + orderLogs.setStepName(stepName); + orderLogs.setSuccess("失败"); + orderLogs.setRemark(remark); + this.save(orderLogs); + } + + @Override + public void createBaseSuccess(String orderNo, String stepName){ + OrderLogs orderLogs = new OrderLogs(); + orderLogs.setOrderNo(orderNo); + orderLogs.setStepName(stepName); + orderLogs.setSuccess("成功"); + this.save(orderLogs); + } + + @Override + public void createAliPayLogs(String orderNo, String inParams, JSONObject jsonObject, TrdPayTypeEnum typeEnum){ + OrderLogs orderLogs = new OrderLogs(); + orderLogs.setOrderNo(orderNo); + orderLogs.setStepName("四方支付宝支付请求日志"); + orderLogs.setSuccess("请求日志"); + orderLogs.setInParams(JSON.toJSONString(new UrlJson(inParams))); + orderLogs.setOutParams(JSON.toJSONString(jsonObject)); + orderLogs.setFlagName(typeEnum.name()); + if(typeEnum == TrdPayTypeEnum.V1) { // V1 + if(!"SUCCESS".equals(jsonObject.getString("retCode"))){ + orderLogs.setSuccess("失败"); + } + }else if(typeEnum == TrdPayTypeEnum.V2){ + if(!"0".equals(jsonObject.getString("retCode"))){ + orderLogs.setSuccess("失败"); + } + }else if(typeEnum == TrdPayTypeEnum.V3){ + if(!"SUCCESS".equals(jsonObject.getString("retCode"))){ + orderLogs.setSuccess("失败"); + } + } + orderLogs.setSuccess("成功"); + this.save(orderLogs); + } + + @Data + public static class UrlJson{ + private String url; + + public UrlJson() { + } + + public UrlJson(String url) { + this.url = url; + } + } + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java index 809c163e..fa2d40b9 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/PayTrdConfigServiceImpl.java @@ -10,6 +10,7 @@ import com.ruoyi.cai.pay.PayManager; import com.ruoyi.cai.pay.PayOrderInfoDTO; import com.ruoyi.cai.pay.PayReturnResp; import com.ruoyi.cai.pay.PayTypeEnum; +import com.ruoyi.cai.service.OrderLogsService; import com.ruoyi.cai.service.PayTrdConfigService; import com.ruoyi.cai.trdpay.TrdPayManager; import com.ruoyi.cai.trdpay.TrdPayTypeEnum; @@ -37,6 +38,8 @@ public class PayTrdConfigServiceImpl extends ServiceImpl + + + + + + + + + + + + + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 2a5bd488..a10ca096 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -322,4 +322,15 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { .collect(Collectors.toList()); } + + public static String cat(String str,Integer num){ + if(str == null){ + return str; + } + if(str.length() < num){ + return str; + } + return str.substring(0,num); + } + }