From d0f34716a661a0003bde4ace690a5d672500604e Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Mon, 18 Mar 2024 12:29:16 +0800 Subject: [PATCH] init --- .gitignore | 6 + .idea/.gitignore | 8 + .idea/compiler.xml | 22 + .idea/encodings.xml | 10 + .idea/misc.xml | 15 + .idea/vcs.xml | 6 + pom.xml | 139 ++++++ sky-common/pom.xml | 81 +++ .../sky/common/constant/AutoFillConstant.java | 11 + .../common/constant/JwtClaimsConstant.java | 9 + .../sky/common/constant/MessageConstant.java | 31 ++ .../sky/common/constant/PasswordConstant.java | 9 + .../sky/common/constant/StatusConstant.java | 11 + .../sky/common/enumeration/OperationType.java | 10 + .../exception/AccountLockedException.java | 22 + .../exception/AccountNotFoundException.java | 22 + .../AddressBookBusinessException.java | 22 + .../sky/common/exception/BaseException.java | 22 + .../DeletionNotAllowedException.java | 22 + .../exception/LoginFailedException.java | 22 + .../exception/OrderBusinessException.java | 22 + .../PasswordEditFailedException.java | 22 + .../exception/PasswordErrorException.java | 22 + .../exception/RestTemplateException.java | 17 + .../SetMealEnableFailedException.java | 22 + .../ShoppingCartBusinessException.java | 22 + .../exception/UserNotLoginException.java | 22 + .../sky/common/properties/JwtProperties.java | 24 + .../common/properties/MinioProperties.java | 22 + .../common/properties/WeChatProperties.java | 20 + sky-pojo/pom.xml | 26 + .../java/com/sky/pojo/dto/CategoryDTO.java | 21 + .../sky/pojo/dto/CategoryPageQueryDTO.java | 21 + .../sky/pojo/dto/DataOverViewQueryDTO.java | 18 + .../main/java/com/sky/pojo/dto/DishDTO.java | 32 ++ .../com/sky/pojo/dto/DishPageQueryDTO.java | 20 + .../java/com/sky/pojo/dto/EmployeeDTO.java | 19 + .../com/sky/pojo/dto/EmployeeLoginDTO.java | 22 + .../sky/pojo/dto/EmployeePageQueryDTO.java | 19 + .../java/com/sky/pojo/dto/GoodsSalesDTO.java | 20 + .../com/sky/pojo/dto/OrdersCancelDTO.java | 16 + .../com/sky/pojo/dto/OrdersConfirmDTO.java | 16 + .../main/java/com/sky/pojo/dto/OrdersDTO.java | 45 ++ .../com/sky/pojo/dto/OrdersPageQueryDTO.java | 25 + .../com/sky/pojo/dto/OrdersPaymentDTO.java | 17 + .../com/sky/pojo/dto/OrdersRejectionDTO.java | 16 + .../com/sky/pojo/dto/OrdersSubmitDTO.java | 35 ++ .../com/sky/pojo/dto/PasswordEditDTO.java | 19 + .../java/com/sky/pojo/dto/SetmealDTO.java | 32 ++ .../com/sky/pojo/dto/SetmealPageQueryDTO.java | 20 + .../com/sky/pojo/dto/ShoppingCartDTO.java | 16 + .../java/com/sky/pojo/dto/UserLoginDTO.java | 17 + .../java/com/sky/pojo/entity/AddressBook.java | 61 +++ .../java/com/sky/pojo/entity/BaiduMap.java | 10 + .../java/com/sky/pojo/entity/Category.java | 44 ++ .../com/sky/pojo/entity/CategoryTest.java | 43 ++ .../main/java/com/sky/pojo/entity/Dish.java | 51 ++ .../java/com/sky/pojo/entity/DishFlavor.java | 31 ++ .../java/com/sky/pojo/entity/Employee.java | 46 ++ .../java/com/sky/pojo/entity/OrderDetail.java | 47 ++ .../main/java/com/sky/pojo/entity/Orders.java | 110 +++++ .../java/com/sky/pojo/entity/Setmeal.java | 50 ++ .../java/com/sky/pojo/entity/SetmealDish.java | 38 ++ .../com/sky/pojo/entity/ShoppingCart.java | 50 ++ .../main/java/com/sky/pojo/entity/User.java | 41 ++ .../java/com/sky/pojo/vo/BusinessDataVO.java | 29 ++ .../main/java/com/sky/pojo/vo/DishItemVO.java | 27 + .../java/com/sky/pojo/vo/DishOverViewVO.java | 23 + .../src/main/java/com/sky/pojo/vo/DishVO.java | 42 ++ .../java/com/sky/pojo/vo/EmployeeLoginVO.java | 31 ++ .../java/com/sky/pojo/vo/OrderOverViewVO.java | 32 ++ .../java/com/sky/pojo/vo/OrderPaymentVO.java | 22 + .../java/com/sky/pojo/vo/OrderReportVO.java | 34 ++ .../com/sky/pojo/vo/OrderStatisticsVO.java | 17 + .../java/com/sky/pojo/vo/OrderSubmitVO.java | 25 + .../main/java/com/sky/pojo/vo/OrderVO.java | 21 + .../com/sky/pojo/vo/SalesTop10ReportVO.java | 22 + .../com/sky/pojo/vo/SetmealOverViewVO.java | 23 + .../main/java/com/sky/pojo/vo/SetmealVO.java | 49 ++ .../com/sky/pojo/vo/TurnoverReportVO.java | 20 + .../java/com/sky/pojo/vo/UserLoginVO.java | 20 + .../java/com/sky/pojo/vo/UserReportVO.java | 25 + sky-server/Dockerfile | 20 + sky-server/pom.xml | 152 ++++++ .../src/main/java/com/sky/SkyApplication.java | 19 + .../controller/admin/CategoryController.java | 74 +++ .../controller/admin/CommonController.java | 38 ++ .../sky/controller/admin/DishController.java | 91 ++++ .../controller/admin/EmployeeController.java | 112 +++++ .../sky/controller/admin/OrderController.java | 84 ++++ .../controller/admin/ReportController.java | 71 +++ .../controller/admin/SetMealController.java | 77 +++ .../sky/controller/admin/ShopController.java | 40 ++ .../controller/admin/WorkSpaceController.java | 61 +++ .../notify/PayNotifyController.java | 111 +++++ .../user/AddressBookController.java | 83 ++++ .../controller/user/CategoryController.java | 28 ++ .../sky/controller/user/DishController.java | 50 ++ .../sky/controller/user/OrderController.java | 81 +++ .../controller/user/SetmealController.java | 44 ++ .../sky/controller/user/ShopController.java | 30 ++ .../user/ShoppingCartController.java | 54 ++ .../sky/controller/user/UserController.java | 59 +++ .../com/sky/mapper/AddressBookMapper.java | 48 ++ .../java/com/sky/mapper/CategoryMapper.java | 53 ++ .../java/com/sky/mapper/DishFlavorMapper.java | 31 ++ .../main/java/com/sky/mapper/DishMapper.java | 87 ++++ .../java/com/sky/mapper/EmployeeMapper.java | 60 +++ .../com/sky/mapper/OrderDetailMapper.java | 24 + .../main/java/com/sky/mapper/OrderMapper.java | 92 ++++ .../com/sky/mapper/SetMealDishMapper.java | 46 ++ .../java/com/sky/mapper/SetmealMapper.java | 88 ++++ .../com/sky/mapper/ShoppingCartMapper.java | 60 +++ .../main/java/com/sky/mapper/UserMapper.java | 42 ++ .../com/sky/service/AddressBookService.java | 22 + .../java/com/sky/service/CategoryService.java | 42 ++ .../java/com/sky/service/DishService.java | 72 +++ .../java/com/sky/service/EmployeeService.java | 65 +++ .../java/com/sky/service/MinioService.java | 14 + .../java/com/sky/service/OrderService.java | 125 +++++ .../java/com/sky/service/ReportService.java | 55 +++ .../java/com/sky/service/SetmealService.java | 74 +++ .../com/sky/service/ShoppingCartService.java | 35 ++ .../java/com/sky/service/UserService.java | 15 + .../com/sky/service/WorkspaceService.java | 43 ++ .../service/impl/AddressBookServiceImpl.java | 72 +++ .../sky/service/impl/CategoryServiceImpl.java | 110 +++++ .../com/sky/service/impl/DishServiceImpl.java | 211 ++++++++ .../sky/service/impl/EmployeeServiceImpl.java | 184 +++++++ .../sky/service/impl/MinioServiceImpl.java | 37 ++ .../sky/service/impl/OrderServiceImpl.java | 467 ++++++++++++++++++ .../sky/service/impl/ReportServiceImpl.java | 233 +++++++++ .../sky/service/impl/SetmealServiceImpl.java | 176 +++++++ .../service/impl/ShoppingCartServiceImpl.java | 120 +++++ .../com/sky/service/impl/UserServiceImpl.java | 78 +++ .../service/impl/WorkspaceServiceImpl.java | 151 ++++++ .../service/utils/CheckOutOfRangeUtils.java | 95 ++++ .../service/utils/OrderServiceImplUtils.java | 56 +++ .../service/utils/ReportServiceImplUtils.java | 39 ++ .../src/main/resources/application-dev.yml | 32 ++ sky-server/src/main/resources/application.yml | 62 +++ sky-server/src/main/resources/banner.txt | 16 + sky-server/src/main/resources/favicon.ico | Bin 0 -> 13342 bytes .../resources/mapper/AddressBookMapper.xml | 44 ++ .../main/resources/mapper/CategoryMapper.xml | 68 +++ .../resources/mapper/DishFlavorMapper.xml | 29 ++ .../src/main/resources/mapper/DishMapper.xml | 119 +++++ .../main/resources/mapper/EmployeeMapper.xml | 67 +++ .../resources/mapper/OrderDetailMapper.xml | 21 + .../src/main/resources/mapper/OrderMapper.xml | 149 ++++++ .../resources/mapper/SetMealDishMapper.xml | 45 ++ .../main/resources/mapper/SetmealMapper.xml | 127 +++++ .../resources/mapper/ShoppingCartMapper.xml | 97 ++++ .../src/main/resources/mapper/UserMapper.xml | 29 ++ .../resources/template/运营数据报表模板.xlsx | Bin 0 -> 12570 bytes 155 files changed, 7797 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 sky-common/pom.xml create mode 100644 sky-common/src/main/java/com/sky/common/constant/AutoFillConstant.java create mode 100644 sky-common/src/main/java/com/sky/common/constant/JwtClaimsConstant.java create mode 100644 sky-common/src/main/java/com/sky/common/constant/MessageConstant.java create mode 100644 sky-common/src/main/java/com/sky/common/constant/PasswordConstant.java create mode 100644 sky-common/src/main/java/com/sky/common/constant/StatusConstant.java create mode 100644 sky-common/src/main/java/com/sky/common/enumeration/OperationType.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/AccountLockedException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/AccountNotFoundException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/AddressBookBusinessException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/BaseException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/DeletionNotAllowedException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/LoginFailedException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/OrderBusinessException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/PasswordEditFailedException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/PasswordErrorException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/RestTemplateException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/SetMealEnableFailedException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/ShoppingCartBusinessException.java create mode 100644 sky-common/src/main/java/com/sky/common/exception/UserNotLoginException.java create mode 100644 sky-common/src/main/java/com/sky/common/properties/JwtProperties.java create mode 100644 sky-common/src/main/java/com/sky/common/properties/MinioProperties.java create mode 100644 sky-common/src/main/java/com/sky/common/properties/WeChatProperties.java create mode 100644 sky-pojo/pom.xml create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/CategoryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/CategoryPageQueryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/DataOverViewQueryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/DishDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/DishPageQueryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeLoginDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/EmployeePageQueryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/GoodsSalesDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersCancelDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersConfirmDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPageQueryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPaymentDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersRejectionDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/OrdersSubmitDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/PasswordEditDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/SetmealDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/SetmealPageQueryDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/ShoppingCartDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/dto/UserLoginDTO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/AddressBook.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/BaiduMap.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/Category.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/CategoryTest.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/Dish.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/DishFlavor.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/Employee.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/OrderDetail.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/Orders.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/Setmeal.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/SetmealDish.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/ShoppingCart.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/entity/User.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/BusinessDataVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/DishItemVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/DishOverViewVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/DishVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/EmployeeLoginVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/OrderOverViewVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/OrderPaymentVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/OrderReportVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/OrderStatisticsVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/OrderSubmitVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/OrderVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/SalesTop10ReportVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/SetmealOverViewVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/SetmealVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/TurnoverReportVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/UserLoginVO.java create mode 100644 sky-pojo/src/main/java/com/sky/pojo/vo/UserReportVO.java create mode 100644 sky-server/Dockerfile create mode 100644 sky-server/pom.xml create mode 100644 sky-server/src/main/java/com/sky/SkyApplication.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/CategoryController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/CommonController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/DishController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/OrderController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/ReportController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/SetMealController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/ShopController.java create mode 100644 sky-server/src/main/java/com/sky/controller/admin/WorkSpaceController.java create mode 100644 sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/AddressBookController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/CategoryController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/DishController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/OrderController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/SetmealController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/ShopController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java create mode 100644 sky-server/src/main/java/com/sky/controller/user/UserController.java create mode 100644 sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/CategoryMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/DishMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/OrderMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/SetMealDishMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/SetmealMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java create mode 100644 sky-server/src/main/java/com/sky/mapper/UserMapper.java create mode 100644 sky-server/src/main/java/com/sky/service/AddressBookService.java create mode 100644 sky-server/src/main/java/com/sky/service/CategoryService.java create mode 100644 sky-server/src/main/java/com/sky/service/DishService.java create mode 100644 sky-server/src/main/java/com/sky/service/EmployeeService.java create mode 100644 sky-server/src/main/java/com/sky/service/MinioService.java create mode 100644 sky-server/src/main/java/com/sky/service/OrderService.java create mode 100644 sky-server/src/main/java/com/sky/service/ReportService.java create mode 100644 sky-server/src/main/java/com/sky/service/SetmealService.java create mode 100644 sky-server/src/main/java/com/sky/service/ShoppingCartService.java create mode 100644 sky-server/src/main/java/com/sky/service/UserService.java create mode 100644 sky-server/src/main/java/com/sky/service/WorkspaceService.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/MinioServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java create mode 100644 sky-server/src/main/java/com/sky/service/utils/CheckOutOfRangeUtils.java create mode 100644 sky-server/src/main/java/com/sky/service/utils/OrderServiceImplUtils.java create mode 100644 sky-server/src/main/java/com/sky/service/utils/ReportServiceImplUtils.java create mode 100644 sky-server/src/main/resources/application-dev.yml create mode 100644 sky-server/src/main/resources/application.yml create mode 100644 sky-server/src/main/resources/banner.txt create mode 100644 sky-server/src/main/resources/favicon.ico create mode 100644 sky-server/src/main/resources/mapper/AddressBookMapper.xml create mode 100644 sky-server/src/main/resources/mapper/CategoryMapper.xml create mode 100644 sky-server/src/main/resources/mapper/DishFlavorMapper.xml create mode 100644 sky-server/src/main/resources/mapper/DishMapper.xml create mode 100644 sky-server/src/main/resources/mapper/EmployeeMapper.xml create mode 100644 sky-server/src/main/resources/mapper/OrderDetailMapper.xml create mode 100644 sky-server/src/main/resources/mapper/OrderMapper.xml create mode 100644 sky-server/src/main/resources/mapper/SetMealDishMapper.xml create mode 100644 sky-server/src/main/resources/mapper/SetmealMapper.xml create mode 100644 sky-server/src/main/resources/mapper/ShoppingCartMapper.xml create mode 100644 sky-server/src/main/resources/mapper/UserMapper.xml create mode 100644 sky-server/src/main/resources/template/运营数据报表模板.xlsx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3df42cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +**/target/ +.idea +*.iml +*.class +*Test.java +**/test/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..41670ba --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..ecf7b8e --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e4e2ad7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..210ed53 --- /dev/null +++ b/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + + spring-boot-starter-parent + org.springframework.boot + 2.7.3 + + com.sky + dev-sky-serve-v1 + pom + 1.0-SNAPSHOT + + + sky-common + sky-pojo + sky-server + sky-server + + + + 8 + 8 + 2.2.0 + 1.18.20 + 1.2.76 + 2.6 + 1.2.1 + 1.3.0 + 3.10.2 + 3.0.3 + 1.9.4 + 0.9.1 + 2.3.1 + 3.16 + 8.4.3 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis.spring} + + + + org.projectlombok + lombok + ${lombok} + + + + com.alibaba + fastjson + ${fastjson} + + + + commons-lang + commons-lang + ${commons.lang} + + + + com.alibaba + druid-spring-boot-starter + ${druid} + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper} + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j} + + + + org.aspectj + aspectjrt + ${aspectj} + + + + org.aspectj + aspectjweaver + ${aspectj} + + + + io.jsonwebtoken + jjwt + ${jjwt} + + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.sdk.oss} + + + + javax.xml.bind + jaxb-api + ${jaxb-api} + + + + + org.apache.poi + poi + ${poi} + + + org.apache.poi + poi-ooxml + ${poi} + + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.4.8 + + + + io.minio + minio + ${minio} + + + + diff --git a/sky-common/pom.xml b/sky-common/pom.xml new file mode 100644 index 0000000..f13e8a6 --- /dev/null +++ b/sky-common/pom.xml @@ -0,0 +1,81 @@ + + 4.0.0 + + com.sky + dev-sky-serve-v1 + 1.0-SNAPSHOT + + + sky-common + jar + + sky-common + http://maven.apache.org + + + UTF-8 + + + + + org.projectlombok + lombok + + + com.alibaba + fastjson + + + commons-lang + commons-lang + + + org.springframework.boot + spring-boot-starter-json + + + io.jsonwebtoken + jjwt + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + com.aliyun.oss + aliyun-sdk-oss + + + javax.xml.bind + jaxb-api + + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + + + + io.minio + minio + + + + org.springframework.boot + spring-boot-starter-websocket + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + diff --git a/sky-common/src/main/java/com/sky/common/constant/AutoFillConstant.java b/sky-common/src/main/java/com/sky/common/constant/AutoFillConstant.java new file mode 100644 index 0000000..2e15fcb --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/constant/AutoFillConstant.java @@ -0,0 +1,11 @@ +package com.sky.common.constant; + +/** + * 公共字段自动填充相关常量 + */ +public class AutoFillConstant { + public static final String SET_CREATE_TIME = "setCreateTime"; + public static final String SET_UPDATE_TIME = "setUpdateTime"; + public static final String SET_CREATE_USER = "setCreateUser"; + public static final String SET_UPDATE_USER = "setUpdateUser"; +} diff --git a/sky-common/src/main/java/com/sky/common/constant/JwtClaimsConstant.java b/sky-common/src/main/java/com/sky/common/constant/JwtClaimsConstant.java new file mode 100644 index 0000000..6121903 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/constant/JwtClaimsConstant.java @@ -0,0 +1,9 @@ +package com.sky.common.constant; + +public class JwtClaimsConstant { + public static final String EMP_ID = "empId"; + public static final String USER_ID = "userId"; + public static final String PHONE = "phone"; + public static final String USERNAME = "username"; + public static final String NAME = "name"; +} diff --git a/sky-common/src/main/java/com/sky/common/constant/MessageConstant.java b/sky-common/src/main/java/com/sky/common/constant/MessageConstant.java new file mode 100644 index 0000000..4de3167 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/constant/MessageConstant.java @@ -0,0 +1,31 @@ +package com.sky.common.constant; + +/** + * 信息提示常量类 + */ +public class MessageConstant { + public static final String PASSWORD_ERROR = "密码错误"; + public static final String OLD_PASSWORD_ERROR = "旧密码不匹配"; + public static final String OLD_PASSWORD_SAME_NEW_PASSWORD = "旧密码与新密码相同"; + public static final String ACCOUNT_NOT_FOUND = "账号不存在"; + public static final String ACCOUNT_LOCKED = "账号被锁定"; + public static final String UNKNOWN_ERROR = "未知错误"; + public static final String USER_NOT_LOGIN = "用户未登录"; + public static final String CATEGORY_BE_RELATED_BY_SETMEAL = "当前分类关联了套餐,不能删除"; + public static final String CATEGORY_BE_RELATED_BY_DISH = "当前分类关联了菜品,不能删除"; + public static final String SHOPPING_CART_IS_NULL = "购物车数据为空,不能下单"; + public static final String ADDRESS_BOOK_IS_NULL = "用户地址为空,不能下单"; + public static final String LOGIN_FAILED = "登录失败"; + public static final String UPLOAD_FAILED = "文件上传失败"; + public static final String SETMEAL_ENABLE_FAILED = "套餐内包含未启售菜品,无法启售"; + public static final String PASSWORD_EDIT_FAILED = "密码修改失败"; + public static final String DISH_ON_SALE = "起售中的菜品不能删除"; + public static final String SETMEAL_ON_SALE = "起售中的套餐不能删除"; + public static final String DISH_BE_RELATED_BY_SETMEAL = "当前菜品关联了套餐,不能删除"; + public static final String ORDER_STATUS_ERROR = "订单状态错误"; + public static final String ORDER_STATUS_NOT_OP = "订单已被接单或已制作"; + public static final String ORDER_NOT_FOUND = "订单不存在"; + public static final String ALREADY_EXISTS = "已存在"; + public static final String NOT_SET_STATUS = "请先设置营业状态"; + public static final String REQUEST_NOT_EMPTY = "请求不为空"; +} diff --git a/sky-common/src/main/java/com/sky/common/constant/PasswordConstant.java b/sky-common/src/main/java/com/sky/common/constant/PasswordConstant.java new file mode 100644 index 0000000..d54164b --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/constant/PasswordConstant.java @@ -0,0 +1,9 @@ +package com.sky.common.constant; + +/** + * 密码常量 + */ +public class PasswordConstant { + // 默认密码 + public static final String DEFAULT_PASSWORD = "123456"; +} diff --git a/sky-common/src/main/java/com/sky/common/constant/StatusConstant.java b/sky-common/src/main/java/com/sky/common/constant/StatusConstant.java new file mode 100644 index 0000000..3db41fb --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/constant/StatusConstant.java @@ -0,0 +1,11 @@ +package com.sky.common.constant; + +/** + * 状态常量,启用或者禁用 + */ +public class StatusConstant { + //启用为1 + public static final Integer ENABLE = 1; + //禁用为0 + public static final Integer DISABLE = 0; +} diff --git a/sky-common/src/main/java/com/sky/common/enumeration/OperationType.java b/sky-common/src/main/java/com/sky/common/enumeration/OperationType.java new file mode 100644 index 0000000..30549ce --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/enumeration/OperationType.java @@ -0,0 +1,10 @@ +package com.sky.common.enumeration; + +/** + * 数据库操作类型 + * 使用AutoFill面向切面,设置枚举量 + */ +public enum OperationType { + UPDATE,// 更新操作 + INSERT// 插入操作 +} diff --git a/sky-common/src/main/java/com/sky/common/exception/AccountLockedException.java b/sky-common/src/main/java/com/sky/common/exception/AccountLockedException.java new file mode 100644 index 0000000..5ad8f05 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/AccountLockedException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 账号被锁定异常 + */ +@Slf4j +public class AccountLockedException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public AccountLockedException() { + } + + public AccountLockedException(String message) { + super(message); + log.error("账号被锁定异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/AccountNotFoundException.java b/sky-common/src/main/java/com/sky/common/exception/AccountNotFoundException.java new file mode 100644 index 0000000..197db39 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/AccountNotFoundException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 账号不存在异常 + */ +@Slf4j +public class AccountNotFoundException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public AccountNotFoundException() { + } + + public AccountNotFoundException(String message) { + super(message); + log.error("账号不存在异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/AddressBookBusinessException.java b/sky-common/src/main/java/com/sky/common/exception/AddressBookBusinessException.java new file mode 100644 index 0000000..04b1196 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/AddressBookBusinessException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 地址信息异常 + */ +@Slf4j +public class AddressBookBusinessException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public AddressBookBusinessException() { + } + + public AddressBookBusinessException(String message) { + super(message); + log.error("账号不存在异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/BaseException.java b/sky-common/src/main/java/com/sky/common/exception/BaseException.java new file mode 100644 index 0000000..394926b --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/BaseException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 业务异常 + */ +@Slf4j +public class BaseException extends RuntimeException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public BaseException() { + } + + public BaseException(String message) { + super(message); + log.error("业务异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/DeletionNotAllowedException.java b/sky-common/src/main/java/com/sky/common/exception/DeletionNotAllowedException.java new file mode 100644 index 0000000..607203f --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/DeletionNotAllowedException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 不允许删除异常 + */ +@Slf4j +public class DeletionNotAllowedException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public DeletionNotAllowedException() { + } + + public DeletionNotAllowedException(String message) { + super(message); + log.error("不允许删除异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/LoginFailedException.java b/sky-common/src/main/java/com/sky/common/exception/LoginFailedException.java new file mode 100644 index 0000000..2cab24d --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/LoginFailedException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 登录失败 + */ +@Slf4j +public class LoginFailedException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public LoginFailedException() { + } + + public LoginFailedException(String message) { + super(message); + log.error("登录失败:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/OrderBusinessException.java b/sky-common/src/main/java/com/sky/common/exception/OrderBusinessException.java new file mode 100644 index 0000000..43ad297 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/OrderBusinessException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 订单业务异常 + */ +@Slf4j +public class OrderBusinessException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public OrderBusinessException() { + } + + public OrderBusinessException(String message) { + super(message); + log.error("订单业务异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/PasswordEditFailedException.java b/sky-common/src/main/java/com/sky/common/exception/PasswordEditFailedException.java new file mode 100644 index 0000000..1cf76f9 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/PasswordEditFailedException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 密码修改失败异常 + */ +@Slf4j +public class PasswordEditFailedException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public PasswordEditFailedException() { + } + + public PasswordEditFailedException(String message) { + super(message); + log.error("密码修改失败异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/PasswordErrorException.java b/sky-common/src/main/java/com/sky/common/exception/PasswordErrorException.java new file mode 100644 index 0000000..a87e72c --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/PasswordErrorException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 密码错误异常 + */ +@Slf4j +public class PasswordErrorException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public PasswordErrorException() { + } + + public PasswordErrorException(String message) { + super(message); + log.error("密码错误异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/RestTemplateException.java b/sky-common/src/main/java/com/sky/common/exception/RestTemplateException.java new file mode 100644 index 0000000..fe574d9 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/RestTemplateException.java @@ -0,0 +1,17 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * RestTemplateException异常 + */ +@Slf4j +public class RestTemplateException extends BaseException { + public RestTemplateException() { + } + + public RestTemplateException(String message) { + super(message); + log.error("RestTemplateException异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/SetMealEnableFailedException.java b/sky-common/src/main/java/com/sky/common/exception/SetMealEnableFailedException.java new file mode 100644 index 0000000..4ad6f3b --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/SetMealEnableFailedException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 套餐启用失败异常 + */ +@Slf4j +public class SetMealEnableFailedException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public SetMealEnableFailedException() { + } + + public SetMealEnableFailedException(String message) { + super(message); + log.error("套餐启用失败异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/ShoppingCartBusinessException.java b/sky-common/src/main/java/com/sky/common/exception/ShoppingCartBusinessException.java new file mode 100644 index 0000000..9ee4d4c --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/ShoppingCartBusinessException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 购物车异常 + */ +@Slf4j +public class ShoppingCartBusinessException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public ShoppingCartBusinessException() { + } + + public ShoppingCartBusinessException(String message) { + super(message); + log.error("购物车异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/exception/UserNotLoginException.java b/sky-common/src/main/java/com/sky/common/exception/UserNotLoginException.java new file mode 100644 index 0000000..99d5d4a --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/exception/UserNotLoginException.java @@ -0,0 +1,22 @@ +package com.sky.common.exception; + +import lombok.extern.slf4j.Slf4j; + +/** + * 用户未登录异常 + */ +@Slf4j +public class UserNotLoginException extends BaseException { + /** + * Constructs a new runtime exception with {@code null} as its + * detail message. The cause is not initialized, and may subsequently be + * initialized by a call to {@link #initCause}. + */ + public UserNotLoginException() { + } + + public UserNotLoginException(String message) { + super(message); + log.error("用户未登录异常:{}", message); + } +} diff --git a/sky-common/src/main/java/com/sky/common/properties/JwtProperties.java b/sky-common/src/main/java/com/sky/common/properties/JwtProperties.java new file mode 100644 index 0000000..00936eb --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/properties/JwtProperties.java @@ -0,0 +1,24 @@ +package com.sky.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "sky.jwt") +@Data +public class JwtProperties { + /** + * 管理端员工生成jwt令牌相关配置 + */ + private String adminSecretKey; + private long adminTtl; + private String adminTokenName; + + /** + * 用户端微信用户生成jwt令牌相关配置 + */ + private String userSecretKey; + private long userTtl; + private String userTokenName; +} diff --git a/sky-common/src/main/java/com/sky/common/properties/MinioProperties.java b/sky-common/src/main/java/com/sky/common/properties/MinioProperties.java new file mode 100644 index 0000000..e473985 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/properties/MinioProperties.java @@ -0,0 +1,22 @@ +package com.sky.common.properties; + +import io.minio.MinioClient; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "sky.minio") +@Data +public class MinioProperties { + private String endpointUrl; + private String accessKey; + private String secretKey; + private String bucketName; + + @Bean + public MinioClient minioClient() { + return MinioClient.builder().endpoint(endpointUrl).credentials(accessKey, secretKey).build(); + } +} diff --git a/sky-common/src/main/java/com/sky/common/properties/WeChatProperties.java b/sky-common/src/main/java/com/sky/common/properties/WeChatProperties.java new file mode 100644 index 0000000..64094c3 --- /dev/null +++ b/sky-common/src/main/java/com/sky/common/properties/WeChatProperties.java @@ -0,0 +1,20 @@ +package com.sky.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "sky.wechat") +@Data +public class WeChatProperties { + private String appid; // 小程序的appid + private String secret; // 小程序的秘钥 + private String mchid; // 商户号 + private String mchSerialNo; // 商户API证书的证书序列号 + private String privateKeyFilePath; // 商户私钥文件 + private String apiV3Key; // 证书解密的密钥 + private String weChatPayCertFilePath; // 平台证书 + private String notifyUrl; // 支付成功的回调地址 + private String refundNotifyUrl; // 退款成功的回调地址 +} diff --git a/sky-pojo/pom.xml b/sky-pojo/pom.xml new file mode 100644 index 0000000..2df6dcc --- /dev/null +++ b/sky-pojo/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + + com.sky + dev-sky-serve-v1 + 1.0-SNAPSHOT + + + sky-pojo + jar + + sky-pojo + http://maven.apache.org + + + UTF-8 + + + + + org.projectlombok + lombok + + + diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/CategoryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/CategoryDTO.java new file mode 100644 index 0000000..b151960 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/CategoryDTO.java @@ -0,0 +1,21 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CategoryDTO implements Serializable { + // 主键 + private Long id; + // 类型 1 菜品分类 2 套餐分类 + private Integer type; + // 分类名称 + private String name; + // 排序 + private Integer sort; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/CategoryPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/CategoryPageQueryDTO.java new file mode 100644 index 0000000..8bbdccd --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/CategoryPageQueryDTO.java @@ -0,0 +1,21 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CategoryPageQueryDTO implements Serializable { + // 页码 + private int page; + // 每页记录数 + private int pageSize; + // 分类名称 + private String name; + // 分类类型 1菜品分类 2套餐分类 + private Integer type; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/DataOverViewQueryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/DataOverViewQueryDTO.java new file mode 100644 index 0000000..cd0699f --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/DataOverViewQueryDTO.java @@ -0,0 +1,18 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DataOverViewQueryDTO implements Serializable { + private LocalDateTime begin; + private LocalDateTime end; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/DishDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/DishDTO.java new file mode 100644 index 0000000..206a247 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/DishDTO.java @@ -0,0 +1,32 @@ +package com.sky.pojo.dto; + +import com.sky.pojo.entity.DishFlavor; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DishDTO implements Serializable { + private Long id; + // 菜品名称 + private String name; + // 菜品分类id + private Long categoryId; + // 菜品价格 + private BigDecimal price; + // 图片 + private String image; + // 描述信息 + private String description; + // 0 停售 1 起售 + private Integer status; + // 口味 + private List flavors = new ArrayList<>(); +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/DishPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/DishPageQueryDTO.java new file mode 100644 index 0000000..bd16409 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/DishPageQueryDTO.java @@ -0,0 +1,20 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DishPageQueryDTO implements Serializable { + private int page; + private int pageSize; + private String name; + // 分类id + private Integer categoryId; + // 状态 0表示禁用 1表示启用 + private Integer status; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeDTO.java new file mode 100644 index 0000000..b9eee9f --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeDTO.java @@ -0,0 +1,19 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EmployeeDTO implements Serializable { + private Long id; + private String username; + private String name; + private String phone; + private String sex; + private String idNumber; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeLoginDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeLoginDTO.java new file mode 100644 index 0000000..2a4883a --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeeLoginDTO.java @@ -0,0 +1,22 @@ +package com.sky.pojo.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "员工登录时传递的数据模型") +public class EmployeeLoginDTO implements Serializable { + + @ApiModelProperty("用户名") + private String username; + + @ApiModelProperty("密码") + private String password; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeePageQueryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeePageQueryDTO.java new file mode 100644 index 0000000..b552e08 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/EmployeePageQueryDTO.java @@ -0,0 +1,19 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EmployeePageQueryDTO implements Serializable { + // 员工姓名 + private String name; + // 页码 + private int page; + // 每页显示记录数 + private int pageSize; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/GoodsSalesDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/GoodsSalesDTO.java new file mode 100644 index 0000000..6dfc767 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/GoodsSalesDTO.java @@ -0,0 +1,20 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class GoodsSalesDTO implements Serializable { + //商品名称 + private String name; + + //销量 + private Integer number; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersCancelDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersCancelDTO.java new file mode 100644 index 0000000..75bced4 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersCancelDTO.java @@ -0,0 +1,16 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrdersCancelDTO implements Serializable { + private Long id; + // 订单取消原因 + private String cancelReason; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersConfirmDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersConfirmDTO.java new file mode 100644 index 0000000..4201aae --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersConfirmDTO.java @@ -0,0 +1,16 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrdersConfirmDTO implements Serializable { + private Long id; + // 订单状态 1待付款 2待接单 3 已接单 4 派送中 5 已完成 6 已取消 7 退款 + private Integer status; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersDTO.java new file mode 100644 index 0000000..f23198d --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersDTO.java @@ -0,0 +1,45 @@ +package com.sky.pojo.dto; + +import com.sky.pojo.entity.OrderDetail; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrdersDTO implements Serializable { + private Long id; + // 订单号 + private String number; + // 订单状态 1待付款,2待派送,3已派送,4已完成,5已取消 + private Integer status; + // 下单用户id + private Long userId; + // 地址id + private Long addressBookId; + // 下单时间 + private LocalDateTime orderTime; + // 结账时间 + private LocalDateTime checkoutTime; + // 支付方式 1微信,2支付宝 + private Integer payMethod; + // 实收金额 + private BigDecimal amount; + // 备注 + private String remark; + // 用户名 + private String userName; + // 手机号 + private String phone; + // 地址 + private String address; + // 收货人 + private String consignee; + private List orderDetails; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPageQueryDTO.java new file mode 100644 index 0000000..9216492 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPageQueryDTO.java @@ -0,0 +1,25 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrdersPageQueryDTO implements Serializable { + private int page; + private int pageSize; + private String number; + private String phone; + private Integer status; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime beginTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + private Long userId; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPaymentDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPaymentDTO.java new file mode 100644 index 0000000..2f38b60 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersPaymentDTO.java @@ -0,0 +1,17 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrdersPaymentDTO implements Serializable { + // 订单号 + private String orderNumber; + // 付款方式 + private Integer payMethod; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersRejectionDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersRejectionDTO.java new file mode 100644 index 0000000..2583a3f --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersRejectionDTO.java @@ -0,0 +1,16 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrdersRejectionDTO implements Serializable { + private Long id; + // 订单拒绝原因 + private String rejectionReason; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersSubmitDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersSubmitDTO.java new file mode 100644 index 0000000..5650bcc --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/OrdersSubmitDTO.java @@ -0,0 +1,35 @@ +package com.sky.pojo.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrdersSubmitDTO implements Serializable { + // 地址簿id + private Long addressBookId; + // 付款方式 + private int payMethod; + // 备注 + private String remark; + // 预计送达时间 + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime estimatedDeliveryTime; + // 配送状态 1立即送出 0选择具体时间 + private Integer deliveryStatus; + // 餐具数量 + private Integer tablewareNumber; + // 餐具数量状态 1按餐量提供 0选择具体数量 + private Integer tablewareStatus; + // 打包费 + private Integer packAmount; + // 总金额 + private BigDecimal amount; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/PasswordEditDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/PasswordEditDTO.java new file mode 100644 index 0000000..881de50 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/PasswordEditDTO.java @@ -0,0 +1,19 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PasswordEditDTO implements Serializable { + // 员工id + private Long empId; + // 旧密码 + private String oldPassword; + // 新密码 + private String newPassword; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/SetmealDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/SetmealDTO.java new file mode 100644 index 0000000..691b2fc --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/SetmealDTO.java @@ -0,0 +1,32 @@ +package com.sky.pojo.dto; + +import com.sky.pojo.entity.SetmealDish; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SetmealDTO implements Serializable { + private Long id; + // 分类id + private Long categoryId; + // 套餐名称 + private String name; + // 套餐价格 + private BigDecimal price; + // 状态 0:停用 1:启用 + private Integer status; + // 描述信息 + private String description; + // 图片 + private String image; + // 套餐菜品关系 + private List setmealDishes = new ArrayList<>(); +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/SetmealPageQueryDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/SetmealPageQueryDTO.java new file mode 100644 index 0000000..251de9a --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/SetmealPageQueryDTO.java @@ -0,0 +1,20 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SetmealPageQueryDTO implements Serializable { + private int page; + private int pageSize; + private String name; + // 分类id + private Integer categoryId; + // 状态 0表示禁用 1表示启用 + private Integer status; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/ShoppingCartDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/ShoppingCartDTO.java new file mode 100644 index 0000000..2052410 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/ShoppingCartDTO.java @@ -0,0 +1,16 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ShoppingCartDTO implements Serializable { + private Long dishId; + private Long setmealId; + private String dishFlavor; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/dto/UserLoginDTO.java b/sky-pojo/src/main/java/com/sky/pojo/dto/UserLoginDTO.java new file mode 100644 index 0000000..0991186 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/dto/UserLoginDTO.java @@ -0,0 +1,17 @@ +package com.sky.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * C端用户登录 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserLoginDTO implements Serializable { + private String code; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/AddressBook.java b/sky-pojo/src/main/java/com/sky/pojo/entity/AddressBook.java new file mode 100644 index 0000000..74f7094 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/AddressBook.java @@ -0,0 +1,61 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 地址簿 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AddressBook implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //用户id + private Long userId; + + //收货人 + private String consignee; + + //手机号 + private String phone; + + //性别 0 女 1 男 + private String sex; + + //省级区划编号 + private String provinceCode; + + //省级名称 + private String provinceName; + + //市级区划编号 + private String cityCode; + + //市级名称 + private String cityName; + + //区级区划编号 + private String districtCode; + + //区级名称 + private String districtName; + + //详细地址 + private String detail; + + //标签 + private String label; + + //是否默认 0否 1是 + private Integer isDefault; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/BaiduMap.java b/sky-pojo/src/main/java/com/sky/pojo/entity/BaiduMap.java new file mode 100644 index 0000000..4b52001 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/BaiduMap.java @@ -0,0 +1,10 @@ +package com.sky.pojo.entity; + +import lombok.Data; + +@Data +public class BaiduMap { + private String address; + private String output; + private String ak; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/Category.java b/sky-pojo/src/main/java/com/sky/pojo/entity/Category.java new file mode 100644 index 0000000..9042477 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/Category.java @@ -0,0 +1,44 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Category implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //类型: 1菜品分类 2套餐分类 + private Integer type; + + //分类名称 + private String name; + + //顺序 + private Integer sort; + + //分类状态 0标识禁用 1表示启用 + private Integer status; + + //创建时间 + private LocalDateTime createTime; + + //更新时间 + private LocalDateTime updateTime; + + //创建人 + private Long createUser; + + //修改人 + private Long updateUser; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/CategoryTest.java b/sky-pojo/src/main/java/com/sky/pojo/entity/CategoryTest.java new file mode 100644 index 0000000..2c911f3 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/CategoryTest.java @@ -0,0 +1,43 @@ +package com.sky.pojo.entity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + *

+ * 商品分类 + *

+ * + * @author Bunny + * @since 2024-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(description = "分类实体类") +public class CategoryTest implements Serializable { + + @Schema(description = "分类名称") + private String name; + + @Schema(description = "分类图片url") + private String imageUrl; + + @Schema(description = "父节点id") + private Long parentId; + + @Schema(description = "分类状态: 是否显示[0-不显示,1显示]") + private Integer status; + + @Schema(description = "排序字段") + private Integer orderNum; + + @Schema(description = "是否存在子节点") + private Boolean hasChildren; + + @Schema(description = "子节点List集合") + private List children; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/Dish.java b/sky-pojo/src/main/java/com/sky/pojo/entity/Dish.java new file mode 100644 index 0000000..b7081bf --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/Dish.java @@ -0,0 +1,51 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 菜品 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Dish implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //菜品名称 + private String name; + + //菜品分类id + private Long categoryId; + + //菜品价格 + private BigDecimal price; + + //图片 + private String image; + + //描述信息 + private String description; + + //0 停售 1 起售 + private Integer status; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; + + private Long createUser; + + private Long updateUser; + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/DishFlavor.java b/sky-pojo/src/main/java/com/sky/pojo/entity/DishFlavor.java new file mode 100644 index 0000000..9ebc896 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/DishFlavor.java @@ -0,0 +1,31 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 菜品口味 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishFlavor implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + //菜品id + private Long dishId; + + //口味名称 + private String name; + + //口味数据list + private String value; + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/Employee.java b/sky-pojo/src/main/java/com/sky/pojo/entity/Employee.java new file mode 100644 index 0000000..543cfed --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/Employee.java @@ -0,0 +1,46 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Employee implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + private String username; + + private String name; + + private String password; + + private String phone; + + private String sex; + + private String idNumber; + + private Integer status; + + //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + private Long createUser; + + private Long updateUser; + private String shopAddress; + private String employeeAddress; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/OrderDetail.java b/sky-pojo/src/main/java/com/sky/pojo/entity/OrderDetail.java new file mode 100644 index 0000000..3010356 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/OrderDetail.java @@ -0,0 +1,47 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 订单明细 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //名称 + private String name; + + //订单id + private Long orderId; + + //菜品id + private Long dishId; + + //套餐id + private Long setmealId; + + //口味 + private String dishFlavor; + + //数量 + private Integer number; + + //金额 + private BigDecimal amount; + + //图片 + private String image; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/Orders.java b/sky-pojo/src/main/java/com/sky/pojo/entity/Orders.java new file mode 100644 index 0000000..bc94be2 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/Orders.java @@ -0,0 +1,110 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 订单 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Orders implements Serializable { + + /** + * 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + */ + public static final Integer PENDING_PAYMENT = 1; + public static final Integer TO_BE_CONFIRMED = 2; + public static final Integer CONFIRMED = 3; + public static final Integer DELIVERY_IN_PROGRESS = 4; + public static final Integer COMPLETED = 5; + public static final Integer CANCELLED = 6; + + /** + * 支付状态 0未支付 1已支付 2退款 + */ + public static final Integer UN_PAID = 0; + public static final Integer PAID = 1; + public static final Integer REFUND = 2; + + private static final long serialVersionUID = 1L; + + private Long id; + + //订单号 + private String number; + + //订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款 + private Integer status; + + //下单用户id + private Long userId; + + //地址id + private Long addressBookId; + + //下单时间 + private LocalDateTime orderTime; + + //结账时间 + private LocalDateTime checkoutTime; + + //支付方式 1微信,2支付宝 + private Integer payMethod; + + //支付状态 0未支付 1已支付 2退款 + private Integer payStatus; + + //实收金额 + private BigDecimal amount; + + //备注 + private String remark; + + //用户名 + private String userName; + + //手机号 + private String phone; + + //地址 + private String address; + + //收货人 + private String consignee; + + //订单取消原因 + private String cancelReason; + + //订单拒绝原因 + private String rejectionReason; + + //订单取消时间 + private LocalDateTime cancelTime; + + //预计送达时间 + private LocalDateTime estimatedDeliveryTime; + + //配送状态 1立即送出 0选择具体时间 + private Integer deliveryStatus; + + //送达时间 + private LocalDateTime deliveryTime; + + //打包费 + private int packAmount; + + //餐具数量 + private int tablewareNumber; + + //餐具数量状态 1按餐量提供 0选择具体数量 + private Integer tablewareStatus; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/Setmeal.java b/sky-pojo/src/main/java/com/sky/pojo/entity/Setmeal.java new file mode 100644 index 0000000..f8a3fd9 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/Setmeal.java @@ -0,0 +1,50 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 套餐 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Setmeal implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //分类id + private Long categoryId; + + //套餐名称 + private String name; + + //套餐价格 + private BigDecimal price; + + //状态 0:停用 1:启用 + private Integer status; + + //描述信息 + private String description; + + //图片 + private String image; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; + + private Long createUser; + + private Long updateUser; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/SetmealDish.java b/sky-pojo/src/main/java/com/sky/pojo/entity/SetmealDish.java new file mode 100644 index 0000000..966b1ee --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/SetmealDish.java @@ -0,0 +1,38 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 套餐菜品关系 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SetmealDish implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //套餐id + private Long setmealId; + + //菜品id + private Long dishId; + + //菜品名称 (冗余字段) + private String name; + + //菜品原价 + private BigDecimal price; + + //份数 + private Integer copies; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/ShoppingCart.java b/sky-pojo/src/main/java/com/sky/pojo/entity/ShoppingCart.java new file mode 100644 index 0000000..8772f51 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/ShoppingCart.java @@ -0,0 +1,50 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 购物车 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShoppingCart implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //名称 + private String name; + + //用户id + private Long userId; + + //菜品id + private Long dishId; + + //套餐id + private Long setmealId; + + //口味 + private String dishFlavor; + + //数量 + private Integer number; + + //金额 + private BigDecimal amount; + + //图片 + private String image; + + private LocalDateTime createTime; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/entity/User.java b/sky-pojo/src/main/java/com/sky/pojo/entity/User.java new file mode 100644 index 0000000..c520420 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/entity/User.java @@ -0,0 +1,41 @@ +package com.sky.pojo.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + //微信用户唯一标识 + private String openid; + + //姓名 + private String name; + + //手机号 + private String phone; + + //性别 0 女 1 男 + private String sex; + + //身份证号 + private String idNumber; + + //头像 + private String avatar; + + //注册时间 + private LocalDateTime createTime; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/BusinessDataVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/BusinessDataVO.java new file mode 100644 index 0000000..d8716ec --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/BusinessDataVO.java @@ -0,0 +1,29 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 数据概览 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusinessDataVO implements Serializable { + + private Double turnover;//营业额 + + private Integer validOrderCount;//有效订单数 + + private Double orderCompletionRate;//订单完成率 + + private Double unitPrice;//平均客单价 + + private Integer newUsers;//新增用户数 + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/DishItemVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/DishItemVO.java new file mode 100644 index 0000000..6d5adb3 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/DishItemVO.java @@ -0,0 +1,27 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishItemVO implements Serializable { + + //菜品名称 + private String name; + + //份数 + private Integer copies; + + //菜品图片 + private String image; + + //菜品描述 + private String description; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/DishOverViewVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/DishOverViewVO.java new file mode 100644 index 0000000..024cc7f --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/DishOverViewVO.java @@ -0,0 +1,23 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 菜品总览 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishOverViewVO implements Serializable { + // 已启售数量 + private Integer sold; + + // 已停售数量 + private Integer discontinued; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/DishVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/DishVO.java new file mode 100644 index 0000000..f729102 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/DishVO.java @@ -0,0 +1,42 @@ +package com.sky.pojo.vo; + +import com.sky.pojo.entity.DishFlavor; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DishVO implements Serializable { + + private Long id; + //菜品名称 + private String name; + //菜品分类id + private Long categoryId; + //菜品价格 + private BigDecimal price; + //图片 + private String image; + //描述信息 + private String description; + //0 停售 1 起售 + private Integer status; + //更新时间 + private LocalDateTime updateTime; + //分类名称 + private String categoryName; + //菜品关联的口味 + private List flavors = new ArrayList<>(); + + //private Integer copies; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/EmployeeLoginVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/EmployeeLoginVO.java new file mode 100644 index 0000000..63c8eb0 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/EmployeeLoginVO.java @@ -0,0 +1,31 @@ +package com.sky.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(description = "员工登录返回的数据格式") +public class EmployeeLoginVO implements Serializable { + + @ApiModelProperty("主键值") + private Long id; + + @ApiModelProperty("用户名") + private String userName; + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("jwt令牌") + private String token; + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/OrderOverViewVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderOverViewVO.java new file mode 100644 index 0000000..48dd971 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderOverViewVO.java @@ -0,0 +1,32 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 订单概览数据 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderOverViewVO implements Serializable { + //待接单数量 + private Integer waitingOrders; + + //待派送数量 + private Integer deliveredOrders; + + //已完成数量 + private Integer completedOrders; + + //已取消数量 + private Integer cancelledOrders; + + //全部订单 + private Integer allOrders; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/OrderPaymentVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderPaymentVO.java new file mode 100644 index 0000000..6e2fbd0 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderPaymentVO.java @@ -0,0 +1,22 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderPaymentVO implements Serializable { + + private String nonceStr; //随机字符串 + private String paySign; //签名 + private String timeStamp; //时间戳 + private String signType; //签名算法 + private String packageStr; //统一下单接口返回的 prepay_id 参数值 + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/OrderReportVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderReportVO.java new file mode 100644 index 0000000..65142fd --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderReportVO.java @@ -0,0 +1,34 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderReportVO implements Serializable { + + //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 + private String dateList; + + //每日订单数,以逗号分隔,例如:260,210,215 + private String orderCountList; + + //每日有效订单数,以逗号分隔,例如:20,21,10 + private String validOrderCountList; + + //订单总数 + private Integer totalOrderCount; + + //有效订单数 + private Integer validOrderCount; + + //订单完成率 + private Double orderCompletionRate; + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/OrderStatisticsVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderStatisticsVO.java new file mode 100644 index 0000000..6420a46 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderStatisticsVO.java @@ -0,0 +1,17 @@ +package com.sky.pojo.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class OrderStatisticsVO implements Serializable { + //待接单数量 + private Integer toBeConfirmed; + + //待派送数量 + private Integer confirmed; + + //派送中数量 + private Integer deliveryInProgress; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/OrderSubmitVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderSubmitVO.java new file mode 100644 index 0000000..296cfda --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderSubmitVO.java @@ -0,0 +1,25 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderSubmitVO implements Serializable { + //订单id + private Long id; + //订单号 + private String orderNumber; + //订单金额 + private BigDecimal orderAmount; + //下单时间 + private LocalDateTime orderTime; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/OrderVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderVO.java new file mode 100644 index 0000000..37d06d2 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/OrderVO.java @@ -0,0 +1,21 @@ +package com.sky.pojo.vo; + +import com.sky.pojo.entity.OrderDetail; +import com.sky.pojo.entity.Orders; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrderVO extends Orders implements Serializable { + // 订单菜品信息 + private String orderDishes; + + // 订单详情 + private List orderDetailList; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/SalesTop10ReportVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/SalesTop10ReportVO.java new file mode 100644 index 0000000..d583677 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/SalesTop10ReportVO.java @@ -0,0 +1,22 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalesTop10ReportVO implements Serializable { + + //商品名称列表,以逗号分隔,例如:鱼香肉丝,宫保鸡丁,水煮鱼 + private String nameList; + + //销量列表,以逗号分隔,例如:260,215,200 + private String numberList; + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/SetmealOverViewVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/SetmealOverViewVO.java new file mode 100644 index 0000000..8a1a05b --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/SetmealOverViewVO.java @@ -0,0 +1,23 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 套餐总览 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SetmealOverViewVO implements Serializable { + // 已启售数量 + private Integer sold; + + // 已停售数量 + private Integer discontinued; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/SetmealVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/SetmealVO.java new file mode 100644 index 0000000..26da1f4 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/SetmealVO.java @@ -0,0 +1,49 @@ +package com.sky.pojo.vo; + +import com.sky.pojo.entity.SetmealDish; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SetmealVO implements Serializable { + + private Long id; + + //分类id + private Long categoryId; + + //套餐名称 + private String name; + + //套餐价格 + private BigDecimal price; + + //状态 0:停用 1:启用 + private Integer status; + + //描述信息 + private String description; + + //图片 + private String image; + + //更新时间 + private LocalDateTime updateTime; + + //分类名称 + private String categoryName; + + //套餐和菜品的关联关系 + private List setmealDishes = new ArrayList<>(); +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/TurnoverReportVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/TurnoverReportVO.java new file mode 100644 index 0000000..aa82bab --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/TurnoverReportVO.java @@ -0,0 +1,20 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TurnoverReportVO implements Serializable { + // 日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 + private String dateList; + + // 营业额,以逗号分隔,例如:406.0,1520.0,75.0 + private String turnoverList; +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/UserLoginVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/UserLoginVO.java new file mode 100644 index 0000000..098bf6c --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/UserLoginVO.java @@ -0,0 +1,20 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserLoginVO implements Serializable { + + private Long id; + private String openid; + private String token; + +} diff --git a/sky-pojo/src/main/java/com/sky/pojo/vo/UserReportVO.java b/sky-pojo/src/main/java/com/sky/pojo/vo/UserReportVO.java new file mode 100644 index 0000000..7da27d4 --- /dev/null +++ b/sky-pojo/src/main/java/com/sky/pojo/vo/UserReportVO.java @@ -0,0 +1,25 @@ +package com.sky.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserReportVO implements Serializable { + + //日期,以逗号分隔,例如:2022-10-01,2022-10-02,2022-10-03 + private String dateList; + + //用户总量,以逗号分隔,例如:200,210,220 + private String totalUserList; + + //新增用户,以逗号分隔,例如:20,21,10 + private String newUserList; + +} diff --git a/sky-server/Dockerfile b/sky-server/Dockerfile new file mode 100644 index 0000000..421b7e4 --- /dev/null +++ b/sky-server/Dockerfile @@ -0,0 +1,20 @@ +FROM openjdk:18 + +#系统编码 +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 + +# 设置时区,构建镜像时执行的命令 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo "Asia/Shanghai" > /etc/timezone + +# 设定工作目录 +WORKDIR /home/bunny + +# 复制jar包 +COPY target/sky-server-1.0-SNAPSHOT.jar /home/bunny/app.jar + +#启动容器时的进程 +ENTRYPOINT ["java","-jar","/home/bunny/app.jar"] + +#暴露 8080 端口 +EXPOSE 8080 \ No newline at end of file diff --git a/sky-server/pom.xml b/sky-server/pom.xml new file mode 100644 index 0000000..e8eda8a --- /dev/null +++ b/sky-server/pom.xml @@ -0,0 +1,152 @@ + + 4.0.0 + + com.sky + dev-sky-serve-v1 + 1.0-SNAPSHOT + + + sky-server + jar + + sky-server + http://maven.apache.org + + + UTF-8 + + + + + com.sky + sky-common + 1.0-SNAPSHOT + + + com.sky + sky-pojo + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-web + compile + + + + mysql + mysql-connector-java + runtime + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + + + + com.alibaba + druid-spring-boot-starter + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + org.aspectj + aspectjrt + + + + org.aspectj + aspectjweaver + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-websocket + + + + javax.xml.bind + jaxb-api + + + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + + io.minio + minio + + + junit + junit + 4.13.1 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 15 + 15 + + + + + diff --git a/sky-server/src/main/java/com/sky/SkyApplication.java b/sky-server/src/main/java/com/sky/SkyApplication.java new file mode 100644 index 0000000..bd4c639 --- /dev/null +++ b/sky-server/src/main/java/com/sky/SkyApplication.java @@ -0,0 +1,19 @@ +package com.sky; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement // 开启注解方式的事务管理 +@EnableCaching// 开启缓存注解 +@EnableScheduling +@Slf4j +public class SkyApplication { + public static void main(String[] args) { + SpringApplication.run(SkyApplication.class); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/CategoryController.java b/sky-server/src/main/java/com/sky/controller/admin/CategoryController.java new file mode 100644 index 0000000..99d7033 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/CategoryController.java @@ -0,0 +1,74 @@ +package com.sky.controller.admin; + + +import com.sky.common.result.PageResult; +import com.sky.common.result.Result; +import com.sky.pojo.dto.CategoryDTO; +import com.sky.pojo.dto.CategoryPageQueryDTO; +import com.sky.pojo.entity.Category; +import com.sky.service.CategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 分类管理 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/category") +@Api(tags = "分类相关接口") +@Slf4j +public class CategoryController { + private final CategoryService categoryService; + + @PostMapping + @ApiOperation("新增分类") + public Result save(@RequestBody CategoryDTO categoryDTO) { + log.info("新增分类:{}", categoryDTO); + categoryService.save(categoryDTO); + return Result.success(); + } + + @GetMapping("/page") + @ApiOperation("分类分页查询") + public Result> page(CategoryPageQueryDTO categoryPageQueryDTO) { + log.info("分页查询:{}", categoryPageQueryDTO); + PageResult pageResult = categoryService.pageQuery(categoryPageQueryDTO); + return Result.success(pageResult); + } + + @DeleteMapping + @ApiOperation("删除分类") + public Result deleteById(Long id) { + log.info("删除分类:{}", id); + categoryService.deleteById(id); + return Result.success(); + } + + @PutMapping + @ApiOperation("修改分类") + public Result update(@RequestBody CategoryDTO categoryDTO) { + categoryService.update(categoryDTO); + return Result.success(); + } + + @PostMapping("/status/{status}") + @ApiOperation("启用禁用分类") + public Result startOrStop(@PathVariable("status") Integer status, Long id) { + categoryService.startOrStop(status, id); + return Result.success(); + } + + @GetMapping("/list") + @ApiOperation("根据类型查询分类") + public Result> list(Integer type) { + List list = categoryService.list(type); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/CommonController.java b/sky-server/src/main/java/com/sky/controller/admin/CommonController.java new file mode 100644 index 0000000..39d3c47 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/CommonController.java @@ -0,0 +1,38 @@ +package com.sky.controller.admin; + + +import com.sky.common.constant.MessageConstant; +import com.sky.common.result.Result; +import com.sky.service.MinioService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/common") +@Api(tags = "通用接口") +@Slf4j +public class CommonController { + private final MinioService minioService; + + @ApiOperation(value = "文件上传") + @PostMapping("/upload") + public Result upload(MultipartFile file) { + log.info("文件上传:{}", file); + try { + String filename = minioService.upload(file); + return Result.success(filename); + } catch (IOException e) { + log.info("文件上传失败"); + return Result.error(MessageConstant.UPLOAD_FAILED); + } + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/DishController.java b/sky-server/src/main/java/com/sky/controller/admin/DishController.java new file mode 100644 index 0000000..cf7c994 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/DishController.java @@ -0,0 +1,91 @@ +package com.sky.controller.admin; + + +import com.sky.common.result.PageResult; +import com.sky.common.result.Result; +import com.sky.common.utils.RedisUtil; +import com.sky.pojo.dto.DishDTO; +import com.sky.pojo.dto.DishPageQueryDTO; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.vo.DishVO; +import com.sky.service.DishService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/dish") +@Api(tags = "菜品相关接口") +@Slf4j +public class DishController { + private final DishService dishService; + + @PostMapping + @ApiOperation("新增菜品") + public Result save(@RequestBody DishDTO dishDTO) { + log.info("新增菜品:{}", dishDTO); + // 删除redis中缓存 + RedisUtil.cleanCache("dish_" + dishDTO.getCategoryId()); + dishService.saveWithFlavor(dishDTO); + return Result.success(); + } + + @GetMapping("/page") + @ApiOperation("菜品分页查询") + public Result> page(DishPageQueryDTO dishPageQueryDTO) { + log.info("菜品分页查询:{}", dishPageQueryDTO); + PageResult pageResult = dishService.pageQuery(dishPageQueryDTO); + return Result.success(pageResult); + } + + @DeleteMapping + @ApiOperation("菜品批量删除") + public Result delete(@RequestParam List ids) { + log.info("菜品批量删除:{}", ids); + dishService.deleteBatch(ids); + // 将菜品数据删除 + RedisUtil.cleanCache("dish_*"); + return Result.success(); + } + + @GetMapping("/{id}") + @ApiOperation("根据id查询菜品和对应的口味数据") + public Result getById(@PathVariable Long id) { + log.info("根据id查询菜品和对应的口味数据:{}", id); + DishVO dishVO = dishService.getById(id); + return Result.success(dishVO); + } + + @PutMapping + @ApiOperation("修改菜品") + public Result update(@RequestBody DishDTO dto) { + log.info("修改菜品:{}", dto); + dishService.updateWithFlavor(dto); + // 将菜品数据删除 + RedisUtil.cleanCache("dish_*"); + return Result.success(); + } + + @PostMapping("status/{status}") + @ApiOperation("菜品起售、停售") + public Result status(@PathVariable Integer status, Long id) { + log.info("菜品起售、停售:{},菜品id:{}", status, id); + dishService.updateWithStatus(status, id); + // 将菜品数据删除 + RedisUtil.cleanCache("dish_*"); + return Result.success(); + } + + @GetMapping("list") + @ApiOperation("根据分类id查询菜品") + public Result> list(Long categoryId) { + log.info("根据分类id查询菜品:{}", categoryId); + List dishVOList = dishService.getByCategoryId(categoryId); + return Result.success(dishVOList); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java b/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java new file mode 100644 index 0000000..1cdecb3 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/EmployeeController.java @@ -0,0 +1,112 @@ +package com.sky.controller.admin; + +import com.sky.common.constant.JwtClaimsConstant; +import com.sky.common.properties.JwtProperties; +import com.sky.common.result.PageResult; +import com.sky.common.result.Result; +import com.sky.common.utils.JwtUtil; +import com.sky.pojo.dto.EmployeeDTO; +import com.sky.pojo.dto.EmployeeLoginDTO; +import com.sky.pojo.dto.EmployeePageQueryDTO; +import com.sky.pojo.dto.PasswordEditDTO; +import com.sky.pojo.entity.Employee; +import com.sky.pojo.vo.EmployeeLoginVO; +import com.sky.service.EmployeeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 员工管理 + */ +@RestController +@RequestMapping("/admin/employee") +@Slf4j +@Api(tags = "员工相关接口") +public class EmployeeController { + + @Autowired + private EmployeeService employeeService; + @Autowired + private JwtProperties jwtProperties; + + @PostMapping("/login") + @ApiOperation(value = "登录接口") + public Result login(@RequestBody EmployeeLoginDTO employeeLoginDTO) { + log.info("员工登录:{}", employeeLoginDTO); + + Employee employee = employeeService.login(employeeLoginDTO); + + // 登录成功后,生成jwt令牌 + Map claims = new HashMap<>(); + claims.put(JwtClaimsConstant.EMP_ID, employee.getId()); + String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(), jwtProperties.getAdminTtl(), claims); + + EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder() + .id(employee.getId()) + .userName(employee.getUsername()) + .name(employee.getName()) + .token(token).build(); + + return Result.success(employeeLoginVO); + } + + @PostMapping("/logout") + @ApiOperation(value = "退出登录") + public Result logout() { + log.info("退出登录"); + return Result.success(); + } + + @PostMapping("") + @ApiOperation("新增员工") + public Result save(@RequestBody EmployeeDTO employeeDTO) { + log.info("新增员工:{}", employeeDTO); + employeeService.save(employeeDTO); + return Result.success(); + } + + @GetMapping("/page") + @ApiOperation("员工分页查询") + public Result page(EmployeePageQueryDTO employeePageQueryDTO) { + log.info("员工分页查询,参数:{}", employeePageQueryDTO); + PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); + return Result.success(pageResult); + } + + @PostMapping("/status/{status}") + @ApiOperation("启用禁用员工账号") + public Result startOrStop(@PathVariable Integer status, Long id) { + log.info("启用禁用员工账号:{},{}", status, id); + employeeService.startOrStop(status, id); + return Result.success(); + } + + @GetMapping("/{id}") + @ApiOperation("根据id查询员工信息") + public Result getById(@PathVariable Long id) { + Employee employee = employeeService.getById(id); + return Result.success(employee); + } + + @PutMapping + @ApiOperation("编辑员工信息") + public Result update(@RequestBody EmployeeDTO employeeDTO) { + log.info("编辑员工信息:{}", employeeDTO); + employeeService.update(employeeDTO); + return Result.success(); + } + + @PutMapping("editPassword") + @ApiOperation("修改密码") + public Result editPassword(@RequestBody PasswordEditDTO passwordEditDTO) { + log.info("修改密码:{}", passwordEditDTO); + employeeService.editPassword(passwordEditDTO); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/OrderController.java b/sky-server/src/main/java/com/sky/controller/admin/OrderController.java new file mode 100644 index 0000000..db31b74 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/OrderController.java @@ -0,0 +1,84 @@ +package com.sky.controller.admin; + +import com.sky.common.result.PageResult; +import com.sky.common.result.Result; +import com.sky.pojo.dto.OrdersCancelDTO; +import com.sky.pojo.dto.OrdersConfirmDTO; +import com.sky.pojo.dto.OrdersPageQueryDTO; +import com.sky.pojo.dto.OrdersRejectionDTO; +import com.sky.pojo.vo.OrderStatisticsVO; +import com.sky.pojo.vo.OrderVO; +import com.sky.service.OrderService; +import com.sky.service.utils.CheckOutOfRangeUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController("adminOrderController") +@RequestMapping("/admin/order") +@Slf4j +@Api(tags = "订单管理接口") +public class OrderController { + @Autowired + OrderService orderService; + @Autowired + CheckOutOfRangeUtils checkOutOfRangeUtils; + + @GetMapping("/conditionSearch") + @ApiOperation(value = "订单搜索") + public Result> conditionSearch(OrdersPageQueryDTO dto) { + PageResult pageResult = orderService.conditionSearch(dto); + return Result.success(pageResult); + } + + @GetMapping("/statistics") + @ApiOperation("各个状态的订单数量统计") + public Result statistics() { + OrderStatisticsVO orderStatisticsVO = orderService.statistics(); + return Result.success(orderStatisticsVO); + } + + @GetMapping("/details/{id}") + @ApiOperation("查询订单详情") + public Result details(@PathVariable Long id) { + OrderVO details = orderService.details(id); + return Result.success(details); + } + + @PutMapping("/confirm") + @ApiOperation("接单") + public Result confirm(@RequestBody OrdersConfirmDTO dto) { + orderService.confirm(dto); + return Result.success(); + } + + @PutMapping("/rejection") + @ApiOperation("拒单") + public Result rejection(@RequestBody OrdersRejectionDTO dto) { + orderService.rejection(dto); + return Result.success(); + } + + @PutMapping("/cancel") + @ApiOperation("取消订单") + public Result cancelBusiness(@RequestBody OrdersCancelDTO dto) throws Exception { + orderService.cancelBusiness(dto); + return Result.success(); + } + + @PutMapping("/delivery/{id}") + @ApiOperation("派送订单") + public Result delivery(@PathVariable("id") Long id) { + orderService.delivery(id); + return Result.success(); + } + + @PutMapping("/complete/{id}") + @ApiOperation("完成订单") + public Result complete(@PathVariable("id") Long id) { + orderService.complete(id); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java new file mode 100644 index 0000000..2a57b00 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java @@ -0,0 +1,71 @@ +package com.sky.controller.admin; + +import com.sky.common.result.Result; +import com.sky.pojo.vo.OrderReportVO; +import com.sky.pojo.vo.SalesTop10ReportVO; +import com.sky.pojo.vo.TurnoverReportVO; +import com.sky.pojo.vo.UserReportVO; +import com.sky.service.ReportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDate; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/report") +@Slf4j +@Api(tags = "统计报表相关接口") +public class ReportController { + private final ReportService reportService; + + @GetMapping("/turnoverStatistics") + @ApiOperation(value = "营业额数据统计") + public Result turnoverStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { + log.info("营业额数据统计:开始时间:{},结束时间:{}", begin, end); + TurnoverReportVO turnover = reportService.getTurnover(begin, end); + return Result.success(turnover); + } + + @GetMapping("/userStatistics") + @ApiOperation(value = "用户数据统计") + public Result userStatistics( + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { + log.info("用户数据统计:开始时间:{},结束时间:{}", begin, end); + UserReportVO userStatistics = reportService.getUserStatistics(begin, end); + return Result.success(userStatistics); + } + + @GetMapping("ordersStatistics") + @ApiOperation(value = "订单统计接口") + public Result ordersStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { + log.info("订单统计接口:开始时间:{},结束时间:{}", begin, end); + OrderReportVO orderReportVO = reportService.getOrdersStatistics(begin, end); + return Result.success(orderReportVO); + } + + @GetMapping("top10") + @ApiOperation(value = "查询销量排名top10接口") + public Result top10(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, + @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { + log.info("订单统计接口:开始时间:{},结束时间:{}", begin, end); + SalesTop10ReportVO top10Report = reportService.getTop10Statistics(begin, end); + return Result.success(top10Report); + } + + @GetMapping("export") + @ApiOperation(value = "导出Excel报表接口") + public void export(HttpServletResponse response) { + log.info("导出Excel报表接口"); + reportService.exportBusinessData(response); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/SetMealController.java b/sky-server/src/main/java/com/sky/controller/admin/SetMealController.java new file mode 100644 index 0000000..fd8c380 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/SetMealController.java @@ -0,0 +1,77 @@ +package com.sky.controller.admin; + +import com.sky.common.result.PageResult; +import com.sky.common.result.Result; +import com.sky.pojo.dto.SetmealDTO; +import com.sky.pojo.dto.SetmealPageQueryDTO; +import com.sky.pojo.vo.SetmealVO; +import com.sky.service.SetmealService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/admin/setmeal") +@Slf4j +@Api(tags = "套餐相关接口") +public class SetMealController { + @Autowired + SetmealService setmealService; + + @GetMapping("page") + @ApiOperation("分页查询") + public Result> page(SetmealPageQueryDTO dto) { + log.info("分页查询:{}", dto); + PageResult pageResult = setmealService.pageQuery(dto); + return Result.success(pageResult); + } + + @GetMapping("{id}") + @ApiOperation("根据id查询套餐") + public Result page4Id(@PathVariable Long id) { + log.info("根据id查询套餐:{}", id); + SetmealVO setmealVO = setmealService.page4Id(id); + return Result.success(setmealVO); + } + + @PutMapping() + @ApiOperation("修改套餐") + @CacheEvict(cacheNames = "setmealCache", allEntries = true) + public Result update(@RequestBody SetmealDTO setmealDTO) { + log.info("修改套餐:{}", setmealDTO); + setmealService.update(setmealDTO); + return Result.success(); + } + + @PostMapping("") + @ApiOperation("新增套餐") + @CacheEvict(cacheNames = "setmealCache", key = "#setmealDTO.categoryId") + public Result setmeal(@RequestBody SetmealDTO setmealDTO) { + log.info("新增套餐:{}", setmealDTO); + setmealService.insert(setmealDTO); + return Result.success(); + } + + @PostMapping("status/{status}") + @ApiOperation("套餐起售、停售") + @CacheEvict(cacheNames = "setmealCache", allEntries = true) + public Result updateStatus(@PathVariable Integer status, Long id) { + log.info("套餐起售、停售,状态:{},id:{}", status, id); + setmealService.updateStatus(status, id); + return Result.success(); + } + + @DeleteMapping("") + @ApiOperation("批量删除套餐") + @CacheEvict(cacheNames = "setmealCache", allEntries = true) + public Result delete(@RequestParam List ids) { + log.info("批量删除套餐:{}", ids); + setmealService.delete(ids); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/ShopController.java b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java new file mode 100644 index 0000000..dbffe9f --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/ShopController.java @@ -0,0 +1,40 @@ +package com.sky.controller.admin; + +import com.sky.common.constant.MessageConstant; +import com.sky.common.result.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +@RestController("adminShopController") +@RequiredArgsConstructor +@RequestMapping("/admin/shop") +@Api(tags = "店铺相关接口") +@Slf4j +public class ShopController { + public static final String KEY = "SHOP_STATUS"; + private final RedisTemplate redisTemplate; + + @PutMapping("/{status}") + @ApiOperation("设置店铺的营业状态") + public Result setStatus(@PathVariable Integer status) { + log.info("设置店铺的营业状态为:{}", status == 1 ? "营业中" : "打烊中"); + redisTemplate.opsForValue().set(KEY, status); + return Result.success(); + } + + @GetMapping("/status") + @ApiOperation("获取店铺的营业状态") + public Result getStatus() { + Integer status = (Integer) redisTemplate.opsForValue().get(KEY); + if (status != null) { + log.info("获取到店铺的营业状态为:{}", status == 1 ? "营业中" : "打烊中"); + return Result.success(status); + } + log.error(MessageConstant.NOT_SET_STATUS); + return Result.error(MessageConstant.NOT_SET_STATUS); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/admin/WorkSpaceController.java b/sky-server/src/main/java/com/sky/controller/admin/WorkSpaceController.java new file mode 100644 index 0000000..e9ba021 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/admin/WorkSpaceController.java @@ -0,0 +1,61 @@ +package com.sky.controller.admin; + +import com.sky.common.result.Result; +import com.sky.pojo.vo.BusinessDataVO; +import com.sky.pojo.vo.DishOverViewVO; +import com.sky.pojo.vo.OrderOverViewVO; +import com.sky.pojo.vo.SetmealOverViewVO; +import com.sky.service.WorkspaceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +/** + * 工作台 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/admin/workspace") +@Slf4j +@Api(tags = "工作台相关接口") +public class WorkSpaceController { + + private final WorkspaceService workspaceService; + + @GetMapping("/businessData") + @ApiOperation("工作台今日数据查询") + public Result businessData() { + // 获得当天的开始时间 + LocalDateTime begin = LocalDateTime.now().with(LocalTime.MIN); + // 获得当天的结束时间 + LocalDateTime end = LocalDateTime.now().with(LocalTime.MAX); + + BusinessDataVO businessDataVO = workspaceService.getBusinessData(begin, end); + return Result.success(businessDataVO); + } + + @GetMapping("/overviewOrders") + @ApiOperation("查询订单管理数据") + public Result orderOverView() { + return Result.success(workspaceService.getOrderOverView()); + } + + @GetMapping("/overviewDishes") + @ApiOperation("查询菜品总览") + public Result dishOverView() { + return Result.success(workspaceService.getDishOverView()); + } + + @GetMapping("/overviewSetmeals") + @ApiOperation("查询套餐总览") + public Result setmealOverView() { + return Result.success(workspaceService.getSetmealOverView()); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java b/sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java new file mode 100644 index 0000000..66ec78d --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/notify/PayNotifyController.java @@ -0,0 +1,111 @@ +package com.sky.controller.notify; + +import com.alibaba.druid.support.json.JSONUtils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sky.common.properties.WeChatProperties; +import com.sky.service.OrderService; +import com.wechat.pay.contrib.apache.httpclient.util.AesUtil; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.entity.ContentType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.UUID; + +/** + * 支付回调相关接口 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/notify") +@Slf4j +public class PayNotifyController { + private final OrderService orderService; + private final WeChatProperties weChatProperties; + + /** + * 支付成功回调 + */ + @RequestMapping("/paySuccess") + @ApiOperation(value = "支付成功") + public void paySuccessNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { + // 读取数据 + String body = readData(request); + log.info("支付成功回调:{}", body); + + // 数据解密 + String plainText = decryptData(body); + // String plainText = UUID.randomUUID().toString().replaceAll("-", ""); + log.info("解密后的文本:{}", plainText); + + JSONObject jsonObject = JSON.parseObject(plainText); + String outTradeNo = jsonObject.getString("out_trade_no");// 商户平台订单号 + // String transactionId = jsonObject.getString("transaction_id");// 微信支付交易号 + // String outTradeNo = "1704854920332";// 商户平台订单号 + String transactionId = UUID.randomUUID().toString();// 微信支付交易号 + + log.info("商户平台订单号:{}", outTradeNo); + log.info("微信支付交易号:{}", transactionId); + + // 业务处理,修改订单状态、来单提醒 + orderService.paySuccess(outTradeNo); + + // 给微信响应 + responseToWeixin(response); + } + + /** + * 读取数据 + */ + private String readData(HttpServletRequest request) throws Exception { + BufferedReader reader = request.getReader(); + StringBuilder result = new StringBuilder(); + String line = null; + while ((line = reader.readLine()) != null) { + if (!result.isEmpty()) { + result.append("\n"); + } + result.append(line); + } + return result.toString(); + } + + /** + * 数据解密 + */ + private String decryptData(String body) throws Exception { + JSONObject resultObject = JSON.parseObject(body); + JSONObject resource = resultObject.getJSONObject("resource"); + String ciphertext = resource.getString("ciphertext"); + String nonce = resource.getString("nonce"); + String associatedData = resource.getString("associated_data"); + + AesUtil aesUtil = new AesUtil(weChatProperties.getApiV3Key().getBytes(StandardCharsets.UTF_8)); + // 密文解密 + + return aesUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8), + nonce.getBytes(StandardCharsets.UTF_8), + ciphertext); + } + + /** + * 给微信响应 + */ + private void responseToWeixin(HttpServletResponse response) throws Exception { + response.setStatus(200); + HashMap map = new HashMap<>(); + map.put("code", "SUCCESS"); + map.put("message", "SUCCESS"); + response.setHeader("Content-type", ContentType.APPLICATION_JSON.toString()); + response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes(StandardCharsets.UTF_8)); + response.flushBuffer(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/AddressBookController.java b/sky-server/src/main/java/com/sky/controller/user/AddressBookController.java new file mode 100644 index 0000000..8bda696 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/AddressBookController.java @@ -0,0 +1,83 @@ +package com.sky.controller.user; + +import com.sky.common.context.BaseContext; +import com.sky.common.result.Result; +import com.sky.pojo.entity.AddressBook; +import com.sky.service.AddressBookService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/user/addressBook") +@Api(tags = "C端地址簿接口") +public class AddressBookController { + private final AddressBookService addressBookService; + + @GetMapping("/list") + @ApiOperation("查询当前登录用户的所有地址信息") + public Result> list() { + AddressBook addressBook = new AddressBook(); + addressBook.setUserId(BaseContext.getUserId()); + List list = addressBookService.list(addressBook); + return Result.success(list); + } + + @PostMapping + @ApiOperation("新增地址") + public Result save(@RequestBody AddressBook addressBook) { + addressBookService.save(addressBook); + return Result.success(); + } + + @GetMapping("/{id}") + @ApiOperation("根据id查询地址") + public Result getById(@PathVariable Long id) { + AddressBook addressBook = addressBookService.getById(id); + return Result.success(addressBook); + } + + @PutMapping + @ApiOperation("根据id修改地址") + public Result update(@RequestBody AddressBook addressBook) { + addressBookService.update(addressBook); + return Result.success(); + } + + @PutMapping("/default") + @ApiOperation("设置默认地址") + public Result setDefault(@RequestBody AddressBook addressBook) { + addressBookService.setDefault(addressBook); + return Result.success(); + } + + @DeleteMapping + @ApiOperation("根据id删除地址") + public Result deleteById(Long id) { + addressBookService.deleteById(id); + return Result.success(); + } + + /** + * 查询默认地址 + */ + @GetMapping("default") + @ApiOperation("查询默认地址") + public Result getDefault() { + // SQL:select * from address_book where user_id = ? and is_default = 1 + AddressBook addressBook = new AddressBook(); + addressBook.setIsDefault(1); + addressBook.setUserId(BaseContext.getUserId()); + List list = addressBookService.list(addressBook); + + if (list != null && list.size() == 1) { + return Result.success(list.get(0)); + } + + return Result.error("没有查询到默认地址"); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/CategoryController.java b/sky-server/src/main/java/com/sky/controller/user/CategoryController.java new file mode 100644 index 0000000..a474ce1 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/CategoryController.java @@ -0,0 +1,28 @@ +package com.sky.controller.user; + +import com.sky.common.result.Result; +import com.sky.pojo.entity.Category; +import com.sky.service.CategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController("userCategoryController") +@RequiredArgsConstructor +@RequestMapping("/user/category") +@Api(tags = "C端-分类接口") +public class CategoryController { + private final CategoryService categoryService; + + @GetMapping("/list") + @ApiOperation("查询分类") + public Result> list(Integer type) { + List list = categoryService.list(type); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/DishController.java b/sky-server/src/main/java/com/sky/controller/user/DishController.java new file mode 100644 index 0000000..5ee1a6e --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/DishController.java @@ -0,0 +1,50 @@ +package com.sky.controller.user; + +import com.alibaba.fastjson.JSON; +import com.sky.common.constant.StatusConstant; +import com.sky.common.result.Result; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.vo.DishVO; +import com.sky.service.DishService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +@RestController("userDishController") +@RequiredArgsConstructor +@RequestMapping("/user/dish") +@Slf4j +@Api(tags = "C端-菜品浏览接口") +public class DishController { + private final RedisTemplate redisTemplate; + DishService dishService; + + @GetMapping("/list") + @ApiOperation("根据分类id查询菜品") + public Result> list(Long categoryId) { + // 构造redis中的key,规则dish_分类id + String key = "dish_" + categoryId; + // 查询redis中是否存在菜品数据 + List list = (List) redisTemplate.opsForValue().get(key); + // 如果存在返回,无需查询数据库 + if (list != null && !list.isEmpty()) { + return Result.success(list); + } + // 如果不存在查询数据库,将查询数据放入redis中 + Dish dish = new Dish(); + dish.setCategoryId(categoryId); + dish.setStatus(StatusConstant.ENABLE);// 查询起售中的菜品 + + list = dishService.listWithFlavor(dish); + redisTemplate.opsForValue().set(key, JSON.toJSON(list), 7, TimeUnit.DAYS); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/OrderController.java b/sky-server/src/main/java/com/sky/controller/user/OrderController.java new file mode 100644 index 0000000..5d2f4fe --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/OrderController.java @@ -0,0 +1,81 @@ +package com.sky.controller.user; + +import com.sky.common.result.PageResult; +import com.sky.common.result.Result; +import com.sky.pojo.dto.OrdersPaymentDTO; +import com.sky.pojo.dto.OrdersSubmitDTO; +import com.sky.pojo.vo.OrderPaymentVO; +import com.sky.pojo.vo.OrderSubmitVO; +import com.sky.pojo.vo.OrderVO; +import com.sky.service.OrderService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * 订单 + */ +@RestController("userOrderController") +@RequiredArgsConstructor +@RequestMapping("/user/order") +@Slf4j +@Api(tags = "C端订单接口") +public class OrderController { + private final OrderService orderService; + + @PostMapping("/submit") + @ApiOperation("用户下单") + public Result submit(@RequestBody OrdersSubmitDTO ordersSubmitDTO) { + log.info("用户下单:{}", ordersSubmitDTO); + OrderSubmitVO orderSubmitVO = orderService.submitOrder(ordersSubmitDTO); + return Result.success(orderSubmitVO); + } + + @PutMapping("/payment") + @ApiOperation("订单支付") + public Result payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO) throws Exception { + log.info("订单支付:{}", ordersPaymentDTO); + OrderPaymentVO orderPaymentVO = orderService.payment(ordersPaymentDTO); + log.info("生成预支付交易单:{}", orderPaymentVO); + return Result.success(orderPaymentVO); + } + + @GetMapping("historyOrders") + @ApiOperation(value = "历史订单") + public Result historyOrders(int page, int pageSize, Integer status) { + log.info("历史订单:{}", page); + PageResult pageResult = orderService.pageQuery4User(page, pageSize, status); + return Result.success(pageResult); + } + + @GetMapping("orderDetail/{id}") + @ApiOperation(value = "查询订单详情") + public Result orderDetail(@PathVariable Long id) { + OrderVO orderVO = orderService.details(id); + return Result.success(orderVO); + } + + @PutMapping("cancel/{id}") + @ApiOperation("取消订单") + public Result cancel(@PathVariable("id") Long id) { + orderService.cancel(id); + return Result.success("操作成功"); + } + + @PostMapping("/repetition/{id}") + @ApiOperation("再来一单") + public Result repetition(@PathVariable Long id) { + orderService.repetition(id); + return Result.success(); + } + + @GetMapping("reminder/{id}") + @ApiOperation(value = "催单") + public Result reminder(@PathVariable("id") Long id) { + log.info("催单:{}", id); + orderService.reminder(id); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/SetmealController.java b/sky-server/src/main/java/com/sky/controller/user/SetmealController.java new file mode 100644 index 0000000..48c4d1b --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/SetmealController.java @@ -0,0 +1,44 @@ +package com.sky.controller.user; + +import com.sky.common.constant.StatusConstant; +import com.sky.common.result.Result; +import com.sky.pojo.entity.Setmeal; +import com.sky.pojo.vo.DishItemVO; +import com.sky.service.SetmealService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController("userSetmealController") +@RequiredArgsConstructor +@RequestMapping("/user/setmeal") +@Api(tags = "C端-套餐浏览接口") +public class SetmealController { + private final SetmealService setmealService; + + @GetMapping("/list") + @ApiOperation("根据分类id查询套餐") + @Cacheable(cacheNames = "setmealCache", key = "#categoryId") + public Result> list(Long categoryId) { + Setmeal setmeal = new Setmeal(); + setmeal.setCategoryId(categoryId); + setmeal.setStatus(StatusConstant.ENABLE); + + List list = setmealService.list(setmeal); + return Result.success(list); + } + + @GetMapping("/dish/{id}") + @ApiOperation("根据套餐id查询包含的菜品列表") + public Result> dishList(@PathVariable("id") Long id) { + List list = setmealService.getDishItemById(id); + return Result.success(list); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/ShopController.java b/sky-server/src/main/java/com/sky/controller/user/ShopController.java new file mode 100644 index 0000000..7fc18df --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShopController.java @@ -0,0 +1,30 @@ +package com.sky.controller.user; + +import com.sky.common.result.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController("userShopController") +@RequestMapping("/user/shop") +@Api(tags = "C端店铺相关接口") +@Slf4j +public class ShopController { + public static final String KEY = "SHOP_STATUS"; + + @Autowired + private RedisTemplate redisTemplate; + + @GetMapping("/status") + @ApiOperation("获取店铺的营业状态") + public Result getStatus() { + Integer status = (Integer) redisTemplate.opsForValue().get(KEY); + log.info("获取到店铺的营业状态为:{}", status == 1 ? "营业中" : "打烊中"); + return Result.success(status); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java new file mode 100644 index 0000000..f4ad52a --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/ShoppingCartController.java @@ -0,0 +1,54 @@ +package com.sky.controller.user; + +import com.sky.common.result.Result; +import com.sky.pojo.dto.ShoppingCartDTO; +import com.sky.pojo.entity.ShoppingCart; +import com.sky.service.ShoppingCartService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/user/shoppingCart") +@Slf4j +@Api(tags = "C端-购物车接口") +public class ShoppingCartController { + @Autowired + private ShoppingCartService shoppingCartService; + + @GetMapping("list") + @ApiOperation(value = "查询购物车") + public Result> shoppingCartList() { + log.info("查询购物车"); + List shoppingCart = shoppingCartService.list(); + return Result.success(shoppingCart); + } + + @PostMapping("add") + @ApiOperation(value = "添加购物车") + public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) { + log.info("添加购物车:{}", shoppingCartDTO); + shoppingCartService.addShoppingCart(shoppingCartDTO); + return Result.success(); + } + + @PostMapping("sub") + @ApiOperation(value = "删除购物车商品") + public Result sub(@RequestBody ShoppingCartDTO shoppingCartDTO) { + log.info("删除购物车商品:{}", shoppingCartDTO); + shoppingCartService.subdShoppingCart(shoppingCartDTO); + return Result.success(); + } + + @DeleteMapping("/clean") + @ApiOperation("清空购物车商品") + public Result clean() { + log.info("清空购物车商品"); + shoppingCartService.cleanShoppingCart(); + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/controller/user/UserController.java b/sky-server/src/main/java/com/sky/controller/user/UserController.java new file mode 100644 index 0000000..18a46b3 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/UserController.java @@ -0,0 +1,59 @@ +package com.sky.controller.user; + +import com.sky.common.constant.JwtClaimsConstant; +import com.sky.common.properties.JwtProperties; +import com.sky.common.result.Result; +import com.sky.common.utils.JwtUtil; +import com.sky.pojo.dto.UserLoginDTO; +import com.sky.pojo.entity.User; +import com.sky.pojo.vo.UserLoginVO; +import com.sky.service.UserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/user/user") +@Api(tags = "C端用户相关接口") +@Slf4j +public class UserController { + @Autowired + private UserService userService; + @Autowired + private JwtProperties jwtProperties; + + @PostMapping("/login") + @ApiOperation("微信登录") + public Result login(@RequestBody UserLoginDTO userLoginDTO) { + log.info("微信用户登录:{}", userLoginDTO.getCode()); + + // 微信登录 + User user = userService.wxLogin(userLoginDTO);// 后绪步骤实现 + + // 为微信用户生成jwt令牌 + Map claims = new HashMap<>(); + claims.put(JwtClaimsConstant.USER_ID, user.getId()); + String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims); + + UserLoginVO userLoginVO = UserLoginVO.builder() + .id(user.getId()) + .openid(user.getOpenid()) + .token(token) + .build(); + return Result.success(userLoginVO); + } + + @PostMapping("logout") + @ApiOperation("退出登录") + public Result logout() { + return Result.success(); + } +} diff --git a/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java b/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java new file mode 100644 index 0000000..a223d0f --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/AddressBookMapper.java @@ -0,0 +1,48 @@ +package com.sky.mapper; + +import com.sky.pojo.entity.AddressBook; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface AddressBookMapper { + + /** + * 条件查询 + */ + List list(AddressBook addressBook); + + /** + * 新增 + */ + @Insert("insert into address_book" + + " (user_id, consignee, phone, sex, province_code, province_name, city_code, city_name, district_code," + + " district_name, detail, label, is_default)" + + " values (#{userId}, #{consignee}, #{phone}, #{sex}, #{provinceCode}, #{provinceName}, #{cityCode}, #{cityName}," + + " #{districtCode}, #{districtName}, #{detail}, #{label}, #{isDefault})") + void insert(AddressBook addressBook); + + /** + * 根据id查询 + */ + @Select("select * from address_book where id = #{id}") + AddressBook getById(Long id); + + /** + * 根据id修改 + */ + void update(AddressBook addressBook); + + /** + * 根据 用户id修改 是否默认地址 + */ + @Update("update address_book set is_default = #{isDefault} where user_id = #{userId}") + void updateIsDefaultByUserId(AddressBook addressBook); + + /** + * 根据id删除地址 + */ + @Delete("delete from address_book where id = #{id}") + void deleteById(Long id); +} diff --git a/sky-server/src/main/java/com/sky/mapper/CategoryMapper.java b/sky-server/src/main/java/com/sky/mapper/CategoryMapper.java new file mode 100644 index 0000000..5aadfe7 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/CategoryMapper.java @@ -0,0 +1,53 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.common.enumeration.OperationType; +import com.sky.pojo.dto.CategoryPageQueryDTO; +import com.sky.pojo.entity.Category; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CategoryMapper { + + /** + * 插入数据 + * + * @param category 分类 + */ + @AutoFill(value = OperationType.INSERT) + void insert(Category category); + + /** + * 分页查询 + * + * @param categoryPageQueryDTO 前端分类数据 + * @return 分类 + */ + Page pageQuery(CategoryPageQueryDTO categoryPageQueryDTO); + + /** + * 根据id删除分类 + * + * @param id 删除id + */ + void deleteById(Long id); + + /** + * 根据id修改分类 + * + * @param category 分类 + */ + @AutoFill(value = OperationType.UPDATE) + void update(Category category); + + /** + * 根据类型查询分类 + * + * @param type 类型 + * @return 分类 + */ + List list(Integer type); +} diff --git a/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java b/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java new file mode 100644 index 0000000..cc09e61 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java @@ -0,0 +1,31 @@ +package com.sky.mapper; + +import com.sky.pojo.entity.DishFlavor; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface DishFlavorMapper { + /** + * 向口味中插入n条数据 + * + * @param flavors 口味 + */ + void insertBatch(List flavors); + + /** + * 删除关联的口味 + * + * @param dishIds 删除的id + */ + void deleteByDishIds(List dishIds); + + /** + * 根据菜品id查询口味数据 + * + * @param dishId 菜品id + * @return 菜品口味列表 + */ + List getByDishId(Long dishId); +} diff --git a/sky-server/src/main/java/com/sky/mapper/DishMapper.java b/sky-server/src/main/java/com/sky/mapper/DishMapper.java new file mode 100644 index 0000000..384e5db --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/DishMapper.java @@ -0,0 +1,87 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.common.enumeration.OperationType; +import com.sky.pojo.dto.DishPageQueryDTO; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.vo.DishVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DishMapper { + + /** + * 根据分类id查询菜品数量 + * + * @param categoryId 分类id + * @return 数量 + */ + Integer countByCategoryId(Long categoryId); + + /** + * 向菜品表插入1条数据 + * + * @param dish 前端新增菜品 + */ + @AutoFill(value = OperationType.INSERT) + void insert(Dish dish); + + /** + * 菜品分页查询 + * + * @param dto 菜品分页查询-前端参数 + * @return 封装分页查询结果 + */ + Page pageQuery(DishPageQueryDTO dto); + + + /** + * 判断当前菜品是否是起售中菜品 + * + * @param id id + */ + Dish getById(Long id); + + /** + * 删除菜品表中菜品数据 + * + * @param ids 被删除的id + */ + void deleteByIds(List ids); + + /** + * 修改菜品信息 + * + * @param dish 菜品信息 + */ + @AutoFill(value = OperationType.UPDATE) + void update(Dish dish); + + /** + * 起售套餐时,判断套餐内是否有停售菜品 + * + * @param id id + * @return List + */ + List getBySetmealId(Long id); + + /** + * 查询菜品 + * + * @param dish 菜品 + * @return List + */ + List list(Dish dish); + + /** + * 根据条件统计菜品数量 + * + * @param map map + * @return 数量 + */ + Integer countByMap(Map map); +} diff --git a/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java b/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java new file mode 100644 index 0000000..5fafbfc --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java @@ -0,0 +1,60 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.common.enumeration.OperationType; +import com.sky.pojo.dto.EmployeePageQueryDTO; +import com.sky.pojo.entity.Employee; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface EmployeeMapper { + + /** + * 根据用户名查询员工 + * + * @param username 用户名 + * @return 员工信息 + */ + Employee getByUsername(String username); + + /** + * 插入员工数据 + * + * @param employee 员工信息 + */ + @AutoFill(value = OperationType.INSERT) + void insert(Employee employee); + + /** + * 员工分页查询 + * + * @param employeePageQueryDTO 员工前端请求信息 + * @return 封装分页查询结果 + */ + Page pageQuery(EmployeePageQueryDTO employeePageQueryDTO); + + /** + * 启用禁用员工账号 + * + * @param employee 员工信息 + */ + @AutoFill(value = OperationType.UPDATE) + void update(Employee employee); + + /** + * 根据id查询员工信息 + * + * @param id 员工id + * @return 员工信息 + */ + Employee getById(Long id); + + /** + * 修改密码 + * + * @param empId 用户id + * @param newPassword 新密码 + */ + void updatePassword(Long empId, String newPassword); +} diff --git a/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java new file mode 100644 index 0000000..532abda --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/OrderDetailMapper.java @@ -0,0 +1,24 @@ +package com.sky.mapper; + +import com.sky.pojo.entity.OrderDetail; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface OrderDetailMapper { + /** + * 批量插入订单明细数据 + * + * @param orderDetailArrayList ArrayList + */ + void insertBatch(List orderDetailArrayList); + + /** + * 查询订单明细 + * + * @param id Long + * @return List + */ + List getByOrderId(Long id); +} \ No newline at end of file diff --git a/sky-server/src/main/java/com/sky/mapper/OrderMapper.java b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java new file mode 100644 index 0000000..1c8e829 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/OrderMapper.java @@ -0,0 +1,92 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.pojo.dto.GoodsSalesDTO; +import com.sky.pojo.dto.OrdersPageQueryDTO; +import com.sky.pojo.entity.Orders; +import org.apache.ibatis.annotations.Mapper; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Mapper +public interface OrderMapper { + /** + * 插入订单数据 + * + * @param order order + */ + void insert(Orders order); + + /** + * 根据订单号查询订单 + * + * @param orderNumber orderNumber + */ + Orders getByNumber(String orderNumber); + + /** + * 修改订单信息 + * + * @param orders orders + */ + void update(Orders orders); + + /** + * 根据动态条件统计营业额 + * + * @param map map + * @return Double + */ + Double sumByMap(Map map); + + /** + * 根据动态条件查询订单总数 + * + * @param map 动态条件 + * @return 数字 + */ + Integer countByMap(Map map); + + /** + * 查询销量前10 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 查询销量前10列表 + */ + List getSalesTop10(LocalDateTime begin, LocalDateTime end); + + /** + * 分页条件查询 + * + * @param ordersPageQueryDTO 订单请求数据 + * @return 订单信息 + */ + Page pageQuery(OrdersPageQueryDTO ordersPageQueryDTO); + + /** + * 定时处理超时订单 + * + * @param status 状态 + * @param orderTime 订单时间 + * @return 订单列表 + */ + List getByStatusAndOrderTime(Integer status, LocalDateTime orderTime); + + /** + * 根据id查询订单 + * + * @param id 订单id + * @return 订单数据 + */ + Orders getById(Long id); + + /** + * 根据状态统计订单数量 + * + * @param status 订单状态 + */ + Integer countStatus(Integer status); +} diff --git a/sky-server/src/main/java/com/sky/mapper/SetMealDishMapper.java b/sky-server/src/main/java/com/sky/mapper/SetMealDishMapper.java new file mode 100644 index 0000000..f78f281 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/SetMealDishMapper.java @@ -0,0 +1,46 @@ +package com.sky.mapper; + +import com.sky.pojo.entity.SetmealDish; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SetMealDishMapper { + /** + * 根据菜品id查询对应的套餐id + * + * @param dishIds 菜品列表id + * @return list + */ + List getSetmealIdsByDishIds(List dishIds); + + /** + * 根据id查找菜品 + * + * @param dishId id + * @return 菜品列表 + */ + List getBySetmealId(Long dishId); + + /** + * 删除相关套餐菜品 + * + * @param setmealId 套餐菜品id + */ + void deleteBySetmealId(Long setmealId); + + /** + * 删除相关套餐菜品 + * + * @param setmealIds 套餐菜品id + */ + void deleteBySetmealIds(List setmealIds); + + /** + * 插入菜品 + * + * @param setmealDishes 菜品列表 + */ + void insert(List setmealDishes); +} diff --git a/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java new file mode 100644 index 0000000..2e0d7c5 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/SetmealMapper.java @@ -0,0 +1,88 @@ +package com.sky.mapper; + +import com.github.pagehelper.Page; +import com.sky.annotation.AutoFill; +import com.sky.common.enumeration.OperationType; +import com.sky.pojo.dto.SetmealPageQueryDTO; +import com.sky.pojo.entity.Setmeal; +import com.sky.pojo.vo.DishItemVO; +import com.sky.pojo.vo.SetmealVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface SetmealMapper { + + /** + * 根据分类id查询套餐的数量 + * + * @param id 当前id + * @return 数量 + */ + Integer countByCategoryId(Long id); + + /** + * 根据id修改套餐 + * + * @param setmeal 套餐 + */ + @AutoFill(OperationType.UPDATE) + void update(Setmeal setmeal); + + /** + * 分页查询 + * + * @param dto 前端请求 + * @return Page结果 + */ + Page pageQuery(SetmealPageQueryDTO dto); + + /** + * 查找套餐 + * + * @param id 套餐id + * @return 套餐 + */ + Setmeal getById(Long id); + + /** + * 插入套餐 + * + * @param setmeal 套餐信息 + */ + @AutoFill(OperationType.INSERT) + void insert(Setmeal setmeal); + + /** + * 批量删除套餐 + * + * @param ids 要删除套餐ids + */ + void delete(List ids); + + /** + * 动态条件查询套餐 + * + * @param setmeal 菜品 + * @return List + */ + List list(Setmeal setmeal); + + /** + * 根据套餐id查询菜品选项 + * + * @param setmealId setmealId + * @return List + */ + List getDishItemBySetmealId(Long setmealId); + + /** + * 根据条件统计套餐数量 + * + * @param map map + * @return 数量 + */ + Integer countByMap(Map map); +} diff --git a/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java new file mode 100644 index 0000000..20b60bc --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/ShoppingCartMapper.java @@ -0,0 +1,60 @@ +package com.sky.mapper; + +import com.sky.pojo.entity.ShoppingCart; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ShoppingCartMapper { + + /** + * 查询购物车 + * + * @param shoppingCart 根据用户id查询购物车 + * @return 购物车列表 + */ + List list(ShoppingCart shoppingCart); + + /** + * 根据id更新购物车数量 + * + * @param shoppingCart 购物车数据 + */ + void updateById(ShoppingCart shoppingCart); + + /** + * 插入购物车 + * + * @param shoppingCart 购物车数据 + */ + void insert(ShoppingCart shoppingCart); + + /** + * 根据用户id删除购物车 + * + * @param userId 用户id + */ + void deleteByUserId(Long userId); + + /** + * 根据购物车id删除购物车内容 + * + * @param cartId 购物车id + */ + void deleteById(Long cartId); + + /** + * 根据购物车id更新购物车内容 + * + * @param cart 购物车内容 + */ + void updateNumberById(ShoppingCart cart); + + /** + * 将购物车对象批量添加到数据库 + * + * @param shoppingCartList 购物车列表 + */ + void insertBatch(List shoppingCartList); +} diff --git a/sky-server/src/main/java/com/sky/mapper/UserMapper.java b/sky-server/src/main/java/com/sky/mapper/UserMapper.java new file mode 100644 index 0000000..07f005c --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/UserMapper.java @@ -0,0 +1,42 @@ +package com.sky.mapper; + +import com.sky.pojo.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Map; + +@Mapper +public interface UserMapper { + /** + * 根据openid查询用户 + * + * @param openid + * @return + */ + @Select("select * from user where openid = #{openid}") + User getByOpenid(String openid); + + /** + * 插入数据 + * + * @param user + */ + void insert(User user); + + /** + * 统计数量 + * + * @param map map + * @return Integer + */ + Integer countByMap(Map map); + + /** + * 当前登录用户id + * + * @param userId 当前用户id + * @return 用户信息 + */ + User getById(Long userId); +} diff --git a/sky-server/src/main/java/com/sky/service/AddressBookService.java b/sky-server/src/main/java/com/sky/service/AddressBookService.java new file mode 100644 index 0000000..d01f413 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/AddressBookService.java @@ -0,0 +1,22 @@ +package com.sky.service; + + +import com.sky.pojo.entity.AddressBook; + +import java.util.List; + +public interface AddressBookService { + + List list(AddressBook addressBook); + + void save(AddressBook addressBook); + + AddressBook getById(Long id); + + void update(AddressBook addressBook); + + void setDefault(AddressBook addressBook); + + void deleteById(Long id); + +} diff --git a/sky-server/src/main/java/com/sky/service/CategoryService.java b/sky-server/src/main/java/com/sky/service/CategoryService.java new file mode 100644 index 0000000..2b9bb66 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/CategoryService.java @@ -0,0 +1,42 @@ +package com.sky.service; + + +import com.sky.common.result.PageResult; +import com.sky.pojo.dto.CategoryDTO; +import com.sky.pojo.dto.CategoryPageQueryDTO; +import com.sky.pojo.entity.Category; + +import java.util.List; + +public interface CategoryService { + + /** + * 新增分类 + */ + void save(CategoryDTO categoryDTO); + + /** + * 分页查询 + */ + PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO); + + /** + * 根据id删除分类 + */ + void deleteById(Long id); + + /** + * 修改分类 + */ + void update(CategoryDTO categoryDTO); + + /** + * 启用、禁用分类 + */ + void startOrStop(Integer status, Long id); + + /** + * 根据类型查询分类 + */ + List list(Integer type); +} diff --git a/sky-server/src/main/java/com/sky/service/DishService.java b/sky-server/src/main/java/com/sky/service/DishService.java new file mode 100644 index 0000000..90c433c --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/DishService.java @@ -0,0 +1,72 @@ +package com.sky.service; + + +import com.sky.common.result.PageResult; +import com.sky.pojo.dto.DishDTO; +import com.sky.pojo.dto.DishPageQueryDTO; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.vo.DishVO; + +import java.util.List; + +public interface DishService { + /** + * 新增菜品 + * + * @param dishPageQueryDTO 前端新增菜品 + */ + void saveWithFlavor(DishDTO dishPageQueryDTO); + + /** + * 菜品分页查询 + * + * @param dishPageQueryDTO 菜品分页查询-前端参数 + * @return 封装分页查询结果 + */ + PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO); + + /** + * 菜品批量删除 + * + * @param ids 删除的is + */ + void deleteBatch(List ids); + + /** + * 根据id查询菜品和对应的口味数据 + * + * @param id 菜品id + * @return DishVO + */ + DishVO getById(Long id); + + /** + * 修改菜品 + * + * @param dto 前端请求菜品 + */ + void updateWithFlavor(DishDTO dto); + + /** + * 菜品起售、停售 + * + * @param status 起售、停售 + */ + void updateWithStatus(Integer status, Long id); + + /** + * 根据分类id查询菜品 + * + * @param categoryId 分类id + * @return List + */ + List getByCategoryId(Long categoryId); + + /** + * 条件查询菜品和口味 + * + * @param dish 菜品 + * @return List + */ + List listWithFlavor(Dish dish); +} diff --git a/sky-server/src/main/java/com/sky/service/EmployeeService.java b/sky-server/src/main/java/com/sky/service/EmployeeService.java new file mode 100644 index 0000000..22df531 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/EmployeeService.java @@ -0,0 +1,65 @@ +package com.sky.service; + + +import com.sky.common.result.PageResult; +import com.sky.pojo.dto.EmployeeDTO; +import com.sky.pojo.dto.EmployeeLoginDTO; +import com.sky.pojo.dto.EmployeePageQueryDTO; +import com.sky.pojo.dto.PasswordEditDTO; +import com.sky.pojo.entity.Employee; + +public interface EmployeeService { + + /** + * 员工登录 + * + * @param employeeLoginDTO 员工等了信息 + * @return 员工信息 + */ + Employee login(EmployeeLoginDTO employeeLoginDTO); + + /** + * 新增员工 + * + * @param employeeDTO 员工信息 + */ + void save(EmployeeDTO employeeDTO); + + /** + * 员工分页查询 + * + * @param employeePageQueryDTO 员工前端请求信息 + * @return 封装分页查询结果 + */ + PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO); + + /** + * 启用禁用员工账号 + * + * @param status 状态 + * @param id 当前id + */ + void startOrStop(Integer status, Long id); + + /** + * 根据id查询员工信息 + * + * @param id 员工id + * @return 员工信息 + */ + Employee getById(Long id); + + /** + * 编辑员工信息 + * + * @param employeeDTO 前端员工信息 + */ + void update(EmployeeDTO employeeDTO); + + /** + * 修改密码 + * + * @param passwordEditDTO 请求修改密码相关 + */ + void editPassword(PasswordEditDTO passwordEditDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/MinioService.java b/sky-server/src/main/java/com/sky/service/MinioService.java new file mode 100644 index 0000000..3011de0 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/MinioService.java @@ -0,0 +1,14 @@ +package com.sky.service; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public interface MinioService { + /** + * 上传文件 + * + * @param file 文件 + */ + String upload(MultipartFile file) throws IOException; +} diff --git a/sky-server/src/main/java/com/sky/service/OrderService.java b/sky-server/src/main/java/com/sky/service/OrderService.java new file mode 100644 index 0000000..72cfcd1 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/OrderService.java @@ -0,0 +1,125 @@ +package com.sky.service; + + +import com.sky.common.result.PageResult; +import com.sky.pojo.dto.*; +import com.sky.pojo.vo.OrderPaymentVO; +import com.sky.pojo.vo.OrderStatisticsVO; +import com.sky.pojo.vo.OrderSubmitVO; +import com.sky.pojo.vo.OrderVO; + +public interface OrderService { + + /** + * 用户下单 + * + * @param ordersSubmitDTO 订单提交 + * @return OrderSubmitVO + */ + OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO); + + /** + * 订单支付 + * + * @param ordersPaymentDTO 订单提交 + * @return OrderPaymentVO + */ + OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception; + + /** + * 支付成功,修改订单状态 + * + * @param outTradeNo String + */ + void paySuccess(String outTradeNo); + + + /** + * 历史订单 + * + * @param page 当前页 + * @param pageSize 一页大小 + * @param status 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + * @return 订单列表 + */ + PageResult pageQuery4User(int page, int pageSize, Integer status); + + /** + * 催单 + * + * @param id 订单id + */ + void reminder(Long id); + + /** + * 查询订单详情 + * + * @param id 订单id + * @return 订单详情 + */ + OrderVO details(Long id); + + /** + * 取消订单 + * + * @param id 订单id + */ + void cancel(Long id); + + /** + * 取消订单-商家 + * + * @param dto 订单 + */ + void cancelBusiness(OrdersCancelDTO dto); + + /** + * 再来一单 + * + * @param id 订单id + */ + void repetition(Long id); + + /** + * 订单搜索 + * + * @param dto 订单详情 + * @return 分页数据 + */ + PageResult conditionSearch(OrdersPageQueryDTO dto); + + /** + * 各个状态的订单数量统计 + * + * @return OrderStatisticsVO + */ + OrderStatisticsVO statistics(); + + /** + * 接单 + * + * @param dto 接单请求 + */ + void confirm(OrdersConfirmDTO dto); + + /** + * 拒单 + * + * @param dto 拒单请求 + */ + void rejection(OrdersRejectionDTO dto); + + /** + * 派送订单 + * + * @param id 订单id + */ + void delivery(Long id); + + /** + * 完成订单 + * + * @param id 订单id + */ + void complete(Long id); +} diff --git a/sky-server/src/main/java/com/sky/service/ReportService.java b/sky-server/src/main/java/com/sky/service/ReportService.java new file mode 100644 index 0000000..a3eed8f --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/ReportService.java @@ -0,0 +1,55 @@ +package com.sky.service; + + +import com.sky.pojo.vo.OrderReportVO; +import com.sky.pojo.vo.SalesTop10ReportVO; +import com.sky.pojo.vo.TurnoverReportVO; +import com.sky.pojo.vo.UserReportVO; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDate; + +public interface ReportService { + /** + * 营业额数据统计 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 营业额数据统计 + */ + TurnoverReportVO getTurnover(LocalDate begin, LocalDate end); + + /** + * 用户数据统计 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 用户数据统计 + */ + UserReportVO getUserStatistics(LocalDate begin, LocalDate end); + + /** + * 订单统计接口 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 订单统计 + */ + OrderReportVO getOrdersStatistics(LocalDate begin, LocalDate end); + + /** + * 查询销量排名top10接口 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 销量排名top10 + */ + SalesTop10ReportVO getTop10Statistics(LocalDate begin, LocalDate end); + + /** + * 导出Excel报表接口 + * + * @param response HttpServletResponse + */ + void exportBusinessData(HttpServletResponse response); +} diff --git a/sky-server/src/main/java/com/sky/service/SetmealService.java b/sky-server/src/main/java/com/sky/service/SetmealService.java new file mode 100644 index 0000000..a6b1417 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/SetmealService.java @@ -0,0 +1,74 @@ +package com.sky.service; + +import com.sky.common.result.PageResult; +import com.sky.pojo.dto.SetmealDTO; +import com.sky.pojo.dto.SetmealPageQueryDTO; +import com.sky.pojo.entity.Setmeal; +import com.sky.pojo.vo.DishItemVO; +import com.sky.pojo.vo.SetmealVO; + +import java.util.List; + +public interface SetmealService { + + /** + * 分页查询 + * + * @param dto 前端请求 + * @return PageResult + */ + PageResult pageQuery(SetmealPageQueryDTO dto); + + /** + * 根据id查询套餐 + * + * @param id 套餐id + * @return 套餐相关信息 + */ + SetmealVO page4Id(Long id); + + /** + * 修改套餐 + * + * @param dto 前端请求 + */ + void update(SetmealDTO dto); + + /** + * 新增套餐 + * + * @param setmealDTO 套餐信息 + */ + void insert(SetmealDTO setmealDTO); + + /** + * 套餐起售、停售 + * + * @param status 状态 + * @param id id + */ + void updateStatus(Integer status, Long id); + + /** + * 批量删除套餐 + * + * @param ids 要删除套餐ids + */ + void delete(List ids); + + /** + * 条件查询 + * + * @param setmeal 套餐 + * @return List + */ + List list(Setmeal setmeal); + + /** + * 根据id查询菜品选项 + * + * @param id id + * @return List + */ + List getDishItemById(Long id); +} diff --git a/sky-server/src/main/java/com/sky/service/ShoppingCartService.java b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java new file mode 100644 index 0000000..19a4b7e --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/ShoppingCartService.java @@ -0,0 +1,35 @@ +package com.sky.service; + + +import com.sky.pojo.dto.ShoppingCartDTO; +import com.sky.pojo.entity.ShoppingCart; + +import java.util.List; + +public interface ShoppingCartService { + /** + * 添加购物车 + * + * @param shoppingCartDTO 购物车请求参数 + */ + void addShoppingCart(ShoppingCartDTO shoppingCartDTO); + + /** + * 查询购物车 + * + * @return 购物车列表 + */ + List list(); + + /** + * 清空购物车商品 + */ + void cleanShoppingCart(); + + /** + * 删除购物车商品 + * + * @param shoppingCartDTO 购物车请求参数 + */ + void subdShoppingCart(ShoppingCartDTO shoppingCartDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/UserService.java b/sky-server/src/main/java/com/sky/service/UserService.java new file mode 100644 index 0000000..82684e5 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/UserService.java @@ -0,0 +1,15 @@ +package com.sky.service; + + +import com.sky.pojo.dto.UserLoginDTO; +import com.sky.pojo.entity.User; + +public interface UserService { + /** + * 微信登录 + * + * @param userLoginDTO userLoginDTO + * @return User + */ + User wxLogin(UserLoginDTO userLoginDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/WorkspaceService.java b/sky-server/src/main/java/com/sky/service/WorkspaceService.java new file mode 100644 index 0000000..adb0401 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/WorkspaceService.java @@ -0,0 +1,43 @@ +package com.sky.service; + + +import com.sky.pojo.vo.BusinessDataVO; +import com.sky.pojo.vo.DishOverViewVO; +import com.sky.pojo.vo.OrderOverViewVO; +import com.sky.pojo.vo.SetmealOverViewVO; + +import java.time.LocalDateTime; + +public interface WorkspaceService { + + /** + * 根据时间段统计营业数据 + * + * @param begin + * @param end + * @return + */ + BusinessDataVO getBusinessData(LocalDateTime begin, LocalDateTime end); + + /** + * 查询订单管理数据 + * + * @return + */ + OrderOverViewVO getOrderOverView(); + + /** + * 查询菜品总览 + * + * @return + */ + DishOverViewVO getDishOverView(); + + /** + * 查询套餐总览 + * + * @return + */ + SetmealOverViewVO getSetmealOverView(); + +} diff --git a/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java new file mode 100644 index 0000000..d8220d4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/AddressBookServiceImpl.java @@ -0,0 +1,72 @@ +package com.sky.service.impl; + +import com.sky.common.context.BaseContext; +import com.sky.mapper.AddressBookMapper; +import com.sky.pojo.entity.AddressBook; +import com.sky.service.AddressBookService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Slf4j +public class AddressBookServiceImpl implements AddressBookService { + @Autowired + private AddressBookMapper addressBookMapper; + + /** + * 条件查询 + */ + public List list(AddressBook addressBook) { + return addressBookMapper.list(addressBook); + } + + /** + * 新增地址 + */ + public void save(AddressBook addressBook) { + addressBook.setUserId(BaseContext.getUserId()); + addressBook.setIsDefault(0); + addressBookMapper.insert(addressBook); + } + + /** + * 根据id查询 + */ + public AddressBook getById(Long id) { + return addressBookMapper.getById(id); + } + + /** + * 根据id修改地址 + */ + public void update(AddressBook addressBook) { + addressBookMapper.update(addressBook); + } + + /** + * 设置默认地址 + */ + @Transactional + public void setDefault(AddressBook addressBook) { + // 1、将当前用户的所有地址修改为非默认地址 update address_book set is_default = ? where user_id = ? + addressBook.setIsDefault(0); + addressBook.setUserId(BaseContext.getUserId()); + addressBookMapper.updateIsDefaultByUserId(addressBook); + + // 2、将当前地址改为默认地址 update address_book set is_default = ? where id = ? + addressBook.setIsDefault(1); + addressBookMapper.update(addressBook); + } + + /** + * 根据id删除地址 + */ + public void deleteById(Long id) { + addressBookMapper.deleteById(id); + } + +} diff --git a/sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..4a18ea9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java @@ -0,0 +1,110 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.common.constant.MessageConstant; +import com.sky.common.constant.StatusConstant; +import com.sky.common.context.BaseContext; +import com.sky.common.exception.DeletionNotAllowedException; +import com.sky.common.result.PageResult; +import com.sky.mapper.CategoryMapper; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.pojo.dto.CategoryDTO; +import com.sky.pojo.dto.CategoryPageQueryDTO; +import com.sky.pojo.entity.Category; +import com.sky.service.CategoryService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 分类业务层 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class CategoryServiceImpl implements CategoryService { + private final CategoryMapper categoryMapper; + private final DishMapper dishMapper; + private final SetmealMapper setmealMapper; + + /** + * 新增分类 + */ + public void save(CategoryDTO categoryDTO) { + Category category = new Category(); + // 属性拷贝 + BeanUtils.copyProperties(categoryDTO, category); + // 分类状态默认为禁用状态0 + category.setStatus(StatusConstant.DISABLE); + categoryMapper.insert(category); + } + + /** + * 分页查询 + */ + public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) { + PageHelper.startPage(categoryPageQueryDTO.getPage(), categoryPageQueryDTO.getPageSize()); + // 下一条sql进行分页,自动加入limit关键字分页 + Page page = categoryMapper.pageQuery(categoryPageQueryDTO); + return new PageResult<>(page.getTotal(), page.getResult()); + } + + /** + * 根据id删除分类 + */ + public void deleteById(Long id) { + // 查询当前分类是否关联了菜品,如果关联了就抛出业务异常 + Integer count = dishMapper.countByCategoryId(id); + if (count > 0) { + // 当前分类下有菜品,不能删除 + throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH); + } + + // 查询当前分类是否关联了套餐,如果关联了就抛出业务异常 + count = setmealMapper.countByCategoryId(id); + if (count > 0) { + // 当前分类下有菜品,不能删除 + throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL); + } + + // 删除分类数据 + categoryMapper.deleteById(id); + } + + /** + * 修改分类 + */ + public void update(CategoryDTO categoryDTO) { + Category category = new Category(); + BeanUtils.copyProperties(categoryDTO, category); + + // 设置修改时间、修改人 + category.setUpdateTime(LocalDateTime.now()); + category.setUpdateUser(BaseContext.getUserId()); + + categoryMapper.update(category); + } + + /** + * 启用、禁用分类 + */ + public void startOrStop(Integer status, Long id) { + Category category = Category.builder() + .id(id) + .status(status).build(); + categoryMapper.update(category); + } + + /** + * 根据类型查询分类 + */ + public List list(Integer type) { + return categoryMapper.list(type); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java new file mode 100644 index 0000000..ad2108f --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/DishServiceImpl.java @@ -0,0 +1,211 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.common.constant.MessageConstant; +import com.sky.common.constant.StatusConstant; +import com.sky.common.exception.DeletionNotAllowedException; +import com.sky.common.result.PageResult; +import com.sky.mapper.DishFlavorMapper; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetMealDishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.pojo.dto.DishDTO; +import com.sky.pojo.dto.DishPageQueryDTO; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.entity.DishFlavor; +import com.sky.pojo.entity.Setmeal; +import com.sky.pojo.vo.DishVO; +import com.sky.service.DishService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +@RequiredArgsConstructor +@Slf4j +public class DishServiceImpl implements DishService { + private final DishMapper dishMapper; + private final DishFlavorMapper dishFlavorMapper; + private final SetMealDishMapper setMealDishMapper; + private final SetmealMapper setmealMapper; + + + /** + * 新增菜品,需要使用到事务 + * + * @param dishDTO 前端新增菜品 + */ + @Override + @Transactional + public void saveWithFlavor(DishDTO dishDTO) { + Dish dish = new Dish(); + BeanUtils.copyProperties(dishDTO, dish); + // 向菜品表插入1条数据,生成主键值 + dishMapper.insert(dish); + Long dishId = dish.getId(); + // 向口味中插入n条数据 + List flavors = dishDTO.getFlavors(); + if (flavors != null && !flavors.isEmpty()) { + flavors.forEach(dishFlavor -> { + dishFlavor.setDishId(dishId); + }); + dishFlavorMapper.insertBatch(flavors); + } + } + + /** + * 菜品分页查询 + * + * @param dto 菜品分页查询-前端参数 + * @return 封装分页查询结果 + */ + @Override + public PageResult pageQuery(DishPageQueryDTO dto) { + PageHelper.startPage(dto.getPage(), dto.getPageSize()); + Page page = dishMapper.pageQuery(dto); + return new PageResult<>(page.getTotal(), page.getResult()); + } + + /** + * 菜品批量删除 + * + * @param ids 删除的is + */ + @Override + public void deleteBatch(List ids) { + // 判断当前菜品是否是起售中菜品 + ids.forEach(id -> { + Dish dish = dishMapper.getById(id); + if (Objects.equals(dish.getStatus(), StatusConstant.ENABLE)) { + // 当前菜品属于起售中,不能删除 + throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE); + } + }); + // 判断当前菜品是否能够删除---是否被套餐关联了 + List setMealIdsByDishIds = setMealDishMapper.getSetmealIdsByDishIds(ids); + if (setMealIdsByDishIds != null && !setMealIdsByDishIds.isEmpty()) { + // 当前菜品被套餐关联了,不能删除 + throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL); + } + + // 删除菜品表中菜品数据 + dishMapper.deleteByIds(ids); + // 删除关联的口味 + dishFlavorMapper.deleteByDishIds(ids); + } + + /** + * 根据id查询菜品和对应的口味数据 + * + * @param id 菜品id + * @return DishVO + */ + @Override + public DishVO getById(Long id) { + // 根据id查询菜品数据 + Dish dish = dishMapper.getById(id); + // 根据菜品id查询口味数据 + List dishFlavors = dishFlavorMapper.getByDishId(id); + // 将查询到的数据封装到VO + DishVO dishVO = new DishVO(); + BeanUtils.copyProperties(dish, dishVO); + dishVO.setFlavors(dishFlavors); + return dishVO; + } + + /** + * 修改菜品 + * + * @param dto 前端请求菜品 + */ + @Override + public void updateWithFlavor(DishDTO dto) { + Dish dish = new Dish(); + BeanUtils.copyProperties(dto, dish); + // 修改菜品信息 + dishMapper.update(dish); + // 重新插入口味数据 + List flavors = dto.getFlavors(); + if (flavors != null && !flavors.isEmpty()) { + flavors.forEach(dishFlavor -> { + dishFlavor.setDishId(dto.getId()); + }); + // 想口味插入n条数据 + dishFlavorMapper.insertBatch(flavors); + } + } + + /** + * 菜品起售、停售 + * + * @param status 起售、停售 + */ + @Override + public void updateWithStatus(Integer status, Long id) { + Dish dish = Dish.builder().status(status).id(id).build(); + + // 修改菜品 + dishMapper.update(dish); + + // 如果是禁售,将包含当前菜品的套餐也要禁售 + if (status.equals(StatusConstant.DISABLE)) { + ArrayList dishIds = new ArrayList<>(); + dishIds.add(id); + // 根据菜品id查询对应的套餐id + List setMealIds = setMealDishMapper.getSetmealIdsByDishIds(dishIds); + if (setMealIds != null && !setMealIds.isEmpty()) { + for (Long setMealId : setMealIds) { + Setmeal setmeal = Setmeal.builder().id(setMealId).status(StatusConstant.DISABLE).build(); + setmealMapper.update(setmeal); + } + } + } + } + + /** + * 根据分类id查询菜品 + * + * @param categoryId 分类id + * @return List + */ + @Override + public List getByCategoryId(Long categoryId) { + Dish dish = Dish.builder() + .categoryId(categoryId) + .status(StatusConstant.ENABLE) + .build(); + return dishMapper.list(dish); + } + + /** + * 条件查询菜品和口味 + * + * @param dish 菜品 + * @return List + */ + public List listWithFlavor(Dish dish) { + List dishList = dishMapper.list(dish); + + List dishVOList = new ArrayList<>(); + + for (Dish d : dishList) { + DishVO dishVO = new DishVO(); + BeanUtils.copyProperties(d, dishVO); + + // 根据菜品id查询对应的口味 + List flavors = dishFlavorMapper.getByDishId(d.getId()); + + dishVO.setFlavors(flavors); + dishVOList.add(dishVO); + } + + return dishVOList; + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java new file mode 100644 index 0000000..3772769 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/EmployeeServiceImpl.java @@ -0,0 +1,184 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.common.constant.MessageConstant; +import com.sky.common.constant.PasswordConstant; +import com.sky.common.constant.StatusConstant; +import com.sky.common.context.BaseContext; +import com.sky.common.exception.AccountLockedException; +import com.sky.common.exception.AccountNotFoundException; +import com.sky.common.exception.PasswordErrorException; +import com.sky.common.result.PageResult; +import com.sky.mapper.EmployeeMapper; +import com.sky.pojo.dto.EmployeeDTO; +import com.sky.pojo.dto.EmployeeLoginDTO; +import com.sky.pojo.dto.EmployeePageQueryDTO; +import com.sky.pojo.dto.PasswordEditDTO; +import com.sky.pojo.entity.Employee; +import com.sky.service.EmployeeService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +@Service +public class EmployeeServiceImpl implements EmployeeService { + + @Autowired + private EmployeeMapper employeeMapper; + + /** + * 员工登录 + * + * @param employeeLoginDTO 员工登录时传递的数据模型 + * @return 员工信息 + */ + public Employee login(EmployeeLoginDTO employeeLoginDTO) { + String username = employeeLoginDTO.getUsername(); + String password = employeeLoginDTO.getPassword(); + + // 1、根据用户名查询数据库中的数据 + Employee employee = employeeMapper.getByUsername(username); + + // 2、处理各种异常情况(用户名不存在、密码不对、账号被锁定) + if (employee == null) { + // 账号不存在 + throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND); + } + + // 密码比对 + // 后期需要进行md5加密,然后再进行比对 + password = DigestUtils.md5DigestAsHex(password.getBytes()); + if (!password.equals(employee.getPassword())) { + // 密码错误 + throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR); + } + + // 账号被锁定 + if (Objects.equals(employee.getStatus(), StatusConstant.DISABLE)) { + throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED); + } + + // 3、返回实体对象 + return employee; + } + + /** + * 新增员工 + * + * @param employeeDTO 员工信息 + */ + @Override + public void save(EmployeeDTO employeeDTO) { + Employee employee = new Employee(); + BeanUtils.copyProperties(employeeDTO, employee); + + // 设置账号状态,1正常、0锁定 + employee.setStatus(StatusConstant.ENABLE); + // 设置密码 + employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes())); + // 设置当前时间 + employee.setCreateTime(LocalDateTime.now()); + employee.setUpdateTime(LocalDateTime.now()); + // 设置当前记录创建人id和修改人id + Long currentId = BaseContext.getUserId(); + employee.setCreateUser(currentId); + employee.setUpdateUser(currentId); + // 插入员工数据 + employeeMapper.insert(employee); + } + + /** + * 员工分页查询 + * + * @param employeePageQueryDTO 员工前端请求信息 + * @return 封装分页查询结果 + */ + @Override + public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { + PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize()); + Page page = employeeMapper.pageQuery(employeePageQueryDTO); + // 获取总数;获取结果 + long total = page.getTotal(); + List records = page.getResult(); + + return new PageResult(total, records); + } + + /** + * 启用禁用员工账号 + * + * @param status 状态 + * @param id 当前id + */ + @Override + public void startOrStop(Integer status, Long id) { + Employee employee = Employee.builder().status(status).id(id).build(); + employeeMapper.update(employee); + } + + /** + * 根据id查询员工信息 + * + * @param id 员工id + * @return 员工信息 + */ + @Override + public Employee getById(Long id) { + Employee employee = employeeMapper.getById(id); + employee.setPassword("******"); + return employee; + } + + /** + * 编辑员工信息 + * + * @param employeeDTO 前端员工信息 + */ + @Override + public void update(EmployeeDTO employeeDTO) { + Employee employee = new Employee(); + BeanUtils.copyProperties(employeeDTO, employee); + employeeMapper.update(employee); + } + + /** + * 修改密码 + * + * @param passwordEditDTO 请求修改密码相关 + */ + @Override + public void editPassword(PasswordEditDTO passwordEditDTO) { + // 判断请求不为空 + if (passwordEditDTO == null) { + throw new AccountNotFoundException(MessageConstant.REQUEST_NOT_EMPTY); + } + Long empId = passwordEditDTO.getEmpId(); + String oldPassword = passwordEditDTO.getOldPassword(); + String newPassword = passwordEditDTO.getNewPassword(); + newPassword = DigestUtils.md5DigestAsHex(newPassword.getBytes()); + oldPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes()); + + // 查看用户id信息 + Employee employee = employeeMapper.getById(empId); + + // 判断填写的密码是否与旧密码相同 + if (!employee.getPassword().equals(oldPassword)) { + throw new AccountNotFoundException(MessageConstant.OLD_PASSWORD_ERROR); + } + + // 判断新密码是否与旧密码相同 + if (employee.getPassword().equals(newPassword)) { + throw new AccountNotFoundException(MessageConstant.OLD_PASSWORD_SAME_NEW_PASSWORD); + } + + // 修改密码 + + employeeMapper.updatePassword(empId, newPassword); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/MinioServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/MinioServiceImpl.java new file mode 100644 index 0000000..1ab9f26 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/MinioServiceImpl.java @@ -0,0 +1,37 @@ +package com.sky.service.impl; + + +import com.sky.common.properties.MinioProperties; +import com.sky.common.utils.MinioUtils; +import com.sky.service.MinioService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.time.LocalDate; +import java.util.UUID; + +@Service +@Slf4j +public class MinioServiceImpl implements MinioService { + @Resource + MinioProperties minioProperties; + @Resource + private MinioUtils minioUtils; + + @Override + public String upload(MultipartFile file) throws IOException { + String extension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); + String filename = LocalDate.now() + "/" + UUID.randomUUID() + extension; + log.info("上传文件:{}", filename); + + minioUtils.bucketCreate(minioProperties.getBucketName()); + return minioUtils + .uploadFile(minioProperties.getBucketName(), + filename, + file.getInputStream(), + file.getSize()); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..666b002 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/OrderServiceImpl.java @@ -0,0 +1,467 @@ +package com.sky.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.common.constant.MessageConstant; +import com.sky.common.context.BaseContext; +import com.sky.common.exception.AddressBookBusinessException; +import com.sky.common.exception.OrderBusinessException; +import com.sky.common.exception.ShoppingCartBusinessException; +import com.sky.common.result.PageResult; +import com.sky.common.utils.WeChatPayUtil; +import com.sky.mapper.*; +import com.sky.pojo.dto.*; +import com.sky.pojo.entity.*; +import com.sky.pojo.vo.OrderPaymentVO; +import com.sky.pojo.vo.OrderStatisticsVO; +import com.sky.pojo.vo.OrderSubmitVO; +import com.sky.pojo.vo.OrderVO; +import com.sky.service.OrderService; +import com.sky.service.utils.CheckOutOfRangeUtils; +import com.sky.service.utils.OrderServiceImplUtils; +import com.sky.websocket.WebSocketServer; +import lombok.extern.slf4j.Slf4j; +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.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 订单 + */ +@Service +@Slf4j +public class OrderServiceImpl implements OrderService { + @Autowired + WebSocketServer webSocketServer; + @Autowired + OrderServiceImplUtils orderServiceImplUtils; + @Autowired + CheckOutOfRangeUtils checkOutOfRangeUtils; + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderDetailMapper orderDetailMapper; + @Autowired + private ShoppingCartMapper shoppingCartMapper; + @Autowired + private UserMapper userMapper; + @Autowired + private AddressBookMapper addressBookMapper; + @Autowired + private WeChatPayUtil weChatPayUtil; + + /** + * 用户下单 + * + * @param ordersSubmitDTO ordersSubmitDTO + * @return OrderSubmitVO + */ + @Transactional + public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) { + // 异常情况的处理(收货地址为空、购物车为空) + AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId()); + if (addressBook == null) { + throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL); + } + + // 判断是否超出范围 + String address = addressBook.getProvinceName() + addressBook.getCityName() + addressBook.getDistrictName() + addressBook.getDetail(); + checkOutOfRangeUtils.checkOutOfRange(address, 1L); + + Long userId = BaseContext.getUserId(); + ShoppingCart shoppingCart = new ShoppingCart(); + shoppingCart.setUserId(userId); + + // 查询当前用户的购物车数据 + List shoppingCartList = shoppingCartMapper.list(shoppingCart); + if (shoppingCartList == null || shoppingCartList.isEmpty()) { + throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL); + } + + // 构造订单数据 + Orders order = new Orders(); + BeanUtils.copyProperties(ordersSubmitDTO, order); + order.setPhone(addressBook.getPhone()); + order.setAddress(addressBook.getDetail()); + order.setConsignee(addressBook.getConsignee()); + order.setNumber(String.valueOf(System.currentTimeMillis())); + order.setUserId(userId); + order.setStatus(Orders.PENDING_PAYMENT); + order.setPayStatus(Orders.UN_PAID); + order.setOrderTime(LocalDateTime.now()); + + // 向订单表插入1条数据 + orderMapper.insert(order); + + // 订单明细数据 + List orderDetailList = new ArrayList<>(); + for (ShoppingCart cart : shoppingCartList) { + OrderDetail orderDetail = new OrderDetail(); + BeanUtils.copyProperties(cart, orderDetail); + orderDetail.setOrderId(order.getId()); + orderDetailList.add(orderDetail); + } + + // 向明细表插入n条数据 + orderDetailMapper.insertBatch(orderDetailList); + + // 清理购物车中的数据 + shoppingCartMapper.deleteByUserId(userId); + + // 封装返回结果 + return OrderSubmitVO.builder() + .id(order.getId()) + .orderNumber(order.getNumber()) + .orderAmount(order.getAmount()) + .orderTime(order.getOrderTime()) + .build(); + } + + /** + * 订单支付 + */ + public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception { + // 当前登录用户id + Long userId = BaseContext.getUserId(); + User user = userMapper.getById(userId); + Orders orders = orderMapper.getByNumber(ordersPaymentDTO.getOrderNumber()); + + // 调用微信支付接口,生成预支付交易单 + JSONObject jsonObject = weChatPayUtil.pay( + ordersPaymentDTO.getOrderNumber(), // 商户订单号 + new BigDecimal(orders.getAmount().toString()), // 支付金额,单位 元 + "苍穹外卖订单", // 商品描述 + user.getOpenid() // 微信用户的openid + ); + + if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) { + throw new OrderBusinessException("该订单已支付"); + } + + OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class); + vo.setPackageStr(jsonObject.getString("package")); + + return vo; + } + + /** + * 支付成功,修改订单状态 + * + * @param outTradeNo + */ + public void paySuccess(String outTradeNo) { + + // 根据订单号查询订单 + Orders ordersDB = orderMapper.getByNumber(outTradeNo); + + // 根据订单id更新订单的状态、支付方式、支付状态、结账时间 + Orders orders = Orders.builder() + .id(ordersDB.getId()) + .status(Orders.TO_BE_CONFIRMED) + .payStatus(Orders.PAID) + .checkoutTime(LocalDateTime.now()) + .build(); + + orderMapper.update(orders); + // 通过客户端浏览器推送消息 + HashMap map = new HashMap<>(); + map.put("type", 1);// 1 来单提醒 2 客户催单 + map.put("orderId", ordersDB.getId()); + map.put("content", "订单号" + outTradeNo); + String jsonString = JSON.toJSONString(map); + webSocketServer.sendToAllClient(jsonString); + } + + /** + * 历史订单 + * + * @param pageNum 当前页 + * @param pageSize 一页大小 + * @param status 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + * @return 订单列表 + */ + @Override + public PageResult pageQuery4User(int pageNum, int pageSize, Integer status) { + // 设置分页 + PageHelper.startPage(pageNum, pageSize); + OrdersPageQueryDTO ordersPageQueryDTO = new OrdersPageQueryDTO(); + ordersPageQueryDTO.setStatus(status); + ordersPageQueryDTO.setUserId(BaseContext.getUserId()); + // 分页条件查询 + Page page = orderMapper.pageQuery(ordersPageQueryDTO); + List list = new ArrayList<>(); + + // 查询出订单明细,并封装入OrderVO进行响应 + if (page != null && page.getTotal() > 0) { + for (Orders orders : page) { + Long orderId = orders.getId();// 订单id + + // 查询订单明细 + List orderDetails = orderDetailMapper.getByOrderId(orderId); + + OrderVO orderVO = new OrderVO(); + BeanUtils.copyProperties(orders, orderVO); + orderVO.setOrderDetailList(orderDetails); + + list.add(orderVO); + } + } + return new PageResult<>(page.getTotal(), list); + } + + + /** + * 催单 + * + * @param id 订单id + */ + @Override + public void reminder(Long id) { + Orders ordersDB = orderMapper.getById(id); + if (ordersDB == null) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); + } + + HashMap map = new HashMap<>(); + map.put("type", 2); + map.put("orderId", id); + map.put("content", "订单号" + ordersDB.getNumber()); + + webSocketServer.sendToAllClient(JSON.toJSONString(map)); + } + + /** + * 查询订单详情 + * + * @param id 订单id + * @return 订单详情 + */ + @Override + public OrderVO details(Long id) { + // 查询订单 + Orders orders = orderMapper.getById(id); + // 查询订单详情列表 + List orderDetailList = orderDetailMapper.getByOrderId(id); + // 封装 OrderVO + OrderVO orderVO = new OrderVO(); + BeanUtils.copyProperties(orders, orderVO); + orderVO.setOrderDetailList(orderDetailList); + return orderVO; + } + + /** + * 取消订单 + * + * @param id 订单id + */ + @Override + public void cancel(Long id) { + // 查找数据库 + Orders ordersDB = orderMapper.getById(id); + // 如果存在则继续 + if (ordersDB == null) { + throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND); + } + // 如果订单状态>2抛出异常 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + if (ordersDB.getStatus() > 2) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_NOT_OP); + } + // 订单处于待接单状态下取消,需要进行退款 + Orders orders = new Orders(); + BeanUtils.copyProperties(ordersDB, orders); + orders.setId(id); + if (orders.getStatus().equals(Orders.TO_BE_CONFIRMED)) { + // 调用微信退款... + orders.setPayStatus(OrderVO.REFUND); + } + // 更新订单状态、时间、原因等 + orders.setStatus(Orders.CANCELLED); + orders.setCancelReason("用户取消"); + orders.setCancelTime(LocalDateTime.now()); + orderMapper.update(orders); + } + + /** + * 取消订单-商家 + * + * @param dto 订单 + */ + @Override + public void cancelBusiness(OrdersCancelDTO dto) { + Orders ordersDB = orderMapper.getById(dto.getId()); + // 订单不存在 + if (ordersDB == null) { + throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND); + } + + Orders orders = new Orders(); + orders.setCancelTime(LocalDateTime.now()); + orders.setCancelReason(dto.getCancelReason()); + orders.setId(dto.getId()); + orders.setStatus(Orders.CANCELLED); + + // 更新数据 + orderMapper.update(orders); + } + + /** + * 再来一单 + * + * @param id 订单id + */ + @Override + public void repetition(Long id) { + // TODO 是否超出范围 + // 查询当前用户id + Long userId = BaseContext.getUserId(); + // 根据订单id查询当前订单详情 + List orderDetailList = orderDetailMapper.getByOrderId(id); + // 将订单详情对象转换为购物车对象 + List shoppingCartList = orderDetailList.stream().map(orderDetail -> { + ShoppingCart shoppingCart = new ShoppingCart(); + BeanUtils.copyProperties(orderDetail, shoppingCart, "id"); + + shoppingCart.setUserId(userId); + shoppingCart.setCreateTime(LocalDateTime.now()); + return shoppingCart; + }).collect(Collectors.toList()); + // 将购物车对象批量添加到数据库 + shoppingCartMapper.insertBatch(shoppingCartList); + } + + /** + * 订单搜索 + * + * @param dto 订单详情 + * @return 分页数据 + */ + @Override + public PageResult conditionSearch(OrdersPageQueryDTO dto) { + PageHelper.startPage(dto.getPage(), dto.getPageSize()); + Page page = orderMapper.pageQuery(dto); + // 部分订单状态,需要额外返回订单菜品信息,将Orders转化为OrderVO + List orderVOList = orderServiceImplUtils.getOrderVOList(page); + return new PageResult<>(page.getTotal(), orderVOList); + } + + /** + * 各个状态的订单数量统计 + * + * @return OrderStatisticsVO + */ + @Override + public OrderStatisticsVO statistics() { + // 根据状态,分别查询出待接单、待派送、派送中的订单数量 + // 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 + Integer toBeConfirmed = orderMapper.countStatus(Orders.TO_BE_CONFIRMED); + Integer confirmed = orderMapper.countStatus(Orders.CONFIRMED); + Integer deliveryInProgress = orderMapper.countStatus(Orders.DELIVERY_IN_PROGRESS); + + // 将查询出的数据封装到orderStatisticsVO中响应 + OrderStatisticsVO orderStatisticsVO = new OrderStatisticsVO(); + orderStatisticsVO.setToBeConfirmed(toBeConfirmed); + orderStatisticsVO.setConfirmed(confirmed); + orderStatisticsVO.setDeliveryInProgress(deliveryInProgress); + return orderStatisticsVO; + } + + /** + * 接单 + * + * @param dto 接单请求 + */ + @Override + public void confirm(OrdersConfirmDTO dto) { + // 订单状态 1待付款 2待接单 3 已接单 4 派送中 5 已完成 6 已取消 7 退款 + Orders orders = Orders.builder().status(Orders.CONFIRMED).id(dto.getId()).build(); + // 接单判断是否超出范围 + checkOutOfRangeUtils.checkOutOfRange(orders.getAddress(), 3L); + orderMapper.update(orders); + } + + /** + * 拒单 + * + * @param dto 拒单请求 + */ + @Override + public void rejection(OrdersRejectionDTO dto) { + Orders ordersDB = orderMapper.getById(dto.getId()); + // 订单为空不存在 + if (ordersDB == null) { + throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND); + } + // 订单状态为2才可以拒单 + if (!ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_NOT_OP); + } + + // 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间 + Orders orders = Orders.builder() + .status(Orders.CANCELLED) + .cancelReason(dto.getRejectionReason()) + .orderTime(LocalDateTime.now()) + .id(ordersDB.getId()) + .build(); + orderMapper.update(orders); + } + + /** + * 派送订单 + * + * @param id 订单id + */ + @Override + public void delivery(Long id) { + Orders ordersDB = orderMapper.getById(id); + // 订单不能再 + if (ordersDB == null) { + throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND); + } + // 状态为3 + if (!ordersDB.getStatus().equals(Orders.CONFIRMED)) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); + } + + Orders orders = Orders.builder() + .id(ordersDB.getId()) + .status(Orders.DELIVERY_IN_PROGRESS) + .orderTime(LocalDateTime.now()).build(); + orderMapper.update(orders); + } + + /** + * 完成订单 + * + * @param id 订单id + */ + @Override + public void complete(Long id) { + // 根据id查询订单 + Orders ordersDB = orderMapper.getById(id); + + // 校验订单是否存在,并且状态为4 + if (ordersDB == null || !ordersDB.getStatus().equals(Orders.DELIVERY_IN_PROGRESS)) { + throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); + } + + Orders orders = Orders.builder() + .id(ordersDB.getId()) + // 更新订单状态,状态转为完成 + .status(Orders.COMPLETED) + .deliveryTime(LocalDateTime.now()) + .build(); + + orderMapper.update(orders); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..1226aef --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java @@ -0,0 +1,233 @@ +package com.sky.service.impl; + +import com.sky.mapper.OrderMapper; +import com.sky.pojo.dto.GoodsSalesDTO; +import com.sky.pojo.entity.Orders; +import com.sky.pojo.vo.*; +import com.sky.service.ReportService; +import com.sky.service.WorkspaceService; +import com.sky.service.utils.ReportServiceImplUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class ReportServiceImpl implements ReportService { + @Autowired + ReportServiceImplUtils reportServiceImplUtils; + @Autowired + WorkspaceService workspaceService; + @Autowired + private OrderMapper orderMapper; + + /** + * 营业额数据统计 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 营业额数据统计 + */ + @Override + public TurnoverReportVO getTurnover(LocalDate begin, LocalDate end) { + ArrayList dateArrayList = new ArrayList<>(); + List turnoverList = new ArrayList<>(); + + dateArrayList.add(begin); + while (!begin.equals(end)) { + // 计算指定日期的后一天 + begin = begin.plusDays(1); + dateArrayList.add(begin); + } + + // 查询数据 + for (LocalDate date : dateArrayList) { + // 查询date日期对应营业额数据 + LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); + Map map = new HashMap(); + map.put("status", Orders.COMPLETED); + map.put("begin", beginTime); + map.put("end", endTime); + // 根据动态条件统计营业额 + Double turnover = orderMapper.sumByMap(map); + turnover = turnover == null ? 0.0 : turnover; + turnoverList.add(turnover); + } + + return TurnoverReportVO.builder() + // 将 dateArrayList 变成字符串 + .dateList(StringUtils.join(dateArrayList, ",")) + // 将数据变成字符串 + .turnoverList(StringUtils.join(turnoverList, ",")) + .build(); + } + + /** + * 用户数据统计 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 用户数据统计 + */ + @Override + public UserReportVO getUserStatistics(LocalDate begin, LocalDate end) { + // 初始化时间 + ArrayList dateArrayList = new ArrayList<>(); + // 新增用户数 + ArrayList newUserList = new ArrayList<>(); + // 总用户数 + ArrayList totalUserList = new ArrayList<>(); + + dateArrayList.add(begin); + while (!begin.equals(end)) { + begin = begin.plusDays(1); + dateArrayList.add(begin); + } + + for (LocalDate date : dateArrayList) { + LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); + // 新增用户数 + Integer newUser = reportServiceImplUtils.getUserCount(beginTime, endTime); + // 总用户数 + Integer totalUser = reportServiceImplUtils.getUserCount(null, endTime); + newUserList.add(newUser); + totalUserList.add(totalUser); + } + + return UserReportVO.builder() + .dateList(StringUtils.join(dateArrayList, ",")) + .newUserList(StringUtils.join(newUserList, ",")) + .totalUserList(StringUtils.join(totalUserList, ",")) + .build(); + } + + /** + * 订单统计接口 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 订单统计 + */ + @Override + public OrderReportVO getOrdersStatistics(LocalDate begin, LocalDate end) { + // 封装dateList + ArrayList dateList = new ArrayList<>(); + dateList.add(begin); + while (!begin.equals(end)) { + begin = begin.plusDays(1); + dateList.add(begin); + } + + // 查询每天订单总数 & 查询每天有效订单数 + ArrayList orderCountList = new ArrayList<>(); + ArrayList validOrderCountList = new ArrayList<>(); + for (LocalDate date : dateList) { + LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); + // 查询每天订单总数 + Integer orderCount = reportServiceImplUtils.getOrderCount(beginTime, endTime, null); + orderCountList.add(orderCount); + // 查询每天有效订单数 + Integer validOrderCount = reportServiceImplUtils.getOrderCount(beginTime, endTime, 5); + validOrderCountList.add(validOrderCount); + } + + // 订单总数 + Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).orElse(0);// 如果为空,则返回默认值 0 + // 有效订单数 + Integer validOrderCount = validOrderCountList.stream().reduce(Integer::sum).orElse(0);// 如果为空,则返回默认值 0 + // 订单完成率 + double orderCompletionRate = totalOrderCount != 0 ? validOrderCount.doubleValue() / totalOrderCount.doubleValue() : 0.0; + + return OrderReportVO.builder() + .dateList(StringUtils.join(dateList, ",")) + .orderCountList(StringUtils.join(orderCountList, ",")) + .validOrderCountList(StringUtils.join(validOrderCountList, ",")) + .totalOrderCount(totalOrderCount) + .validOrderCount(validOrderCount) + .orderCompletionRate(orderCompletionRate).build(); + } + + /** + * 查询销量排名top10接口 + * + * @param begin 开始时间 + * @param end 结束时间 + * @return 销量排名top10 + */ + @Override + public SalesTop10ReportVO getTop10Statistics(LocalDate begin, LocalDate end) { + // 查询销量前10列表 + LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX); + List salesTop = orderMapper.getSalesTop10(beginTime, endTime); + List nameList = salesTop.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()); + List numberList = salesTop.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList()); + return SalesTop10ReportVO.builder() + .nameList(StringUtils.join(nameList, ",")) + .numberList(StringUtils.join(numberList, ",")).build(); + } + + /** + * 导出Excel报表接口 + * + * @param response HttpServletResponse + */ + @Override + public void exportBusinessData(HttpServletResponse response) { + // 1. 查询数据库,获取营业数据 + LocalDate dateBegin = LocalDate.now().minusDays(30); + LocalDate dateEnd = LocalDate.now().minusDays(1); + // 查询概览数据 + BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX)); + // 2. 通过POI将数据写入到Excel文件中 + InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx"); + try { + XSSFWorkbook excel = new XSSFWorkbook(in); + XSSFSheet sheet = excel.getSheet("Sheet1"); + sheet.getRow(1).getCell(1).setCellValue("时间" + dateBegin + "至" + dateEnd);// 标题 + sheet.getRow(3).getCell(2).setCellValue(businessDataVO.getTurnover());// 营业额 + sheet.getRow(3).getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());// 订单完成率 + sheet.getRow(3).getCell(6).setCellValue(businessDataVO.getNewUsers());// 新增用户数 + sheet.getRow(4).getCell(2).setCellValue(businessDataVO.getValidOrderCount());// 有效订单数 + sheet.getRow(4).getCell(4).setCellValue(businessDataVO.getUnitPrice());// 平均客单价 + + for (int i = 0; i < 30; i++) { + LocalDate date = dateBegin.plusDays(i); + // 查询某一天数据 + BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX)); + XSSFRow row = sheet.getRow(7 + i); + row.getCell(1).setCellValue(date.toString()); + row.getCell(2).setCellValue(businessData.getTurnover()); + row.getCell(3).setCellValue(businessData.getValidOrderCount()); + row.getCell(4).setCellValue(businessData.getOrderCompletionRate()); + row.getCell(5).setCellValue(businessData.getUnitPrice()); + row.getCell(6).setCellValue(businessData.getNewUsers()); + } + // 3. 通过输出流将Excel下载到客户端浏览器 + ServletOutputStream out = response.getOutputStream(); + excel.write(out); + excel.close(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java new file mode 100644 index 0000000..18c91c3 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java @@ -0,0 +1,176 @@ +package com.sky.service.impl; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.sky.common.constant.MessageConstant; +import com.sky.common.constant.StatusConstant; +import com.sky.common.exception.SetMealEnableFailedException; +import com.sky.common.result.PageResult; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetMealDishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.pojo.dto.SetmealDTO; +import com.sky.pojo.dto.SetmealPageQueryDTO; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.entity.Setmeal; +import com.sky.pojo.entity.SetmealDish; +import com.sky.pojo.vo.DishItemVO; +import com.sky.pojo.vo.SetmealVO; +import com.sky.service.SetmealService; +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.util.List; + +@Service +@Transactional +public class SetmealServiceImpl implements SetmealService { + @Autowired + SetmealMapper setmealMapper; + @Autowired + SetMealDishMapper setMealDishMapper; + @Autowired + DishMapper dishMapper; + + /** + * 分页查询 + * + * @param dto 前端请求 + * @return PageResult + */ + @Override + public PageResult pageQuery(SetmealPageQueryDTO dto) { + int pageSize = dto.getPageSize(); + int page = dto.getPage(); + PageHelper.startPage(page, pageSize); + + Page setmealVOPage = setmealMapper.pageQuery(dto); + return new PageResult<>(setmealVOPage.getTotal(), setmealVOPage.getResult()); + } + + /** + * 根据id查询套餐 + * + * @param id 套餐id + * @return 套餐相关信息 + */ + @Override + public SetmealVO page4Id(Long id) { + // 查找套餐 + Setmeal setmeal = setmealMapper.getById(id); + // 根据id查找菜品 + List setmealDishList = setMealDishMapper.getBySetmealId(id); + SetmealVO setmealVO = new SetmealVO(); + + BeanUtils.copyProperties(setmeal, setmealVO); + setmealVO.setSetmealDishes(setmealDishList); + + return setmealVO; + } + + /** + * 修改套餐 + * + * @param dto 前端请求 + */ + @Override + public void update(SetmealDTO dto) { + Setmeal setmeal = new Setmeal(); + BeanUtils.copyProperties(dto, setmeal); + // 修改套餐 + setmealMapper.update(setmeal); + + // 先删除相关套餐菜品 + Long setmealId = dto.getId(); + setMealDishMapper.deleteBySetmealId(setmealId); + + // 插入菜品 + List setmealDishes = dto.getSetmealDishes(); + setmealDishes.forEach(setmealDish -> setmealDish.setSetmealId(setmealId)); + setMealDishMapper.insert(setmealDishes); + } + + /** + * 新增套餐 + * + * @param setmealDTO 套餐信息 + */ + @Override + @Transactional + public void insert(SetmealDTO setmealDTO) { + // 插入套餐 + Setmeal setmeal = new Setmeal(); + BeanUtils.copyProperties(setmealDTO, setmeal); + setmealMapper.insert(setmeal); + + // 插入套餐菜品 + List setmealDishes = setmealDTO.getSetmealDishes(); + setmealDishes.forEach(setmealDish -> setmealDish.setSetmealId(setmeal.getId())); + + setMealDishMapper.insert(setmealDishes); + } + + + /** + * 套餐起售、停售 + * + * @param status 状态 + * @param id id + */ + @Override + public void updateStatus(Integer status, Long id) { + List byCategoryId = dishMapper.getBySetmealId(id); + // 判断当前是否有停售的菜品,如果有则不能起售 + if (status.equals(StatusConstant.ENABLE)) { + byCategoryId.forEach(dishVO -> { + if (dishVO.getStatus().equals(StatusConstant.DISABLE)) { + throw new SetMealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED); + } + }); + } + // 修改起售或停售 + Setmeal setmeal = Setmeal.builder().status(status).id(id).build(); + setmealMapper.update(setmeal); + } + + /** + * 批量删除套餐 + * + * @param ids 要删除套餐ids + */ + @Override + @Transactional + public void delete(List ids) { + // 查看当前是否是起售,起售中不能删除 + ids.forEach(id -> { + Setmeal setmeal = setmealMapper.getById(id); + if (setmeal.getStatus().equals(StatusConstant.ENABLE)) { + throw new SetMealEnableFailedException(MessageConstant.SETMEAL_ON_SALE); + } + }); + setmealMapper.delete(ids); + setMealDishMapper.deleteBySetmealIds(ids); + } + + /** + * 条件查询 + * + * @param setmeal 套餐 + * @return List + */ + public List list(Setmeal setmeal) { + return setmealMapper.list(setmeal); + } + + /** + * 根据id查询菜品选项 + * + * @param id id + * @return List + */ + public List getDishItemById(Long id) { + return setmealMapper.getDishItemBySetmealId(id); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java new file mode 100644 index 0000000..ab2fdbf --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/ShoppingCartServiceImpl.java @@ -0,0 +1,120 @@ +package com.sky.service.impl; + +import com.sky.common.context.BaseContext; +import com.sky.mapper.DishMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.mapper.ShoppingCartMapper; +import com.sky.pojo.dto.ShoppingCartDTO; +import com.sky.pojo.entity.Dish; +import com.sky.pojo.entity.Setmeal; +import com.sky.pojo.entity.ShoppingCart; +import com.sky.service.ShoppingCartService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +@Slf4j +public class ShoppingCartServiceImpl implements ShoppingCartService { + @Autowired + ShoppingCartMapper shoppingCartMapper; + @Autowired + DishMapper dishMapper; + @Autowired + SetmealMapper setmealMapper; + + /** + * 添加购物车 + * + * @param shoppingCartDTO 购物车请求参数 + */ + @Override + public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) { + ShoppingCart shoppingCart = new ShoppingCart(); + BeanUtils.copyProperties(shoppingCartDTO, shoppingCart); + // 只能查询自己的购物车数据 + shoppingCart.setUserId(BaseContext.getUserId()); + + // 判断当前加入购物车中上是否已经存在 + List shoppingCartList = shoppingCartMapper.list(shoppingCart); + if (shoppingCartList != null && shoppingCartList.size() == 1) { + ShoppingCart cart = shoppingCartList.get(0); + cart.setNumber(cart.getNumber() + 1); + // 加一之后修改 数据库中数据-根据id更新购物车数量 + shoppingCartMapper.updateById(cart); + } else { + // 如果不存在则插入 + Long dishId = shoppingCart.getDishId(); + Long setmealId = shoppingCart.getSetmealId(); + // 判断添加的是套餐还是菜品 + if (dishId != null) { + // 添加的是菜品 + Dish dish = dishMapper.getById(dishId); + shoppingCart.setName(dish.getName()); + shoppingCart.setImage(dish.getImage()); + shoppingCart.setAmount(dish.getPrice()); + } else { + // 添加的是套餐 + Setmeal setmeal = setmealMapper.getById(setmealId); + shoppingCart.setName(setmeal.getName()); + shoppingCart.setImage(setmeal.getImage()); + shoppingCart.setAmount(setmeal.getPrice()); + } + // 插入购物车 + shoppingCart.setNumber(1); + shoppingCart.setCreateTime(LocalDateTime.now()); + shoppingCartMapper.insert(shoppingCart); + } + } + + /** + * 删除购物车商品 + * + * @param shoppingCartDTO 购物车请求参数 + */ + @Override + public void subdShoppingCart(ShoppingCartDTO shoppingCartDTO) { + // 初始化购物车,相关信息,包括用户id + ShoppingCart shoppingCart = new ShoppingCart(); + BeanUtils.copyProperties(shoppingCartDTO, shoppingCart); + shoppingCart.setUserId(BaseContext.getUserId()); + // 查询购物车 + List shoppingCartList = shoppingCartMapper.list(shoppingCart); + if (shoppingCartList != null && !shoppingCartList.isEmpty()) { + ShoppingCart cart = shoppingCartList.get(0); + Integer number = cart.getNumber(); + Long cartId = cart.getId(); + // 如果数量为1直接删除购物车这条数据 + if (number == 1) { + shoppingCartMapper.deleteById(cartId); + } else { + cart.setNumber(number - 1); + shoppingCartMapper.updateById(cart); + } + } + } + + /** + * 查询购物车 + * + * @return 购物车列表 + */ + @Override + public List list() { + ShoppingCart shoppingCart = ShoppingCart.builder().userId(BaseContext.getUserId()).build(); + log.info("查询购物车-用户id:{}", shoppingCart.getUserId()); + return shoppingCartMapper.list(shoppingCart); + } + + /** + * 清空购物车商品 + */ + @Override + public void cleanShoppingCart() { + shoppingCartMapper.deleteByUserId(BaseContext.getUserId()); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..7d4b882 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java @@ -0,0 +1,78 @@ +package com.sky.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sky.common.constant.MessageConstant; +import com.sky.common.exception.LoginFailedException; +import com.sky.common.properties.WeChatProperties; +import com.sky.common.utils.HttpClientUtil; +import com.sky.mapper.UserMapper; +import com.sky.pojo.dto.UserLoginDTO; +import com.sky.pojo.entity.User; +import com.sky.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@Service +public class UserServiceImpl implements UserService { + // 微信服务接口地址 + public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session"; + + @Autowired + private WeChatProperties weChatProperties; + @Autowired + private UserMapper userMapper; + + /** + * 微信登录 + * + * @param userLoginDTO userLoginDTO + * @return User + */ + public User wxLogin(UserLoginDTO userLoginDTO) { + String openid = getOpenid(userLoginDTO.getCode()); + + // 判断openid是否为空,如果为空表示登录失败,抛出业务异常 + if (openid == null) { + throw new LoginFailedException(MessageConstant.LOGIN_FAILED); + } + + // 判断当前用户是否为新用户 + User user = userMapper.getByOpenid(openid); + + // 如果是新用户,自动完成注册 + if (user == null) { + user = User.builder() + .openid(openid) + .createTime(LocalDateTime.now()) + .build(); + userMapper.insert(user);// 后绪步骤实现 + } + + // 返回这个用户对象 + return user; + } + + /** + * 调用微信接口服务,获取微信用户的openid + * + * @param code code + * @return String + */ + private String getOpenid(String code) { + // 调用微信接口服务,获得当前微信用户的openid + Map map = new HashMap<>(); + map.put("appid", weChatProperties.getAppid()); + map.put("secret", weChatProperties.getSecret()); + map.put("js_code", code); + map.put("grant_type", "authorization_code"); + String json = HttpClientUtil.doGet(WX_LOGIN, map); + + JSONObject jsonObject = JSON.parseObject(json); + return jsonObject.getString("openid"); + } +} diff --git a/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java new file mode 100644 index 0000000..b5999c1 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java @@ -0,0 +1,151 @@ +package com.sky.service.impl; + + +import com.sky.common.constant.StatusConstant; +import com.sky.mapper.DishMapper; +import com.sky.mapper.OrderMapper; +import com.sky.mapper.SetmealMapper; +import com.sky.mapper.UserMapper; +import com.sky.pojo.entity.Orders; +import com.sky.pojo.vo.BusinessDataVO; +import com.sky.pojo.vo.DishOverViewVO; +import com.sky.pojo.vo.OrderOverViewVO; +import com.sky.pojo.vo.SetmealOverViewVO; +import com.sky.service.WorkspaceService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.HashMap; + +@Service +@Slf4j +public class WorkspaceServiceImpl implements WorkspaceService { + + @Autowired + private OrderMapper orderMapper; + @Autowired + private UserMapper userMapper; + @Autowired + private DishMapper dishMapper; + @Autowired + private SetmealMapper setmealMapper; + + /** + * 根据时间段统计营业数据 + */ + public BusinessDataVO getBusinessData(LocalDateTime begin, LocalDateTime end) { + /** + * 营业额:当日已完成订单的总金额 + * 有效订单:当日已完成订单的数量 + * 订单完成率:有效订单数 / 总订单数 + * 平均客单价:营业额 / 有效订单数 + * 新增用户:当日新增用户的数量 + */ + HashMap map = new HashMap<>(); + map.put("begin", begin); + map.put("end", end); + + // 查询总订单数 + Integer totalOrderCount = orderMapper.countByMap(map); + + map.put("status", Orders.COMPLETED); + // 营业额 + Double turnover = orderMapper.sumByMap(map); + turnover = turnover == null ? 0.0 : turnover; + + // 有效订单数 + Integer validOrderCount = orderMapper.countByMap(map); + + Double unitPrice = 0.0; + + Double orderCompletionRate = 0.0; + if (totalOrderCount != 0 && validOrderCount != 0) { + // 订单完成率 + orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount; + // 平均客单价 + unitPrice = turnover / validOrderCount; + } + + // 新增用户数 + Integer newUsers = userMapper.countByMap(map); + + return BusinessDataVO.builder() + .turnover(turnover) + .validOrderCount(validOrderCount) + .orderCompletionRate(orderCompletionRate) + .unitPrice(unitPrice) + .newUsers(newUsers) + .build(); + } + + + /** + * 查询订单管理数据 + */ + public OrderOverViewVO getOrderOverView() { + HashMap map = new HashMap<>(); + map.put("begin", LocalDateTime.now().with(LocalTime.MIN)); + map.put("status", Orders.TO_BE_CONFIRMED); + + // 待接单 + Integer waitingOrders = orderMapper.countByMap(map); + + // 待派送 + map.put("status", Orders.CONFIRMED); + Integer deliveredOrders = orderMapper.countByMap(map); + + // 已完成 + map.put("status", Orders.COMPLETED); + Integer completedOrders = orderMapper.countByMap(map); + + // 已取消 + map.put("status", Orders.CANCELLED); + Integer cancelledOrders = orderMapper.countByMap(map); + + // 全部订单 + map.put("status", null); + Integer allOrders = orderMapper.countByMap(map); + + return OrderOverViewVO.builder() + .waitingOrders(waitingOrders) + .deliveredOrders(deliveredOrders) + .completedOrders(completedOrders) + .cancelledOrders(cancelledOrders) + .allOrders(allOrders) + .build(); + } + + /** + * 查询菜品总览 + */ + public DishOverViewVO getDishOverView() { + HashMap map = new HashMap<>(); + map.put("status", StatusConstant.ENABLE); + Integer sold = dishMapper.countByMap(map); + + map.put("status", StatusConstant.DISABLE); + Integer discontinued = dishMapper.countByMap(map); + + return DishOverViewVO.builder() + .sold(sold) + .discontinued(discontinued) + .build(); + } + + /** + * 查询套餐总览 + */ + public SetmealOverViewVO getSetmealOverView() { + HashMap map = new HashMap<>(); + map.put("status", StatusConstant.ENABLE); + Integer sold = setmealMapper.countByMap(map); + + map.put("status", StatusConstant.DISABLE); + Integer discontinued = setmealMapper.countByMap(map); + + return SetmealOverViewVO.builder().sold(sold).discontinued(discontinued).build(); + } +} diff --git a/sky-server/src/main/java/com/sky/service/utils/CheckOutOfRangeUtils.java b/sky-server/src/main/java/com/sky/service/utils/CheckOutOfRangeUtils.java new file mode 100644 index 0000000..15ccb66 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/utils/CheckOutOfRangeUtils.java @@ -0,0 +1,95 @@ +package com.sky.service.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.sky.common.exception.OrderBusinessException; +import com.sky.common.utils.HttpClientUtil; +import com.sky.mapper.EmployeeMapper; +import com.sky.pojo.entity.Employee; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +@Slf4j +public class CheckOutOfRangeUtils { + @Autowired + EmployeeMapper employeeMapper; + + @Value("${sky.baidu.ak}") + private String ak; + + public void checkOutOfRange(String address, Long shopId) { + // 商家地址 + Employee employee = employeeMapper.getById(shopId); + String shopAddress = employee.getShopAddress(); + + Map map = new HashMap<>(); + map.put("address", shopAddress); + map.put("output", "json"); + map.put("ak", ak); + // 获取店铺的经纬度坐标 +/* ResponseEntity shopCoordinate = new RestTemplateUtils().requestGet("https://api.map.baidu.com/geocoding/v3", baiduMap); + + BaiduMap baiduMap = new BaiduMap(); + baiduMap.setAddress(shopAddress); + baiduMap.setOutput("json"); + baiduMap.setAk(ak); */ + String shopCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map); + + JSONObject jsonObject = JSON.parseObject(shopCoordinate); + if (!jsonObject.getString("status").equals("0")) { + throw new OrderBusinessException("店铺地址解析失败"); + } + + // 数据解析 + JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location"); + String lat = location.getString("lat"); + String lng = location.getString("lng"); + // 店铺经纬度坐标 + String shopLngLat = lat + "," + lng; + + map.put("address", address); + // 获取用户收货地址的经纬度坐标 + String userCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map); + + jsonObject = JSON.parseObject(userCoordinate); + if (!jsonObject.getString("status").equals("0")) { + throw new OrderBusinessException("收货地址解析失败"); + } + + // 数据解析 + location = jsonObject.getJSONObject("result").getJSONObject("location"); + lat = location.getString("lat"); + lng = location.getString("lng"); + // 用户收货地址经纬度坐标 + String userLngLat = lat + "," + lng; + + map.put("origin", shopLngLat); + map.put("destination", userLngLat); + map.put("steps_info", "0"); + + // 路线规划 + String json = HttpClientUtil.doGet("https://api.map.baidu.com/directionlite/v1/driving", map); + + jsonObject = JSON.parseObject(json); + if (!jsonObject.getString("status").equals("0")) { + throw new OrderBusinessException("配送路线规划失败"); + } + + // 数据解析 + JSONObject result = jsonObject.getJSONObject("result"); + JSONArray jsonArray = (JSONArray) result.get("routes"); + Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance"); + + if (distance > 5000) { + // 配送距离超过5000米 + throw new OrderBusinessException("超出配送范围"); + } + } +} diff --git a/sky-server/src/main/java/com/sky/service/utils/OrderServiceImplUtils.java b/sky-server/src/main/java/com/sky/service/utils/OrderServiceImplUtils.java new file mode 100644 index 0000000..a1d2244 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/utils/OrderServiceImplUtils.java @@ -0,0 +1,56 @@ +package com.sky.service.utils; + +import com.github.pagehelper.Page; +import com.sky.mapper.OrderDetailMapper; +import com.sky.pojo.entity.OrderDetail; +import com.sky.pojo.entity.Orders; +import com.sky.pojo.vo.OrderVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class OrderServiceImplUtils { + @Autowired + private OrderDetailMapper orderDetailMapper; + + // 部分订单状态,需要额外返回订单菜品信息,将Orders转化为OrderVO + public List getOrderVOList(Page page) { + // 需要返回订单菜品信息,自定义OrderVO响应结果 + List orderVOList = new ArrayList<>(); + + List ordersList = page.getResult(); + if (!CollectionUtils.isEmpty(ordersList)) { + for (Orders orders : ordersList) { + // 将共同字段复制到OrderVO + OrderVO orderVO = new OrderVO(); + BeanUtils.copyProperties(orders, orderVO); + String orderDishes = getOrderDishesStr(orders); + + // 将订单菜品信息封装到orderVO中,并添加到orderVOList + orderVO.setOrderDishes(orderDishes); + orderVOList.add(orderVO); + } + } + return orderVOList; + } + + // 根据订单id获取菜品信息字符串 + public String getOrderDishesStr(Orders orders) { + // 查询订单菜品详情信息(订单中的菜品和数量) + List orderDetailList = orderDetailMapper.getByOrderId(orders.getId()); + + // 将每一条订单菜品信息拼接为字符串(格式:宫保鸡丁*3;) + List orderDishList = orderDetailList.stream().map(x -> x.getName() + "*" + x.getNumber() + ";").collect(Collectors.toList()); + + // 将该订单对应的所有菜品信息拼接在一起 + return String.join("", orderDishList); + } +} diff --git a/sky-server/src/main/java/com/sky/service/utils/ReportServiceImplUtils.java b/sky-server/src/main/java/com/sky/service/utils/ReportServiceImplUtils.java new file mode 100644 index 0000000..29314e9 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/utils/ReportServiceImplUtils.java @@ -0,0 +1,39 @@ +package com.sky.service.utils; + +import com.sky.mapper.OrderMapper; +import com.sky.mapper.UserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.HashMap; + +@Component +public class ReportServiceImplUtils { + @Autowired + UserMapper userMapper; + @Autowired + private OrderMapper orderMapper; + + /** + * 根据时间区间统计用户数量 + * + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return Integer + */ + public Integer getUserCount(LocalDateTime beginTime, LocalDateTime endTime) { + HashMap map = new HashMap<>(); + map.put("begin", beginTime); + map.put("end", endTime); + return userMapper.countByMap(map); + } + + public Integer getOrderCount(LocalDateTime beginTime, LocalDateTime endTime, Integer status) { + HashMap map = new HashMap<>(); + map.put("begin", beginTime); + map.put("end", endTime); + map.put("status", status); + return orderMapper.countByMap(map); + } +} diff --git a/sky-server/src/main/resources/application-dev.yml b/sky-server/src/main/resources/application-dev.yml new file mode 100644 index 0000000..f340038 --- /dev/null +++ b/sky-server/src/main/resources/application-dev.yml @@ -0,0 +1,32 @@ +sky: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + host: 106.15.251.123 + port: 3305 + database: sky_take_out + username: root + password: "02120212" + + minio: + endpointUrl: "http://129.211.31.58:9000" + bucket-name: sky + accessKey: "bunny" + secretKey: "02120212" + + redis: + host: 106.15.251.123 + port: 6378 + password: "02120212" + database: 10 + + wechat: + appid: wx18e5556d7539757b + secret: ac06f1c49f90a2ed69f1a946d4981833 + + baidu: + ak: sUMa2pGqc6z2gYbQyeRVMQuyinKWjmKP + +spring: + servlet: + multipart: + max-file-size: 2MB diff --git a/sky-server/src/main/resources/application.yml b/sky-server/src/main/resources/application.yml new file mode 100644 index 0000000..671e8a6 --- /dev/null +++ b/sky-server/src/main/resources/application.yml @@ -0,0 +1,62 @@ +server: + port: 8080 + +spring: + profiles: + active: dev + # mvc: + # pathmatch: + # matching-strategy: ant_path_matcher #没有写MVC配置会报错 + main: + allow-circular-references: true + datasource: + druid: + driver-class-name: ${sky.datasource.driver-class-name} + url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true + username: ${sky.datasource.username} + password: ${sky.datasource.password} + redis: + host: ${sky.redis.host} + port: ${sky.redis.port} + password: ${sky.redis.password} + database: ${sky.redis.database} + +mybatis: + #mapper配置文件 + mapper-locations: classpath:mapper/*.xml + type-aliases-package: com.sky.pojo.entity + configuration: + map-underscore-to-camel-case: true # 开启驼峰命名 + +logging: + level: + com: + sky: + mapper: debug + service: info + controller: info + +sky: + jwt: + # 设置jwt签名加密时使用的秘钥 + admin-secret-key: itcast + # 设置jwt过期时间 + admin-ttl: 7200000 + # 设置前端传递过来的令牌名称 + admin-token-name: token + user-secret-key: itheima + user-ttl: 7200000 + user-token-name: authentication + + wechat: + appid: ${sky.wechat.appid} + secret: ${sky.wechat.secret} + + minio: + endpointUrl: ${sky.minio.endpointUrl} + accessKey: ${sky.minio.accessKey} + secretKey: ${sky.minio.secretKey} + bucket-name: ${sky.minio.bucket-name} + + baidu: + ak: ${sky.baidu.ak} \ No newline at end of file diff --git a/sky-server/src/main/resources/banner.txt b/sky-server/src/main/resources/banner.txt new file mode 100644 index 0000000..cc77fc2 --- /dev/null +++ b/sky-server/src/main/resources/banner.txt @@ -0,0 +1,16 @@ +-----------------▄██-█▄--------- +-----------------███▄██▄-------- +-----------------███████-------- +-----------------▀███████------- +-------------------██████▄▄----- +-------------------█████████▄--- +-------------------██████▄████-- +-------▄███████████████████████- +-----▄███████████████████████▀-- +---▄██████████████████████------ +---███████████████████████------ +---███████████████████████------ +-▄▄██████████████████████▀------ +-█████████████████▀█████-------- +-▀██████████████▀▀-▀█████▄------ +-------▀▀▀▀▀▀▀▀▀------▀▀▀▀------ \ No newline at end of file diff --git a/sky-server/src/main/resources/favicon.ico b/sky-server/src/main/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1ba397c45de65f92b238bb9f94608320bf32209b GIT binary patch literal 13342 zcmYMb2RvK<_dovbTeWJHTD5C$N{phYO=9moN)cLn)hrdnruM8fp;~)yZCcbO_O7ZC zvnp1s-}U}}{*V77x%Vbla$e`2^E~G~&&dVX(@`fQW+49OpMS_SHB=0Mz*{?CHOEodoQJ=+!Z-We0a8^BvmTDgh4}PdJ-?Pgxn8ONSiNFP*gX4eA<~8KIC2DE_a0 zuqwFLN|DRII z-niJe*e*K$jc&I70p;5vIY$@P3kcQ>*2g~X{g>cQv3iW8p#TjVGB)Mo$LwmF#+*ho zLIEgO{@LmiHJSXi+pV^2@#{=-##dNB&K>h z=Qf<0zogtXijqSuVJ5vgRg$Y5)ll7&4gt_ym9^S;aFw2AqvG7&eS<}nh~QF=%UcA_YOh(A`uBPa?Rq7lxOETbq=5u}O+ zGQAR+9>>om?8RpFlkzMj}Mfy210{(%P@R#JvjM$^)y4CYwTo>zvXs|h`(;GcKdr@oAT50+o}BlyV2Pu??>B0 zzY4SW_}twxn+Eq5401y+mvPUhAa4hm5vH&WGz8m3B7)N8ZcmpNruO}$2Oh;Cc3l0d zw)gY%6rN1)$%_`Y3zVE_tvNSt7g>0OZNXz$EF2QIPTn7#8<3iiQ#VasaD(c0{02`nW5}Gm8hOSpD`$}{;qMr6TU;ku?~U$ zw%_+vh0|M&^W6>zs2aoWTiDiys2>yw_``T;g?G#>XId+oOIvxSJqCuP;ODhgALw1~ zYA<6_VWd?WMK*X}j7QeLD=i7pj|gBcv6&AD8dBaS*eq7dV2xt}kw?7OJi0H-pEkr@ z_xJB>Y!CRWuNF_iO}wZAaC;y3G*66JtJVkd!Z&*xk^kFUYl^&R+-l}r#}vve8uXGCe!9976Q}5c zq+vN@hK7C>gLR#I1nn1`wAPsRgl=_mALn2EnJ;r zE#y^!)F}rfuFy&wsMq4bTgRKpn@O9;ygrEc)Gv5*UzEz`(~J0%(edSmj=jq0bahg# z%Z8rBTns4emN(IDtuJ6thA*qGoAJ*3j!`&5x6qX<&4bfGDDB;nW4*RuUD*ZHLS0+% zv~QStM>|K;`If(WQnzQ`Sstkr_87XZqKw5>)dW6UOrest{~L$%TA7Aa(S>yYFN}xM z+>88+R)iPj$0%X`Su5P*grcK@-#iywqd8t2H#&7vEJ~od90X4?_S8SI&R!lTUt}rF zx%T-M12(%p)Gv$T+L(l1SofD@H8{B9rn47OU77*U zKs*d!-SEV20tB0YbTJ;x?=#0WL|)fce>a^R=AV4U?T0YOFpCxVAzHZSn8%h7OZugE zw{V?Xw)Z~7*PUF1skU^xvd9~$Q=}F5Fx&dc$L1=3cXYw8eWz)yX=TR8NTQq znZ8<)6lLB-Y>(uq)Sb{?ZDjklu|AU{K`ZN`!Tk5$`&nye!& zEvtFm>%W0-w|rbf)pF1Z(_5_KohJ(Wvu(kaq{|cgSMaM%q1|E2+$%EHxIapPiILBm zAJ`C6Q*-`{{ap5lf{2xl=r%D%5CrbI>zf7{{vPi?e&*miEd6!RoMHzYNASW^qol62i-w!iFSv#w(rk8wSVgH)VUSsrkynzXg)dM z`t;25b4>W!&UyHY(5rxn{m-BG-L}fkmbI^H_>}OZ7Dba6?%UoAh702Ip#y99PM2kq z)^p)-nQ0;CTo@e&vSJLM)%Itp_9;4(Gs>l3m3CJ6*;nLq9J-~VI1or9?fhfHo5!2SW(&^Yh?fhE>kA&zD&MX1vd3&^yc>_UF}Xi zxOg?cYLk@sgXBfX^lbAl%hR?v9DTh!jI*8N0`B=*a{PO$%kpFQF8kJIkyY&lN_k=6 zS>scLjeLfM25eS=ti8_+3$GXpuiUmYk|yAPyx@NzXo%u%N+Qf>G)R*>M?(aa%!%&h zY7LF%z;kS6uG|@rAl_EbzfKwNTKmOgbrE%RH!2wt^{ly;hp;6k<44TaDMydQI4m5h zbOfl9c&)nHdxx~#JugH#Q^EL`Z0&2vcVWfTW|hDWsP>|Px;Hx&oReoO6ROSJmnw6k zp-o(*5;fw3Z#ql&w((Xp6yn|&2R32V1eOtZD-i$p?l?Y$p(vWt72pM$vD`H8wH zY-r@usLcB~-)V_yI^wf&eJT`WC=_YEtnYdHu-l|iBom*dYgz`bk4r37!}I~1^IiFG z73L0`Aht`TMwdQ%_aI>*xhxjO%kv9RVprNysvuI+94t z1F|s#1_am56ATeofk5?R9}&k(&0ccLdWbE&Up!D6uRDCRea%-l|Ircu{pN~`bH;>S zXjQfwyd7KZ+U+b-siafi=^{zRedeU&n;yDTkVRg->9(AJJL!N*yVg-i_cF_^Xsud= z!L*iJi9~IdzdkJZG`h#Z&F6&q9MpSN1}W0pZqh(!jGBMk(^#hI{M^d36Z;H8&r6`K zOYd^0A3z_l1L@tlQE}ixa=@cHFn;CE5SrwL-G)5MdB2TUMe$SxK@p(@g#)Rm+wBF) zy-&zbh3j3pe2z+*X80G+0+;qt=ITRQ)Q6n$o$Ag#4s&{uha%a+KT>5yh zO`G%+(SDgU%Ty;<0@%nq9$n8iq9GTAtfw4Cjb$`!73&rs&0iGl@5s!wI3;X%o`3U@ z4ZgN4smrSsRt0^i2P*?M$&GM&Pnv$S6DN4_9xxXIRj&eR>h(O*hvD01Og7m=BCD+Jbq9>~VR_#=tR31bhCBrBcRGY!TZ(za zIhE1Nyl??bLLoF}V1Zz>07L3kl%eoU41xm2D-Oyf+>OkCIGwODkx0k>0}RCUR%WZy zoSszJ23Q&RB&f7tT=)kka2CTBt8@?eb~-((blKVBb$5NS`$tQo+O&*TCkxSvzSR7W z9I2oNo2&-Y()4-IDz;|tz(hLuH}+dx;_~|=OTV_{Fgc(*3pU8#m($fC`r zzjE6nbcQDv(MXiQ3Yenso(Q2n1)vW6ARmiX_kP~)*lq^^`v%-NSyLIXI`$^NZl1vJ zz&Y~wRLAFfDTz9{vHJ*We!qc0#iWT;ram|j$2t@L z?SU7LTs+8Rt*nEe7#xMN9^D%ihX3LK zU_N$(3N?D(iY#Jnbu6C{mM#(lIE0Hhk_ho0a78gLQOpgO$-c*Xpq_iF2~}SaWjQ0W zr~_V9MX6V_K+5_SRhI31?3iEK2TJuu*uxGHPZ#& zqmC%H#0WuYZHVWjhw}Y(#8s5V>wN%>{Hv&=!iI0@To5BGlU0(ZJW%dZ-9Eb0z{2lk zD%XLc&<|=k2)=3Qtk1oj>TQ+bC79$Dc&4n!^j%1RrhU`GQ1MROCmVD1Vmv``1It4?b zd8G+-zcrZ4+!{9$oD(**1WITC|8>_tx1y@N4OSNyCqXK>Ed%cVf z15#{4&KFx7+}Oys4R;rJE)D`>I#zAnYD#B9d39?PfBE5JpV?xrxgLH!H&x}*F+6fT z`Tl!nY~IxUD*7uY^{(lZgeS-_D)7 z?erzq`tk`O>Dn-K-w9lanSKO#h;*&Heu3k0eQKq855i;bqJPUXn#mgOZjh_`X z%u`9HW1}%+g3YJ&bP68|Q{bHA&eTLWbf+&PtA=HF&9qDCX40JkpN@qc!^+RE>7=s# z$G}AfqpY>fy}yLpJnGIR+dRhiMgi(xYtRH}efE}$Y$zWyCd4QAO@cNc@UKUXWO<<- zyMXjrz6F#uz?g@jRBiut;#5pfBIK>>aC24WHpV(tYOMbyOt);5wdS0R{3>ekt{`i5 zFe_}qfTtvbZY%cBT^@@$!o@Uu z)3n*#%=DAABZ~8xgJOUaC{y=;@k}gedU7g!XgTOUy7$O6bFdTuRED8NL{|zLjRbsqFFN9 z0Q1i7_3R^uspQvqxxx!B-K(@AKJ&gf+}+Y;hYd3Sy_yrrh?Q9P7^j=S_@I;EhS`|3 zWAj6+$)p`e!TS2Gx~Bl$UkyenFLe9uXe9pOBSe*2V^~F*M6DeB3l8#k>75l;exEH0npp8)jD^HWR>f)dj4g0{K-tdz5o{G^j^Vkrqmor zt}3T(ofB*JIXfDyMl%rXx3w*JG#_SwyGS zr!cG-66ew{vea$+wxxe1Stb0R?Ad$+9t`9K0PPKyZ?|sv+Cjr4fS{tqrkR%B9hu#H z83Xkm2_Wa?%A|H`5Xz!cw=$o9kU1uK1@OIaXYQRTJ zJwTZoLCtA4G-1YHtz@X(KP9~yx=`BgnhdT4neP6gXnUv^!V8d5H1`s6l!JI z9={|~&rq;|v6|~<^B>b(c}G+grzD=9tt4NKg z?)dpDbU3^pdtdtOR@VJln=~pv_6}+dRyqw}3Spk=gpSyf@karYF+W>e*#v8nQMw!* z>4oh|JT5$fHa3$vvF**ZmA{J`Dm3a_(khaUWp|IMw z?0vES6P9TuIT0aCH`z5aP{|9bi^-zwoe1e3)g-W+F@F2F_mS^e5)kNPl^by_qi0&g zyX4<)#pekw+nvY<-_N!#oj*W({#cUYCAegHp~g+eyj?m$`A)+EN--D>lwDr^tg$yyS@O`k6d|! zscTl1<$1SD==XfCR-P;L41ux~YwP(XDSKkpsYp#LMGq*esbz_oHYXxum{fWgH7q4w z2o*iC+8TRwQR~7BFtdX3-O=4qQWdsHr{UpO{_b@?$!|Ssn^l{X$EgzO!0NI*475$s zPk17`wS||~F64Sh#8NxO>p1+E9Z$3~Js!&ayug zWVYbwpLixQM?a>=Afi(2t70GamMB`;pVj*;WgzCIh<=|6-oUqQunN@m^%wUy%Ases zaFc7$$JR(s7SmOx(D7CGEyx@`yr%GI$ z8Zj2kZUH1V;ln(pkoa#3fRix>GINCSjDx^sA#aEvWt4zEFQE`{hI}?SZ%8yN*<9{< zJEwqo-xg#Hs6u$I#Wefm67}k482W-6=;_NoEPwXu4*VL}*SGw^-ltDIt*@So5*R-S zMEG(^7*v4{wFLYM1sIGe3-8^g#0Bqk_U$q5EIRMsI={gRu%?sU6T2txZGkSk%#stE z!wEFD;(!%wVk6(zCuB_sjc4YE@PXAq6he_QqOT}yT!QA90jgAsFNlA}771irZzMgh z+-_uDk@uDG#(u4wI(r`u$VX32qk2p>a%d|y3^-^;R4K^D9y59W(RROx0V2Sw;EW7! z4KzZSv0U>(QqNS7alM65vR8y`xYfX_S%;S&QGdn%2l z33U&RAEdxaGitd7m?V#5gs_=7$olkb%h1)mOO|;boiOwkA7Hi)e(QTigozVDC8`Hj z#C*3A#iaEheCYZ#kad1ZqJUoXAhlczXcWfdCaFwx%~+`-{wM+Ye|&fo5Qw+t)aPZ+ zc{%bVyl9Be@5a2(2_sxwf^s8>fU!_?>rt>V&_F_Sm>)BV$s({WcW9f;5cKvo4qsH04Oe_u~OG8AU@!8_=Lqi084?f`av z!~jeYc9tBj0VKHG;f#b1ot;0uV%gXitIRghva~IK1hmC`WRbv#$M0`24H=4p?9lDM zAQ%?PY?^IR?i$#M?S3^?TFwG;?@OEp-{wb?RNUu!5a9yd@D28Dt0(Dy2BlO9R4tgv z_r78&RahBY{oUz9&M6@6b;(Kr>(&MT%`6>A|YHj%TB!z9g-3c&;JRL|cJWUj9$c z7Eqj3HWFu5k-*pkX%yIs#leBOj7&`54nzF*U{y`?S3Dqlo2r%Yb7}i^cwPIqCCiU0F{y%n7fWE+QU_IgHi(5U@U=yH7p^_Yr zlx~md$=tN9xF9&<)2FG;9Fv(KVQmANk5uE)yIeqgKun4>pxL(0GtS}9H)v&>%$I)s zA`oWrK1jKNTp)hGB}55S-9At~vJ~3N94$vJ>HKooQ;k_ugz%=HfAIt$IUQ1ERO4}8 z-Q9N`Yo&QYI~;+*-4F3J8u$%fu%nLv+F$^N)=C7GNX!NaCwzS1_k4kZu3Wb{WbiDw z9vFS?CSdRyw^26`d;p|->}*Tlu#msI=+3y1%bmuoa^1j-{p?0T51&8Uxe@k7?uyXa z{5ok4fzPGoMYYn02BYNS1iN4Uva|t}C;1@lNHmF$dF)Y0O(YR@ZYE~jS7jAOR5ZU6 zd*eTbcoUYG15wE1j^SDz{#4!96gW1I`)3HB;aSlLpP>NO6`$7#&Q;) zv#23>7V#zdWm=df2yv-vea zS_RpxVzPfyF+lj@2Fd&2GO3zP@98O2^cZq!`;H?AdR10Vc?LZmnJpFDinXZ$=I!3f z9#FRm`?58oj(Du_AA*kVZ9ACs=3nMd-s4fQzfAYiF3_;ecLCCLLN^(CSKo>h{V|^q zO7+yr>Fyvo!0vWIJ5;cPv`IrC2rt<33`>Nt)0$eCo=ps>!WY|rhr_@G$iu=cphPQq zZUNb*maAS3(@5SMJEZ{w;W7@u(ILQ)wuEdRGR5QQji-v11K^U)JSvo9>+JQeb?vX{ z=iYMNA7F0ELGo_Hx%OxWqU=sIv7tEjDX1 z)eB}9iaw6?(q_JK1rS=|MBul-V9;;t>GA62NwYQv0`nv~;nC=3dn?gbfF&(Qg?NR` zq0Tm^;qz~OxZB76)bJq~)wzyhJq^UhneDEk!ZQmn&-@WLbcpvS=BU<4Hnw$BRC7-dbwCaLM zPsLh?HfcZ1C%B6)m%3@{X4zP=gX7pHxxdAi+d8fC=S}n8r6xe&GN`%qM}^E2&6#SR z{Qi@bAM*Wgw!h|dilz+J10f4&1dXekMbSrG2@9B{KFn}=OmLIIgeq6sT6_5c7bTH% zBrip}=569+UxBTA@dPFub6m5ABiRei5~#wlX`IkedgAAoR`$E>lt$a>ZWACesHtGG zd13WaC*Qm=A+;v6!fJ-`2Be2tdb;u_vS>Q;rXjr{GBUXXsXj!+^xG^ocxkiwO)x05EVsgl~XJ3 zqx8wBAoSQdQ|HLadBT1T(^vo!v>S(&7qyeH_l-FkAQdqn=bPpQ=K_N|r=E*9XKe8V z>oF4`JZI?PT=Zl*X_7m;8B<-Ob~-f|U@2kfdc6<#34QqBDN8)n7GbD*Q0*v0K+6ju zWeN@XWFUK>_afQ?Y>PA(n_c^pMdW|==6T{*ZdJ`w6|9zlZqArI_wj#f?EB#4WA?`fu?+Z3-x6~Spvt+9i`yK7;d%^H_)p7{ER$?v zo**A_d1L4#%a+jNucH4dlj;$b&gHJf{wh?T%bk_CtkSPAtS}_UGPXv$cl%~xh2L3o z2jno1R&HA0lW_1y#EAF2e0Qh`;?O4+?3VbXP7YaoX6K>NidIl23rRwhatB;#*DymU z(U7D7?wJtbdn@Ca%;cn?E)W4Ar*o!`kvYk4LeX>|r=aWNfJu&`0GIZAe|ObtLwNKR zs@&E$NKbeB4_c%l#hx}nt$&(vzANp(=7o)aq1%K2Lba79XY;9X5T#ruMq^*kK60*< zUrL+>uS=V)(L3`Drd>v@<3|=xIUwo}k0k16bDJ;sFnm?bP{UBi@J{nsL#(e*3pt{y zNli^NDFZ~dHNxWL<^tqbjDYR`j;%W`w7`!j(m5*XQ-%Cbh2^wG1d){F4JG^yy2grl zmD=z3SnQbHnxi6cWh!YJ&aLExp}Nw*M0?PMRz9oKtfdDpxt%rJ-aqx(s(ILR07Qs6 zBq;?pH7itXuvDReXwNr-9!My}5H2c3JUmAcX zC>>Mimlf?#d4tK>tQg@``79fwm=<5;;WLjY6d)Z`Kk+2hAI99ye^jV`?5I6Y@k1r8 zP`Bl4j|3pML1AUC$a7cSDzN*+hC9u_Z(YHla=eMxC37%Y!&X&f5XAwzi=G(mFXb=N zgfIy#j0Y1MmQfYz9TlY&+RL(()CB#v+_IXloT+KtEJ;Nk&;0!524s~JpW9ef zzibk93`-KOCwqSC+zlJ8&R;Y;VOKIGz=UPiR7dMEJdedl6}$BjS}RYF3YsVKO#`Ya zO222SuKCtOP8a^H?!AR`wWhRPV5&EnVvxR24~Aexm>g!lFdDQOJz^~Hqr2hPphL{D zvs!5r@ybdKn>Wfcn<`&})Sb&k{OvHL2DD=f9r+ctmhGfyWCUbpFf}J8-W5i$)XP*%^R%&!k8Cqp>VHPa4fuYhs1zMboI`R7Di;f+lr5=nj!99FpJJ-p9^Br8WN0dxvx z@6_g|X$G+{uV*{h2EMWGxSQ=VS@`}hCki&#X~6c1#DgT!m%o5`g9}|oG$rDNC97;7 zSZkUIiy!a+a+V1-4W$iB#G^=rV_?JzVce~E=Yz=)mmO*cyp`As?rorAEC#(2LU%Mz zDxT^=U%EY2T+?KLxFt2nSY;i1v0H!thX#zj7s<;D?q|!JZoZJ5zD^kMsJR4`G$4Zm z1=~gkxOV`UOy6Z%UjM`WAy|;dabFZ0FaB^f!dG`C!jn4OZHJFvw-)0n^ix$fs5W=J}&M*!E{KR3?~CTrv7wCYYaOMDKN)b;Y!xl`*5NUi0S@wmX|JZK(2-3>_}^ zk5lIJPKW$iOTYVBJugQ#8Roc-($}KaV%K6jj|}(G__9($gha2k^ z;ma*opGN*CVoDn(=W`=IGEg^WnCGv;le9g}EYa^2rbwYEYNb;v#g?8w?0KfMt;4A4 zmJ8bP&@K8pf|7H9D(;R?*??!q1wU>~80zdjZvD1dSqd(~jv>Yw@7?!=w4!_*zhOW| zg)fE{`YZL=kz`g>lBnXxDf~qw{cPVz$~`~}$cKTBK;vHs|98ETHa6H)ty+#?v3&3blG*@l&%Jw( zRYQtq&ulKaOZ0C(|Hx_;s_4CxVJpw&LRrA$6yZ~?WkX<;DB3)-)&$LDnO#_!V;z&w zI?iSll|{O>=L3n_4ePqz3uMcp6o7PfEbDCx!C=0or~fGQo?{A&QFMB*qaT5y(y#ih zc019n>1e&yz3HPq*I``j$Lu0Kk*BpS-zF6tci9g))_Vt&u?!-p9jIx&z!tqatCw&5 zT0$pRYRB@Z9ecsgN?Zh5VS52R^BqI-@oCH>!ZTA^nUk6a2KzJ@ltEE3c=-vRWSrcg zL#}jaFJAH+iB;IUwe0TL?*D+46r>~PEUNU?yJu5AQeLx5xCZ_3yqP2Pd{)p7-}L?_E;8B_WlfF9*%MuYhJc29>E$5K=zW zBRB8*zWySYFcflo{6AFv=uBlO?g?#A&Li$h+1oA;(afOpGTta`$}8tUGDX}$4FKt=J`G5L?ilMEK1z#jg46F?&Q;AEiaz6R>*qXOV; zFHHBgzMc_K_ETIpQ!9@&q#dtATcc;$$|%>fS6ISe*E}J}Cbw^xETf=X3TMHWiPxWx z?q^=LnG_qEfysn_e!>yUg{m)O0?M5R$z5F8%ceGiYk7#-iEIV)iGiiitLU;n&40RY z_MQN1xH)MnNJ02QRobq4xJS~`w8b+6fnYMI7!%B91ub!%6LLRXHAO4@y5gWWu-0sB$cc%AeNsP~lk8Py~75K3s375XgVz`Fl@<*rY1)S8G!nO1%fx8fF*cJ6D z2;D5(|Mps4J5+W;8hYkv8MCBMs~bDzK4e2!Nfde&AWg_NVvu;)r;|b)mvLu#*Ersk z+kfz7E=h3{bqPjURt%b1FY(#VUyGWW5HOZTpp^^_OV)4{2&?tv-EdSd$`Bwk|Gfmx z-25?2xjGEq9lOJO*DCBSiD@&=V(v=u)#~4bU$%t~y3*07vhqnkAS6kJ;vlGUpDbv9jpkXv-!VFA|0E z7F2bWxTJotIvuj=<6pn#Pd?8PYOYAIi)UmLvPoZ4ne&cP;Oq+k)sU^%xyiC`S9|PU zajg~(6%_HuT=Q-Opn}1MJg&+GjF{>7!1s%NzD*RvGDLy0?T-p)Ba3o-086=p*}st> zU;?7$DR8YYF(Og*8kr0TclA69?|WC%qht}Jz7b7&BSC@)LnbtLK~fOFY?0+EfRaex zgb4&?)o_$+D%6wn$oG3 zQ8jP7x!5@IMBfz!&W5xFl6ZhU?C;JSZ~+oRmt9RAhJI<(J+01NZ0tO$Ntj2gqpcaW z6Ni&uwDW`x@!K{rV#r8hT-{1~)-Bq=UFafW2c%7m!Au&zNYTVeL6CG~{$f+^5~fMv z-Q~!|&&8r`$@Mw!y-i!mrE^xS+;Z$6GBDbfA(!65%;ziXiu!3PuJO;ErSF;b+~vhe z@CUH{81h6tNJDj+N&nZGW49*j(2d6FaA2km6AYugKJL1}cxbLMQajpA=D5@wc<7dW zxqSkYLds(NRzCUC(A6Z7QFpR3BzQ(TbSSU9nVAj6H?D<(l8vyFsRi21Y4nv|2G0KUL(ZYK_ zl|xj*O}n0sP4ncszYKk4-(YqsMBK%3=3!+VWQ=XaDPyhMbB1Vne z22u|0hzJNvzIUWSzAi8m*D*x5s66f7Pf2+S`7g}SN>K8(D>mT$-?rKpFR-`y8qgZ8 z@upF3K~+RR(5d&D~YOz!+hSRE1`kiT{Vs&biZPxH@Oqnlt z$}rM!#YiUOfA3hfkPHLAIWa89H3B=}6BGf=0p-vDN27BIO~4(~eqrk9Cao)3x=9-e zPwODPoc|Dq^(kxE2m6#qs%(^x5{DC9)ND9L1Ka0VgMm6BOHMj`Qz zEQ4v6S|{q}s1?yO%A_Xv;$8wdxzS>;FweYt6lrf8dWSAezTSS4WVQ zJCM0yD3qaZZt)xO>c3ARzK^1Kz=xcG6pU&XjB1cE6w|swVKlVp2jg1fjs~6&@-=wC z>X=kt&cTGqCCphSAbQ7bC;Q`MG&e?m3g!n(Y^z;Sx}0 zH}tbldd1Hkr5GgJY()XlZed}^Cy1nX%D(52aHK~3Au?6`0d0^#Mn-jgwUOCJ3IF=d z(1ED^Sk47K86%lmry+?7H;e>S9V_PV3HVJFO2s(yor1vrQHIi^l+7{CifW}qE~jh< z?u4kCC9@R`83P#u*)eIaWzCC@sQ|6Dw%?_gq$R&ZYY-DZ_!wRNzW{zQk<##P?wn5R}cZ&?z{y4@8=&)RUMT|CA-M~2PRouh5!Hn literal 0 HcmV?d00001 diff --git a/sky-server/src/main/resources/mapper/AddressBookMapper.xml b/sky-server/src/main/resources/mapper/AddressBookMapper.xml new file mode 100644 index 0000000..0944526 --- /dev/null +++ b/sky-server/src/main/resources/mapper/AddressBookMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + update address_book + + + consignee = #{consignee}, + + + sex = #{sex}, + + + phone = #{phone}, + + + detail = #{detail}, + + + label = #{label}, + + + is_default = #{isDefault}, + + + where id = #{id} + + diff --git a/sky-server/src/main/resources/mapper/CategoryMapper.xml b/sky-server/src/main/resources/mapper/CategoryMapper.xml new file mode 100644 index 0000000..b64809e --- /dev/null +++ b/sky-server/src/main/resources/mapper/CategoryMapper.xml @@ -0,0 +1,68 @@ + + + + + + + insert into category(type, name, sort, status, create_time, update_time, create_user, update_user) + VALUES (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}) + + + + + delete + from category + where id = #{id} + + + + + + + + update category + + + type = #{type}, + + + name = #{name}, + + + sort = #{sort}, + + + status = #{status}, + + + update_time = #{updateTime}, + + + update_user = #{updateUser} + + + where id = #{id} + + + + + diff --git a/sky-server/src/main/resources/mapper/DishFlavorMapper.xml b/sky-server/src/main/resources/mapper/DishFlavorMapper.xml new file mode 100644 index 0000000..3cc7400 --- /dev/null +++ b/sky-server/src/main/resources/mapper/DishFlavorMapper.xml @@ -0,0 +1,29 @@ + + + + + + + insert into dish_flavor (dish_id, name, value) VALUES + + (#{df.dishId},#{df.name},#{df.value}) + + + + + + delete + from dish_flavor + where dish_id in + + #{dishId} + + + + + + diff --git a/sky-server/src/main/resources/mapper/DishMapper.xml b/sky-server/src/main/resources/mapper/DishMapper.xml new file mode 100644 index 0000000..3a32838 --- /dev/null +++ b/sky-server/src/main/resources/mapper/DishMapper.xml @@ -0,0 +1,119 @@ + + + + + + + insert into dish (name, category_id, price, image, description, create_time, update_time, create_user, + update_user, status) + values (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, + #{updateUser}, #{status}) + + + + + update dish + + + name=#{name}, + + + category_id=#{categoryId}, + + + price=#{price}, + + + image=#{image}, + + + description=#{description}, + + + status=#{status}, + + update_time=#{updateTime}, + update_user=#{updateUser}, + + where id = #{id}; + + + + + delete + from dish + where id in + + #{id} + + + + + + + + + + + + + + + + + + + + + diff --git a/sky-server/src/main/resources/mapper/EmployeeMapper.xml b/sky-server/src/main/resources/mapper/EmployeeMapper.xml new file mode 100644 index 0000000..e04d8b3 --- /dev/null +++ b/sky-server/src/main/resources/mapper/EmployeeMapper.xml @@ -0,0 +1,67 @@ + + + + + + + insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, + update_user, status) + values (#{name}, #{username}, #{password}, #{phone}, #{sex}, #{idNumber}, #{createTime}, #{updateTime}, + #{createUser}, #{updateUser}, #{status}); + + + + + update employee + + name = #{name}, + username = #{username}, + password = #{password}, + phone = #{phone}, + sex = #{sex}, + id_Number = #{idNumber}, + update_Time = #{updateTime}, + update_User = #{updateUser}, + status = #{status}, + + where id =#{id} + + + + + update employee + + + password = #{newPassword} + + + where id = #{empId} + + + + + + + + + + + diff --git a/sky-server/src/main/resources/mapper/OrderDetailMapper.xml b/sky-server/src/main/resources/mapper/OrderDetailMapper.xml new file mode 100644 index 0000000..6f9bc85 --- /dev/null +++ b/sky-server/src/main/resources/mapper/OrderDetailMapper.xml @@ -0,0 +1,21 @@ + + + + + + insert into order_detail + (name, order_id, dish_id, setmeal_id, dish_flavor, number, amount, image) + values + + (#{od.name},#{od.orderId},#{od.dishId},#{od.setmealId},#{od.dishFlavor}, + #{od.number},#{od.amount},#{od.image}) + + + + + + diff --git a/sky-server/src/main/resources/mapper/OrderMapper.xml b/sky-server/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 0000000..1271b03 --- /dev/null +++ b/sky-server/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,149 @@ + + + + + + + insert into orders + (number, status, user_id, address_book_id, order_time, checkout_time, pay_method, pay_status, amount, remark, + phone, address, consignee, estimated_delivery_time, delivery_status, pack_amount, tableware_number, + tableware_status) + values (#{number}, #{status}, #{userId}, #{addressBookId}, #{orderTime}, #{checkoutTime}, #{payMethod}, + #{payStatus}, #{amount}, #{remark}, #{phone}, #{address}, #{consignee}, + #{estimatedDeliveryTime}, #{deliveryStatus}, #{packAmount}, #{tablewareNumber}, #{tablewareStatus}) + + + + + update orders + + + cancel_reason=#{cancelReason}, + + + rejection_reason=#{rejectionReason}, + + + cancel_time=#{cancelTime}, + + + pay_status=#{payStatus}, + + + pay_method=#{payMethod}, + + + checkout_time=#{checkoutTime}, + + + status = #{status}, + + + delivery_time = #{deliveryTime} + + + where id = #{id} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sky-server/src/main/resources/mapper/SetMealDishMapper.xml b/sky-server/src/main/resources/mapper/SetMealDishMapper.xml new file mode 100644 index 0000000..2cf487b --- /dev/null +++ b/sky-server/src/main/resources/mapper/SetMealDishMapper.xml @@ -0,0 +1,45 @@ + + + + + + + insert into setmeal_dish ( setmeal_id, dish_id, name, price, copies) + values + + (#{setMeal.setmealId},#{setMeal.dishId},#{setMeal.name},#{setMeal.price},#{setMeal.copies}) + + + + + + delete + from setmeal_dish + where setmeal_id = #{setmealId} + + + + + delete + from setmeal_dish + where setmeal_id in + ( + #{setmealId} + ) + + + + + + + + diff --git a/sky-server/src/main/resources/mapper/SetmealMapper.xml b/sky-server/src/main/resources/mapper/SetmealMapper.xml new file mode 100644 index 0000000..13a6c54 --- /dev/null +++ b/sky-server/src/main/resources/mapper/SetmealMapper.xml @@ -0,0 +1,127 @@ + + + + + + + insert into setmeal (category_id, name, price, status, description, image, create_time, update_time, + create_user, update_user) + values (#{categoryId}, #{name}, #{price}, #{status}, #{description}, #{image}, #{createTime}, #{updateTime}, + #{createUser}, #{updateUser}) + + + + + update setmeal + + + name = #{name}, + + + category_id = #{categoryId}, + + + price = #{price}, + + + status = #{status}, + + + description = #{description}, + + + image = #{image}, + + + update_time = #{updateTime}, + + + update_user = #{updateUser} + + + where id = #{id} + + + + + delete + from setmeal + where id in + ( + #{id} + ) + + + + + + + + + + + + + + + + + + + + diff --git a/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml new file mode 100644 index 0000000..cdb0d0a --- /dev/null +++ b/sky-server/src/main/resources/mapper/ShoppingCartMapper.xml @@ -0,0 +1,97 @@ + + + + + + insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) + values (#{name}, #{userId}, #{dishId}, #{setmealId}, #{dishFlavor}, #{number}, #{amount}, #{image}, + #{createTime}) + + + + + insert into shopping_cart + (name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time) + values + + (#{sc.name},#{sc.image},#{sc.userId},#{sc.dishId},#{sc.setmealId},#{sc.dishFlavor},#{sc.number},#{sc.amount},#{sc.createTime}) + + + + + + update shopping_cart + set number = #{number} + where id = #{id}; + + + + + update shopping_cart + + + name = #{name} + + + user_id = #{userId} + + + dish_id = #{dishId} + + + setmeal_id = #{setmealId} + + + dish_flavor = #{dishFlavor} + + + number = #{number} + + + amount = #{amount} + + + image = #{image} + + + create_time = #{createTime} + + + where id = #{id}; + + + + + delete + from shopping_cart + where user_id = #{userId}; + + + + + delete + from shopping_cart + where id = #{cartId}; + + + + + diff --git a/sky-server/src/main/resources/mapper/UserMapper.xml b/sky-server/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..82218db --- /dev/null +++ b/sky-server/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,29 @@ + + + + + + insert into user (openid, name, phone, sex, id_number, avatar, create_time) + values (#{openid}, #{name}, #{phone}, #{sex}, #{idNumber}, #{avatar}, #{createTime}) + + + + + + + + diff --git a/sky-server/src/main/resources/template/运营数据报表模板.xlsx b/sky-server/src/main/resources/template/运营数据报表模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..76806c553826045fe5f3fc6f81dd7e2cef56b3a9 GIT binary patch literal 12570 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 literal 0 HcmV?d00001