feat(order): 添加订单列表查询功能

- 新增 OrderQueryRequestDTO 请求对象,支持多条件查询和分页参数
- 新增 OrderListResponseDTO 响应对象,包含客户订单和 PayPal 订单信息
- 在 CustomerOrderController 中添加 /query 接口,支持 POST 方式查询订单列表
- 在 CustomerOrderService 和实现类中添加 queryOrders 方法,实现订单查询逻辑
- 支持按订单号、状态、客户信息、商品名称等条件查询
- 支持按 PayPal 订单相关条件查询,关联查询 PayPal 支付信息
- 实现分页查询功能,限制每页最大数量为 100
- 添加时间范围查询和多种排序功能
- 优化 N+1 查询问题,批量查询 PayPal 订单信息
- 添加详细的查询日志记录和性能监控
- 更新项目完善计划文档,记录待办功能和优化项
This commit is contained in:
2025-12-25 18:11:57 +08:00
parent 10d0bfa9f6
commit f8d116f9a3
8 changed files with 2769 additions and 0 deletions

373
PROJECT_IMPROVEMENT_PLAN.md Normal file
View File

@@ -0,0 +1,373 @@
# 项目完善、优化、补充计划
## 📋 目录
1. [功能完善](#功能完善)
2. [性能优化](#性能优化)
3. [安全性增强](#安全性增强)
4. [代码质量](#代码质量)
5. [数据完整性](#数据完整性)
6. [监控和日志](#监控和日志)
7. [部署和运维](#部署和运维)
8. [用户体验](#用户体验)
9. [文档完善](#文档完善)
---
## 1. 功能完善
### 1.1 商品管理功能
- [ ] **商品编辑功能** ⚠️ 高优先级
- 当前状态:`ProductManage.vue` 中有 TODO 标记,点击编辑只显示提示
- 需要实现:
- 后端:`PUT /api/product/{id}` 更新商品接口
- 后端:`ProductService.updateProduct()` 方法
- 前端:`/manage/product/edit/:id` 编辑页面
- 支持修改商品名称、价格、主图、SKU信息等
- [ ] **商品上架功能**
- 当前状态:只有下架功能,没有上架功能
- 需要实现:
- 后端:`PUT /api/product/{id}/on-shelf` 上架接口
- 上架时恢复SKU库存需要记录下架前的库存
- [ ] **商品批量操作**
- 批量上架/下架
- 批量删除(软删除)
### 1.2 订单管理功能
- [ ] **订单列表查询** ⚠️ 高优先级
- 当前状态:只有单个订单查询(`OrderQuery.vue`),没有列表
- 需要实现:
- 后端:`GET /api/order/list` 订单列表接口(支持分页、筛选)
- 前端:订单管理页面,支持按状态、时间、订单号等查询
- 支持订单状态筛选(待支付、已支付、已发货、已完成、已取消)
- [ ] **订单状态管理**
- 订单发货功能(更新状态为 SHIPPED
- 订单完成功能(更新状态为 COMPLETED
- 订单取消功能(更新状态为 CANCELLED恢复库存
- [ ] **订单详情查看**
- 在订单列表中点击查看详情
- 显示完整的订单信息、支付信息、收货地址等
### 1.3 库存管理
- [ ] **库存扣减** ⚠️ 高优先级
- 当前状态:创建订单时只验证库存,没有扣减
- 需要实现:
- 创建订单时扣减库存(使用数据库锁防止超卖)
- 支付成功时确认扣减(如果创建时是预扣,支付时确认)
- 订单取消时恢复库存
- [ ] **库存预警**
- 库存低于阈值时提醒
- 库存为0时自动下架商品可选
- [ ] **库存历史记录**
- 记录库存变动历史(入库、出库、调整等)
### 1.4 数据统计
- [ ] **销售统计**
- 按时间段统计销售额
- 按商品统计销量
- 按地区统计销售情况
- [ ] **订单统计**
- 订单数量统计
- 订单状态分布
- 支付成功率统计
---
## 2. 性能优化
### 2.1 缓存机制
- [ ] **引入Redis缓存** ⚠️ 中优先级
- 当前状态PayPal token和汇率使用内存缓存单机可用集群有问题
- 需要实现:
- 集成Redis
- PayPal token缓存到Redis
- 汇率缓存到Redis
- 商品详情缓存(热点商品)
- 商品列表缓存(带过期时间)
- [ ] **数据库查询优化**
- 检查慢查询日志
- 优化复杂查询
- 添加必要的数据库索引
### 2.2 前端优化
- [ ] **移除console.log** ⚠️ 低优先级
- 当前状态:前端代码中有多处 `console.log``console.error`
- 需要实现:
- 使用日志库(如 `winston` 或自定义日志工具)
- 生产环境禁用console输出
- 统一错误处理
- [ ] **代码分割和懒加载**
- 路由懒加载(已部分实现)
- 组件懒加载
- 减少首屏加载时间
- [ ] **图片优化**
- 图片懒加载
- 图片压缩
- CDN加速
### 2.3 数据库优化
- [ ] **连接池优化**
- 检查当前连接池配置是否合理
- 根据实际负载调整参数
- [ ] **批量操作优化**
- 商品创建已优化批量插入SKU
- 其他批量操作也需要优化
---
## 3. 安全性增强
### 3.1 密码安全
- [ ] **密码加密升级** ⚠️ 高优先级
- 当前状态使用MD5加密不安全
- 需要实现:
- 使用BCrypt或Argon2加密
- 密码强度验证
- 密码历史记录(防止重复使用)
- [ ] **Token安全**
- 当前状态使用MD5+Base64注释说生产环境建议使用JWT
- 需要实现:
- 集成JWTJSON Web Token
- Token刷新机制
- Token黑名单登出时
### 3.2 权限控制
- [ ] **角色权限系统** ⚠️ 中优先级
- 当前状态:只有登录验证,没有角色权限
- 需要实现:
- 角色管理(管理员、普通用户等)
- 权限管理(商品管理、订单管理、用户管理等)
- 接口权限控制(`@PreAuthorize` 或自定义拦截器)
- [ ] **API访问控制**
- 接口访问频率限制(防止暴力攻击)
- IP白名单可选用于管理接口
### 3.3 数据安全
- [ ] **敏感数据加密**
- 客户手机号、邮箱加密存储
- 支付信息加密
- [ ] **SQL注入防护**
- 检查是否所有查询都使用参数化查询MyBatis-Plus已提供
- [ ] **XSS防护**
- 前端输入验证和转义
- 后端输出转义
---
## 4. 代码质量
### 4.1 测试覆盖
- [ ] **单元测试** ⚠️ 中优先级
- 当前状态:没有单元测试
- 需要实现:
- Service层单元测试
- Controller层单元测试
- 工具类单元测试
- 测试覆盖率目标:>70%
- [ ] **集成测试**
- API接口测试
- 数据库操作测试
- [ ] **前端测试**
- 组件测试
- E2E测试
### 4.2 代码规范
- [ ] **代码审查**
- 统一代码风格
- 移除TODO标记实现或记录到任务列表
- 代码注释完善
- [ ] **静态代码分析**
- 集成SonarQube或类似工具
- 修复代码质量问题
### 4.3 API文档
- [ ] **Swagger/OpenAPI文档** ⚠️ 中优先级
- 当前状态只有部分API有Markdown文档
- 需要实现:
- 集成Swagger UI
- 自动生成API文档
- 接口参数和响应说明
---
## 5. 数据完整性
### 5.1 库存管理
- [ ] **库存扣减逻辑** ⚠️ 高优先级
- 创建订单时扣减库存
- 支付成功时确认库存
- 订单取消时恢复库存
- 使用数据库锁SELECT FOR UPDATE防止超卖
- [ ] **库存一致性检查**
- 定期检查库存数据一致性
- 库存异常告警
### 5.2 订单状态流转
- [ ] **订单状态机** ⚠️ 中优先级
- 定义订单状态流转规则
- 防止非法状态转换
- 状态变更日志
### 5.3 数据备份
- [ ] **数据库备份策略**
- 定期自动备份
- 备份恢复测试
- 备份文件管理
---
## 6. 监控和日志
### 6.1 操作日志
- [ ] **操作审计日志** ⚠️ 中优先级
- 记录用户操作(商品创建、编辑、下架等)
- 记录订单状态变更
- 记录支付操作
- [ ] **日志查询功能**
- 前端日志查询页面
- 按时间、用户、操作类型筛选
### 6.2 性能监控
- [ ] **性能指标监控**
- API响应时间监控
- 数据库查询性能监控
- 系统资源监控CPU、内存、磁盘
- [ ] **告警机制**
- 异常告警(错误率、响应时间)
- 系统资源告警
### 6.3 错误追踪
- [ ] **错误日志聚合**
- 集成错误追踪服务如Sentry
- 错误分类和统计
- 错误通知
---
## 7. 部署和运维
### 7.1 数据库迁移
- [ ] **数据库版本管理** ⚠️ 中优先级
- 当前状态只有SQL脚本没有版本管理
- 需要实现:
- 集成Flyway或Liquibase
- 数据库版本控制
- 自动迁移脚本
### 7.2 配置管理
- [ ] **环境配置优化**
- 敏感信息加密(密码、密钥等)
- 配置中心(可选)
- 环境变量管理
### 7.3 部署文档
- [ ] **部署指南**
- 生产环境部署步骤
- 环境要求说明
- 故障排查指南
### 7.4 容器化
- [ ] **Docker支持** ⚠️ 低优先级
- Dockerfile编写
- Docker Compose配置
- 容器化部署文档
---
## 8. 用户体验
### 8.1 前端优化
- [ ] **加载状态优化**
- 骨架屏Skeleton
- 加载动画优化
- [ ] **错误提示优化**
- 友好的错误提示
- 错误恢复建议
- [ ] **移动端优化**
- 响应式设计检查
- 移动端交互优化
### 8.2 功能完善
- [ ] **订单导出**
- 订单列表导出Excel
- 支持筛选条件导出
- [ ] **数据统计可视化**
- 销售图表
- 订单趋势图
---
## 9. 文档完善
### 9.1 技术文档
- [ ] **API文档**
- 完整的API文档Swagger
- 接口调用示例
- [ ] **数据库设计文档**
- ER图
- 表结构说明
- 索引说明
### 9.2 用户文档
- [ ] **用户手册**
- 商品管理操作指南
- 订单管理操作指南
- 常见问题解答
---
## 优先级说明
- ⚠️ **高优先级**:影响核心功能或安全性,需要尽快实现
- ⚠️ **中优先级**:提升系统质量和可维护性,建议实现
- ⚠️ **低优先级**:优化和增强功能,可选择性实现
---
## 实施建议
1. **第一阶段(核心功能)**
- 商品编辑功能
- 订单列表查询
- 库存扣减逻辑
- 密码加密升级
2. **第二阶段(安全性)**
- JWT Token
- 角色权限系统
- API访问控制
3. **第三阶段(优化)**
- Redis缓存
- 性能监控
- 单元测试
4. **第四阶段(完善)**
- 操作日志
- 数据统计
- 文档完善

View File

@@ -6352,6 +6352,690 @@ Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.PingPongPrope
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException: null
at org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread(SilentExitExceptionHandler.java:92)
at org.springframework.boot.devtools.restart.Restarter.immediateRestart(Restarter.java:179)
at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:163)
at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:532)
at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartingEvent(RestartApplicationListener.java:98)
at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:51)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:149)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:137)
at org.springframework.boot.context.event.EventPublishingRunListener.multicastInitialEvent(EventPublishingRunListener.java:136)
at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:75)
at org.springframework.boot.SpringApplicationRunListeners.lambda$starting$0(SpringApplicationRunListeners.java:54)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118)
at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
2025-12-25 18:04:00.011 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerOrderController': Resolution of declared constructors on bean Class [com.mtkj.mtpay.controller.CustomerOrderController] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@1a78dbd2] failed
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:368)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1295)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1190)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.NoClassDefFoundError: com/mtkj/mtpay/service/CustomerOrderService
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373)
at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2555)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:363)
... 21 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.service.CustomerOrderService
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 25 common frames omitted
2025-12-25 18:04:00.016 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerOrderController': Resolution of declared constructors on bean Class [com.mtkj.mtpay.controller.CustomerOrderController] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@1a78dbd2] failed
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:368)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1295)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1190)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.NoClassDefFoundError: com/mtkj/mtpay/service/CustomerOrderService
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373)
at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2555)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:363)
... 21 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.service.CustomerOrderService
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 25 common frames omitted
2025-12-25 18:04:30.885 [restartedMain] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter -
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 1 of constructor in com.mtkj.mtpay.controller.PayPalController required a bean of type 'com.mtkj.mtpay.service.CustomerOrderService' that could not be found.
Action:
Consider defining a bean of type 'com.mtkj.mtpay.service.CustomerOrderService' in your configuration.
2025-12-25 18:04:30.885 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'payPalController' defined in file [E:\MTKJPAY\mt-pay\target\classes\com\mtkj\mtpay\controller\PayPalController.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'com.mtkj.mtpay.service.CustomerOrderService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:241)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1193)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mtkj.mtpay.service.CustomerOrderService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
... 22 common frames omitted
2025-12-25 18:04:34.415 [restartedMain] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter -
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.mtkj.mtpay.controller.CustomerOrderController required a bean of type 'com.mtkj.mtpay.service.CustomerOrderService' that could not be found.
Action:
Consider defining a bean of type 'com.mtkj.mtpay.service.CustomerOrderService' in your configuration.
2025-12-25 18:04:34.415 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customerOrderController' defined in file [E:\MTKJPAY\mt-pay\target\classes\com\mtkj\mtpay\controller\CustomerOrderController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'com.mtkj.mtpay.service.CustomerOrderService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:241)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1193)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mtkj.mtpay.service.CustomerOrderService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
... 22 common frames omitted
2025-12-25 18:04:44.680 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.IllegalArgumentException: Could not find class [com.mtkj.mtpay.config.PingPongProperties]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:355)
at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:465)
at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:390)
at org.springframework.core.annotation.TypeMappedAnnotation.getAttributeValue(TypeMappedAnnotation.java:371)
at org.springframework.core.annotation.AbstractMergedAnnotation.getRequiredAttributeValue(AbstractMergedAnnotation.java:215)
at org.springframework.core.annotation.AbstractMergedAnnotation.getClassArray(AbstractMergedAnnotation.java:153)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.lambda$getTypes$0(EnableConfigurationPropertiesRegistrar.java:55)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
at org.springframework.core.annotation.MergedAnnotationsCollection$AnnotationsSpliterator.tryAdvance(MergedAnnotationsCollection.java:254)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.getTypes(EnableConfigurationPropertiesRegistrar.java:57)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.registerBeanDefinitions(EnableConfigurationPropertiesRegistrar.java:49)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:376)
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:375)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.PingPongProperties
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:345)
... 38 common frames omitted
2025-12-25 18:04:44.681 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
java.lang.IllegalArgumentException: Could not find class [com.mtkj.mtpay.config.PingPongProperties]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:355)
at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:465)
at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:390)
at org.springframework.core.annotation.TypeMappedAnnotation.getAttributeValue(TypeMappedAnnotation.java:371)
at org.springframework.core.annotation.AbstractMergedAnnotation.getRequiredAttributeValue(AbstractMergedAnnotation.java:215)
at org.springframework.core.annotation.AbstractMergedAnnotation.getClassArray(AbstractMergedAnnotation.java:153)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.lambda$getTypes$0(EnableConfigurationPropertiesRegistrar.java:55)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
at org.springframework.core.annotation.MergedAnnotationsCollection$AnnotationsSpliterator.tryAdvance(MergedAnnotationsCollection.java:254)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.getTypes(EnableConfigurationPropertiesRegistrar.java:57)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.registerBeanDefinitions(EnableConfigurationPropertiesRegistrar.java:49)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:376)
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:375)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.PingPongProperties
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:345)
... 38 common frames omitted
2025-12-25 18:04:53.850 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.IllegalArgumentException: Could not find class [com.mtkj.mtpay.config.AliyunOSSProperties]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:355)
at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:465)
at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:390)
at org.springframework.core.annotation.TypeMappedAnnotation.getAttributeValue(TypeMappedAnnotation.java:371)
at org.springframework.core.annotation.AbstractMergedAnnotation.getRequiredAttributeValue(AbstractMergedAnnotation.java:215)
at org.springframework.core.annotation.AbstractMergedAnnotation.getClassArray(AbstractMergedAnnotation.java:153)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.lambda$getTypes$0(EnableConfigurationPropertiesRegistrar.java:55)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
at org.springframework.core.annotation.MergedAnnotationsCollection$AnnotationsSpliterator.tryAdvance(MergedAnnotationsCollection.java:254)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.getTypes(EnableConfigurationPropertiesRegistrar.java:57)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.registerBeanDefinitions(EnableConfigurationPropertiesRegistrar.java:49)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:376)
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:375)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.AliyunOSSProperties
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:345)
... 38 common frames omitted
2025-12-25 18:04:53.851 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
java.lang.IllegalArgumentException: Could not find class [com.mtkj.mtpay.config.AliyunOSSProperties]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:355)
at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:465)
at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:390)
at org.springframework.core.annotation.TypeMappedAnnotation.getAttributeValue(TypeMappedAnnotation.java:371)
at org.springframework.core.annotation.AbstractMergedAnnotation.getRequiredAttributeValue(AbstractMergedAnnotation.java:215)
at org.springframework.core.annotation.AbstractMergedAnnotation.getClassArray(AbstractMergedAnnotation.java:153)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.lambda$getTypes$0(EnableConfigurationPropertiesRegistrar.java:55)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
at org.springframework.core.annotation.MergedAnnotationsCollection$AnnotationsSpliterator.tryAdvance(MergedAnnotationsCollection.java:254)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.getTypes(EnableConfigurationPropertiesRegistrar.java:57)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.registerBeanDefinitions(EnableConfigurationPropertiesRegistrar.java:49)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:376)
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:375)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.AliyunOSSProperties
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:345)
... 38 common frames omitted
2025-12-25 18:04:56.489 [restartedMain] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter -
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.mtkj.mtpay.controller.CustomerOrderController required a bean of type 'com.mtkj.mtpay.service.CustomerOrderService' that could not be found.
Action:
Consider defining a bean of type 'com.mtkj.mtpay.service.CustomerOrderService' in your configuration.
2025-12-25 18:04:56.489 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'customerOrderController' defined in file [E:\MTKJPAY\mt-pay\target\classes\com\mtkj\mtpay\controller\CustomerOrderController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'com.mtkj.mtpay.service.CustomerOrderService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:241)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1193)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mtkj.mtpay.service.CustomerOrderService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
... 22 common frames omitted
2025-12-25 18:06:10.230 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.IllegalArgumentException: Could not find class [com.mtkj.mtpay.config.PingPongProperties]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:355)
at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:465)
at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:390)
at org.springframework.core.annotation.TypeMappedAnnotation.getAttributeValue(TypeMappedAnnotation.java:371)
at org.springframework.core.annotation.AbstractMergedAnnotation.getRequiredAttributeValue(AbstractMergedAnnotation.java:215)
at org.springframework.core.annotation.AbstractMergedAnnotation.getClassArray(AbstractMergedAnnotation.java:153)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.lambda$getTypes$0(EnableConfigurationPropertiesRegistrar.java:55)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
at org.springframework.core.annotation.MergedAnnotationsCollection$AnnotationsSpliterator.tryAdvance(MergedAnnotationsCollection.java:254)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.getTypes(EnableConfigurationPropertiesRegistrar.java:57)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.registerBeanDefinitions(EnableConfigurationPropertiesRegistrar.java:49)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:376)
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:375)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.PingPongProperties
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:345)
... 38 common frames omitted
2025-12-25 18:06:10.230 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
java.lang.IllegalArgumentException: Could not find class [com.mtkj.mtpay.config.PingPongProperties]
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:355)
at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:465)
at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:390)
at org.springframework.core.annotation.TypeMappedAnnotation.getAttributeValue(TypeMappedAnnotation.java:371)
at org.springframework.core.annotation.AbstractMergedAnnotation.getRequiredAttributeValue(AbstractMergedAnnotation.java:215)
at org.springframework.core.annotation.AbstractMergedAnnotation.getClassArray(AbstractMergedAnnotation.java:153)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.lambda$getTypes$0(EnableConfigurationPropertiesRegistrar.java:55)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
at org.springframework.core.annotation.MergedAnnotationsCollection$AnnotationsSpliterator.tryAdvance(MergedAnnotationsCollection.java:254)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:332)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.getTypes(EnableConfigurationPropertiesRegistrar.java:57)
at org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.registerBeanDefinitions(EnableConfigurationPropertiesRegistrar.java:49)
at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:376)
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:375)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: java.lang.ClassNotFoundException: com.mtkj.mtpay.config.PingPongProperties
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:121)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:467)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:345)
... 38 common frames omitted
2025-12-25 18:06:21.017 [restartedMain] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter -
***************************
APPLICATION FAILED TO START
***************************
Description:
Field ossProperties in com.mtkj.mtpay.service.impl.OssServiceImpl required a bean of type 'com.mtkj.mtpay.config.AliyunOSSProperties' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.mtkj.mtpay.config.AliyunOSSProperties' in your configuration.
2025-12-25 18:06:21.017 [restartedMain] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'productController': Unsatisfied dependency expressed through field 'ossService': Error creating bean with name 'ossServiceImpl': Unsatisfied dependency expressed through field 'ossProperties': No qualifying bean of type 'com.mtkj.mtpay.config.AliyunOSSProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:772)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:752)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:493)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323)
at com.mtkj.mtkjpay.MtkjpayApplication.main(MtkjpayApplication.java:42)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ossServiceImpl': Unsatisfied dependency expressed through field 'ossProperties': No qualifying bean of type 'com.mtkj.mtpay.config.AliyunOSSProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:772)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:752)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:145)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:493)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1441)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:769)
... 23 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mtkj.mtpay.config.AliyunOSSProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:769)
... 37 common frames omitted
2025-12-25 18:10:19.023 [main] ERROR com.mtkj.mtkjpay.MtkjpayApplication -
╔══════════════════════════════════════════════════════════╗
║ ║
║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║
║ ║
╚══════════════════════════════════════════════════════════╝
org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException: null
at org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread(SilentExitExceptionHandler.java:92)
at org.springframework.boot.devtools.restart.Restarter.immediateRestart(Restarter.java:179)

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,10 @@ package com.mtkj.mtpay.controller;
import com.mtkj.mtpay.common.Result;
import com.mtkj.mtpay.dto.request.CalculateCurrencyConversionRequestDTO;
import com.mtkj.mtpay.dto.request.CreateCustomerOrderRequestDTO;
import com.mtkj.mtpay.dto.request.OrderQueryRequestDTO;
import com.mtkj.mtpay.dto.response.CurrencyConversionDTO;
import com.mtkj.mtpay.dto.response.CustomerOrderResponseDTO;
import com.mtkj.mtpay.dto.response.PageResult;
import com.mtkj.mtpay.service.CustomerOrderService;
import com.mtkj.mtpay.service.ExchangeRateService;
import jakarta.validation.Valid;
@@ -134,6 +136,18 @@ public class CustomerOrderController {
return Result.success(order);
}
/**
* 查询订单列表(支持多条件查询和分页)
*/
@PostMapping("/query")
public Result<PageResult<com.mtkj.mtpay.dto.response.OrderListResponseDTO>> queryOrders(
@RequestBody OrderQueryRequestDTO query) {
log.info("查询订单列表,查询条件:{}", query);
PageResult<com.mtkj.mtpay.dto.response.OrderListResponseDTO> pageResult =
customerOrderService.queryOrders(query);
return Result.success(pageResult);
}
/**
* 构建汇率说明文本
*/

View File

@@ -0,0 +1,96 @@
package com.mtkj.mtpay.dto.request;
import lombok.Data;
/**
* 订单列表查询请求DTO
*/
@Data
public class OrderQueryRequestDTO {
/**
* 订单号(精确查询)
*/
private String orderNo;
/**
* PayPal订单ID精确查询
*/
private String paypalOrderId;
/**
* 商户订单号精确查询等同于orderNo
*/
private String merchantOrderNo;
/**
* 订单状态PENDING-待支付PAID-已支付SHIPPED-已发货COMPLETED-已完成CANCELLED-已取消)
*/
private String status;
/**
* 支付状态UNPAID-未支付PAID-已支付FAILED-支付失败)
*/
private String paymentStatus;
/**
* PayPal订单状态CREATED-已创建APPROVED-已批准COMPLETED-已完成VOIDED-已取消等)
*/
private String paypalStatus;
/**
* PayPal支付状态COMPLETED-已完成DENIED-被拒绝PENDING-待处理等)
*/
private String paypalPaymentStatus;
/**
* 客户姓名(模糊查询)
*/
private String customerName;
/**
* 客户电话(模糊查询)
*/
private String customerPhone;
/**
* 客户邮箱(模糊查询)
*/
private String customerEmail;
/**
* 商品名称(模糊查询)
*/
private String productName;
/**
* 支付者邮箱PayPal模糊查询
*/
private String payerEmail;
/**
* 支付者姓名PayPal模糊查询
*/
private String payerName;
/**
* 开始时间(订单创建时间)
*/
private String startTime;
/**
* 结束时间(订单创建时间)
*/
private String endTime;
/**
* 当前页码从1开始默认1
*/
private Integer pageNum = 1;
/**
* 每页大小默认10
*/
private Integer pageSize = 10;
}

View File

@@ -0,0 +1,155 @@
package com.mtkj.mtpay.dto.response;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 订单列表响应DTO包含客户订单和PayPal订单信息
*/
@Data
public class OrderListResponseDTO implements Serializable {
/**
* 客户订单ID
*/
private Long id;
/**
* 订单号
*/
private String orderNo;
/**
* 商品ID
*/
private Long productId;
/**
* 商品名称
*/
private String productName;
/**
* SKU名称
*/
private String skuName;
/**
* 购买数量
*/
private Integer quantity;
/**
* 订单总金额(原始货币)
*/
private BigDecimal totalAmount;
/**
* 原始货币代码
*/
private String originalCurrency;
/**
* 原始订单金额
*/
private BigDecimal originalAmount;
/**
* 支付货币代码
*/
private String paymentCurrency;
/**
* 支付金额
*/
private BigDecimal paymentAmount;
/**
* 订单状态PENDING-待支付PAID-已支付SHIPPED-已发货COMPLETED-已完成CANCELLED-已取消)
*/
private String status;
/**
* 支付状态UNPAID-未支付PAID-已支付FAILED-支付失败)
*/
private String paymentStatus;
/**
* 客户姓名
*/
private String customerName;
/**
* 客户电话
*/
private String customerPhone;
/**
* 客户邮箱
*/
private String customerEmail;
/**
* 收货国家
*/
private String shippingCountry;
/**
* 收货城市
*/
private String shippingCity;
/**
* PayPal订单ID
*/
private String paypalOrderId;
/**
* PayPal订单状态CREATED-已创建APPROVED-已批准COMPLETED-已完成VOIDED-已取消等)
*/
private String paypalStatus;
/**
* PayPal支付状态COMPLETED-已完成DENIED-被拒绝PENDING-待处理等)
*/
private String paypalPaymentStatus;
/**
* 支付者邮箱PayPal
*/
private String payerEmail;
/**
* 支付者姓名PayPal
*/
private String payerName;
/**
* 支付捕获IDPayPal
*/
private String captureId;
/**
* 订单创建时间
*/
private LocalDateTime createTime;
/**
* 订单更新时间
*/
private LocalDateTime updateTime;
/**
* PayPal订单创建时间
*/
private LocalDateTime paypalCreateTime;
/**
* PayPal订单更新时间
*/
private LocalDateTime paypalUpdateTime;
}

View File

@@ -1,7 +1,9 @@
package com.mtkj.mtpay.service;
import com.mtkj.mtpay.dto.request.CreateCustomerOrderRequestDTO;
import com.mtkj.mtpay.dto.request.OrderQueryRequestDTO;
import com.mtkj.mtpay.dto.response.CustomerOrderResponseDTO;
import com.mtkj.mtpay.dto.response.PageResult;
/**
* 客户订单服务接口
@@ -58,5 +60,12 @@ public interface CustomerOrderService {
String paymentCurrency,
java.math.BigDecimal paymentAmount,
java.math.BigDecimal exchangeRate);
/**
* 查询订单列表(支持多条件查询和分页)
* @param query 查询条件(包含分页参数)
* @return 分页结果
*/
PageResult<com.mtkj.mtpay.dto.response.OrderListResponseDTO> queryOrders(OrderQueryRequestDTO query);
}

View File

@@ -3,8 +3,14 @@ package com.mtkj.mtpay.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mtkj.mtpay.common.ResultCode;
import com.mtkj.mtpay.common.enums.ProductStatus;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mtkj.mtpay.dto.request.CreateCustomerOrderRequestDTO;
import com.mtkj.mtpay.dto.request.OrderQueryRequestDTO;
import com.mtkj.mtpay.dto.response.CustomerOrderResponseDTO;
import com.mtkj.mtpay.dto.response.OrderListResponseDTO;
import com.mtkj.mtpay.dto.response.PageResult;
import com.mtkj.mtpay.entity.PayPalPaymentOrder;
import com.mtkj.mtpay.entity.CustomerOrder;
import com.mtkj.mtpay.entity.MtProduct;
import com.mtkj.mtpay.entity.MtProductSku;
@@ -12,6 +18,7 @@ import com.mtkj.mtpay.exception.BusinessException;
import com.mtkj.mtpay.mapper.CustomerOrderMapper;
import com.mtkj.mtpay.mapper.MtProductMapper;
import com.mtkj.mtpay.mapper.MtProductSkuMapper;
import com.mtkj.mtpay.mapper.PayPalPaymentOrderMapper;
import com.mtkj.mtpay.service.CustomerOrderService;
import com.mtkj.mtpay.util.BaiduTranslatorUtils;
import com.mtkj.mtpay.util.OrderIdGenerator;
@@ -38,6 +45,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
private final CustomerOrderMapper customerOrderMapper;
private final MtProductMapper productMapper;
private final MtProductSkuMapper productSkuMapper;
private final PayPalPaymentOrderMapper payPalPaymentOrderMapper;
private final BaiduTranslatorUtils baiduTranslatorUtils;
@Override
@@ -319,5 +327,203 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
log.info("订单状态更新成功,订单号: {}", orderNo);
}
@Override
public PageResult<OrderListResponseDTO> queryOrders(OrderQueryRequestDTO query) {
long startTime = System.currentTimeMillis();
// 处理分页参数
int pageNum = query.getPageNum() != null && query.getPageNum() > 0 ? query.getPageNum() : 1;
int pageSize = query.getPageSize() != null && query.getPageSize() > 0 ? query.getPageSize() : 10;
// 限制每页最大数量
if (pageSize > 100) {
pageSize = 100;
log.warn("每页大小超过限制已调整为100原始值: {}", query.getPageSize());
}
log.info("查询订单列表,查询条件: {}, 页码: {}, 每页大小: {}", query, pageNum, pageSize);
// 1. 构建客户订单查询条件
LambdaQueryWrapper<CustomerOrder> orderWrapper = new LambdaQueryWrapper<>();
// 订单号查询
if (query.getOrderNo() != null && !query.getOrderNo().trim().isEmpty()) {
orderWrapper.eq(CustomerOrder::getOrderNo, query.getOrderNo().trim());
}
// 订单状态查询
if (query.getStatus() != null && !query.getStatus().trim().isEmpty()) {
orderWrapper.eq(CustomerOrder::getStatus, query.getStatus().trim());
}
// 支付状态查询
if (query.getPaymentStatus() != null && !query.getPaymentStatus().trim().isEmpty()) {
orderWrapper.eq(CustomerOrder::getPaymentStatus, query.getPaymentStatus().trim());
}
// 客户姓名模糊查询
if (query.getCustomerName() != null && !query.getCustomerName().trim().isEmpty()) {
orderWrapper.like(CustomerOrder::getCustomerName, query.getCustomerName().trim());
}
// 客户电话模糊查询
if (query.getCustomerPhone() != null && !query.getCustomerPhone().trim().isEmpty()) {
orderWrapper.like(CustomerOrder::getCustomerPhone, query.getCustomerPhone().trim());
}
// 客户邮箱模糊查询
if (query.getCustomerEmail() != null && !query.getCustomerEmail().trim().isEmpty()) {
orderWrapper.like(CustomerOrder::getCustomerEmail, query.getCustomerEmail().trim());
}
// 商品名称模糊查询
if (query.getProductName() != null && !query.getProductName().trim().isEmpty()) {
orderWrapper.like(CustomerOrder::getProductName, query.getProductName().trim());
}
// 时间范围查询
if (query.getStartTime() != null && !query.getStartTime().trim().isEmpty()) {
try {
java.time.LocalDateTime start = java.time.LocalDateTime.parse(query.getStartTime().trim());
orderWrapper.ge(CustomerOrder::getCreateTime, start);
} catch (Exception e) {
log.warn("开始时间格式错误: {}", query.getStartTime(), e);
}
}
if (query.getEndTime() != null && !query.getEndTime().trim().isEmpty()) {
try {
java.time.LocalDateTime end = java.time.LocalDateTime.parse(query.getEndTime().trim());
orderWrapper.le(CustomerOrder::getCreateTime, end);
} catch (Exception e) {
log.warn("结束时间格式错误: {}", query.getEndTime(), e);
}
}
// 如果指定了PayPal相关查询条件需要先查询PayPal订单获取对应的商户订单号
java.util.List<String> merchantOrderNos = null;
if (query.getPaypalOrderId() != null && !query.getPaypalOrderId().trim().isEmpty() ||
query.getMerchantOrderNo() != null && !query.getMerchantOrderNo().trim().isEmpty() ||
query.getPaypalStatus() != null && !query.getPaypalStatus().trim().isEmpty() ||
query.getPaypalPaymentStatus() != null && !query.getPaypalPaymentStatus().trim().isEmpty() ||
query.getPayerEmail() != null && !query.getPayerEmail().trim().isEmpty() ||
query.getPayerName() != null && !query.getPayerName().trim().isEmpty()) {
// 构建PayPal订单查询条件
LambdaQueryWrapper<PayPalPaymentOrder> paypalWrapper = new LambdaQueryWrapper<>();
if (query.getPaypalOrderId() != null && !query.getPaypalOrderId().trim().isEmpty()) {
paypalWrapper.eq(PayPalPaymentOrder::getPaypalOrderId, query.getPaypalOrderId().trim());
}
if (query.getMerchantOrderNo() != null && !query.getMerchantOrderNo().trim().isEmpty()) {
paypalWrapper.eq(PayPalPaymentOrder::getMerchantOrderNo, query.getMerchantOrderNo().trim());
}
if (query.getPaypalStatus() != null && !query.getPaypalStatus().trim().isEmpty()) {
paypalWrapper.eq(PayPalPaymentOrder::getStatus, query.getPaypalStatus().trim());
}
if (query.getPaypalPaymentStatus() != null && !query.getPaypalPaymentStatus().trim().isEmpty()) {
paypalWrapper.eq(PayPalPaymentOrder::getPaymentStatus, query.getPaypalPaymentStatus().trim());
}
if (query.getPayerEmail() != null && !query.getPayerEmail().trim().isEmpty()) {
paypalWrapper.like(PayPalPaymentOrder::getPayerEmail, query.getPayerEmail().trim());
}
if (query.getPayerName() != null && !query.getPayerName().trim().isEmpty()) {
paypalWrapper.like(PayPalPaymentOrder::getPayerName, query.getPayerName().trim());
}
// 查询PayPal订单获取商户订单号列表
java.util.List<PayPalPaymentOrder> paypalOrders = payPalPaymentOrderMapper.selectList(paypalWrapper);
merchantOrderNos = paypalOrders.stream()
.map(PayPalPaymentOrder::getMerchantOrderNo)
.filter(java.util.Objects::nonNull)
.distinct()
.collect(java.util.stream.Collectors.toList());
if (merchantOrderNos.isEmpty()) {
// 如果PayPal订单查询结果为空直接返回空分页结果
log.debug("PayPal订单查询结果为空返回空列表");
return new PageResult<>((long) pageNum, (long) pageSize, 0L, new java.util.ArrayList<>());
}
// 将商户订单号作为客户订单的查询条件
orderWrapper.in(CustomerOrder::getOrderNo, merchantOrderNos);
}
// 按创建时间降序排序
orderWrapper.orderByDesc(CustomerOrder::getCreateTime);
// 使用MyBatis-Plus分页查询
Page<CustomerOrder> page = new Page<>(pageNum, pageSize);
IPage<CustomerOrder> orderPage = customerOrderMapper.selectPage(page, orderWrapper);
java.util.List<CustomerOrder> orders = orderPage.getRecords();
log.debug("查询到订单数量: {}/{}, 总记录数: {}", orders.size(), pageSize, orderPage.getTotal());
if (orders.isEmpty()) {
log.info("订单列表为空,耗时: {}ms", System.currentTimeMillis() - startTime);
return new PageResult<>((long) pageNum, (long) pageSize, orderPage.getTotal(), new java.util.ArrayList<>());
}
// 2. 批量查询PayPal订单信息优化N+1问题
java.util.List<String> orderNos = orders.stream()
.map(CustomerOrder::getOrderNo)
.filter(java.util.Objects::nonNull)
.collect(java.util.stream.Collectors.toList());
java.util.Map<String, PayPalPaymentOrder> paypalOrderMap = new java.util.HashMap<>();
if (!orderNos.isEmpty()) {
LambdaQueryWrapper<PayPalPaymentOrder> paypalWrapper = new LambdaQueryWrapper<>();
paypalWrapper.in(PayPalPaymentOrder::getMerchantOrderNo, orderNos);
java.util.List<PayPalPaymentOrder> paypalOrders = payPalPaymentOrderMapper.selectList(paypalWrapper);
paypalOrderMap = paypalOrders.stream()
.collect(java.util.stream.Collectors.toMap(
PayPalPaymentOrder::getMerchantOrderNo,
order -> order,
(existing, replacement) -> existing // 如果有重复,保留第一个
));
log.debug("批量查询到PayPal订单数量: {}", paypalOrderMap.size());
}
// 3. 组装响应数据
java.util.List<OrderListResponseDTO> result = new java.util.ArrayList<>();
for (CustomerOrder order : orders) {
OrderListResponseDTO dto = new OrderListResponseDTO();
BeanUtils.copyProperties(order, dto);
// 设置PayPal订单信息
PayPalPaymentOrder paypalOrder = paypalOrderMap.get(order.getOrderNo());
if (paypalOrder != null) {
dto.setPaypalOrderId(paypalOrder.getPaypalOrderId());
dto.setPaypalStatus(paypalOrder.getStatus());
dto.setPaypalPaymentStatus(paypalOrder.getPaymentStatus());
dto.setPayerEmail(paypalOrder.getPayerEmail());
dto.setPayerName(paypalOrder.getPayerName());
dto.setCaptureId(paypalOrder.getCaptureId());
dto.setPaypalCreateTime(paypalOrder.getCreateTime());
dto.setPaypalUpdateTime(paypalOrder.getUpdateTime());
}
result.add(dto);
}
long endTime = System.currentTimeMillis();
log.info("查询订单列表完成,查询条件: {}, 结果数量: {}/{}, 总记录数: {}, 耗时: {}ms",
query, result.size(), pageSize, orderPage.getTotal(), endTime - startTime);
// 构建分页结果
return new PageResult<>(
orderPage.getCurrent(),
orderPage.getSize(),
orderPage.getTotal(),
result
);
}
}