From f4d8134fe5d0fbc3c5ed92443611d4489e369ea8 Mon Sep 17 00:00:00 2001 From: grtsinry43 Date: Thu, 22 May 2025 16:32:26 +0800 Subject: [PATCH] Refactor: Refactor OrdersController and OrdersService to improve order creation and retrieval functionality --- .gitignore | 4 +- logs/book-management.log | 308 ++++++++++++++++++ .../controller/OrdersController.java | 147 ++------- .../bookmanagement/dto/OrderCreateDTO.java | 13 + .../dto/OrderItemCreateDTO.java | 15 + .../bookmanagement/service/OrdersService.java | 13 +- .../service/impl/OrdersServiceImpl.java | 113 +++++-- .../bookmanagement/vo/OrderItemVO.java | 14 + .../grtsinry43/bookmanagement/vo/OrderVO.java | 18 + 9 files changed, 488 insertions(+), 157 deletions(-) create mode 100644 src/main/java/com/grtsinry43/bookmanagement/dto/OrderCreateDTO.java create mode 100644 src/main/java/com/grtsinry43/bookmanagement/dto/OrderItemCreateDTO.java create mode 100644 src/main/java/com/grtsinry43/bookmanagement/vo/OrderItemVO.java create mode 100644 src/main/java/com/grtsinry43/bookmanagement/vo/OrderVO.java diff --git a/.gitignore b/.gitignore index 187525d..531e26a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,6 @@ build/ ### VS Code ### .vscode/ -src/main/resources/application-secret.yml \ No newline at end of file +src/main/resources/application-secret.yml + +logs/ \ No newline at end of file diff --git a/logs/book-management.log b/logs/book-management.log index 8ad306e..c66eed2 100644 --- a/logs/book-management.log +++ b/logs/book-management.log @@ -1093,3 +1093,311 @@ org.springframework.web.servlet.resource.NoResourceFoundException: No static res at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:840) +2025-05-22 12:28:13.794 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.BookMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:28:13.796 | [main] | WARN | c.b.m.core.injector.methods.Delete | [com.grtsinry43.bookmanagement.mapper.BookMapper.delete] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Delete] +2025-05-22 12:28:13.797 | [main] | WARN | c.b.m.core.injector.methods.Update | [com.grtsinry43.bookmanagement.mapper.BookMapper.update] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Update] +2025-05-22 12:28:13.805 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.OrderItemMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:28:13.813 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.OrdersMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:28:13.821 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:28:13.822 | [main] | WARN | c.b.m.core.injector.methods.Delete | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.delete] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Delete] +2025-05-22 12:28:13.822 | [main] | WARN | c.b.m.core.injector.methods.Update | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.update] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Update] +2025-05-22 12:28:13.830 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.ReaderMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:28:14.121 | [main] | INFO | c.b.m.e.s.MybatisPlusApplicationContextAware | Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@7b139eab +2025-05-22 12:28:16.308 | [http-nio-8080-exec-3] | ERROR | c.g.b.c.GlobalExceptionHandler | 系统异常: No static resource favicon.ico. +org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico. + at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585) + at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:840) +2025-05-22 12:28:19.386 | [http-nio-8080-exec-5] | ERROR | c.g.b.c.GlobalExceptionHandler | 系统异常: No static resource favicon.ico. +org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico. + at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585) + at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:840) +2025-05-22 12:36:43.061 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.BookMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:36:43.062 | [main] | WARN | c.b.m.core.injector.methods.Delete | [com.grtsinry43.bookmanagement.mapper.BookMapper.delete] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Delete] +2025-05-22 12:36:43.063 | [main] | WARN | c.b.m.core.injector.methods.Update | [com.grtsinry43.bookmanagement.mapper.BookMapper.update] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Update] +2025-05-22 12:36:43.071 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.OrderItemMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:36:43.079 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.OrdersMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:36:43.088 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:36:43.088 | [main] | WARN | c.b.m.core.injector.methods.Delete | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.delete] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Delete] +2025-05-22 12:36:43.089 | [main] | WARN | c.b.m.core.injector.methods.Update | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.update] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Update] +2025-05-22 12:36:43.099 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.ReaderMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 12:36:43.396 | [main] | INFO | c.b.m.e.s.MybatisPlusApplicationContextAware | Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@3f2ef586 +2025-05-22 12:36:47.001 | [http-nio-8080-exec-1] | ERROR | c.g.b.c.GlobalExceptionHandler | 系统异常: Required request body is missing: public com.grtsinry43.bookmanagement.common.ApiResponse> com.grtsinry43.bookmanagement.controller.ReaderController.login(com.grtsinry43.bookmanagement.dto.LoginRequest) +org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.grtsinry43.bookmanagement.common.ApiResponse> com.grtsinry43.bookmanagement.controller.ReaderController.login(com.grtsinry43.bookmanagement.dto.LoginRequest) + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:179) + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:150) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:840) +2025-05-22 12:36:50.370 | [http-nio-8080-exec-3] | ERROR | c.g.b.c.GlobalExceptionHandler | 系统异常: Required request body is missing: public com.grtsinry43.bookmanagement.common.ApiResponse> com.grtsinry43.bookmanagement.controller.ReaderController.login(com.grtsinry43.bookmanagement.dto.LoginRequest) +org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.grtsinry43.bookmanagement.common.ApiResponse> com.grtsinry43.bookmanagement.controller.ReaderController.login(com.grtsinry43.bookmanagement.dto.LoginRequest) + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:179) + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:150) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:840) +2025-05-22 16:29:06.522 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.BookMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 16:29:06.524 | [main] | WARN | c.b.m.core.injector.methods.Delete | [com.grtsinry43.bookmanagement.mapper.BookMapper.delete] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Delete] +2025-05-22 16:29:06.525 | [main] | WARN | c.b.m.core.injector.methods.Update | [com.grtsinry43.bookmanagement.mapper.BookMapper.update] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Update] +2025-05-22 16:29:06.535 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.OrderItemMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 16:29:06.544 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.OrdersMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 16:29:06.553 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 16:29:06.554 | [main] | WARN | c.b.m.core.injector.methods.Delete | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.delete] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Delete] +2025-05-22 16:29:06.554 | [main] | WARN | c.b.m.core.injector.methods.Update | [com.grtsinry43.bookmanagement.mapper.PublisherMapper.update] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Update] +2025-05-22 16:29:06.563 | [main] | WARN | c.b.m.core.injector.methods.Insert | [com.grtsinry43.bookmanagement.mapper.ReaderMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert] +2025-05-22 16:29:06.897 | [main] | INFO | c.b.m.e.s.MybatisPlusApplicationContextAware | Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@7b139eab +2025-05-22 16:29:09.661 | [http-nio-8080-exec-2] | ERROR | c.g.b.c.GlobalExceptionHandler | 系统异常: No static resource favicon.ico. +org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico. + at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585) + at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:840) +2025-05-22 16:29:22.182 | [http-nio-8080-exec-4] | ERROR | c.g.b.c.GlobalExceptionHandler | 系统异常: No static resource favicon.ico. +org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico. + at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585) + at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) + at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1740) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189) + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) + at java.base/java.lang.Thread.run(Thread.java:840) diff --git a/src/main/java/com/grtsinry43/bookmanagement/controller/OrdersController.java b/src/main/java/com/grtsinry43/bookmanagement/controller/OrdersController.java index 4d74b4b..4cfeba3 100644 --- a/src/main/java/com/grtsinry43/bookmanagement/controller/OrdersController.java +++ b/src/main/java/com/grtsinry43/bookmanagement/controller/OrdersController.java @@ -2,13 +2,10 @@ package com.grtsinry43.bookmanagement.controller; import com.grtsinry43.bookmanagement.annotation.AuthCheck; import com.grtsinry43.bookmanagement.common.ApiResponse; -import com.grtsinry43.bookmanagement.common.BusinessException; -import com.grtsinry43.bookmanagement.common.ErrorCode; +import com.grtsinry43.bookmanagement.common.PageResponse; import com.grtsinry43.bookmanagement.common.UserRole; -import com.grtsinry43.bookmanagement.dto.CreateOrderRequest; -import com.grtsinry43.bookmanagement.entity.OrderItem; -import com.grtsinry43.bookmanagement.entity.Orders; -import com.grtsinry43.bookmanagement.service.OrderItemService; // Keep for future use if OrderItem specific endpoints are added +import com.grtsinry43.bookmanagement.dto.OrderCreateDTO; +import com.grtsinry43.bookmanagement.vo.OrderVO; import com.grtsinry43.bookmanagement.service.OrdersService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; @@ -16,133 +13,41 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -/** - *

- * 订单前端控制器 - *

- * - * @author grtsinry43 - * @since 2025-05-19 - */ @RestController @RequestMapping("/orders") public class OrdersController { - @Autowired private OrdersService ordersService; - // @Autowired - // private OrderItemService orderItemService; // 如果需要单独操作订单项,则保留 - - /** - * 顾客:创建新订单 - * @param createOrderRequest 包含订单信息和订单项列表的请求体 - * @param request HTTP请求对象,用于获取用户ID - * @return 包含创建的订单信息的API响应 - */ @PostMapping("/create") - @AuthCheck(requiredRole = UserRole.USER) // 需要用户登录才能创建订单 - public ApiResponse createOrder(@RequestBody CreateOrderRequest createOrderRequest, HttpServletRequest request) { - // 从HttpServletRequest中获取用户ID - Object userIdObject = request.getAttribute("userId"); - if (userIdObject == null) { - throw new BusinessException(ErrorCode.NOT_LOGIN); - } - Integer userId = (Integer) userIdObject; - - // 基本验证:订单项不能为空 - if (createOrderRequest.getItems() == null || createOrderRequest.getItems().isEmpty()) { - throw new BusinessException(ErrorCode.PARAMS_ERROR); - } - - Orders orderToCreate = createOrderRequest.getOrder(); - if (orderToCreate == null) { - // 如果请求中没有order部分,或者需要初始化一个 - orderToCreate = new Orders(); - } - // 设置订单的读者ID为当前登录用户的ID - orderToCreate.setReaderId(userId); - - // 调用服务创建订单 - // 服务层中的 createOrder 方法应该处理库存检查等业务逻辑,并在发生错误时抛出 BusinessException - Orders createdOrder = ordersService.createOrder(orderToCreate, createOrderRequest.getItems()); - return ApiResponse.success(createdOrder); + @AuthCheck(requiredRole = UserRole.USER) + public ApiResponse createOrder(@RequestBody OrderCreateDTO dto, HttpServletRequest request) { + Integer userId = (Integer) request.getAttribute("userId"); + return ApiResponse.success(ordersService.createOrder(dto, userId)); } - /** - * 顾客:查看自己的订单列表 - * @param request HTTP请求对象,用于获取用户ID - * @return 包含用户订单列表的API响应 - */ - @GetMapping("/my-orders") // 移除了{readerId}路径参数 - @AuthCheck(requiredRole = UserRole.USER) // 需要用户登录才能查看订单 - public ApiResponse> getMyOrders(HttpServletRequest request) { - // 从HttpServletRequest中获取用户ID - Object userIdObject = request.getAttribute("userId"); - if (userIdObject == null) { - throw new BusinessException(ErrorCode.NOT_LOGIN); - } - Integer userId = (Integer) userIdObject; - - List orders = ordersService.getOrdersByReaderId(userId); - return ApiResponse.success(orders); - } - - /** - * 顾客和管理员:查看特定订单详情 - * (对于顾客,应在服务层或此处增加逻辑,校验订单是否属于该顾客,除非拦截器已处理) - * @param orderId 订单ID - * @param request HTTP请求对象 (如果需要根据用户角色或ID进行权限校验) - * @return 包含订单详情的API响应 - */ @GetMapping("/{orderId}") - @AuthCheck(requiredRole = UserRole.USER) // 需要用户登录才能查看订单详情 - public ApiResponse getOrderDetails(@PathVariable Integer orderId, HttpServletRequest request) { - // 示例:如果需要基于用户ID的权限检查,可以从request中获取userId - Object userIdObject = request.getAttribute("userId"); - Integer currentUserId = (userIdObject != null) ? (Integer) userIdObject : null; - // TODO: 根据业务需求,添加权限校验逻辑,例如检查订单是否属于当前用户(如果非管理员) - - Orders order = ordersService.getOrderById(orderId); - if (order == null) { - throw new BusinessException(ErrorCode.NOT_FOUND); - } - if (order.getReaderId() != null && !order.getReaderId().equals(currentUserId)) { - // 如果订单属于其他用户,且当前用户不是管理员,则抛出权限异常 - throw new BusinessException(ErrorCode.UNAUTHORIZED); - } - // 考虑:如果用户不是管理员,且订单不属于该用户,也应抛出权限异常 - return ApiResponse.success(order); + @AuthCheck(requiredRole = UserRole.USER) + public ApiResponse getOrderDetail(@PathVariable Integer orderId, HttpServletRequest request) { + Integer userId = (Integer) request.getAttribute("userId"); + OrderVO vo = ordersService.getOrderDetailApi(orderId, userId); + return ApiResponse.success(vo); + } + + @GetMapping("/my") + @AuthCheck(requiredRole = UserRole.USER) + public ApiResponse>> getOrdersByReaderId(@RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "10") int pageSize, + HttpServletRequest request) { + Integer userId = (Integer) request.getAttribute("userId"); + return ApiResponse.success(ordersService.getOrdersByReaderId(userId, pageNum, pageSize)); } - /** - * 管理员:查看所有订单列表 - * (假设已有管理员权限拦截器) - * @return 包含所有订单列表的API响应 - */ @GetMapping("/admin/all") - @AuthCheck(requiredRole = UserRole.ADMIN) // 需要管理员权限才能查看所有订单 - public ApiResponse> getAllOrders() { - List orders = ordersService.getAllOrders(); - return ApiResponse.success(orders); - } - - /** - * 管理员:更新订单状态 - * (假设已有管理员权限拦截器) - * @param orderId 订单ID - * @param status 新的订单状态 - * @return 操作结果的API响应 - */ - @PutMapping("/admin/update-status/{orderId}") - @AuthCheck(requiredRole = UserRole.ADMIN) // 需要管理员权限才能更新订单状态 - public ApiResponse updateOrderStatus(@PathVariable Integer orderId, @RequestParam String status) { - // TODO: 可以增加对status参数有效性的校验 - if (status == null || status.trim().isEmpty()) { - throw new BusinessException(ErrorCode.PARAMS_ERROR); - } - ordersService.updateOrderStatus(orderId, status); - // 更新成功,通常返回成功的消息,data部分可以为null或包含更新后的对象(如果服务层返回) - return ApiResponse.success(null); + @AuthCheck(requiredRole = UserRole.ADMIN) + public ApiResponse>> getAllOrders(@RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "10") int pageSize) { + return ApiResponse.success(ordersService.getAllOrders(pageNum, pageSize)); } } + diff --git a/src/main/java/com/grtsinry43/bookmanagement/dto/OrderCreateDTO.java b/src/main/java/com/grtsinry43/bookmanagement/dto/OrderCreateDTO.java new file mode 100644 index 0000000..b4de9a6 --- /dev/null +++ b/src/main/java/com/grtsinry43/bookmanagement/dto/OrderCreateDTO.java @@ -0,0 +1,13 @@ +package com.grtsinry43.bookmanagement.dto; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; +import java.util.List; + +@Data +public class OrderCreateDTO { + @NotNull(message = "订单项不能为空") + private List items; +} + diff --git a/src/main/java/com/grtsinry43/bookmanagement/dto/OrderItemCreateDTO.java b/src/main/java/com/grtsinry43/bookmanagement/dto/OrderItemCreateDTO.java new file mode 100644 index 0000000..d932e0b --- /dev/null +++ b/src/main/java/com/grtsinry43/bookmanagement/dto/OrderItemCreateDTO.java @@ -0,0 +1,15 @@ +package com.grtsinry43.bookmanagement.dto; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Data; + +@Data +public class OrderItemCreateDTO { + @NotNull(message = "图书ID不能为空") + private Integer bookId; + @NotNull(message = "数量不能为空") + @Positive(message = "数量必须大于0") + private Integer quantity; +} + diff --git a/src/main/java/com/grtsinry43/bookmanagement/service/OrdersService.java b/src/main/java/com/grtsinry43/bookmanagement/service/OrdersService.java index 4cb64fb..7c1f1cd 100644 --- a/src/main/java/com/grtsinry43/bookmanagement/service/OrdersService.java +++ b/src/main/java/com/grtsinry43/bookmanagement/service/OrdersService.java @@ -2,6 +2,9 @@ package com.grtsinry43.bookmanagement.service; import com.grtsinry43.bookmanagement.entity.Orders; import com.grtsinry43.bookmanagement.entity.OrderItem; +import com.grtsinry43.bookmanagement.dto.OrderCreateDTO; +import com.grtsinry43.bookmanagement.vo.OrderVO; +import com.grtsinry43.bookmanagement.common.PageResponse; import java.util.List; @@ -14,13 +17,13 @@ import java.util.List; * @since 2025-05-19 */ public interface OrdersService { - Orders getOrderById(Integer orderId); + void updateOrderStatus(Integer orderId, String status); - List getAllOrders(); // For admin + OrderVO createOrder(OrderCreateDTO orderCreateDTO, Integer userId); - List getOrdersByReaderId(Integer readerId); + OrderVO getOrderDetailApi(Integer orderId, Integer userId); - Orders createOrder(Orders order, List items); // Simplified: pass items directly + PageResponse> getOrdersByReaderId(Integer userId, int pageNum, int pageSize); - void updateOrderStatus(Integer orderId, String status); // Simplified + PageResponse> getAllOrders(int pageNum, int pageSize); } diff --git a/src/main/java/com/grtsinry43/bookmanagement/service/impl/OrdersServiceImpl.java b/src/main/java/com/grtsinry43/bookmanagement/service/impl/OrdersServiceImpl.java index 820755a..77bc651 100644 --- a/src/main/java/com/grtsinry43/bookmanagement/service/impl/OrdersServiceImpl.java +++ b/src/main/java/com/grtsinry43/bookmanagement/service/impl/OrdersServiceImpl.java @@ -1,6 +1,8 @@ package com.grtsinry43.bookmanagement.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.grtsinry43.bookmanagement.common.BusinessException; +import com.grtsinry43.bookmanagement.common.ErrorCode; import com.grtsinry43.bookmanagement.entity.Book; import com.grtsinry43.bookmanagement.entity.OrderItem; import com.grtsinry43.bookmanagement.entity.Orders; @@ -8,24 +10,31 @@ import com.grtsinry43.bookmanagement.mapper.BookMapper; import com.grtsinry43.bookmanagement.mapper.OrderItemMapper; import com.grtsinry43.bookmanagement.mapper.OrdersMapper; import com.grtsinry43.bookmanagement.service.OrdersService; +import com.grtsinry43.bookmanagement.dto.OrderCreateDTO; +import com.grtsinry43.bookmanagement.dto.OrderItemCreateDTO; +import com.grtsinry43.bookmanagement.vo.OrderVO; +import com.grtsinry43.bookmanagement.vo.OrderItemVO; +import com.grtsinry43.bookmanagement.common.PageResponse; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; /** *

- * 服务实现类 + * 服务实现类 *

* * @author grtsinry43 * @since 2025-05-19 */ @Service -public class OrdersServiceImpl extends ServiceImpl implements OrdersService { +public class OrdersServiceImpl extends ServiceImpl implements OrdersService { @Autowired private OrdersMapper ordersMapper; @@ -34,55 +43,99 @@ public class OrdersServiceImpl extends ServiceImpl implemen private OrderItemMapper orderItemMapper; @Autowired - private BookMapper bookMapper; // To update stock and get price + private BookMapper bookMapper; @Override - public Orders getOrderById(Integer orderId) { - return ordersMapper.findById(orderId); - } - - @Override - public List getAllOrders() { - return ordersMapper.findAll(); - } - - @Override - public List getOrdersByReaderId(Integer readerId) { - return ordersMapper.findByReaderId(readerId); - } - - @Override - @Transactional // Ensure atomicity - public Orders createOrder(Orders order, List items) { + @Transactional + public OrderVO createOrder(OrderCreateDTO orderCreateDTO, Integer userId) { + Orders order = new Orders(); order.setOrderDate(LocalDateTime.now()); order.setStatus("PENDING"); - BigDecimal totalAmount = BigDecimal.ZERO; - for (OrderItem item : items) { - Book book = bookMapper.findById(item.getBookId()); - if (book == null || book.getStock() < item.getQuantity()) { - throw new RuntimeException("Book not found or insufficient stock for: " + (book != null ? book.getTitle() : item.getBookId())); + List items = new ArrayList<>(); + for (OrderItemCreateDTO itemDTO : orderCreateDTO.getItems()) { + Book book = bookMapper.findById(itemDTO.getBookId()); + if (book == null || book.getStock() < itemDTO.getQuantity()) { + throw new RuntimeException("Book not found or insufficient stock for: " + itemDTO.getBookId()); } + OrderItem item = new OrderItem(); + item.setBookId(itemDTO.getBookId()); + item.setQuantity(itemDTO.getQuantity()); item.setUnitPrice(book.getPrice()); - totalAmount = totalAmount.add(book.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); + totalAmount = totalAmount.add(book.getPrice().multiply(BigDecimal.valueOf(itemDTO.getQuantity()))); + items.add(item); } order.setTotalAmount(totalAmount); - ordersMapper.insert(order); - for (OrderItem item : items) { item.setOrderId(order.getOrderId()); orderItemMapper.insert(item); - Book book = bookMapper.findById(item.getBookId()); book.setStock(book.getStock() - item.getQuantity()); bookMapper.update(book); } - return order; + return getOrderDetail(order.getOrderId()); + } + + @Override + public OrderVO getOrderDetailApi(Integer orderId, Integer userId) { + Orders order = ordersMapper.findById(orderId); + if (order == null) { + throw new BusinessException(ErrorCode.NOT_FOUND); + } else if (!order.getReaderId().equals(userId)) { + throw new BusinessException(ErrorCode.UNAUTHORIZED); + } + return getOrderDetail(orderId); + } + + @Override + public PageResponse> getOrdersByReaderId(Integer userId, int pageNum, int pageSize) { + List orders = ordersMapper.findByReaderId(userId); + int total = orders.size(); + int fromIndex = Math.max(0, (pageNum - 1) * pageSize); + int toIndex = Math.min(fromIndex + pageSize, total); + List voList = new ArrayList<>(); + for (Orders order : orders.subList(fromIndex, toIndex)) { + voList.add(getOrderDetail(order.getOrderId())); + } + return new PageResponse<>(pageNum, pageSize, (long) total, voList); + } + + @Override + public PageResponse> getAllOrders(int pageNum, int pageSize) { + List orders = ordersMapper.findAll(); + int total = orders.size(); + int fromIndex = Math.max(0, (pageNum - 1) * pageSize); + int toIndex = Math.min(fromIndex + pageSize, total); + List voList = new ArrayList<>(); + for (Orders order : orders.subList(fromIndex, toIndex)) { + voList.add(getOrderDetail(order.getOrderId())); + } + return new PageResponse<>(pageNum, pageSize, (long) total, voList); } @Override public void updateOrderStatus(Integer orderId, String status) { ordersMapper.updateStatus(orderId, status); } + + public OrderVO getOrderDetail(Integer orderId) { + Orders order = ordersMapper.findById(orderId); + if (order == null) { + throw new BusinessException(ErrorCode.NOT_FOUND); + } + OrderVO vo = new OrderVO(); + BeanUtils.copyProperties(order, vo); + List items = orderItemMapper.findByOrderId(orderId); + List itemVOs = new ArrayList<>(); + for (OrderItem item : items) { + OrderItemVO itemVO = new OrderItemVO(); + BeanUtils.copyProperties(item, itemVO); + Book book = bookMapper.findById(item.getBookId()); + if (book != null) itemVO.setBookTitle(book.getTitle()); + itemVOs.add(itemVO); + } + vo.setItems(itemVOs); + return vo; + } } diff --git a/src/main/java/com/grtsinry43/bookmanagement/vo/OrderItemVO.java b/src/main/java/com/grtsinry43/bookmanagement/vo/OrderItemVO.java new file mode 100644 index 0000000..5af6dc7 --- /dev/null +++ b/src/main/java/com/grtsinry43/bookmanagement/vo/OrderItemVO.java @@ -0,0 +1,14 @@ +package com.grtsinry43.bookmanagement.vo; + +import lombok.Data; +import java.math.BigDecimal; + +@Data +public class OrderItemVO { + private Integer orderItemId; + private Integer bookId; + private String bookTitle; + private Integer quantity; + private BigDecimal unitPrice; +} + diff --git a/src/main/java/com/grtsinry43/bookmanagement/vo/OrderVO.java b/src/main/java/com/grtsinry43/bookmanagement/vo/OrderVO.java new file mode 100644 index 0000000..deac1f5 --- /dev/null +++ b/src/main/java/com/grtsinry43/bookmanagement/vo/OrderVO.java @@ -0,0 +1,18 @@ +package com.grtsinry43.bookmanagement.vo; + +import lombok.Data; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class OrderVO { + private Integer orderId; + private Integer readerId; + private String readerName; + private LocalDateTime orderDate; + private BigDecimal totalAmount; + private String status; + private List items; +} +