From 4957cd802321da9e116cfc0ed6e6d5ff8f2fcc88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E7=A5=A5?= Date: Wed, 28 May 2025 11:07:39 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=E5=90=88=E5=B9=B6=E5=95=86=E5=9F=8E?= =?UTF-8?q?=E3=80=81=E7=AE=A1=E7=90=86=E5=92=8Cvlog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + .../src/main/resources/application.yml | 2 +- ruoyi-front/pom.xml | 18 + ruoyi-front/ruoyi-consumer/pom.xml | 103 +++ .../content/config/InterceptorConfig.java | 117 ++++ .../consumer/content/config/MinIOConfig.java | 33 + .../consumer/content/config/RedisConfig.java | 56 ++ .../content/config/SpringSecurityConfig.java | 30 + .../content/config/knife4jConfig.java | 40 ++ .../content/controller/BaseController.java | 12 + .../controller/BaseInfoProperties.java | 46 ++ .../content/controller/CommentController.java | 114 ++++ .../content/controller/FansController.java | 298 +++++++++ .../content/controller/FileController.java | 72 ++ .../content/controller/MsgController.java | 43 ++ .../controller/PassportController.java | 210 ++++++ .../content/controller/RabbitMQConsumer.java | 66 ++ .../controller/UserInfoController.java | 148 +++++ .../content/controller/VlogController.java | 370 +++++++++++ .../intercepter/PassportInterceptor.java | 47 ++ .../intercepter/UserTokenInterceptor.java | 58 ++ ruoyi-front/ruoyi-manager/pom.xml | 105 +++ .../controller}/SysClientController.java | 2 +- .../controller}/SysConfigController.java | 2 +- .../system/controller}/SysDeptController.java | 2 +- .../controller}/SysDictDataController.java | 2 +- .../controller}/SysDictTypeController.java | 2 +- .../system/controller}/SysMenuController.java | 2 +- .../controller}/SysNoticeController.java | 2 +- .../controller}/SysOssConfigController.java | 2 +- .../system/controller}/SysOssController.java | 2 +- .../system/controller}/SysPostController.java | 2 +- .../controller}/SysProfileController.java | 2 +- .../system/controller}/SysRoleController.java | 2 +- .../controller}/SysSocialController.java | 2 +- .../controller}/SysTenantController.java | 2 +- .../SysTenantPackageController.java | 2 +- .../system/controller}/SysUserController.java | 2 +- ruoyi-modules/pom.xml | 5 + ruoyi-modules/ruoyi-content/pom.xml | 102 +++ .../soopin/content/domain/bo/CommentBO.java | 32 + .../domain/bo/LoginWithPasswordBO.java | 31 + .../content/domain/bo/RegistLoginBO.java | 23 + .../content/domain/bo/UpdatedUserBO.java | 30 + .../wzj/soopin/content/domain/bo/VlogBO.java | 27 + .../soopin/content/domain/mo/MessageMO.java | 41 ++ .../wzj/soopin/content/domain/mo/Token.java | 16 + .../soopin/content/domain/pojo/Comment.java | 193 ++++++ .../wzj/soopin/content/domain/pojo/Fans.java | 114 ++++ .../content/domain/pojo/MyLikedVlog.java | 83 +++ .../content/domain/pojo/UserMember.java | 14 + .../wzj/soopin/content/domain/pojo/Users.java | 387 +++++++++++ .../wzj/soopin/content/domain/pojo/Vlog.java | 361 ++++++++++ .../soopin/content/domain/vo/CommentVO.java | 28 + .../wzj/soopin/content/domain/vo/FansVO.java | 19 + .../soopin/content/domain/vo/IndexVlogVO.java | 33 + .../wzj/soopin/content/domain/vo/UsersVO.java | 43 ++ .../soopin/content/domain/vo/VlogerVO.java | 20 + .../content/mapper/mapper/CommentMapper.java | 8 + .../mapper/mapper/CommentMapperCustom.java | 15 + .../content/mapper/mapper/FansMapper.java | 42 ++ .../mapper/mapper/FansMapperCustom.java | 19 + .../mapper/mapper/MyLikedVlogMapper.java | 8 + .../content/mapper/mapper/MyMapper.java | 34 + .../mapper/mapper/UserMemberMapper.java | 14 + .../content/mapper/mapper/UsersMapper.java | 32 + .../content/mapper/mapper/VlogMapper.java | 57 ++ .../mapper/mapper/VlogMapperCustom.java | 23 + .../mapper/repository/MessageRepository.java | 17 + .../content/service/CommentService.java | 34 + .../soopin/content/service/FansService.java | 35 + .../soopin/content/service/MsgService.java | 25 + .../content/service/UserMemberService.java | 9 + .../soopin/content/service/UserService.java | 81 +++ .../soopin/content/service/VlogService.java | 171 +++++ .../service/impl/CommentServiceImpl.java | 150 +++++ .../content/service/impl/FansServiceImpl.java | 189 ++++++ .../content/service/impl/MsgServiceImpl.java | 89 +++ .../service/impl/UserMemberServiceImpl.java | 19 + .../content/service/impl/UserServiceImpl.java | 428 ++++++++++++ .../content/service/impl/VlogServiceImpl.java | 626 ++++++++++++++++++ .../mapper/content/CommentMapper.xml | 17 + .../mapper/content/CommentMapperCustom.xml | 46 ++ .../resources/mapper/content/FansMapper.xml | 73 ++ .../mapper/content/FansMapperCustom.xml | 49 ++ .../mapper/content/MyLikedVlogMapper.xml | 14 + .../mapper/content/UserMemberMapper.xml | 45 ++ .../resources/mapper/content/UsersMapper.xml | 27 + .../resources/mapper/content/VlogMapper.xml | 160 +++++ .../mapper/content/VlogMapperCustom.xml | 229 +++++++ ruoyi-modules/ruoyi-goods/pom.xml | 102 +++ .../goods/controller/BrandController.java | 82 +++ .../controller/ProductCategoryController.java | 73 ++ .../goods/controller/ProductController.java | 86 +++ .../goods/controller/SkuController.java | 86 +++ .../soopin/goods/convert/BrandConvert.java | 17 + .../goods/convert/ProductCategoryConvert.java | 20 + .../soopin/goods/convert/ProductConvert.java | 22 + .../wzj/soopin/goods/convert/SkuConvert.java | 17 + .../wzj/soopin/goods/domain/entity/Brand.java | 39 ++ .../soopin/goods/domain/entity/Product.java | 89 +++ .../goods/domain/entity/ProductCategory.java | 47 ++ .../wzj/soopin/goods/domain/entity/Sku.java | 49 ++ .../soopin/goods/domain/query/BrandQuery.java | 27 + .../domain/query/ProductCategoryQuery.java | 33 + .../goods/domain/query/ProductQuery.java | 80 +++ .../soopin/goods/domain/query/SkuQuery.java | 32 + .../wzj/soopin/goods/domain/vo/BrandVO.java | 27 + .../goods/domain/vo/ProductCategoryVO.java | 30 + .../wzj/soopin/goods/domain/vo/ProductVO.java | 67 ++ .../com/wzj/soopin/goods/domain/vo/SkuVO.java | 34 + .../wzj/soopin/goods/mapper/BrandMapper.java | 21 + .../goods/mapper/ProductCategoryMapper.java | 21 + .../soopin/goods/mapper/ProductMapper.java | 21 + .../wzj/soopin/goods/mapper/SkuMapper.java | 25 + .../soopin/goods/service/BrandService.java | 99 +++ .../goods/service/ProductCategoryService.java | 246 +++++++ .../soopin/goods/service/ProductService.java | 212 ++++++ .../wzj/soopin/goods/service/SkuService.java | 103 +++ .../resources/mapper/goods/BrandMapper.xml | 36 + .../mapper/goods/ProductCategoryMapper.xml | 40 ++ .../resources/mapper/goods/ProductMapper.xml | 58 ++ .../main/resources/mapper/goods/SkuMapper.xml | 46 ++ .../src/main/resources/mapper/package-info.md | 3 + ruoyi-modules/ruoyi-im/pom.xml | 37 ++ .../ruoyi-im/src/site/apt/format.apt | 602 +++++++++++++++++ ruoyi-modules/ruoyi-im/src/site/apt/index.apt | 16 + ruoyi-modules/ruoyi-im/src/site/fml/faq.fml | 27 + .../ruoyi-im/src/site/fr/apt/format.apt | 602 +++++++++++++++++ .../ruoyi-im/src/site/fr/apt/index.apt | 17 + .../ruoyi-im/src/site/fr/fml/faq.fml | 27 + .../ruoyi-im/src/site/fr/xdoc/xdoc.xml | 17 + ruoyi-modules/ruoyi-im/src/site/site.xml | 27 + ruoyi-modules/ruoyi-im/src/site/site_fr.xml | 27 + ruoyi-modules/ruoyi-im/src/site/xdoc/xdoc.xml | 17 + ruoyi-modules/ruoyi-member/pom.xml | 103 +++ .../member/controller/FeedbackController.java | 68 ++ .../controller/MemberAccountController.java | 86 +++ .../controller/MemberAddressController.java | 88 +++ .../controller/MemberCartController.java | 83 +++ .../member/controller/MemberController.java | 122 ++++ .../MemberLogininforController.java | 81 +++ .../controller/MemberWechatController.java | 86 +++ .../controller/PlatformVerifyController.java | 37 ++ .../member/convert/FeedbackConvert.java | 17 + .../member/convert/MemberAccountConvert.java | 17 + .../member/convert/MemberAddressConvert.java | 17 + .../member/convert/MemberCartConvert.java | 31 + .../soopin/member/convert/MemberConvert.java | 17 + .../convert/MemberLogininforConvert.java | 17 + .../member/convert/MemberWechatConvert.java | 20 + .../soopin/member/domain/dto/AddressDTO.java | 19 + .../soopin/member/domain/entity/Address.java | 50 ++ .../soopin/member/domain/entity/Feedback.java | 58 ++ .../soopin/member/domain/entity/Member.java | 93 +++ .../member/domain/entity/MemberAccount.java | 42 ++ .../member/domain/entity/MemberAddress.java | 79 +++ .../member/domain/entity/MemberCart.java | 55 ++ .../domain/entity/MemberLogininfor.java | 52 ++ .../member/domain/entity/MemberWechat.java | 77 +++ .../member/domain/form/AddMemberCartForm.java | 23 + .../domain/form/ChangeMemberStatusForm.java | 9 + .../member/domain/form/MemberAddressForm.java | 18 + .../domain/form/UpdateMemberCartForm.java | 18 + .../member/domain/query/FeedbackQuery.java | 39 ++ .../domain/query/MemberAccountQuery.java | 23 + .../domain/query/MemberAddressQuery.java | 45 ++ .../member/domain/query/MemberCartQuery.java | 42 ++ .../domain/query/MemberLogininforQuery.java | 42 ++ .../member/domain/query/MemberQuery.java | 70 ++ .../domain/query/MemberWechatQuery.java | 56 ++ .../soopin/member/domain/vo/FeedbackVO.java | 43 ++ .../member/domain/vo/MemberAccountVO.java | 27 + .../member/domain/vo/MemberAddressVO.java | 47 ++ .../soopin/member/domain/vo/MemberCartVO.java | 53 ++ .../domain/vo/MemberDataStatisticsVO.java | 20 + .../member/domain/vo/MemberLogininforVO.java | 39 ++ .../wzj/soopin/member/domain/vo/MemberVO.java | 71 ++ .../member/domain/vo/MemberWechatVO.java | 58 ++ .../soopin/member/mapper/AddressMapper.java | 22 + .../soopin/member/mapper/FeedbackMapper.java | 21 + .../member/mapper/MemberAccountMapper.java | 27 + .../member/mapper/MemberAddressMapper.java | 25 + .../member/mapper/MemberCartMapper.java | 32 + .../member/mapper/MemberLogininforMapper.java | 25 + .../soopin/member/mapper/MemberMapper.java | 21 + .../member/mapper/MemberWechatMapper.java | 21 + .../member/service/FeedbackService.java | 130 ++++ .../member/service/MemberAccountService.java | 90 +++ .../member/service/MemberAddressService.java | 136 ++++ .../member/service/MemberCartService.java | 199 ++++++ .../service/MemberLogininforService.java | 113 ++++ .../soopin/member/service/MemberService.java | 160 +++++ .../member/service/MemberWechatService.java | 248 +++++++ .../src/main/resources/ums/AddressMapper.xml | 34 + .../src/main/resources/ums/FeedbackMapper.xml | 35 + .../resources/ums/MemberAccountMapper.xml | 34 + .../resources/ums/MemberAddressMapper.xml | 102 +++ .../main/resources/ums/MemberCartMapper.xml | 76 +++ .../resources/ums/MemberLogininforMapper.xml | 40 ++ .../src/main/resources/ums/MemberMapper.xml | 59 ++ .../main/resources/ums/MemberWechatMapper.xml | 54 ++ ruoyi-modules/ruoyi-order/pom.xml | 102 +++ .../order/controller/AftersaleController.java | 101 +++ .../controller/AftersaleItemController.java | 86 +++ .../order/controller/OrderController.java | 143 ++++ .../OrderDeliveryHistoryController.java | 86 +++ .../order/controller/OrderItemController.java | 86 +++ .../OrderOperateHistoryController.java | 86 +++ .../WechatPaymentHistoryController.java | 86 +++ .../order/convert/AftersaleConvert.java | 17 + .../order/convert/AftersaleItemConvert.java | 17 + .../soopin/order/convert/OrderConvert.java | 19 + .../convert/OrderDeliveryHistoryConvert.java | 17 + .../order/convert/OrderItemConvert.java | 17 + .../convert/OrderOperateHistoryConvert.java | 17 + .../convert/WechatPaymentHistoryConvert.java | 17 + .../soopin/order/domain/entity/Aftersale.java | 85 +++ .../order/domain/entity/AftersaleItem.java | 49 ++ .../wzj/soopin/order/domain/entity/Order.java | 162 +++++ .../domain/entity/OrderDeliveryHistory.java | 35 + .../soopin/order/domain/entity/OrderItem.java | 84 +++ .../domain/entity/OrderOperateHistory.java | 43 ++ .../domain/entity/WechatPaymentHistory.java | 73 ++ .../domain/form/DealWithAftersaleForm.java | 23 + .../order/domain/form/DeliverProductForm.java | 27 + .../form/ManagerAftersaleOrderForm.java | 41 ++ .../domain/form/ManagerOrderQueryForm.java | 54 ++ .../domain/query/AftersaleItemQuery.java | 32 + .../order/domain/query/AftersaleQuery.java | 54 ++ .../query/OrderDeliveryHistoryQuery.java | 24 + .../order/domain/query/OrderItemQuery.java | 59 ++ .../query/OrderOperateHistoryQuery.java | 27 + .../soopin/order/domain/query/OrderQuery.java | 107 +++ .../query/WechatPaymentHistoryQuery.java | 50 ++ .../order/domain/vo/AftersaleItemVO.java | 35 + .../soopin/order/domain/vo/AftersaleVO.java | 56 ++ .../domain/vo/ManagerOrderAddressVo.java | 26 + .../order/domain/vo/ManagerOrderDetailVO.java | 47 ++ .../domain/vo/ManagerOrderProductVO.java | 25 + .../order/domain/vo/ManagerOrderVO.java | 104 +++ .../domain/vo/ManagerRefundOrderDetailVO.java | 52 ++ .../order/domain/vo/ManagerRefundOrderVO.java | 86 +++ .../order/domain/vo/OrderAddressVO.java | 26 + .../domain/vo/OrderDeliveryHistoryVO.java | 24 + .../soopin/order/domain/vo/OrderItemVO.java | 59 ++ .../domain/vo/OrderOperateHistoryVO.java | 30 + .../wzj/soopin/order/domain/vo/OrderVO.java | 113 ++++ .../soopin/order/domain/vo/RefundInfoVO.java | 50 ++ .../domain/vo/WechatPaymentHistoryVO.java | 53 ++ .../order/mapper/AftersaleItemMapper.java | 25 + .../soopin/order/mapper/AftersaleMapper.java | 30 + .../mapper/OrderDeliveryHistoryMapper.java | 21 + .../soopin/order/mapper/OrderItemMapper.java | 21 + .../wzj/soopin/order/mapper/OrderMapper.java | 51 ++ .../mapper/OrderOperateHistoryMapper.java | 21 + .../mapper/WechatPaymentHistoryMapper.java | 21 + .../order/service/AftersaleItemService.java | 102 +++ .../order/service/AftersaleService.java | 471 +++++++++++++ .../service/OrderDeliveryHistoryService.java | 94 +++ .../order/service/OrderItemService.java | 173 +++++ .../service/OrderOperateHistoryService.java | 101 +++ .../soopin/order/service/OrderService.java | 403 +++++++++++ .../service/WechatPaymentHistoryService.java | 127 ++++ .../resources/mapper/AftersaleItemMapper.xml | 58 ++ .../main/resources/mapper/AftersaleMapper.xml | 109 +++ .../mapper/OrderDeliveryHistoryMapper.xml | 34 + .../main/resources/mapper/OrderItemMapper.xml | 56 ++ .../src/main/resources/mapper/OrderMapper.xml | 266 ++++++++ .../mapper/OrderOperateHistoryMapper.xml | 37 ++ .../mapper/WechatPaymentHistoryMapper.xml | 51 ++ 271 files changed, 18643 insertions(+), 17 deletions(-) create mode 100644 ruoyi-front/pom.xml create mode 100644 ruoyi-front/ruoyi-consumer/pom.xml create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/InterceptorConfig.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/MinIOConfig.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/RedisConfig.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/SpringSecurityConfig.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/knife4jConfig.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseInfoProperties.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/CommentController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FansController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FileController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/MsgController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/PassportController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/RabbitMQConsumer.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/UserInfoController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/VlogController.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/PassportInterceptor.java create mode 100644 ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/UserTokenInterceptor.java create mode 100644 ruoyi-front/ruoyi-manager/pom.xml rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysClientController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysConfigController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysDeptController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysDictDataController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysDictTypeController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysMenuController.java (99%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysNoticeController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysOssConfigController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysOssController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysPostController.java (98%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysProfileController.java (99%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysRoleController.java (99%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysSocialController.java (95%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysTenantController.java (99%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysTenantPackageController.java (99%) rename {ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system => ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller}/SysUserController.java (99%) create mode 100644 ruoyi-modules/ruoyi-content/pom.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/CommentBO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/LoginWithPasswordBO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/RegistLoginBO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/UpdatedUserBO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/VlogBO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/MessageMO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/Token.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Comment.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Fans.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/MyLikedVlog.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/UserMember.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Users.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Vlog.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/CommentVO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/FansVO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/IndexVlogVO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/UsersVO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/VlogerVO.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapperCustom.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapperCustom.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyLikedVlogMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UserMemberMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UsersMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapper.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapperCustom.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/repository/MessageRepository.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/CommentService.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/FansService.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/MsgService.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserMemberService.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserService.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/FansServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MsgServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserMemberServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapper.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapperCustom.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapper.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapperCustom.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/MyLikedVlogMapper.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UserMemberMapper.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UsersMapper.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapper.xml create mode 100644 ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapperCustom.xml create mode 100644 ruoyi-modules/ruoyi-goods/pom.xml create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Brand.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Product.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/ProductCategory.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Sku.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/BrandQuery.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductCategoryQuery.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductQuery.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/SkuQuery.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/BrandVO.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductCategoryVO.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductVO.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/SkuVO.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/BrandMapper.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductCategoryMapper.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductMapper.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/SkuMapper.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java create mode 100644 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/BrandMapper.xml create mode 100644 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductCategoryMapper.xml create mode 100644 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductMapper.xml create mode 100644 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/SkuMapper.xml create mode 100644 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-im/pom.xml create mode 100644 ruoyi-modules/ruoyi-im/src/site/apt/format.apt create mode 100644 ruoyi-modules/ruoyi-im/src/site/apt/index.apt create mode 100644 ruoyi-modules/ruoyi-im/src/site/fml/faq.fml create mode 100644 ruoyi-modules/ruoyi-im/src/site/fr/apt/format.apt create mode 100644 ruoyi-modules/ruoyi-im/src/site/fr/apt/index.apt create mode 100644 ruoyi-modules/ruoyi-im/src/site/fr/fml/faq.fml create mode 100644 ruoyi-modules/ruoyi-im/src/site/fr/xdoc/xdoc.xml create mode 100644 ruoyi-modules/ruoyi-im/src/site/site.xml create mode 100644 ruoyi-modules/ruoyi-im/src/site/site_fr.xml create mode 100644 ruoyi-modules/ruoyi-im/src/site/xdoc/xdoc.xml create mode 100644 ruoyi-modules/ruoyi-member/pom.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberLogininforController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberWechatController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/PlatformVerifyController.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/dto/AddressDTO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Address.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Feedback.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Member.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAccount.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAddress.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberCart.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberLogininfor.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberWechat.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/AddMemberCartForm.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/ChangeMemberStatusForm.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/MemberAddressForm.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/UpdateMemberCartForm.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/FeedbackQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAccountQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAddressQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberCartQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberLogininforQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberWechatQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FeedbackVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAccountVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAddressVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberCartVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberDataStatisticsVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberLogininforVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberWechatVO.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/FeedbackMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAddressMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberCartMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberLogininforMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberWechatMapper.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/FeedbackService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAccountService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAddressService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberCartService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberLogininforService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberWechatService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/AddressMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/FeedbackMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAccountMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAddressMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberCartMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberLogininforMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberMapper.xml create mode 100644 ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberWechatMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/pom.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Aftersale.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderDeliveryHistory.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderOperateHistory.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/WechatPaymentHistory.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DealWithAftersaleForm.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleItemVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderAddressVo.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderDetailVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderDetailVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderAddressVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderDeliveryHistoryVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderItemVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderOperateHistoryVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/RefundInfoVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/WechatPaymentHistoryVO.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderOperateHistoryMapper.xml create mode 100644 ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml diff --git a/pom.xml b/pom.xml index f1362f2e3..5d1d6ff81 100644 --- a/pom.xml +++ b/pom.xml @@ -372,6 +372,7 @@ ruoyi-common ruoyi-extend ruoyi-modules + ruoyi-front pom diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index c15d89c02..bf0dd0b95 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -138,7 +138,7 @@ mybatis-plus: # 对应的 XML 文件位置 mapperLocations: classpath*:mapper/**/*Mapper.xml # 实体扫描,多个package用逗号或者分号分隔 - typeAliasesPackage: org.dromara.**.domain + typeAliasesPackage: org.dromara.**.domain,com.wzj.soopin.** global-config: dbConfig: # 主键类型 diff --git a/ruoyi-front/pom.xml b/ruoyi-front/pom.xml new file mode 100644 index 000000000..4749b6e32 --- /dev/null +++ b/ruoyi-front/pom.xml @@ -0,0 +1,18 @@ + + + + ruoyi-vue-plus + org.dromara + ${revision} + + 4.0.0 + ruoyi-front + pom + + + ruoyi-consumer + ruoyi-manager + + diff --git a/ruoyi-front/ruoyi-consumer/pom.xml b/ruoyi-front/ruoyi-consumer/pom.xml new file mode 100644 index 000000000..e8d6a814f --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/pom.xml @@ -0,0 +1,103 @@ + + + + org.dromara + ruoyi-front + ${revision} + + 4.0.0 + + ruoyi-consumer + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/InterceptorConfig.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/InterceptorConfig.java new file mode 100644 index 000000000..2498b7c32 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/InterceptorConfig.java @@ -0,0 +1,117 @@ +package com.wzj.soopin.consumer.content.config; + +import com.imooc.intercepter.PassportInterceptor; +import com.imooc.intercepter.UserTokenInterceptor; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.ssl.SSLContexts; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.net.ssl.SSLContext; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + + private String[] CORS_HTTP_METHODS = { HttpMethod.HEAD.name(), HttpMethod.GET.name(), HttpMethod.POST.name(), + HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.OPTIONS.name(), HttpMethod.PATCH.name() }; + + private static final long CORS_MAX_AGE = 30 * 24 * 60 * 60; + + @Bean + public PassportInterceptor passportInterceptor() { + return new PassportInterceptor(); + } + + @Bean + public UserTokenInterceptor userTokenInterceptor() { + return new UserTokenInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(passportInterceptor()).addPathPatterns("/passport/getSMSCode"); + + registry.addInterceptor(userTokenInterceptor()).addPathPatterns("/userInfo/modifyUserInfo") + .addPathPatterns("/userInfo/modifyImage"); + } + + @Order(Ordered.HIGHEST_PRECEDENCE) + @Bean + public CorsFilter corsFilter() { + // 添加跨域配置信息 + CorsConfiguration config = new CorsConfiguration(); + // 设置访问源地址 + config.addAllowedOriginPattern("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置是否发送Cookie信息 + config.setAllowCredentials(true); + // 设置访问源请求方法 + Arrays.stream(CORS_HTTP_METHODS).forEach(method -> config.addAllowedMethod(method)); + // 设置请求最大有效时长 + config.setMaxAge(CORS_MAX_AGE); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + // 配置跨域 + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + @Primary + @Bean + public RestTemplate restTemplate() { + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); + // 连接池最大连接数 + connManager.setMaxTotal(1000); + // 每个主机的并发 + connManager.setDefaultMaxPerRoute(500); + + CloseableHttpClient httpClient = HttpClients.custom()// + .setConnectionManager(connManager)// 设置HTTP连接管理器 + .build(); + return buildRestTemplate(httpClient); + } + + @Bean + public RestTemplate restTemplateIgnoreSSL() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { + SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, (chain, authType) -> true).build(); + SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, + NoopHostnameVerifier.INSTANCE); + + CloseableHttpClient httpClient = HttpClients.custom()// + .setSSLSocketFactory(sslSocketFactory)// + .build(); + return buildRestTemplate(httpClient); + } + + private RestTemplate buildRestTemplate(CloseableHttpClient httpClient) { + HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory( + httpClient); + // 获取链接超时时间 + httpRequestFactory.setConnectionRequestTimeout(3000); + // 指客户端和服务器建立连接的timeout + httpRequestFactory.setConnectTimeout(3000); + // 读取数据的超时时间 + httpRequestFactory.setReadTimeout(120000); + return new RestTemplate(httpRequestFactory); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/MinIOConfig.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/MinIOConfig.java new file mode 100644 index 000000000..91340f0ef --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/MinIOConfig.java @@ -0,0 +1,33 @@ +package com.wzj.soopin.consumer.content.config; + +import com.imooc.utils.MinIOUtils; +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Data +public class MinIOConfig { + + @Value("${minio.endpoint}") + private String endpoint; + @Value("${minio.fileHost}") + private String fileHost; + @Value("${minio.bucketName}") + private String bucketName; + @Value("${minio.accessKey}") + private String accessKey; + @Value("${minio.secretKey}") + private String secretKey; + + @Value("${minio.imgSize}") + private Integer imgSize; + @Value("${minio.fileSize}") + private Integer fileSize; + + @Bean + public MinIOUtils creatMinioClient() { + return new MinIOUtils(endpoint, bucketName, accessKey, secretKey, imgSize, fileSize); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/RedisConfig.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/RedisConfig.java new file mode 100644 index 000000000..91281bbf6 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/RedisConfig.java @@ -0,0 +1,56 @@ +package com.wzj.soopin.consumer.content.config; + +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; +import org.redisson.spring.data.connection.RedissonConnectionFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Slf4j +@Configuration +@ConditionalOnClass(RedissonClient.class) +public class RedisConfig { + + private static final RedisSerializer STRING_SERIALIZER = new StringRedisSerializer(); + + @Bean + RedissonConnectionFactory redisConnectionFactory(RedissonClient redisson) { + log.info("------------->>>配置自定义RedissonConnectionFactory"); + return new RedissonConnectionFactory(redisson); + } + + @Bean + RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + log.info("------------->>>配置自定义RedisTemplate"); + return buildRedisTemplate(redisConnectionFactory); + } + + /** + * 配置redisTemplate + * + * @param redisConnectionFactory + * @param enableTransactionSupport + * @return + */ + private RedisTemplate buildRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + // 配置redisTemplate + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + // key序列化 + redisTemplate.setKeySerializer(STRING_SERIALIZER); + // value序列化 + redisTemplate.setValueSerializer(STRING_SERIALIZER); + // Hash key序列化 + redisTemplate.setHashKeySerializer(STRING_SERIALIZER); + // Hash value序列化 + redisTemplate.setHashValueSerializer(STRING_SERIALIZER); + // 初始化RedisTemplate + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/SpringSecurityConfig.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/SpringSecurityConfig.java new file mode 100644 index 000000000..10273d059 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/SpringSecurityConfig.java @@ -0,0 +1,30 @@ +package com.wzj.soopin.consumer.content.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + * spring security配置类. + * + * @author lzc + * @version 1.0 + */ +@Configuration +public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().antMatchers("/**").permitAll() // 所有请求都可以访问 + .and().csrf().disable() // 跨域请求关闭 + .headers().frameOptions().disable(); // 资源下载权限关闭 + } + + @Bean + PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/knife4jConfig.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/knife4jConfig.java new file mode 100644 index 000000000..0415e4d9f --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/config/knife4jConfig.java @@ -0,0 +1,40 @@ +package com.wzj.soopin.consumer.content.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +/** + * @author vercen + * @version 1.0 + * @date 2023/5/20 19:55 + */ +@Configuration +@EnableSwagger2WebMvc +public class knife4jConfig { + @Bean + public Docket defaultApi2() { + Docket docket=new Docket(DocumentationType.SWAGGER_2) + .apiInfo(new ApiInfoBuilder() + //.title("swagger-bootstrap-ui-demo RESTful APIs") + .description("短视频实战接口文档") + .termsOfServiceUrl("http://www.xx.com/") + .contact(new Contact("lee", "http://www.imooc.com/", "abc@imooc.com")) + .version("1.0") + .build()) + //分组名称 + .groupName("2.X版本") + .select() + //这里指定Controller扫描包路径 + .apis(RequestHandlerSelectors.basePackage("com.imooc.controller")) + .paths(PathSelectors.any()) + .build(); + return docket; + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseController.java new file mode 100644 index 000000000..c4a0937b3 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseController.java @@ -0,0 +1,12 @@ +package com.wzj.soopin.consumer.content.controller; + +//public class BaseController { +// +// @Autowired +// public RedisOperator redis; +// +// public static final String MOBILE_SMSCODE = "mobile:smscode"; +// public static final String REDIS_USER_TOKEN = "redis_user_token"; +// public static final String REDIS_USER_INFO = "redis_user_info"; +// +//} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseInfoProperties.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseInfoProperties.java new file mode 100644 index 000000000..a5ceef8cd --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/BaseInfoProperties.java @@ -0,0 +1,46 @@ +package com.wzj.soopin.consumer.content.controller;//package com.imooc.controller; +// +//import com.github.pagehelper.PageInfo; +//import com.imooc.utils.RedisOperator; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.validation.BindingResult; +//import org.springframework.validation.FieldError; +// +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +//public class BaseInfoProperties { +// +// @Autowired +// public RedisOperator redis; +// +// public static final Integer COMMON_START_PAGE = 1; +// public static final Integer COMMON_PAGE_SIZE = 10; +// +// public static final String MOBILE_SMSCODE = "mobile:smscode"; +// public static final String REDIS_USER_TOKEN = "redis_user_token"; +// public static final String REDIS_USER_INFO = "redis_user_info"; +// +// +// //我的关注总数 +// public static final String REDIS_MY_FOLLOWS_COUNTS = "redis_my_follows_counts"; +// // 我的粉丝总数 +// public static final String REDIS_MY_FANS_COUNTS = "redis_my_fans_counts"; +// +// // 视频和发布者获赞数 +// public static final String REDIS_VLOG_BE_LIKED_COUNTS = "redis_vlog_be_liked_counts"; +// public static final String REDIS_VLOGER_BE_LIKED_COUNTS = "redis_vloger_be_liked_counts"; +// +// public PagedGridResult setterPagedGrid(List list, +// Integer page) { +// PageInfo pageList = new PageInfo<>(list); +// PagedGridResult gridResult = new PagedGridResult(); +// gridResult.setRows(list); +// gridResult.setPage(page); +// gridResult.setRecords(pageList.getTotal()); +// gridResult.setTotal(pageList.getPages()); +// return gridResult; +// } +// +//} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/CommentController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/CommentController.java new file mode 100644 index 000000000..c00cbd42e --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/CommentController.java @@ -0,0 +1,114 @@ +package com.wzj.soopin.consumer.content.controller; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.CommentBO; +import com.imooc.enums.MessageEnum; +import com.imooc.grace.result.GraceJSONResult; +import com.imooc.pojo.Comment; +import com.imooc.pojo.Vlog; +import com.imooc.service.CommentService; +import com.imooc.service.MsgService; +import com.imooc.service.VlogService; +import com.imooc.vo.CommentVO; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Api(tags = "CommentController 评论模块的接口") +@RequestMapping("comment") +@RestController +public class CommentController extends BaseInfoProperties { + + @Autowired + private CommentService commentService; + @Autowired + private MsgService msgService; + @Autowired + private VlogService vlogService; +// + @PostMapping("create") + public GraceJSONResult create(@RequestBody @Valid CommentBO commentBO) + throws Exception { + + CommentVO commentVO = commentService.createComment(commentBO); + return GraceJSONResult.ok(commentVO); + } +// + @GetMapping("counts") + public GraceJSONResult counts(@RequestParam String vlogId) { + + String countsStr = redis.get(REDIS_VLOG_COMMENT_COUNTS + ":" + vlogId); + if (StringUtils.isBlank(countsStr)) { + countsStr = "0"; + } + + return GraceJSONResult.ok(Integer.valueOf(countsStr)); + } + + @GetMapping("list") + public GraceJSONResult list(@RequestParam String vlogId, + @RequestParam(defaultValue = "") String userId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + return GraceJSONResult.ok( + commentService.queryVlogComments( + vlogId, + userId, + page, + pageSize)); + } + + @DeleteMapping("delete") + public GraceJSONResult delete(@RequestParam String commentUserId, + @RequestParam String commentId, + @RequestParam String vlogId) { + commentService.deleteComment(commentUserId, + commentId, + vlogId); + return GraceJSONResult.ok(); + } + + @PostMapping("like") + public GraceJSONResult like(@RequestParam String commentId, + @RequestParam String userId) { + + // 故意犯错,bigkey + redis.incrementHash(REDIS_VLOG_COMMENT_LIKED_COUNTS, commentId, 1); + redis.setHashValue(REDIS_USER_LIKE_COMMENT, userId + ":" + commentId, "1"); +// redis.hset(REDIS_USER_LIKE_COMMENT, userId, "1"); + + + // 系统消息:点赞评论 + Comment comment = commentService.getComment(commentId); + Vlog vlog = vlogService.getVlog(comment.getVlogId()); + Map msgContent = new HashMap(); + msgContent.put("vlogId", vlog.getId()); + msgContent.put("vlogCover", vlog.getCover()); + msgContent.put("commentId", commentId); + msgService.createMsg(userId, + comment.getCommentUserId(), + MessageEnum.LIKE_COMMENT.type, + msgContent); + + + return GraceJSONResult.ok(); + } + + @PostMapping("unlike") + public GraceJSONResult unlike(@RequestParam String commentId, + @RequestParam String userId) { + + redis.decrementHash(REDIS_VLOG_COMMENT_LIKED_COUNTS, commentId, 1); + redis.hdel(REDIS_USER_LIKE_COMMENT, userId + ":" + commentId); + + return GraceJSONResult.ok(); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FansController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FansController.java new file mode 100644 index 000000000..59f231cd1 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FansController.java @@ -0,0 +1,298 @@ +package com.wzj.soopin.consumer.content.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.imooc.base.BaseInfoProperties; +import com.imooc.grace.result.GraceJSONResult; +import com.imooc.grace.result.ResponseStatusEnum; +import com.imooc.pojo.Users; +import com.imooc.service.FansService; +import com.imooc.service.UserService; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@Api(tags = "FansController 粉丝相关业务功能的接口") +@RequestMapping("fans") +@RestController +public class FansController extends BaseInfoProperties { + + @Autowired + private UserService userService; + @Autowired + private FansService fansService; + + @PostMapping("follow") + public GraceJSONResult follow(@RequestParam String myId, + @RequestParam String vlogerId) { + // 从redis中获取拉黑信息 + String redisKey = REDIS_USER_BLOCK + ":" + myId; + Boolean hasKey = redis.keyIsExist(redisKey); + if(hasKey){ + List blockUserList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理拉黑信息 + String queryvlogerId = (String) reportMap.get("vlogerId"); + blockUserList.add(queryvlogerId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + System.out.println(blockUserList); + Boolean isBlock = blockUserList.contains(vlogerId); + if(isBlock){ + return GraceJSONResult.errorCustom(ResponseStatusEnum.ON_BLOCK); + } + } + + // 判断两个id不能为空 + if (StringUtils.isBlank(myId) || StringUtils.isBlank(vlogerId)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR); + } + + // 判断当前用户,自己不能关注自己 + if (myId.equalsIgnoreCase(vlogerId)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_RESPONSE_NO_INFO); + } + + // 是否已经存在关系 + Boolean flow = fansService.queryDoIFollowVloger(myId,vlogerId); + if(flow){ + return GraceJSONResult.errorCustom(ResponseStatusEnum.FANS_INFO_UPDATED_ISFAN_EXIST_ERROR); + } + + // 判断两个id对应的用户是否存在 + Users vloger = userService.getUser(vlogerId); + Users myInfo = userService.getUser(myId); + + // fixme: 两个用户id的数据库查询后的判断,是分开好?还是合并判断好? + if (myInfo == null || vloger == null) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_RESPONSE_NO_INFO); + } +// + // 保存粉丝关系到数据库 + fansService.doFollow(myId, vlogerId); + + // 博主的粉丝+1,我的关注+1 + redis.increment(REDIS_MY_FOLLOWS_COUNTS + ":" + myId, 1); + redis.increment(REDIS_MY_FANS_COUNTS + ":" + vlogerId, 1); + + // 我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈 + redis.set(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + myId + ":" + vlogerId, "1"); +// + return GraceJSONResult.ok(); + } + + @PostMapping("cancel") + public GraceJSONResult cancel(@RequestParam String myId, + @RequestParam String vlogerId) { + // 判断两个id不能为空 + if (StringUtils.isBlank(myId) || StringUtils.isBlank(vlogerId)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR); + } + // 是否已经存在关系 + Boolean flow = fansService.queryDoIFollowVloger(myId,vlogerId); + if(!flow){ + return GraceJSONResult.errorCustom(ResponseStatusEnum.FANS_INFO_UPDATED_ISFLOW_EXIST_ERROR); + } + // 删除业务的执行 + fansService.doCancel(myId, vlogerId); + + // 博主的粉丝-1,我的关注-1 + redis.decrement(REDIS_MY_FOLLOWS_COUNTS + ":" + myId, 1); + redis.decrement(REDIS_MY_FANS_COUNTS + ":" + vlogerId, 1); + + // 我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈 + redis.del(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + myId + ":" + vlogerId); + + return GraceJSONResult.ok(); + } + + @GetMapping("queryBlockVloger") + public GraceJSONResult queryBlockVloger(@RequestParam String myId, + @RequestParam String vlogerId) { + // 从redis中获取拉黑信息 + String redisKey = REDIS_USER_BLOCK + ":" + myId; + Boolean hasKey = redis.keyIsExist(redisKey); + if(hasKey){ + List blockUserList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理拉黑信息 + String queryvlogerId = (String) reportMap.get("vlogerId"); + blockUserList.add(queryvlogerId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + System.out.println(blockUserList); + return GraceJSONResult.ok(blockUserList.contains(vlogerId)); + }else{ + return GraceJSONResult.ok(false); + } + } + + @PostMapping("block") + public GraceJSONResult block(@RequestParam String myId, + @RequestParam String vlogerId) { + // 先执行cancel + // 判断两个id不能为空 + if (StringUtils.isBlank(myId) || StringUtils.isBlank(vlogerId)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR); + } + // 是否已经存在关系 + Boolean flow = fansService.queryDoIFollowVloger(myId,vlogerId); + if(flow){ + // 删除业务的执行 + fansService.doCancel(myId, vlogerId); + + // 博主的粉丝-1,我的关注-1 + redis.decrement(REDIS_MY_FOLLOWS_COUNTS + ":" + myId, 1); + redis.decrement(REDIS_MY_FANS_COUNTS + ":" + vlogerId, 1); + + // 我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈 + redis.del(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + myId + ":" + vlogerId); + } + // 拉黑 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String blockTime = LocalDateTime.now().format(formatter); + try{ + Map blockInfo = new HashMap<>(); + blockInfo.put("vlogerId", vlogerId); + blockInfo.put("myId", myId); + blockInfo.put("time", blockTime); + // 转成 JSON 字符串 + ObjectMapper objectMapper = new ObjectMapper(); + String blockJson = objectMapper.writeValueAsString(blockInfo); + String redisKey = REDIS_USER_BLOCK + ":" + myId ; + log.info("写入Redis => key: {}, value: {}", redisKey, blockJson); + redis.rpush(redisKey , blockJson); + + return GraceJSONResult.ok(); + }catch (JsonProcessingException e){ + // 打日志,或者抛出业务异常 + e.printStackTrace(); + throw new RuntimeException("JSON序列化失败: " + e.getMessage()); + } + } + + @PostMapping("cancelBlock") + public GraceJSONResult cancelBlock(@RequestParam String myId, + @RequestParam String vlogerId) { + // 判断两个id不能为空 + if (StringUtils.isBlank(myId) || StringUtils.isBlank(vlogerId)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR); + } + // 解除拉黑 + String redisKey = REDIS_USER_BLOCK + ":" + myId; + Boolean hasKey = redis.keyIsExist(redisKey); + if(hasKey){ + List blockList = redis.lrange(redisKey, 0, -1); + ObjectMapper objectMapper = new ObjectMapper(); + if (blockList != null && !blockList.isEmpty()) { + for (String item : blockList) { + try { + Map itemMap = objectMapper.readValue(item, new TypeReference>() {}); + String storedVlogerId = itemMap.get("vlogerId"); + + if (storedVlogerId != null && storedVlogerId.equals(vlogerId)) { + redis.lrem(redisKey, 1, item); // 删除找到的 JSON 字符串 + break; + } + }catch (JsonProcessingException e){ + e.printStackTrace(); + } + } + } + return GraceJSONResult.ok(); + }else{ + return GraceJSONResult.error(); + } + } + + @PostMapping("blockVideo") + public GraceJSONResult blockVideo(@RequestParam String myId, + @RequestParam String vlogId, + @RequestParam String reason, + @RequestParam(defaultValue = "") String description) { + // 判断两个id不能为空 + if (StringUtils.isBlank(myId) || StringUtils.isBlank(vlogId)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR); + } + // 拉黑 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String blockTime = LocalDateTime.now().format(formatter); + // + try{ + Map blockInfo = new HashMap<>(); + blockInfo.put("vlogId", vlogId); + blockInfo.put("reporter", myId); + blockInfo.put("time", blockTime); + blockInfo.put("reason", reason); + blockInfo.put("description", description); + // 转成 JSON 字符串 + ObjectMapper objectMapper = new ObjectMapper(); + String blockJson = objectMapper.writeValueAsString(blockInfo); + + String redisKey = REDIS_VIDEO_BLOCK + ":" + myId ; + log.info("写入Redis => key: {}, value: {}", redisKey, blockJson); + redis.rpush(redisKey , blockJson); + + return GraceJSONResult.ok(); + }catch (JsonProcessingException e){ + // 打日志,或者抛出业务异常 + e.printStackTrace(); + throw new RuntimeException("JSON序列化失败: " + e.getMessage()); + } + } + + + + @GetMapping("queryDoIFollowVloger") + public GraceJSONResult queryDoIFollowVloger(@RequestParam String myId, + @RequestParam String vlogerId) { + return GraceJSONResult.ok(fansService.queryDoIFollowVloger(myId, vlogerId)); + } + + @GetMapping("queryMyFollows") + public GraceJSONResult queryMyFollows(@RequestParam String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + return GraceJSONResult.ok( + fansService.queryMyFollows( + myId, + page, + pageSize)); + } + + @GetMapping("queryMyFans") + public GraceJSONResult queryMyFans(@RequestParam String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + return GraceJSONResult.ok( + fansService.queryMyFans( + myId, + page, + pageSize)); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FileController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FileController.java new file mode 100644 index 000000000..3e4473542 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/FileController.java @@ -0,0 +1,72 @@ +package com.wzj.soopin.consumer.content.controller; + + +import com.imooc.config.MinIOConfig; +import com.imooc.grace.result.GraceJSONResult; +import io.swagger.annotations.Api; +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.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + + +@Slf4j +@Api(tags = "FileController 文件上传测试的接口") +@RestController +public class FileController { + + @Autowired + private MinIOConfig minIOConfig; + + @PostMapping("upload") + public GraceJSONResult upload(MultipartFile file) throws Exception { + // 获取 vlogdata 目录路径 +// String storagePath = new File(System.getProperty("user.dir"), "vlogdata").getAbsolutePath(); + String storagePath = "/data/vlogdata"; // 生产 +// String storagePath = "/Users/wuzhongjie/Desktop/vlog-1.0.0/vlogdata"; // 本地 + + log.info(storagePath); + File storageDir = new File(storagePath); + if (!storageDir.exists()) { + storageDir.mkdirs(); // 确保目录存在 + } + + // 组装完整的存储路径 + File destFile = new File(storageDir, file.getOriginalFilename()); + log.info(destFile.getAbsolutePath()); + String imgUrl = destFile.getAbsolutePath(); + // 使用流手动存储文件 + try (InputStream inputStream = file.getInputStream(); + OutputStream outputStream = new FileOutputStream(destFile)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + + log.info("本地文件存储成功: " + destFile.getAbsolutePath()); + +// String fileName = file.getOriginalFilename(); +// +// +// +// MinIOUtils.uploadFile(minIOConfig.getBucketName(), +// fileName, +// file.getInputStream()); +// +// String imgUrl = minIOConfig.getFileHost() +// + "/" +// + minIOConfig.getBucketName() +// + "/" +// + fileName; + + return GraceJSONResult.ok(imgUrl); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/MsgController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/MsgController.java new file mode 100644 index 000000000..b074e2916 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/MsgController.java @@ -0,0 +1,43 @@ +package com.wzj.soopin.consumer.content.controller; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.grace.result.GraceJSONResult; +import com.imooc.mo.MessageMO; +import com.imooc.service.MsgService; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@Api(tags = "MsgController 消息功能模块的接口") +@RequestMapping("msg") +@RestController +public class MsgController extends BaseInfoProperties { + + @Autowired + private MsgService msgService; + + @GetMapping("list") + public GraceJSONResult list(@RequestParam String userId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + // mongodb 从0分页,区别于数据库 + if (page == null) { + page = COMMON_START_PAGE_ZERO; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + List list = msgService.queryList(userId, page, pageSize); + + return GraceJSONResult.ok(list); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/PassportController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/PassportController.java new file mode 100644 index 000000000..cacd9a533 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/PassportController.java @@ -0,0 +1,210 @@ +package com.wzj.soopin.consumer.content.controller; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.LoginWithPasswordBO; +import com.imooc.bo.RegistLoginBO; +import com.imooc.grace.result.GraceJSONResult; +import com.imooc.grace.result.ResponseStatusEnum; +import com.imooc.pojo.Users; +import com.imooc.service.UserService; +import com.imooc.utils.GsonUtil; +import com.imooc.utils.IPUtil; +import com.imooc.utils.SMSUtils; +import com.imooc.vo.UsersVO; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.Optional; +import java.util.UUID; + +/** + * @author vercen + * @version 1.0 + * @date 2023/5/25 10:47 + */ +@Slf4j +@RestController +@RequestMapping("passport") +@Api(tags = "通行证,验证码登录注册") +public class PassportController extends BaseInfoProperties { + @Autowired + private SMSUtils smsUtils; + + @Autowired + private UserService userService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @PostMapping("getSMSCode") + public Object getSMSCode(@RequestParam String mobile, HttpServletRequest request) throws Exception { + if (StringUtils.isBlank(mobile)) { + return GraceJSONResult.ok(); + } + + // TODO 获得用户ip 限制时间60s只能1次 + String userIp = IPUtil.getRequestIp(request); + + redis.setnx60s(MOBILE_SMSCODE + ":" + userIp, userIp); + String code = (int) ((Math.random() * 9 + 1) * 100000) + ""; + + smsUtils.sendSMS(mobile, code); + + log.info(code); + redis.set(MOBILE_SMSCODE + ":" + mobile, code, 30 * 60); + // TODO 验证码放入redis + return GraceJSONResult.ok(); + } + + @PostMapping("login") + public Object login(@Valid @RequestBody RegistLoginBO registLoginBO) { + + String rediscode = redis.get(MOBILE_SMSCODE + ":" + registLoginBO.getMobile()); + + if (StringUtils.isBlank(rediscode) || !rediscode.equalsIgnoreCase(registLoginBO.getSmsCode())) { + System.out.println("rediscode" + rediscode); + System.out.println("registLoginBO.getMobile()" + registLoginBO.getSmsCode()); + return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR); + } + + Users user = userService.queryMobileIsExist(registLoginBO.getMobile()); + if (user == null) { + user = userService.createUser(registLoginBO.getMobile()); + } + String uToken = UUID.randomUUID().toString(); + log.info(uToken); + redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken); + + // 清除验证码 + redis.del(MOBILE_SMSCODE + ":" + user.getMobile()); + + // 返回给前端 + UsersVO usersVO = new UsersVO(); + BeanUtils.copyProperties(user, usersVO); + usersVO.setUserToken(uToken); + + return GraceJSONResult.ok(usersVO); + } + + /** + * 从商城系统登录 + * + * @param mobile + * @return + */ + @PostMapping("loginFromShop") + public String loginFromShop(String mobile, String memberId) { + // 创建短视频系统账号 + return Optional.ofNullable(userService.createUserFromShop(mobile, memberId))// + .map(user -> { + String uToken = UUID.randomUUID().toString(); + log.info(uToken); + redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken); + // 返回给前端 + UsersVO usersVO = new UsersVO(); + BeanUtils.copyProperties(user, usersVO); + usersVO.setUserToken(uToken); + + return GsonUtil.beanToJson(usersVO); + })// + .orElseGet(() -> StringUtils.EMPTY); + } + + /** + * 从商城登录获取短视频账户信息 + * + * @param memberId + * @return + */ + @PostMapping("getUserFromShop") + public String getUserFromShop(String memberId) { + return userService.getUserInfoFromShop(memberId); + } + + /*@PostMapping("login") + public Object login(@Valid @RequestBody RegistLoginBO registLoginBO) { + String rediscode = redis.get(MOBILE_SMSCODE + ":" + registLoginBO.getMobile()); + + if (StringUtils.isBlank(rediscode) || !rediscode.equalsIgnoreCase(registLoginBO.getSmsCode())) { + System.out.println("rediscode" + rediscode); + System.out.println("registLoginBO.getMobile()" + registLoginBO.getSmsCode()); + return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR); + } + + // 手机号 + String mobile = registLoginBO.getMobile(); + Users user = userService.queryMobileIsExist(mobile); + Token shopToken = null; + if (user == null) { + Map result = userService.createUserNew(mobile); + if (CommonUtil.isEmpty(result)) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.FAILED); + } + user = (Users) result.get("user"); + shopToken = (Token) result.get("token"); + } else { + shopToken = userService.getShopToken(user.getId()); + } + + String uToken = UUID.randomUUID().toString(); + log.info(uToken); + redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken); + + // 清除验证码 + redis.del(MOBILE_SMSCODE + ":" + user.getMobile()); + + // 返回给前端 + UsersVO usersVO = new UsersVO(); + BeanUtils.copyProperties(user, usersVO); + usersVO.setUserToken(uToken); + //usersVO.setShopToken(shopToken); + + return GraceJSONResult.ok(usersVO); + }*/ + + @PostMapping("loginWithPassword") + public Object loginWithPassword(@Valid @RequestBody LoginWithPasswordBO loginWithPasswordBO) { + String phone = loginWithPasswordBO.getMobile(); + String password = loginWithPasswordBO.getPassword(); + log.info(phone); + log.info(password); + Users user = userService.queryMobileIsExist(phone); + if (user == null) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_NOT_EXIST_ERROR); + } + if (!passwordEncoder.matches(password, user.getPassword())) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_PASSWORD_ERROR); + } + + String uToken = UUID.randomUUID().toString(); + log.info(uToken); + redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken); + // 商城token + // Token shopToken = userService.getShopToken(user.getId()); + + // 返回给前端 + UsersVO usersVO = new UsersVO(); + BeanUtils.copyProperties(user, usersVO); + usersVO.setUserToken(uToken); + // usersVO.setShopToken(shopToken); + + return GraceJSONResult.ok(usersVO); + + } + + @PostMapping("logout") + public Object logout(@RequestParam String userId) { + + redis.del(REDIS_USER_TOKEN + ":" + userId); + + return GraceJSONResult.ok(); + } + +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/RabbitMQConsumer.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/RabbitMQConsumer.java new file mode 100644 index 000000000..ea3cd50c9 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/RabbitMQConsumer.java @@ -0,0 +1,66 @@ +package com.wzj.soopin.consumer.content.controller; + +import com.imooc.base.RabbitMQConfig; +import com.imooc.enums.MessageEnum; +import com.imooc.exceptions.GraceException; +import com.imooc.grace.result.ResponseStatusEnum; +import com.imooc.mo.MessageMO; +import com.imooc.service.MsgService; +import com.imooc.utils.JsonUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class RabbitMQConsumer { + + @Autowired + private MsgService msgService; + + @RabbitListener(queues = {RabbitMQConfig.QUEUE_SYS_MSG}) + public void watchQueue(String payload, Message message) { + log.info(payload); + + MessageMO messageMO = JsonUtils.jsonToPojo(payload, MessageMO.class); + + String routingKey = message.getMessageProperties().getReceivedRoutingKey(); + log.info(routingKey); + + // TODO: 下面这段代码可以优化,一个地方是参数优化,另外是枚举的判断优化 + + if (routingKey.equalsIgnoreCase("sys.msg." + MessageEnum.FOLLOW_YOU.enValue)) { + msgService.createMsg(messageMO.getFromUserId(), + messageMO.getToUserId(), + MessageEnum.FOLLOW_YOU.type, + null); + } else if (routingKey.equalsIgnoreCase("sys.msg." + MessageEnum.LIKE_VLOG.enValue)) { + msgService.createMsg(messageMO.getFromUserId(), + messageMO.getToUserId(), + MessageEnum.FOLLOW_YOU.type, + messageMO.getMsgContent()); + } else if (routingKey.equalsIgnoreCase("sys.msg." + MessageEnum.COMMENT_VLOG.enValue)) { + msgService.createMsg(messageMO.getFromUserId(), + messageMO.getToUserId(), + MessageEnum.COMMENT_VLOG.type, + messageMO.getMsgContent()); + } else if (routingKey.equalsIgnoreCase("sys.msg." + MessageEnum.REPLY_YOU.enValue)) { + msgService.createMsg(messageMO.getFromUserId(), + messageMO.getToUserId(), + MessageEnum.REPLY_YOU.type, + messageMO.getMsgContent()); + } else if (routingKey.equalsIgnoreCase("sys.msg." + MessageEnum.LIKE_COMMENT.enValue)) { + msgService.createMsg(messageMO.getFromUserId(), + messageMO.getToUserId(), + MessageEnum.LIKE_COMMENT.type, + messageMO.getMsgContent()); + } else { + GraceException.display(ResponseStatusEnum.SYSTEM_OPERATION_ERROR); + } + + } + + +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/UserInfoController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/UserInfoController.java new file mode 100644 index 000000000..0433cf7db --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/UserInfoController.java @@ -0,0 +1,148 @@ +package com.wzj.soopin.consumer.content.controller; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.UpdatedUserBO; +import com.imooc.config.MinIOConfig; +import com.imooc.enums.FileTypeEnum; +import com.imooc.enums.UserInfoModifyType; +import com.imooc.grace.result.GraceJSONResult; +import com.imooc.grace.result.ResponseStatusEnum; +import com.imooc.pojo.Users; +import com.imooc.service.UserService; +import com.imooc.utils.MinIOUtils; +import com.imooc.vo.UsersVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author vercen + * @version 1.0 + * @date 2023/5/20 14:32 + */ +@RestController +@Slf4j +@Api(tags = "UserInfoController用户信息接口模块") +@RequestMapping("userInfo") +public class UserInfoController extends BaseInfoProperties { + + @Autowired + UserService userService; + +// @ResponseBody + @ApiOperation(value = "根据userId返回个人信息") + @GetMapping("query") + public Object query(@RequestParam String userId){ + Users user = userService.getUser(userId); + + UsersVO usersVO = new UsersVO(); + BeanUtils.copyProperties(user, usersVO); + + + // 我的关注博主总数量 + String myFollowsCountsStr = redis.get(REDIS_MY_FOLLOWS_COUNTS + ":" + userId); + // 我的粉丝总数 + String myFansCountsStr = redis.get(REDIS_MY_FANS_COUNTS + ":" + userId); + // 用户获赞总数,视频博主(点赞/喜欢)总和 +// String likedVlogCountsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + userId); + String likedVlogerCountsStr = redis.get(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + userId); + + Integer myFollowsCounts = 0; + Integer myFansCounts = 0; + Integer likedVlogCounts = 0; + Integer likedVlogerCounts = 0; + Integer totalLikeMeCounts = 0; + + + if (StringUtils.isNotBlank(myFollowsCountsStr)) { + myFollowsCounts = Integer.valueOf(myFollowsCountsStr); + } + if (StringUtils.isNotBlank(myFansCountsStr)) { + myFansCounts = Integer.valueOf(myFansCountsStr); + } +// if (StringUtils.isNotBlank(likedVlogCountsStr)) { +// likedVlogCounts = Integer.valueOf(likedVlogCountsStr); +// } + if (StringUtils.isNotBlank(likedVlogerCountsStr)) { + likedVlogerCounts = Integer.valueOf(likedVlogerCountsStr); + } + totalLikeMeCounts = likedVlogCounts + likedVlogerCounts; + + usersVO.setMyFollowsCounts(myFollowsCounts); + usersVO.setMyFansCounts(myFansCounts); + usersVO.setTotalLikeMeCounts(totalLikeMeCounts); + + //usersVO.setMyFansCounts((Integer) myFansCounts); + + return GraceJSONResult.ok(usersVO); + } + + @PostMapping("modifyUserInfo") + public GraceJSONResult modifyUserInfo(@RequestBody UpdatedUserBO updatedUserBO, @RequestParam Integer type) throws Exception { + + UserInfoModifyType.checkUserInfoTypeIsRight(type); + Users newUserInfo = userService.updateUserInfo(updatedUserBO, type); + return GraceJSONResult.ok(newUserInfo); + } + + @Autowired + private MinIOConfig minIOConfig; + + @PostMapping("modifyImage") + public GraceJSONResult modifyImage(@RequestParam String userId, + @RequestParam Integer type, + MultipartFile file) throws Exception { + + if (type != FileTypeEnum.BGIMG.type && type != FileTypeEnum.FACE.type) { + return GraceJSONResult.errorCustom(ResponseStatusEnum.FILE_UPLOAD_FAILD); + } + + String fileName = file.getOriginalFilename(); + + MinIOUtils.uploadFile(minIOConfig.getBucketName(), + fileName, + file.getInputStream()); + + String imgUrl = minIOConfig.getFileHost() + + "/" + + minIOConfig.getBucketName() + + "/" + + fileName; + + + // 修改图片地址到数据库 + UpdatedUserBO updatedUserBO = new UpdatedUserBO(); + updatedUserBO.setId(userId); + + if (type == FileTypeEnum.BGIMG.type) { + updatedUserBO.setBgImg(imgUrl); + } else { + updatedUserBO.setFace(imgUrl); + } + Users users = userService.updateUserInfo(updatedUserBO); + + return GraceJSONResult.ok(users); + } + + @ApiOperation(value = "根据昵称搜索用户") + @GetMapping("searchByNickname") + public GraceJSONResult searchByNickname(@RequestParam String nickname, + @RequestParam(defaultValue = "") String id, + @RequestParam Integer page, + @RequestParam Integer pageSize){ + try { + return GraceJSONResult.ok(userService.searchByNickname(nickname, page, pageSize,id)); + } catch (Exception e) { + // 记录异常日志 + log.error("搜索用户时发生异常,nickname: {}, page: {}, pageSize: {}", nickname, page, pageSize, e); + return GraceJSONResult.errorMsg("搜索用户时发生异常,请稍后重试"); + } + } + + +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/VlogController.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/VlogController.java new file mode 100644 index 000000000..2c8c41c67 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/controller/VlogController.java @@ -0,0 +1,370 @@ +package com.wzj.soopin.consumer.content.controller; + + +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.VlogBO; +import com.imooc.config.MinIOConfig; +import com.imooc.enums.YesOrNo; +import com.imooc.grace.result.GraceJSONResult; +import com.imooc.service.VlogService; +import com.imooc.utils.PagedGridResult; +import com.imooc.utils.QcCloud; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@Slf4j +@Api(tags = "VlogController 短视频相关业务功能的接口") +@RequestMapping("vlog") +@RestController +@RefreshScope +public class VlogController extends BaseInfoProperties { + @Autowired + private VlogService vlogService; + @Autowired + private QcCloud qcCloud; + @Autowired + private MinIOConfig minIOConfig; + + @PostMapping("vodCallBack") + public GraceJSONResult vodCallBack(@RequestBody Map callbackData) { + try { + // 解析回调事件类型 + String eventType = (String) callbackData.get("EventType"); + log.info("收到腾讯云 VOD 回调, 事件类型: {}", eventType); + log.info(callbackData.toString()); + + if ("ProcedureStateChanged".equals(eventType)) { + // 获取 ProcedureStateChangeEvent + Object eventObject = callbackData.get("ProcedureStateChangeEvent"); + if (eventObject instanceof Map) { + @SuppressWarnings("unchecked") + Map procedureStateChangeEvent = (Map) eventObject; + String fileId = (String) procedureStateChangeEvent.get("FileId"); + String fileUrl = (String) procedureStateChangeEvent.get("FileUrl"); // 原视频地址 + String status = (String) procedureStateChangeEvent.get("Status"); // FINISH + // 只处理完成状态 + if ("FINISH".equals(status)) { + // 获取 MediaProcessResultSet,可能包含任务流信息 + List> mediaProcessResultSet = + (List>) procedureStateChangeEvent.get("MediaProcessResultSet"); + + if (mediaProcessResultSet != null) { + String coverUrl=null; // 首帧图 + String transVdUrl=null; // 转码后的视频地址 + for (Map processResult : mediaProcessResultSet) { + String type = (String) processResult.get("Type"); + if ("CoverBySnapshot".equals(type)) { + // 任务流:首帧截图 + Map coverBySnapshotTask = + (Map) processResult.get("CoverBySnapshotTask"); + Map output = (Map) coverBySnapshotTask.get("Output"); + coverUrl = (String) output.get("CoverUrl"); // 正确获取 CoverUrl + + } + if("Transcode".equals(type)){ + // 拿到output中的url + Map TranscodeTask = + (Map) processResult.get("TranscodeTask"); + Map output = (Map) TranscodeTask.get("Output"); + transVdUrl = (String) output.get("Url"); + } + } + log.info("任务流 [截取首帧,视频转码] 完成, FileId: {}, 封面图 URL: {},视频地址: {}", fileId, coverUrl,transVdUrl); + // TODO: 更新数据库,存储首帧图,设置云端地址,删除minio视频文件 + vlogService.updateVlogFirstImg(fileId,coverUrl,transVdUrl); + + } else { + log.warn("MediaProcessResultSet 为空,回调数据: {}", callbackData); + } + } + log.info("任务流完成, FileId: {}, Status: {}", fileId, status); + } else { + log.warn("ProcedureStateChangeEvent 为空或格式错误,回调数据: {}", callbackData); + } + } + if("ReviewAudioVideoComplete".equals(eventType)){ + //处理审核结果 + Map reviewEvent = (Map) callbackData.get("ReviewAudioVideoCompleteEvent"); + if (reviewEvent != null) { + String status = (String) reviewEvent.get("Status"); // FINISH + if ("FINISH".equals(status)) { + Map input = (Map) reviewEvent.get("Input"); + String fileId = (String) input.get("FileId"); // 查询的唯一标识 + // 获取审核结果 + Map output = (Map) reviewEvent.get("Output"); + String suggestion = (String) output.get("Suggestion"); + if ("block".equals(suggestion)) { + // 审核不通过,修改视频状态为2,写入reason,发送站内消息,告知审核结果 + // label + //Porn:色情; + //Terror:暴力; + //Polity:不适宜的信息; + //Ad:广告; + //Illegal:违法; + //Abuse:谩骂; + //Moan:娇喘。 + String label = (String) output.get("Label"); // 违规内容 + String subLabel = (String) output.get("SubLabel"); // 违规子标签 + log.info("视频文件 {} 审核驳回, 原因: {} - {}", fileId, label, subLabel); + // TODO: 更新数据库,发送站内信 + vlogService.updateVlogStatus(fileId,2,label); + } else if ("pass".equals(suggestion)) { + // 审核通过,处理通过逻辑,修改视频状态为1,发送站内消息,告知审核结果 + log.info("视频文件 {} 审核通过", fileId); + // TODO: 更新数据库,发送站内信 + vlogService.updateVlogStatus(fileId,1,"通过"); + + } else if ("review".equals(suggestion)){ + // 建议复审,修改状态为3,发送站内消息,告知审核结果 + String label = (String) output.get("Label"); // 违规内容 + String subLabel = (String) output.get("SubLabel"); // 违规子标签 + log.info("视频文件 {} 建议复审, 原因: {} - {}", fileId, label, subLabel); + // TODO: 更新数据库,发送站内信 + vlogService.updateVlogStatus(fileId,3,"等待复审"); + + } + } + } + } + // 处理完成,返回成功,防止腾讯云重复发送回调 + return GraceJSONResult.ok(); + } catch (Exception e) { + log.error("处理腾讯云 VOD 回调异常: ", e); + return GraceJSONResult.error(); + } + } + + @PostMapping("publish") + public GraceJSONResult publish(@RequestBody VlogBO vlogBO) throws Exception { + String url = vlogBO.getUrl(); + log.info("未审核视频地址:"+url); + String fileName = url.substring(url.lastIndexOf("/") + 1); + log.info("视频文件名称:"+fileName); + log.info("开始上传腾讯云点播:"+fileName); + String fileId = qcCloud.uploadViaTempFile(fileName); + log.info("视频发布ID:"+fileId); + vlogBO.setFileId(fileId); + // 删除minio文件 +// MinIOUtils.removeFile(minIOConfig.getBucketName(),fileName); +// log.info("删除minio文件:"+fileName); + + // FIXME 校验VlogBO + vlogService.createVlog(vlogBO); + + return GraceJSONResult.ok(); + } + + @GetMapping("indexList") + public GraceJSONResult indexList(@RequestParam(defaultValue = "") String userId, + @RequestParam(defaultValue = "") String search, + @RequestParam(defaultValue = "") String cityCode, + @RequestParam(defaultValue = "") String status, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + if (page == null) { + page = COMMON_START_PAGE; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + PagedGridResult gridResult = vlogService.getIndexVlogList(userId, search, cityCode,status, page, pageSize); + return GraceJSONResult.ok(gridResult); + } + + @GetMapping("detail") + public GraceJSONResult detail(@RequestParam(defaultValue = "") String userId, + @RequestParam String vlogId) { + return GraceJSONResult.ok(vlogService.getVlogDetailById(userId, vlogId)); + } + @PostMapping("changeVlogStatus") + public GraceJSONResult changeVlogStatus(@RequestParam String userId, + @RequestParam String vlogId, + @RequestParam Integer status) { + vlogService.changeVlogStatus(userId, vlogId,status); + return GraceJSONResult.ok(); + } + + @PostMapping("changeToPrivate") + public GraceJSONResult changeToPrivate(@RequestParam String userId, + @RequestParam String vlogId) { + vlogService.changeToPrivateOrPublic(userId, + vlogId, + YesOrNo.YES.type); + return GraceJSONResult.ok(); + } + + @PostMapping("changeToPublic") + public GraceJSONResult changeToPublic(@RequestParam String userId, + @RequestParam String vlogId) { + vlogService.changeToPrivateOrPublic(userId, + vlogId, + YesOrNo.NO.type); + return GraceJSONResult.ok(); + } + + + + @GetMapping("myPublicList") + public GraceJSONResult myPublicList(@RequestParam String userId, + @RequestParam(defaultValue = "") String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + if (page == null) { + page = COMMON_START_PAGE; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + PagedGridResult gridResult = vlogService.queryMyVlogList(userId, + myId, + page, + pageSize, + YesOrNo.NO.type); + return GraceJSONResult.ok(gridResult); + } + + @GetMapping("myPrivateList") + public GraceJSONResult myPrivateList(@RequestParam String userId, + @RequestParam(defaultValue = "") String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + if (page == null) { + page = COMMON_START_PAGE; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + PagedGridResult gridResult = vlogService.queryMyVlogList(userId, + myId, + page, + pageSize, + YesOrNo.YES.type); + return GraceJSONResult.ok(gridResult); + } + + @GetMapping("myLikedList") + public GraceJSONResult myLikedList(@RequestParam String userId, + @RequestParam(defaultValue = "") String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + if (page == null) { + page = COMMON_START_PAGE; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + PagedGridResult gridResult = vlogService.getMyLikedVlogList(userId, + myId, + page, + pageSize); + return GraceJSONResult.ok(gridResult); + } + + @Value(("${nacos.counts}")) + private Integer nacosConuts; + + + @PostMapping("like") + public GraceJSONResult like(@RequestParam String userId, + @RequestParam String vlogerId, + @RequestParam String vlogId) { + + // 我点赞的视频,关联关系保存到数据库 + vlogService.userLikeVlog(userId, vlogId); + + // 点赞后,视频和视频发布者的获赞都会 +1 + redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + vlogerId, 1); + redis.increment(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); + + // 我点赞的视频,需要在redis中保存关联关系 + redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId, "1"); + + log.info("nacosConuts="+nacosConuts); + + String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId); + Integer counts=0; + if (StringUtils.isNotBlank(countsStr)){ + + counts=Integer.valueOf(countsStr); + if (counts>=nacosConuts){ + + vlogService.flushCounts(vlogId, counts); + } + } + + return GraceJSONResult.ok(); + } + + + @PostMapping("unlike") + public GraceJSONResult unlike(@RequestParam String userId, + @RequestParam String vlogerId, + @RequestParam String vlogId) { + + // 我取消点赞的视频,关联关系删除 + vlogService.userUnLikeVlog(userId, vlogId); + + redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + vlogerId, 1); + redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); + redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId); + + return GraceJSONResult.ok(); + } + + @PostMapping("totalLikedCounts") + public GraceJSONResult totalLikedCounts(@RequestParam String vlogId) { + return GraceJSONResult.ok(vlogService.getVlogBeLikedCounts(vlogId)); + } + + @GetMapping("followList") + public GraceJSONResult followList(@RequestParam String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + if (page == null) { + page = COMMON_START_PAGE; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + PagedGridResult gridResult = vlogService.getMyFollowVlogList(myId, + page, + pageSize); + return GraceJSONResult.ok(gridResult); + } + + @GetMapping("friendList") + public GraceJSONResult friendList(@RequestParam String myId, + @RequestParam Integer page, + @RequestParam Integer pageSize) { + + if (page == null) { + page = COMMON_START_PAGE; + } + if (pageSize == null) { + pageSize = COMMON_PAGE_SIZE; + } + + PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, + page, + pageSize); + return GraceJSONResult.ok(gridResult); + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/PassportInterceptor.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/PassportInterceptor.java new file mode 100644 index 000000000..e636282e8 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/PassportInterceptor.java @@ -0,0 +1,47 @@ +package com.wzj.soopin.consumer.content.intercepter; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.exceptions.GraceException; +import com.imooc.grace.result.ResponseStatusEnum; +import com.imooc.utils.IPUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +public class PassportInterceptor extends BaseInfoProperties implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + + // 获得用户的ip + String userIp = IPUtil.getRequestIp(request); + + // 得到是否存在的判断 + boolean keyIsExist = redis.keyIsExist(MOBILE_SMSCODE + ":" + userIp); + + if (keyIsExist) { + GraceException.display(ResponseStatusEnum.SMS_NEED_WAIT_ERROR); + log.info("短信发送频率太大!"); + return false; + } + + /** + * true: 请求放行 + * false: 请求拦截 + */ + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + } +} diff --git a/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/UserTokenInterceptor.java b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/UserTokenInterceptor.java new file mode 100644 index 000000000..382ca5075 --- /dev/null +++ b/ruoyi-front/ruoyi-consumer/src/main/java/com/wzj/soopin/consumer/content/intercepter/UserTokenInterceptor.java @@ -0,0 +1,58 @@ +package com.wzj.soopin.consumer.content.intercepter; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.exceptions.GraceException; +import com.imooc.grace.result.ResponseStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +public class UserTokenInterceptor extends BaseInfoProperties implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + + + // 从header中获得用户id和token + String userId = request.getHeader("headerUserId"); + String userToken = request.getHeader("headerUserToken"); + + // 判断header中用户id和token不能为空 + if (StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(userToken)) { + String redisToken = redis.get(REDIS_USER_TOKEN + ":" + userId); + if (StringUtils.isBlank(redisToken)) { + GraceException.display(ResponseStatusEnum.UN_LOGIN); + return false; + } else { + // 比较token是否一致,如果不一致,表示用户在别的手机端登录 + if (!redisToken.equalsIgnoreCase(userToken)) { + GraceException.display(ResponseStatusEnum.TICKET_INVALID); + return false; + } + } + } else { + GraceException.display(ResponseStatusEnum.UN_LOGIN); + return false; + } + + /** + * true: 请求放行 + * false: 请求拦截 + */ + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + } +} diff --git a/ruoyi-front/ruoyi-manager/pom.xml b/ruoyi-front/ruoyi-manager/pom.xml new file mode 100644 index 000000000..ba7e298ae --- /dev/null +++ b/ruoyi-front/ruoyi-manager/pom.xml @@ -0,0 +1,105 @@ + + + org.dromara + ruoyi-front + ${revision} + + 4.0.0 + + ruoyi-manager + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + org.dromara + ruoyi-system + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysClientController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysClientController.java index eaed06847..abc0124f3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysClientController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysClientController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import java.util.List; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysConfigController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysConfigController.java index c73c3866f..aedd15a16 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysConfigController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import org.dromara.common.core.domain.R; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDeptController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDeptController.java index 45b841850..1795423bc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDeptController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDictDataController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDictDataController.java index 57527511e..f65e188ff 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDictDataController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDictTypeController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDictTypeController.java index 67c1f5133..776b372a6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysDictTypeController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import org.dromara.common.core.domain.R; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysMenuController.java similarity index 99% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysMenuController.java index d8cd335ce..78e02c056 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysMenuController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysNoticeController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysNoticeController.java index 5d65137b1..346cd6410 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysNoticeController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import lombok.RequiredArgsConstructor; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysOssConfigController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysOssConfigController.java index 24ddaff29..4a8a32a6f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssConfigController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysOssConfigController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import org.dromara.common.core.domain.R; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysOssController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysOssController.java index 81200c115..d9fe2d60e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysOssController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysOssController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysPostController.java similarity index 98% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysPostController.java index 5333a4aef..cfe1bf8eb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysPostController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysProfileController.java similarity index 99% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysProfileController.java index 5f187cb91..cf6af28c6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysProfileController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysRoleController.java similarity index 99% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysRoleController.java index d4a9dc8a4..292eac1e1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysRoleController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import jakarta.servlet.http.HttpServletResponse; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysSocialController.java similarity index 95% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysSocialController.java index b0281cf6b..6e2e3b38e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSocialController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysSocialController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysTenantController.java similarity index 99% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysTenantController.java index 66c1b7ddf..58c84c71d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysTenantController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysTenantPackageController.java similarity index 99% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysTenantPackageController.java index 4bfe597cf..14b115b4e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysTenantPackageController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysUserController.java similarity index 99% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java rename to ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysUserController.java index e1e868a6e..7dad83015 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-front/ruoyi-manager/src/main/java/com/wzj/soopin/manager/system/controller/SysUserController.java @@ -1,4 +1,4 @@ -package org.dromara.system.controller.system; +package com.wzj.soopin.manager.system.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.secure.BCrypt; diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index daff497a0..777a691ad 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -15,6 +15,11 @@ ruoyi-job ruoyi-system ruoyi-workflow + ruoyi-order + ruoyi-goods + ruoyi-member + ruoyi-content + ruoyi-im ruoyi-modules diff --git a/ruoyi-modules/ruoyi-content/pom.xml b/ruoyi-modules/ruoyi-content/pom.xml new file mode 100644 index 000000000..e4545e86d --- /dev/null +++ b/ruoyi-modules/ruoyi-content/pom.xml @@ -0,0 +1,102 @@ + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-content + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/CommentBO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/CommentBO.java new file mode 100644 index 000000000..1bbafee18 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/CommentBO.java @@ -0,0 +1,32 @@ +package com.wzj.soopin.content.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CommentBO { + + @NotBlank(message = "留言信息不完整") + private String vlogerId; + + @NotBlank(message = "留言信息不完整") + private String fatherCommentId; + + @NotBlank(message = "留言信息不完整") + private String vlogId; + + @NotBlank(message = "当前用户信息不正确,请尝试重新登录") + private String commentUserId; + + @NotBlank(message = "评论内容不能为空") + @Length(max = 50, message = "评论内容长度不能超过50") + private String content; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/LoginWithPasswordBO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/LoginWithPasswordBO.java new file mode 100644 index 000000000..69bdc10b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/LoginWithPasswordBO.java @@ -0,0 +1,31 @@ +package com.wzj.soopin.content.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * 密码登陆中, 对前端数据映射的实体类. + * + * @author lzc + * @version 1.0 + */ +@Data +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class LoginWithPasswordBO { + + @NotBlank(message = "账号不能为空!") + @Length(min = 5, max = 16, message = "账号格式不正确!") + private String mobile; + + @NotBlank(message = "密码不能为空!") + @Length(min = 5, max = 16, message = "密码格式不正确!") + private String password; + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/RegistLoginBO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/RegistLoginBO.java new file mode 100644 index 000000000..459548cac --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/RegistLoginBO.java @@ -0,0 +1,23 @@ +package com.wzj.soopin.content.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +@Data +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class RegistLoginBO { + + @NotBlank(message = "手机号不能为空") + @Length(min = 11, max = 11, message = "手机长度不正确") + private String mobile; + @NotBlank(message = "验证码不能为空") + private String smsCode; + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/UpdatedUserBO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/UpdatedUserBO.java new file mode 100644 index 000000000..ffbc75b5b --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/UpdatedUserBO.java @@ -0,0 +1,30 @@ +package com.wzj.soopin.content.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UpdatedUserBO { + private String id; + private String nickname; + private String imoocNum; + private String face; + private Integer sex; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date birthday; + private String country; + private String province; + private String city; + private String district; + private String description; + private String bgImg; + private Integer canImoocNumBeUpdated; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/VlogBO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/VlogBO.java new file mode 100644 index 000000000..c68c0863d --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/bo/VlogBO.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.content.domain.bo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class VlogBO { + private String id; + private String vlogerId; + private String url; + private String cover; + private String title; + private Integer width; + private Integer height; + private Integer likeCounts; + private Integer commentsCounts; + private String fileId; + private Integer status; + private String reason; + private Integer cityCode; + private String firstFrameImg; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/MessageMO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/MessageMO.java new file mode 100644 index 000000000..e10746343 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/MessageMO.java @@ -0,0 +1,41 @@ +package com.wzj.soopin.content.domain.mo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; + +import java.util.Date; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +@Document("message") +public class MessageMO { + + @Id + private String id; // 消息主键id + + @Field("fromUserId") + private String fromUserId; // 消息来自的用户id + @Field("fromNickname") + private String fromNickname; // 消息来自的用户昵称 + @Field("fromFace") + private String fromFace; // 消息来自的用户头像 + + @Field("toUserId") + private String toUserId; // 消息发送到某对象的用户id + + @Field("msgType") + private Integer msgType; // 消息类型 枚举 + @Field("msgContent") + private Map msgContent; // 消息内容 + + @Field("createTime") + private Date createTime; // 消息创建时间 +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/Token.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/Token.java new file mode 100644 index 000000000..4097c3e42 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/mo/Token.java @@ -0,0 +1,16 @@ +package com.wzj.soopin.content.domain.mo; + +import lombok.Data; + +@Data +public class Token { + /** + * 访问token + */ + private String accessToken; + + /** + * 刷新token + */ + private String refreshToken; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Comment.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Comment.java new file mode 100644 index 000000000..b4463ce65 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Comment.java @@ -0,0 +1,193 @@ +package com.wzj.soopin.content.domain.pojo; + +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Table(name="t_comment") +public class Comment { + @Id + private String id; + + /** + * 评论的视频是哪个作者(vloger)的关联id + */ + @Column(name = "vloger_id") + private String vlogerId; + + /** + * 如果是回复留言,则本条为子留言,需要关联查询 + */ + @Column(name = "father_comment_id") + private String fatherCommentId; + + /** + * 回复的那个视频id + */ + @Column(name = "vlog_id") + private String vlogId; + + /** + * 发布留言的用户id + */ + @Column(name = "comment_user_id") + private String commentUserId; + + /** + * 留言内容 + */ + private String content; + + /** + * 留言的点赞总数 + */ + @Column(name = "like_counts") + private Integer likeCounts; + + /** + * 留言时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id; + } + + /** + * 获取评论的视频是哪个作者(vloger)的关联id + * + * @return vloger_id - 评论的视频是哪个作者(vloger)的关联id + */ + public String getVlogerId() { + return vlogerId; + } + + /** + * 设置评论的视频是哪个作者(vloger)的关联id + * + * @param vlogerId 评论的视频是哪个作者(vloger)的关联id + */ + public void setVlogerId(String vlogerId) { + this.vlogerId = vlogerId; + } + + /** + * 获取如果是回复留言,则本条为子留言,需要关联查询 + * + * @return father_comment_id - 如果是回复留言,则本条为子留言,需要关联查询 + */ + public String getFatherCommentId() { + return fatherCommentId; + } + + /** + * 设置如果是回复留言,则本条为子留言,需要关联查询 + * + * @param fatherCommentId 如果是回复留言,则本条为子留言,需要关联查询 + */ + public void setFatherCommentId(String fatherCommentId) { + this.fatherCommentId = fatherCommentId; + } + + /** + * 获取回复的那个视频id + * + * @return vlog_id - 回复的那个视频id + */ + public String getVlogId() { + return vlogId; + } + + /** + * 设置回复的那个视频id + * + * @param vlogId 回复的那个视频id + */ + public void setVlogId(String vlogId) { + this.vlogId = vlogId; + } + + /** + * 获取发布留言的用户id + * + * @return comment_user_id - 发布留言的用户id + */ + public String getCommentUserId() { + return commentUserId; + } + + /** + * 设置发布留言的用户id + * + * @param commentUserId 发布留言的用户id + */ + public void setCommentUserId(String commentUserId) { + this.commentUserId = commentUserId; + } + + /** + * 获取留言内容 + * + * @return content - 留言内容 + */ + public String getContent() { + return content; + } + + /** + * 设置留言内容 + * + * @param content 留言内容 + */ + public void setContent(String content) { + this.content = content; + } + + /** + * 获取留言的点赞总数 + * + * @return like_counts - 留言的点赞总数 + */ + public Integer getLikeCounts() { + return likeCounts; + } + + /** + * 设置留言的点赞总数 + * + * @param likeCounts 留言的点赞总数 + */ + public void setLikeCounts(Integer likeCounts) { + this.likeCounts = likeCounts; + } + + /** + * 获取留言时间 + * + * @return create_time - 留言时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 设置留言时间 + * + * @param createTime 留言时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Fans.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Fans.java new file mode 100644 index 000000000..09c60779e --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Fans.java @@ -0,0 +1,114 @@ +package com.wzj.soopin.content.domain.pojo; + +import org.springframework.data.annotation.Id; + +import javax.persistence.Column; +import javax.persistence.Table; +import java.util.Date; + +@Table(name = "t_fans") +public class Fans { + @Id + private String id; + + /** + * 作家用户id + */ + @Column(name = "vloger_id") + private String vlogerId; + + @Column(name = "created_time") + private Date createdTime; + + + /** + * 粉丝用户id + */ + @Column(name = "fan_id") + private String fanId; + + /** + * 粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0 + */ + @Column(name = "is_fan_friend_of_mine") + private Integer isFanFriendOfMine; + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id; + } + + /** + * 获取作家用户id + * + * @return vloger_id - 作家用户id + */ + public String getVlogerId() { + return vlogerId; + } + + /** + * 设置作家用户id + * + * @param vlogerId 作家用户id + */ + public void setVlogerId(String vlogerId) { + this.vlogerId = vlogerId; + } + + /** + * 获取粉丝用户id + * + * @return fan_id - 粉丝用户id + */ + public String getFanId() { + return fanId; + } + + /** + * 设置粉丝用户id + * + * @param fanId 粉丝用户id + */ + public void setFanId(String fanId) { + this.fanId = fanId; + } + + /** + * 获取粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0 + * + * @return is_fan_friend_of_mine - 粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0 + */ + public Integer getIsFanFriendOfMine() { + return isFanFriendOfMine; + } + + /** + * 设置粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0 + * + * @param isFanFriendOfMine 粉丝是否是vloger的朋友,如果成为朋友,则本表的双方此字段都需要设置为1,如果有一人取关,则两边都需要设置为0 + */ + public void setIsFanFriendOfMine(Integer isFanFriendOfMine) { + this.isFanFriendOfMine = isFanFriendOfMine; + } + + public void setCreateTime() { + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/MyLikedVlog.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/MyLikedVlog.java new file mode 100644 index 000000000..ca4abd5ce --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/MyLikedVlog.java @@ -0,0 +1,83 @@ +package com.wzj.soopin.content.domain.pojo; + +import org.springframework.data.annotation.Id; + +import javax.persistence.Column; +import javax.persistence.Table; +import java.util.Date; + +@Table(name = "t_my_liked_vlog") +public class MyLikedVlog { + @Id + private String id; + + /** + * 用户id + */ + @Column(name = "user_id") + private String userId; + + /** + * 喜欢的短视频id + */ + @Column(name = "vlog_id") + private String vlogId; + + @Column(name = "created_time") + private Date createdTime; + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id; + } + + /** + * 获取用户id + * + * @return user_id - 用户id + */ + public String getUserId() { + return userId; + } + + /** + * 设置用户id + * + * @param userId 用户id + */ + public void setUserId(String userId) { + this.userId = userId; + } + + /** + * 获取喜欢的短视频id + * + * @return vlog_id - 喜欢的短视频id + */ + public String getVlogId() { + return vlogId; + } + + /** + * 设置喜欢的短视频id + * + * @param vlogId 喜欢的短视频id + */ + public void setVlogId(String vlogId) { + this.vlogId = vlogId; + } + + + public void setCreatedTime(Date date) { + this.createdTime = date; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/UserMember.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/UserMember.java new file mode 100644 index 000000000..c239fce32 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/UserMember.java @@ -0,0 +1,14 @@ +package com.wzj.soopin.content.domain.pojo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Table; + +@Data +@NoArgsConstructor +@Table(name = "r_user_member") +public class UserMember { + private String userId; + private String memberId; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Users.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Users.java new file mode 100644 index 000000000..7a88e3113 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Users.java @@ -0,0 +1,387 @@ +package com.wzj.soopin.content.domain.pojo; + +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Table(name="t_users") +public class Users { + @Id + private String id; + + /** + * 手机号 + */ + private String mobile; + + private String password; + + /** + * 昵称,媒体号 + */ + private String nickname; + + + /** + * 慕课号,类似头条号,抖音号,公众号,唯一标识,需要限制修改次数,比如终生1次,每年1次,每半年1次等,可以用于付费修改。 + */ + @Column(name = "imooc_num") + private String imoocNum; + + /** + * 头像 + */ + private String face; + + /** + * 性别 1:男 0:女 2:保密 + */ + private Integer sex; + + /** + * 生日 + */ + private Date birthday; + + /** + * 国家 + */ + private String country; + + /** + * 省份 + */ + private String province; + + /** + * 城市 + */ + private String city; + + /** + * 区县 + */ + private String district; + + /** + * 简介 + */ + private String description; + + /** + * 个人介绍的背景图 + */ + @Column(name = "bg_img") + private String bgImg; + + /** + * 慕课号能否被修改,1:默认,可以修改;0,无法修改 + */ + @Column(name = "can_imooc_num_be_updated") + private Integer canImoocNumBeUpdated; + + /** + * 创建时间 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id; + } + + /** + * 获取手机号 + * + * @return mobile - 手机号 + */ + public String getMobile() { + return mobile; + } + + /** + * 设置手机号 + * + * @param mobile 手机号 + */ + public void setMobile(String mobile) { + this.mobile = mobile; + } + + /** + * 获取昵称,媒体号 + * + * @return nickname - 昵称,媒体号 + */ + public String getNickname() { + return nickname; + } + + /** + * 设置昵称,媒体号 + * + * @param nickname 昵称,媒体号 + */ + public void setNickname(String nickname) { + this.nickname = nickname; + } + + /** + * 获取慕课号,类似头条号,抖音号,公众号,唯一标识,需要限制修改次数,比如终生1次,每年1次,每半年1次等,可以用于付费修改。 + * + * @return imooc_num - 慕课号,类似头条号,抖音号,公众号,唯一标识,需要限制修改次数,比如终生1次,每年1次,每半年1次等,可以用于付费修改。 + */ + public String getImoocNum() { + return imoocNum; + } + + /** + * 设置慕课号,类似头条号,抖音号,公众号,唯一标识,需要限制修改次数,比如终生1次,每年1次,每半年1次等,可以用于付费修改。 + * + * @param imoocNum 慕课号,类似头条号,抖音号,公众号,唯一标识,需要限制修改次数,比如终生1次,每年1次,每半年1次等,可以用于付费修改。 + */ + public void setImoocNum(String imoocNum) { + this.imoocNum = imoocNum; + } + + /** + * 获取头像 + * + * @return face - 头像 + */ + public String getFace() { + return face; + } + + /** + * 设置头像 + * + * @param face 头像 + */ + public void setFace(String face) { + this.face = face; + } + + /** + * 获取性别 1:男 0:女 2:保密 + * + * @return sex - 性别 1:男 0:女 2:保密 + */ + public Integer getSex() { + return sex; + } + + /** + * 设置性别 1:男 0:女 2:保密 + * + * @param sex 性别 1:男 0:女 2:保密 + */ + public void setSex(Integer sex) { + this.sex = sex; + } + + /** + * 获取生日 + * + * @return birthday - 生日 + */ + public Date getBirthday() { + return birthday; + } + + /** + * 设置生日 + * + * @param birthday 生日 + */ + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + /** + * 获取国家 + * + * @return country - 国家 + */ + public String getCountry() { + return country; + } + + /** + * 设置国家 + * + * @param country 国家 + */ + public void setCountry(String country) { + this.country = country; + } + + /** + * 获取省份 + * + * @return province - 省份 + */ + public String getProvince() { + return province; + } + + /** + * 设置省份 + * + * @param province 省份 + */ + public void setProvince(String province) { + this.province = province; + } + + /** + * 获取城市 + * + * @return city - 城市 + */ + public String getCity() { + return city; + } + + /** + * 设置城市 + * + * @param city 城市 + */ + public void setCity(String city) { + this.city = city; + } + + /** + * 获取区县 + * + * @return district - 区县 + */ + public String getDistrict() { + return district; + } + + /** + * 设置区县 + * + * @param district 区县 + */ + public void setDistrict(String district) { + this.district = district; + } + + /** + * 获取简介 + * + * @return description - 简介 + */ + public String getDescription() { + return description; + } + + /** + * 设置简介 + * + * @param description 简介 + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 获取个人介绍的背景图 + * + * @return bg_img - 个人介绍的背景图 + */ + public String getBgImg() { + return bgImg; + } + + /** + * 设置个人介绍的背景图 + * + * @param bgImg 个人介绍的背景图 + */ + public void setBgImg(String bgImg) { + this.bgImg = bgImg; + } + + /** + * 获取慕课号能否被修改,1:默认,可以修改;0,无法修改 + * + * @return can_imooc_num_be_updated - 慕课号能否被修改,1:默认,可以修改;0,无法修改 + */ + public Integer getCanImoocNumBeUpdated() { + return canImoocNumBeUpdated; + } + + /** + * 设置慕课号能否被修改,1:默认,可以修改;0,无法修改 + * + * @param canImoocNumBeUpdated 慕课号能否被修改,1:默认,可以修改;0,无法修改 + */ + public void setCanImoocNumBeUpdated(Integer canImoocNumBeUpdated) { + this.canImoocNumBeUpdated = canImoocNumBeUpdated; + } + + /** + * 获取创建时间 创建时间 + * + * @return created_time - 创建时间 创建时间 + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置创建时间 创建时间 + * + * @param createdTime 创建时间 创建时间 + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取更新时间 更新时间 + * + * @return updated_time - 更新时间 更新时间 + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置更新时间 更新时间 + * + * @param updatedTime 更新时间 更新时间 + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPassword() { + return password; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Vlog.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Vlog.java new file mode 100644 index 000000000..8edd095c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/pojo/Vlog.java @@ -0,0 +1,361 @@ +package com.wzj.soopin.content.domain.pojo; + +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Table(name="t_vlog") +public class Vlog { + @Id + private String id; + + /** + * 对应用户表id,vlog视频发布者 + */ + @Column(name = "vloger_id") + private String vlogerId; + + /** + * 视频播放地址 + */ + private String url; + + /** + * 视频封面 + */ + private String cover; + + /** + * 视频标题,可以为空 + */ + private String title; + + /** + * 视频width + */ + private Integer width; + + /** + * 视频height + */ + private Integer height; + + /** + * 点赞总数 + */ + @Column(name = "like_counts") + private Integer likeCounts; + + /** + * 评论总数 + */ + @Column(name = "comments_counts") + private Integer commentsCounts; + + /** + * 是否私密,用户可以设置私密,如此可以不公开给比人看 + */ + @Column(name = "is_private") + private Integer isPrivate; + + /** + * 创建时间 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; + + /** + * 视频状态 + */ + @Column(name = "status") + private Integer status; + + /** + * 云点播文件ID + */ + @Column(name = "file_id") + private String fileId; + + /** + * 审核结果 + */ + @Column(name = "reason") + private String reason; + + /** + * 视频归属地 + */ + @Column(name = "city_code") + private Integer cityCode; + + /** + * 首帧图 + */ + @Column(name = "first_frame_img") + private String firstFrameImg; + + /** + * @return id + */ + public String getId() { + return id; + } + + /** + * @param id + */ + public void setId(String id) { + this.id = id; + } + + /** + * 获取对应用户表id,vlog视频发布者 + * + * @return vloger_id - 对应用户表id,vlog视频发布者 + */ + public String getVlogerId() { + return vlogerId; + } + + /** + * 设置对应用户表id,vlog视频发布者 + * + * @param vlogerId 对应用户表id,vlog视频发布者 + */ + public void setVlogerId(String vlogerId) { + this.vlogerId = vlogerId; + } + + /** + * 获取视频播放地址 + * + * @return url - 视频播放地址 + */ + public String getUrl() { + return url; + } + + /** + * 设置视频播放地址 + * + * @param url 视频播放地址 + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * 获取视频封面 + * + * @return cover - 视频封面 + */ + public String getCover() { + return cover; + } + + /** + * 设置视频封面 + * + * @param cover 视频封面 + */ + public void setCover(String cover) { + this.cover = cover; + } + + /** + * 获取视频标题,可以为空 + * + * @return title - 视频标题,可以为空 + */ + public String getTitle() { + return title; + } + + /** + * 设置视频标题,可以为空 + * + * @param title 视频标题,可以为空 + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * 获取视频width + * + * @return width - 视频width + */ + public Integer getWidth() { + return width; + } + + /** + * 设置视频width + * + * @param width 视频width + */ + public void setWidth(Integer width) { + this.width = width; + } + + /** + * 获取视频height + * + * @return height - 视频height + */ + public Integer getHeight() { + return height; + } + + /** + * 设置视频height + * + * @param height 视频height + */ + public void setHeight(Integer height) { + this.height = height; + } + + /** + * 获取点赞总数 + * + * @return like_counts - 点赞总数 + */ + public Integer getLikeCounts() { + return likeCounts; + } + + /** + * 设置点赞总数 + * + * @param likeCounts 点赞总数 + */ + public void setLikeCounts(Integer likeCounts) { + this.likeCounts = likeCounts; + } + + /** + * 获取评论总数 + * + * @return comments_counts - 评论总数 + */ + public Integer getCommentsCounts() { + return commentsCounts; + } + + /** + * 设置评论总数 + * + * @param commentsCounts 评论总数 + */ + public void setCommentsCounts(Integer commentsCounts) { + this.commentsCounts = commentsCounts; + } + + /** + * 获取是否私密,用户可以设置私密,如此可以不公开给比人看 + * + * @return is_private - 是否私密,用户可以设置私密,如此可以不公开给比人看 + */ + public Integer getIsPrivate() { + return isPrivate; + } + + /** + * 设置是否私密,用户可以设置私密,如此可以不公开给比人看 + * + * @param isPrivate 是否私密,用户可以设置私密,如此可以不公开给比人看 + */ + public void setIsPrivate(Integer isPrivate) { + this.isPrivate = isPrivate; + } + + /** + * 获取创建时间 创建时间 + * + * @return created_time - 创建时间 创建时间 + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置创建时间 创建时间 + * + * @param createdTime 创建时间 创建时间 + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取更新时间 更新时间 + * + * @return updated_time - 更新时间 更新时间 + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置更新时间 更新时间 + * + * @param updatedTime 更新时间 更新时间 + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + /** + * 设置视频状态 + */ + public void setStatus(Integer status) { + this.status = status; + } + + /** + * 设置视频状态 + */ + public Integer getStatus() { + return status; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Integer getCityCode() { + return cityCode; + } + + public void setCityCode(Integer cityCode) { + this.cityCode = cityCode; + } + + public String getFirstFrameImg() { + return firstFrameImg; + } + + public void setFirstFrameImg(String firstFrameImg) { + this.firstFrameImg = firstFrameImg; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/CommentVO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/CommentVO.java new file mode 100644 index 000000000..b8facafbe --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/CommentVO.java @@ -0,0 +1,28 @@ +package com.wzj.soopin.content.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class CommentVO { + private String id; + private String commentId; + private String vlogerId; + private String fatherCommentId; + private String vlogId; + private String commentUserId; + private String commentUserNickname; + private String commentUserFace; + private String content; + private Integer likeCounts; + private String replyedUserNickname; + private Date createTime; + private Integer isLike = 0; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/FansVO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/FansVO.java new file mode 100644 index 000000000..896e5450a --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/FansVO.java @@ -0,0 +1,19 @@ +package com.wzj.soopin.content.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class FansVO { + private String fanId; + private String nickname; + private String face; + private boolean isFriend = false; + private int bothFriend; + private String createdTime; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/IndexVlogVO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/IndexVlogVO.java new file mode 100644 index 000000000..2796e1c3f --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/IndexVlogVO.java @@ -0,0 +1,33 @@ +package com.wzj.soopin.content.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class IndexVlogVO { + private String vlogId; + private String vlogerId; + private String vlogerFace; + private String vlogerName; + private String content; + private String url; + private String cover; + private Integer width; + private Integer height; + private Integer likeCounts; + private Integer commentsCounts; + private Integer isPrivate; + private boolean isPlay = false; + private boolean doIFollowVloger = false; + private boolean doILikeThisVlog = false; + private Integer status; + private String reason; + private Integer cityCode; + private String fileId; + private String firstFrameImg; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/UsersVO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/UsersVO.java new file mode 100644 index 000000000..dafb3d942 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/UsersVO.java @@ -0,0 +1,43 @@ +package com.wzj.soopin.content.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UsersVO { + private String id; + private String mobile; + private String nickname; + private String imoocNum; + private String face; + private Integer sex; + private Date birthday; + private String country; + private String province; + private String city; + private String district; + private String description; + private String bgImg; + private Integer canImoocNumBeUpdated; + private Date createdTime; + private Date updatedTime; + + private String userToken; // 用户token,传递给前端 + + private Integer myFollowsCounts; // 我关注的 + private Integer myFansCounts; // 我的粉丝数量 + // private Integer myLikedVlogCounts; + private Integer totalLikeMeCounts; + //private Token shopToken; + + private boolean IsFollowed; // 关注状态 + private String FollowStatus; // 关注状态 + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/VlogerVO.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/VlogerVO.java new file mode 100644 index 000000000..42383809c --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/vo/VlogerVO.java @@ -0,0 +1,20 @@ +package com.wzj.soopin.content.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class VlogerVO { + private String vlogerId; + private String nickname; + private String face; + private boolean isFollowed = true; + private int bothFriend; + private String createdTime; + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapper.java new file mode 100644 index 000000000..21329986a --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapper.java @@ -0,0 +1,8 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.pojo.Comment; +import org.springframework.stereotype.Repository; + +@Repository +public interface CommentMapper extends MyMapper { +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapperCustom.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapperCustom.java new file mode 100644 index 000000000..bcc502918 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/CommentMapperCustom.java @@ -0,0 +1,15 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.vo.CommentVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +public interface CommentMapperCustom { + + public List getCommentList(@Param("paramMap") Map map); + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapper.java new file mode 100644 index 000000000..7f8e141b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapper.java @@ -0,0 +1,42 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.pojo.Fans; +import com.imooc.vo.VlogerVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +//@Repository +//public interface FansMapper extends MyMapper { +// int updateByPrimaryKeySelective(Fans record); +// +// +// @Select("") +// List> getFollowedVlogerIds(@Param("currentUserId")String currentUserId,@Param("vlogerIds")List vlogerIds); +//// Set getFollowedVlogerIds( +//// @Param("currentUserId") String currentUserId, +//// @Param("vlogerIds") List vlogerIds +//// ); +// +//} + +@Repository +public interface FansMapper { + int updateByPrimaryKeySelective(Fans record); + public List> getFollowedVlogerIds(@Param("currentUserId")String currentUserId,@Param("vlogerIds")List vlogerIds); + + int insert(@Param("fansData") Map vlogData); + + public List selectByExample(@Param("paramMap") Map map); + + int delete(@Param("id") String id); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapperCustom.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapperCustom.java new file mode 100644 index 000000000..5fa7d84d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/FansMapperCustom.java @@ -0,0 +1,19 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.pojo.Fans; +import com.imooc.vo.FansVO; +import com.imooc.vo.VlogerVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +public interface FansMapperCustom extends MyMapper { + + public List queryMyFollows(@Param("paramMap") Map map); + + public List queryMyFans(@Param("paramMap") Map map); + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyLikedVlogMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyLikedVlogMapper.java new file mode 100644 index 000000000..034ab60be --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyLikedVlogMapper.java @@ -0,0 +1,8 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.pojo.MyLikedVlog; +import org.springframework.stereotype.Repository; + +@Repository +public interface MyLikedVlogMapper extends MyMapper { +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyMapper.java new file mode 100644 index 000000000..8202065a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/MyMapper.java @@ -0,0 +1,34 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014-2016 abel533@gmail.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.wzj.soopin.content.mapper.mapper; + +import tk.mybatis.mapper.common.Mapper; +import tk.mybatis.mapper.common.MySqlMapper; + +/** + * 继承自己的MyMapper + */ +public interface MyMapper extends Mapper, MySqlMapper { +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UserMemberMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UserMemberMapper.java new file mode 100644 index 000000000..97c06f3e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UserMemberMapper.java @@ -0,0 +1,14 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.pojo.UserMember; +import com.imooc.pojo.Users; +import org.apache.ibatis.annotations.Mapper; + +/** + * 短视频用户与商城会员数据处理层 + */ +@Mapper +public interface UserMemberMapper extends MyMapper { + + Users getUserByMemberId(String memberId); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UsersMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UsersMapper.java new file mode 100644 index 000000000..ba43d5d38 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/UsersMapper.java @@ -0,0 +1,32 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.bo.UpdatedUserBO; +import com.imooc.pojo.Users; +import com.imooc.vo.UsersVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +@Mapper +public interface UsersMapper extends MyMapper { + + @Select("SELECT * FROM t_users WHERE nickname LIKE CONCAT('%', #{nickname}, '%')") + List searchByNickname(String nickname); + @Update("UPDATE t_users SET nickname = #{nickname} WHERE id = #{id}") + int updateNickname(UpdatedUserBO user); + @Update("UPDATE t_users SET sex = #{sex} WHERE id = #{id}") + int updateSex(UpdatedUserBO user); + @Update("UPDATE t_users SET birthday = #{birthday} WHERE id = #{id}") + int updateBirthday(UpdatedUserBO user); + @Update("UPDATE t_users SET description = #{description} WHERE id = #{id}") + int updateDescription(UpdatedUserBO user); + @Update("UPDATE t_users SET province = #{province},city = #{city},district = #{district} WHERE id = #{id}") + int updateLocation(UpdatedUserBO user); + @Update("UPDATE t_users SET imooc_num = #{imoocNum},can_imooc_num_be_updated = 0 WHERE id = #{id}") + int updateVnum(UpdatedUserBO user); + @Select("SELECT * FROM t_users WHERE imooc_num = #{imoocNum}") + List selectByImoocNum(@Param("imoocNum") String imoocNum); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapper.java new file mode 100644 index 000000000..ddc36adf5 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapper.java @@ -0,0 +1,57 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.vo.IndexVlogVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + + +//@Repository +//public interface VlogMapper extends MyMapper { +//} +@Repository +public interface VlogMapper { +// public List updateVlogStatus(@Param("paramMap") Map map); + /** + * 通用动态更新方法 + * @param primaryKey 主键字段名 + * @param idValue 主键值 + * @param updateFields 待更新的字段Map(key=字段名, value=字段值) + * @return 影响的行数 + */ + int dynamicUpdate( + @Param("primaryKey") String primaryKey, + @Param("idValue") Object idValue, + @Param("updateFields") Map updateFields + ); + + /** + * Vlog表多条件动态更新 + * @param updateFields 需要更新的字段及值(Map结构) + * @param conditions 更新条件(Map结构) + * @return 受影响的行数 + */ + int updateVlogByConditions( + @Param("updates") Map updateFields, + @Param("conditions") Map conditions + ); + + /** + * 单条插入vlog记录 + * @param vlogData 插入数据的键值对(key=列名, value=列值) + * @return 影响的行数 + */ + int dynamicInsert(@Param("vlogData") Map vlogData); + + /** + * 批量插入vlog记录 + * @param vlogList 插入数据列表(每个Map代表一行数据) + * @return 影响的行数 + */ + int dynamicBatchInsert(@Param("vlogList") List> vlogList); + + public List selectMyPublic(@Param("paramMap")Map map); + public List getVlogDetailFromId(@Param("paramMap")Map map); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapperCustom.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapperCustom.java new file mode 100644 index 000000000..e970cba57 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/mapper/VlogMapperCustom.java @@ -0,0 +1,23 @@ +package com.wzj.soopin.content.mapper.mapper; + +import com.imooc.vo.IndexVlogVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +public interface VlogMapperCustom { + + public List getIndexVlogList(@Param("paramMap")Map map); + + public List getVlogDetailById(@Param("paramMap")Map map); + + public List getMyLikedVlogList(@Param("paramMap")Map map); + + public List getMyFollowVlogList(@Param("paramMap")Map map); + + public List getMyFriendVlogList(@Param("paramMap")Map map); + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/repository/MessageRepository.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/repository/MessageRepository.java new file mode 100644 index 000000000..6684bd2f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/repository/MessageRepository.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.content.mapper.repository; + +import com.imooc.mo.MessageMO; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface MessageRepository extends MongoRepository { + + // 通过实现Repository,自定义条件查询 + List findAllByToUserIdEqualsOrderByCreateTimeDesc(String toUserId, + Pageable pageable); +// void deleteAllByFromUserIdAndToUserIdAndMsgType(); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/CommentService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/CommentService.java new file mode 100644 index 000000000..55713d4e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/CommentService.java @@ -0,0 +1,34 @@ +package com.wzj.soopin.content.service; + +import com.imooc.bo.CommentBO; +import com.imooc.pojo.Comment; +import com.imooc.utils.PagedGridResult; +import com.imooc.vo.CommentVO; + +public interface CommentService { + + /** + * 发表评论 + */ + public CommentVO createComment(CommentBO commentBO); + + /** + * 查询评论的列表 + */ + public PagedGridResult queryVlogComments(String vlogId, + String userId, + Integer page, + Integer pageSize); + + /** + * 删除评论 + */ + public void deleteComment(String commentUserId, + String commentId, + String vlogId); + + /** + * 根据主键查询comment + */ + public Comment getComment(String id); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/FansService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/FansService.java new file mode 100644 index 000000000..d2e4d896f --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/FansService.java @@ -0,0 +1,35 @@ +package com.wzj.soopin.content.service; + +import com.imooc.utils.PagedGridResult; + +public interface FansService { + + /** + * 关注 + */ + public void doFollow(String myId, String vlogerId); + + /** + * 取关 + */ + public void doCancel(String myId, String vlogerId); + + /** + * 查询用户是否关注博主 + */ + public boolean queryDoIFollowVloger(String myId, String vlogerId); + + /** + * 查询我关注的博主列表 + */ + public PagedGridResult queryMyFollows(String myId, + Integer page, + Integer pageSize); + + /** + * 查询我的粉丝列表 + */ + public PagedGridResult queryMyFans(String myId, + Integer page, + Integer pageSize); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/MsgService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/MsgService.java new file mode 100644 index 000000000..151e0dcfb --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/MsgService.java @@ -0,0 +1,25 @@ +package com.wzj.soopin.content.service; + +import com.imooc.mo.MessageMO; + +import java.util.List; +import java.util.Map; + +public interface MsgService { + + /** + * 创建消息 + */ + public void createMsg(String fromUserId, + String toUserId, + Integer type, + Map msgContent); + + /** + * 查询消息列表 + */ + public List queryList(String toUserId, + Integer page, + Integer pageSize); + +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserMemberService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserMemberService.java new file mode 100644 index 000000000..476c5bec5 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserMemberService.java @@ -0,0 +1,9 @@ +package com.wzj.soopin.content.service; + + + +/** + * 短视频用户与商城会员业务层 + */ +public interface UserMemberService { +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserService.java new file mode 100644 index 000000000..b4d894ca1 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/UserService.java @@ -0,0 +1,81 @@ +package com.wzj.soopin.content.service; + +import com.imooc.bo.UpdatedUserBO; +import com.imooc.mo.Token; +import com.imooc.pojo.Users; +import com.imooc.vo.UsersVO; + +import java.util.List; +import java.util.Map; + +/** + * @author vercen + * @version 1.0 + * @date 2023/5/25 21:02 + */ +public interface UserService { + /** + * 判断用户是否存在,如果存在则返回用户信息 + */ + public Users queryMobileIsExist(String mobile); + + /** + * 创建用户信息,并且返回用户对象 + */ + public Users createUser(String mobile); + + /** + * 根据用户主键查询用户信息 + */ + public Users getUser(String userId); + + /** + * 用户信息修改 + */ + public Users updateUserInfo(UpdatedUserBO updatedUserBO); + + /** + * 用户信息修改 + */ + public Users updateUserInfo(UpdatedUserBO updatedUserBO, Integer type); + + /** + * 创建用户打通短视频和商城系统 + * + * @param mobile + * @return + */ + Map createUserNew(String mobile); + + /** + * 获取商城token + * + * @param userId + * @return + */ + Token getShopToken(String userId); + + /** + * 从商城系统创建账号 + * + * @param mobile + * @return + */ + Users createUserFromShop(String mobile, String memberId); + + /** + * 从商城系统获取短视频账户信息 + * @param memberId + * @return + */ + String getUserInfoFromShop(String memberId); + + /** + * 根据昵称搜索用户 + * @param nickname + * @param page + * @param pageSize + * @return + */ + List searchByNickname(String nickname, Integer page, Integer pageSize, String id); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java new file mode 100644 index 000000000..99e14250d --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java @@ -0,0 +1,171 @@ +package com.wzj.soopin.content.service; + +import com.imooc.bo.VlogBO; +import com.imooc.pojo.Vlog; +import com.imooc.utils.PagedGridResult; +import com.imooc.vo.IndexVlogVO; + +public interface VlogService { + /** + * 修改视频首帧图 + */ + public void updateVlogFirstImg(String fileId,String url,String fileUrl); + /** + * 修改视频状态 + */ + public void updateVlogStatus(String fileId,Integer status,String reason); + + /** + * 新增vlog视频 + */ + public void createVlog(VlogBO vlogBO); + + /** + * 查询首页/搜索的vlog列表 + */ + public PagedGridResult getIndexVlogList(String userId, + String search, + String cityCode, + String status, + Integer page, + Integer pageSize); + + /** + * 根据视频主键查询vlog + */ + public IndexVlogVO getVlogDetailById(String userId, String vlogId); + + /** + * 用户把视频改为公开/私密的视频 + */ + public void changeToPrivateOrPublic(String userId, + String vlogId, + Integer yesOrNo); + + public void changeVlogStatus(String userId, + String vlogId, + Integer status); + /** + * 查询用的公开/私密的视频列表 + */ + public PagedGridResult queryMyVlogList(String userId, + String myId, + Integer page, + Integer pageSize, + Integer yesOrNo); + + /** + * 用户点赞/喜欢视频 + */ + public void userLikeVlog(String userId, String vlogId); + + /** + * 用户取消点赞/喜欢视频 + */ + public void userUnLikeVlog(String userId, String vlogId); + + /** + * 获得用户点赞视频的总数 + */ + public Integer getVlogBeLikedCounts(String vlogId); + + /** + * 查询用户点赞过的短视频 + */ + public PagedGridResult getMyLikedVlogList(String userId, + String myId, + Integer page, + Integer pageSize); + + /** + * 查询用户关注的博主发布的短视频列表 + */ + public PagedGridResult getMyFollowVlogList(String myId, + Integer page, + Integer pageSize); + + /** + * 查询朋友发布的短视频列表 + */ + public PagedGridResult getMyFriendVlogList(String myId, + Integer page, + Integer pageSize); + + /** + * 根据主键查询vlog + */ + public Vlog getVlog(String id); + + /** + * 把counts输入数据库 + */ + public void flushCounts(String vlogId, Integer counts); +// /** +// * 查询首页/搜索的vlog列表 +// */ +// public PagedGridResult getIndexVlogList(String userId, +// String search, +// Integer page, +// Integer pageSize); +// +// /** +// * 根据视频主键查询vlog +// */ +// public IndexVlogVO getVlogDetailById(String userId, String vlogId); +// +// /** +// * 用户把视频改为公开/私密的视频 +// */ +// public void changeToPrivateOrPublic(String userId, +// String vlogId, +// Integer yesOrNo); +// +// /** +// * 查询用的公开/私密的视频列表 +// */ +// public PagedGridResult queryMyVlogList(String userId, +// Integer page, +// Integer pageSize, +// Integer yesOrNo); +// +// /** +// * 用户点赞/喜欢视频 +// */ +// public void userLikeVlog(String userId, String vlogId); +// +// /** +// * 用户取消点赞/喜欢视频 +// */ +// public void userUnLikeVlog(String userId, String vlogId); +// +// /** +// * 获得用户点赞视频的总数 +// */ +// public Integer getVlogBeLikedCounts(String vlogId); +// +// /** +// * 查询用户点赞过的短视频 +// */ +// public PagedGridResult getMyLikedVlogList(String userId, +// Integer page, +// Integer pageSize); +// +// /** +// * 查询用户关注的博主发布的短视频列表 +// */ +// public PagedGridResult getMyFollowVlogList(String myId, +// Integer page, +// Integer pageSize); +// +// /** +// * 查询朋友发布的短视频列表 +// */ +// public PagedGridResult getMyFriendVlogList(String myId, +// Integer page, +// Integer pageSize); +// +// /** +// * 根据主键查询vlog +// */ +// public Vlog getVlog(String id); +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java new file mode 100644 index 000000000..0b60d41e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java @@ -0,0 +1,150 @@ +package com.wzj.soopin.content.service.impl; + +import com.github.pagehelper.PageHelper; +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.CommentBO; +import com.imooc.enums.MessageEnum; +import com.imooc.enums.YesOrNo; +import com.imooc.mapper.CommentMapper; +import com.imooc.mapper.CommentMapperCustom; +import com.imooc.pojo.Comment; +import com.imooc.pojo.Vlog; +import com.imooc.service.CommentService; +import com.imooc.service.MsgService; +import com.imooc.service.VlogService; +import com.imooc.utils.PagedGridResult; +import com.imooc.vo.CommentVO; +import org.apache.commons.lang3.StringUtils; +import org.n3r.idworker.Sid; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class CommentServiceImpl extends BaseInfoProperties implements CommentService { +// + @Autowired + private CommentMapper commentMapper; +// + @Autowired + private CommentMapperCustom commentMapperCustom; +// + @Autowired + private VlogService vlogService; + @Autowired + private MsgService msgService; +// + @Autowired + private Sid sid; +// + @Override + public CommentVO createComment(CommentBO commentBO) { + + String commentId = sid.nextShort(); + + Comment comment = new Comment(); + comment.setId(commentId); + + comment.setVlogId(commentBO.getVlogId()); + comment.setVlogerId(commentBO.getVlogerId()); + + comment.setCommentUserId(commentBO.getCommentUserId()); + comment.setFatherCommentId(commentBO.getFatherCommentId()); + comment.setContent(commentBO.getContent()); + + comment.setLikeCounts(0); + comment.setCreateTime(new Date()); + + commentMapper.insert(comment); + + // redis操作放在service中,评论总数的累加 + redis.increment(REDIS_VLOG_COMMENT_COUNTS + ":" + commentBO.getVlogId(), 1); + + // 留言后的最新评论需要返回给前端进行展示 + CommentVO commentVO = new CommentVO(); + BeanUtils.copyProperties(comment, commentVO); + + + + // 系统消息:评论/回复 + Vlog vlog = vlogService.getVlog(commentBO.getVlogId()); + Map msgContent = new HashMap(); + msgContent.put("vlogId", vlog.getId()); + msgContent.put("vlogCover", vlog.getCover()); + msgContent.put("commentId", commentId); + msgContent.put("commentContent", commentBO.getContent()); + Integer type = MessageEnum.COMMENT_VLOG.type; + if (StringUtils.isNotBlank(commentBO.getFatherCommentId()) && + !commentBO.getFatherCommentId().equalsIgnoreCase("0") ) { + type = MessageEnum.REPLY_YOU.type; + } + + msgService.createMsg(commentBO.getCommentUserId(), + commentBO.getVlogerId(), + type, + msgContent); +// +// +// + return commentVO; + } +// + @Override + public PagedGridResult queryVlogComments(String vlogId, + String userId, + Integer page, + Integer pageSize) { + + Map map = new HashMap<>(); + map.put("vlogId", vlogId); + + PageHelper.startPage(page, pageSize); + + List list = commentMapperCustom.getCommentList(map); + + for (CommentVO cv:list) { + String commentId = cv.getCommentId(); + + // 当前短视频的某个评论的点赞总数 + String countsStr = redis.getHashValue(REDIS_VLOG_COMMENT_LIKED_COUNTS, commentId); + Integer counts = 0; + if (StringUtils.isNotBlank(countsStr)) { + counts = Integer.valueOf(countsStr); + } + cv.setLikeCounts(counts); + + // 判断当前用户是否点赞过该评论 + String doILike = redis.hget(REDIS_USER_LIKE_COMMENT, userId + ":" + commentId); + if (StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")) { + cv.setIsLike(YesOrNo.YES.type); + } + } + + return setterPagedGrid(list, page); + } + + @Override + public void deleteComment(String commentUserId, + String commentId, + String vlogId) { + + Comment pendingDelete = new Comment(); + pendingDelete.setId(commentId); + pendingDelete.setCommentUserId(commentUserId); + + commentMapper.delete(pendingDelete); + + // 评论总数的累减 + redis.decrement(REDIS_VLOG_COMMENT_COUNTS + ":" + vlogId, 1); + } + + @Override + public Comment getComment(String id) { + return commentMapper.selectByPrimaryKey(id); + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/FansServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/FansServiceImpl.java new file mode 100644 index 000000000..bd9ca7c98 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/FansServiceImpl.java @@ -0,0 +1,189 @@ +package com.wzj.soopin.content.service.impl; + +import com.github.pagehelper.PageHelper; +import com.imooc.base.BaseInfoProperties; +import com.imooc.base.RabbitMQConfig; +import com.imooc.enums.MessageEnum; +import com.imooc.enums.YesOrNo; +import com.imooc.mapper.FansMapper; +import com.imooc.mapper.FansMapperCustom; +import com.imooc.mo.MessageMO; +import com.imooc.pojo.Fans; +import com.imooc.service.FansService; +import com.imooc.service.MsgService; +import com.imooc.utils.JsonUtils; +import com.imooc.utils.PagedGridResult; +import com.imooc.vo.FansVO; +import com.imooc.vo.VlogerVO; +import org.apache.commons.lang3.StringUtils; +import org.n3r.idworker.Sid; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class FansServiceImpl extends BaseInfoProperties implements FansService { + + @Autowired + private FansMapper fansMapper; + @Autowired + private FansMapperCustom fansMapperCustom; +// + @Autowired + private MsgService msgService; + + @Autowired + public RabbitTemplate rabbitTemplate; +// + @Autowired + private Sid sid; +// + @Transactional + @Override + public void doFollow(String myId, String vlogerId) { + + String fid = sid.nextShort(); + +// Fans fans = new Fans(); +// fans.setId(fid); +// fans.setFanId(myId); +// fans.setVlogerId(vlogerId); +// fans.setCreatedTime(new Date()); + + Map fans = new HashMap<>(); + fans.put("id", fid); + fans.put("fan_id", myId); + fans.put("vloger_id", vlogerId); + fans.put("created_time", new Date()); + + // 判断对方是否关注我,如果关注我,那么双方都要互为朋友关系 + Fans vloger = queryFansRelationship(vlogerId, myId); + System.out.println(vloger); + if (vloger != null) { +// fans.setIsFanFriendOfMine(YesOrNo.YES.type); + fans.put("is_fan_friend_of_mine",YesOrNo.YES.type); + vloger.setIsFanFriendOfMine(YesOrNo.YES.type); + fansMapper.updateByPrimaryKeySelective(vloger); + System.out.println(vloger.getIsFanFriendOfMine()); + } else { +// fans.setIsFanFriendOfMine(YesOrNo.NO.type); + fans.put("is_fan_friend_of_mine",YesOrNo.NO.type); + } + fansMapper.insert(fans); + + + // 系统消息:关注 + // msgService.createMsg(myId, vlogerId, MessageEnum.FOLLOW_YOU.type, null); + //优化使用mQEXCHANGE_MSG + + MessageMO messageMO = new MessageMO(); + + messageMO.setFromUserId(myId); + messageMO.setToUserId(vlogerId); + rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_MSG, "sys.msg."+ MessageEnum.FOLLOW_YOU.enValue, JsonUtils.objectToJson(messageMO)); + } + + public Fans queryFansRelationship(String fanId, String vlogerId) { +// Example example = new Example(Fans.class); +// Example.Criteria criteria = example.createCriteria(); +// criteria.andEqualTo("vlogerId", vlogerId); +// criteria.andEqualTo("fanId", fanId); + + + Map mapexample = new HashMap<>(); + mapexample.put("vlogerId", vlogerId); + mapexample.put("fanId", fanId); + + List list = fansMapper.selectByExample(mapexample); + + Fans fan = null; + if (list != null && list.size() > 0 && !list.isEmpty()) { + fan = (Fans)list.get(0); + } + + return fan; + } + + @Transactional + @Override + public void doCancel(String myId, String vlogerId) { + + // 判断我们是否朋友关系,如果是,则需要取消双方的关系 + Fans fan = queryFansRelationship(myId, vlogerId); + if (fan != null && fan.getIsFanFriendOfMine() == YesOrNo.YES.type) { + // 抹除双方的朋友关系,自己的关系删除即可 + Fans pendingFan = queryFansRelationship(vlogerId, myId); + pendingFan.setIsFanFriendOfMine(YesOrNo.NO.type); + System.out.println(pendingFan.getIsFanFriendOfMine()); + fansMapper.updateByPrimaryKeySelective(pendingFan); + } + + // 删除自己的关注关联表记录 + String fanId = fan.getId(); + fansMapper.delete(fanId); + } + + @Override + public boolean queryDoIFollowVloger(String myId, String vlogerId) { + Fans vloger = queryFansRelationship(myId, vlogerId); + return vloger != null; + } + + @Override + public PagedGridResult queryMyFollows(String myId, + Integer page, + Integer pageSize) { + Map map = new HashMap<>(); + map.put("myId", myId); + + PageHelper.startPage(page, pageSize); + + List list = fansMapperCustom.queryMyFollows(map); + + return setterPagedGrid(list, page); + } + + @Override + public PagedGridResult queryMyFans(String myId, + Integer page, + Integer pageSize) { + + /** + * <判断粉丝是否是我的朋友(互粉互关)> + * 普通做法: + * 多表关联+嵌套关联查询,这样会违反多表关联的规范,不可取,高并发下回出现性能问题 + * + * 常规做法: + * 1. 避免过多的表关联查询,先查询我的粉丝列表,获得fansList + * 2. 判断粉丝关注我,并且我也关注粉丝 -> 循环fansList,获得每一个粉丝,再去数据库查询我是否关注他 + * 3. 如果我也关注他(粉丝),说明,我俩互为朋友关系(互关互粉),则标记flag为true,否则false + * + * 高端做法: + * 1. 关注/取关的时候,关联关系保存在redis中,不要依赖数据库 + * 2. 数据库查询后,直接循环查询redis,避免第二次循环查询数据库的尴尬局面 + */ + + + Map map = new HashMap<>(); + map.put("myId", myId); + + PageHelper.startPage(page, pageSize); + + List list = fansMapperCustom.queryMyFans(map); + + for (FansVO f : list) { + String relationship = redis.get(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + myId + ":" + f.getFanId()); + if (StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")) { + f.setFriend(true); + } + } + + return setterPagedGrid(list, page); + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MsgServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MsgServiceImpl.java new file mode 100644 index 000000000..f310fd9df --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MsgServiceImpl.java @@ -0,0 +1,89 @@ +package com.wzj.soopin.content.service.impl; + +import com.imooc.base.BaseInfoProperties; +import com.imooc.enums.MessageEnum; +import com.imooc.mo.MessageMO; +import com.imooc.pojo.Users; +import com.imooc.repository.MessageRepository; +import com.imooc.service.MsgService; +import com.imooc.service.UserService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class MsgServiceImpl extends BaseInfoProperties implements MsgService { + + @Autowired + private MessageRepository messageRepository; + + @Autowired + private UserService userService; + + @Override + public void createMsg(String fromUserId, + String toUserId, + Integer type, + Map msgContent) { + + Users fromUser = userService.getUser(fromUserId); + + MessageMO messageMO = new MessageMO(); + + messageMO.setFromUserId(fromUserId); + messageMO.setFromNickname(fromUser.getNickname()); + messageMO.setFromFace(fromUser.getFace()); + + messageMO.setToUserId(toUserId); + + messageMO.setMsgType(type); + if (msgContent != null) { + messageMO.setMsgContent(msgContent); + } + + messageMO.setCreateTime(new Date()); + + messageRepository.save(messageMO); + } +// + @Override + public List queryList(String toUserId, + Integer page, + Integer pageSize) { + + Pageable pageable = PageRequest.of(page, + pageSize, + Sort.Direction.DESC, + "createTime"); + + List list = messageRepository + .findAllByToUserIdEqualsOrderByCreateTimeDesc(toUserId, + pageable); + for (MessageMO msg : list) { + // 如果类型是关注消息,则需要查询我之前有没有关注过他,用于在前端标记“互粉”“互关” + if (msg.getMsgType() != null && msg.getMsgType() == MessageEnum.FOLLOW_YOU.type) { + Map map = msg.getMsgContent(); + if (map == null) { + map = new HashMap(); + } + + String relationship = redis.get(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + msg.getToUserId() + ":" + msg.getFromUserId()); + if (StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")) { + map.put("isFriend", true); + } else { + map.put("isFriend", false); + } + msg.setMsgContent(map); + } + } + return list; + } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserMemberServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserMemberServiceImpl.java new file mode 100644 index 000000000..6fff04bee --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserMemberServiceImpl.java @@ -0,0 +1,19 @@ +package com.wzj.soopin.content.service.impl; + +import com.imooc.mapper.UserMemberMapper; +import com.imooc.service.UserMemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 会员接口业务层实现 + * + * @author Chopper + * @since 2021-03-29 14:10:16 + */ +@Service +public class UserMemberServiceImpl implements UserMemberService { + + @Autowired + private UserMemberMapper userMemberMapper; +} diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserServiceImpl.java new file mode 100644 index 000000000..c3be780a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/UserServiceImpl.java @@ -0,0 +1,428 @@ +package com.wzj.soopin.content.service.impl; + +import com.github.pagehelper.PageHelper; +import com.google.common.collect.Maps; +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.UpdatedUserBO; +import com.imooc.enums.Sex; +import com.imooc.enums.UserInfoModifyType; +import com.imooc.enums.YesOrNo; +import com.imooc.exceptions.GraceException; +import com.imooc.grace.result.ResponseStatusEnum; +import com.imooc.mapper.FansMapper; +import com.imooc.mapper.FansMapperCustom; +import com.imooc.mapper.UserMemberMapper; +import com.imooc.mapper.UsersMapper; +import com.imooc.mo.Token; +import com.imooc.pojo.UserMember; +import com.imooc.pojo.Users; +import com.imooc.service.FansService; +import com.imooc.service.UserService; +import com.imooc.utils.*; +import com.imooc.vo.UsersVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.n3r.idworker.Sid; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.imooc.base.BaseInfoProperties.REDIS_USER_TOKEN; + +/** + * @author vercen + * @version 1.0 + * @date 2023/5/25 21:02 + */ +@Slf4j +@Service +public class UserServiceImpl extends BaseInfoProperties implements UserService { + @Autowired + private UsersMapper usersMapper; + @Autowired + private FansMapperCustom fansMapperCustom; + @Autowired + private FansService fansService; + + @Resource + private PasswordEncoder passwordEncoder; + + @Autowired + private UserMemberMapper userMemberMapper; + + @Autowired + private FansMapper fansMapper; + + //@Autowired + //public RedisOperator redis; + + @Resource(name = "redisTemplate") + private RedisTemplate redisTemplate; + + @Autowired + private Sid sid; + private static final String USER_FACE1 = "http://43.143.227.203:29000/bucket/logo.png"; + + @Override + public Users queryMobileIsExist(String mobile) { + Example userExample = new Example(Users.class); + Example.Criteria criteria = userExample.createCriteria(); + criteria.andEqualTo("mobile", mobile); + Users user = usersMapper.selectOneByExample(userExample); + return user; + } + + @Override + public Users createUser(String mobile) { + // 获得全局唯一主键 + String userId = sid.nextShort(); + + Users user = new Users(); + user.setId(userId); + user.setPassword(mobile); + user.setMobile(mobile); + user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile)); + user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile)); + user.setFace(USER_FACE1); + + user.setBirthday(DateUtil.stringToDate("1999-01-01")); + user.setSex(Sex.secret.type); + user.setBgImg(USER_FACE1); + user.setCountry("中国"); + user.setProvince(""); + user.setCity(""); + user.setDistrict(""); + user.setDescription("这家伙很懒,什么都没留下~"); + user.setCanImoocNumBeUpdated(YesOrNo.YES.type); + user.setCreatedTime(new Date()); + user.setUpdatedTime(new Date()); + + usersMapper.insert(user); + + return user; + } + + @Override + public Users getUser(String userId) { + Users users = usersMapper.selectByPrimaryKey(userId); + return users; + } + + + @Transactional + @Override + public Users updateUserInfo(UpdatedUserBO updatedUserBO) { + + Users users = new Users(); + BeanUtils.copyProperties(updatedUserBO, users); + usersMapper.updateByPrimaryKeySelective(users); + return getUser(updatedUserBO.getId()); + } + + @Transactional + @Override + public Users updateUserInfo(UpdatedUserBO updatedUserBO, Integer type) { + if (type == UserInfoModifyType.NICKNAME.type) { + usersMapper.updateNickname(updatedUserBO); + } + if (type == UserInfoModifyType.SEX.type) { + usersMapper.updateSex(updatedUserBO); + } + if (type == UserInfoModifyType.BIRTHDAY.type) { + usersMapper.updateBirthday(updatedUserBO); + } + if (type == UserInfoModifyType.LOCATION.type) { + usersMapper.updateLocation(updatedUserBO); + } + if (type == UserInfoModifyType.DESC.type) { + usersMapper.updateDescription(updatedUserBO); + } + if (type == UserInfoModifyType.IMOOCNUM.type) { + if (updatedUserBO.getCanImoocNumBeUpdated() == YesOrNo.NO.type) { + GraceException.display(ResponseStatusEnum.USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR); + } + // 校验唯一性 + List haveImooc = usersMapper.selectByImoocNum(updatedUserBO.getImoocNum()); + if (haveImooc != null && !haveImooc.isEmpty()) { + GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_IMOOCNUM_EXIST_ERROR); + } + usersMapper.updateVnum(updatedUserBO); + } + + + return getUser(updatedUserBO.getId()); + +// Example example = new Example(Users.class); +// Example.Criteria criteria = example.createCriteria(); +// if (type == UserInfoModifyType.NICKNAME.type) { +// criteria.andEqualTo("nickname", updatedUserBO.getNickname()); +// Users user = usersMapper.selectOneByExample(example); +// if (user != null) { +// GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_NICKNAME_EXIST_ERROR); +// } +// } +// +// if (type == UserInfoModifyType.IMOOCNUM.type) { +// criteria.andEqualTo("imoocNum", updatedUserBO.getImoocNum()); +// Users user = usersMapper.selectOneByExample(example); +// if (user != null) { +// GraceException.display(ResponseStatusEnum.USER_INFO_UPDATED_NICKNAME_EXIST_ERROR); +// } +// +// Users tempUser = getUser(updatedUserBO.getId()); +// if (tempUser.getCanImoocNumBeUpdated() == YesOrNo.NO.type) { +// GraceException.display(ResponseStatusEnum.USER_INFO_CANT_UPDATED_IMOOCNUM_ERROR); +// } +// +// updatedUserBO.setCanImoocNumBeUpdated(YesOrNo.NO.type); +// } +// +// return updateUserInfo(updatedUserBO); + + } + + @Transactional(rollbackFor = RuntimeException.class) + @Override + public Map createUserNew(String mobile) { + // 获得全局唯一主键 + String userId = sid.nextShort(); + // 创建短视频系统账号 + Users user = new Users(); + user.setId(userId); + user.setPassword(passwordEncoder.encode(mobile)); + user.setMobile(mobile); + user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile)); + user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile)); + user.setFace(USER_FACE1); + user.setBirthday(DateUtil.stringToDate("1999-01-01")); + user.setSex(Sex.secret.type); + user.setBgImg(USER_FACE1); + user.setCountry("中国"); + user.setProvince(""); + user.setCity(""); + user.setDistrict(""); + user.setDescription("这家伙很懒,什么都没留下~"); + user.setBgImg(""); + user.setCanImoocNumBeUpdated(YesOrNo.YES.type); + user.setCreatedTime(new Date()); + user.setUpdatedTime(new Date()); + + int row = usersMapper.insert(user); + + if (row > 0) { + Map result = Maps.newHashMap(); + result.put("user", user); + // 创建商城系统账号,获取商城系统token + String url = "http://localhost:8888/buyer/passport/member/registerFromTik"; + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("userName", mobile); + param.add("password", mobile); + param.add("mobilePhone", mobile); + param.add("userId", user.getId()); + + RestTemplateUtil.post(null, null, null, url, param, String.class, t -> { + if (t.getStatusCode() == HttpStatus.OK) { + String content = t.getBody(); + if (StringUtils.isNotBlank(content)) { + Token token = GsonUtil.jsonToBean(content, Token.class); + result.put("token", token); + } else { + throw new RuntimeException("账号注册异常"); + } + } else { + throw new RuntimeException("账号注册异常"); + } + }); + return result; + } + return null; + } + + @Override + public Token getShopToken(String userId) { + Token[] tokens = { null }; + String url = "http://localhost:8888/buyer/passport/member/getTokenFromTik"; + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("userId", userId); + RestTemplateUtil.post(null, null, null, url, param, String.class, t -> { + if (t.getStatusCode() == HttpStatus.OK) { + String content = t.getBody(); + if (StringUtils.isNotBlank(content)) { + tokens[0] = GsonUtil.jsonToBean(content, Token.class); + } else { + throw new RuntimeException("账号注册异常"); + } + } else { + throw new RuntimeException("账号注册异常"); + } + }); + return tokens[0]; + } + + @Transactional(rollbackFor = RuntimeException.class) + @Override + public Users createUserFromShop(String mobile, String memberId) { + String tempMobile = StringUtils.isBlank(mobile) ? "unionID" : mobile; + // 获得全局唯一主键 + String userId = sid.nextShort(); + Users user = new Users(); + user.setId(userId); + user.setPassword(tempMobile); + user.setMobile(tempMobile); + user.setNickname("用户:" + DesensitizationUtil.commonDisplay(tempMobile)); + user.setImoocNum("WZJ" + (System.currentTimeMillis() / 1000) + (int)(Math.random() * 1000)); + user.setFace(USER_FACE1); + user.setBirthday(DateUtil.stringToDate("1999-01-01")); + user.setSex(Sex.secret.type); + user.setBgImg("https://wuzhongjie.com.cn/download/logo.png"); // 测试用地址 + user.setCountry("中国"); + user.setProvince(""); + user.setCity(""); + user.setDistrict(""); + user.setDescription("这家伙很懒,什么都没留下~"); + user.setCanImoocNumBeUpdated(YesOrNo.YES.type); + user.setCreatedTime(new Date()); + user.setUpdatedTime(new Date()); + + // 短视频用户与商城账号关系 + UserMember userMember = new UserMember(); + userMember.setUserId(user.getId()); + userMember.setMemberId(memberId); + + if (usersMapper.insert(user) > 0 && userMemberMapper.insert(userMember) > 0) { + return user; + } + return null; + } + + @Override + public String getUserInfoFromShop(String memberId) { + return Optional.ofNullable(userMemberMapper.getUserByMemberId(memberId))// + .map(user -> { + String uToken = UUID.randomUUID().toString(); + //redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken); + redisTemplate.opsForValue().set(REDIS_USER_TOKEN + ":" + user.getId(), uToken); + // 返回给前端 + UsersVO usersVO = new UsersVO(); + BeanUtils.copyProperties(user, usersVO); + usersVO.setUserToken(uToken); + + return GsonUtil.beanToJson(usersVO); + })// + .orElseGet(() -> StringUtils.EMPTY); + } + + @Override + public List searchByNickname(String nickname, Integer page, Integer pageSize, String currentUserId) { + try { + PageHelper.startPage(page, pageSize); + List userList = usersMapper.searchByNickname(nickname); + + if(currentUserId.isEmpty()){ + return userList; + } + + // 提取模糊查询出的用户 ID 列表 + List vlogerIds = userList.stream().map(UsersVO::getId).collect(Collectors.toList()); + log.info("用户列表" + vlogerIds); + if (vlogerIds.isEmpty()) { + log.info("没有查询到用户 ID,跳过关注关系查询"); + return userList; + } + // + userList.forEach(usersVO -> { + // 当前用户是否关注博主 + Boolean isFollowed = fansService.queryDoIFollowVloger(currentUserId,usersVO.getId()); + // 我的粉丝总数 + String myFansCountsStr = redis.get(REDIS_MY_FANS_COUNTS + ":" + usersVO.getId()); + // 获赞总数 + String likedVlogerCountsStr = redis.get(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + usersVO.getId()); + + int fansCount = 0; + int likeCount = 0; + if (myFansCountsStr != null) { + try { + fansCount = Integer.parseInt(myFansCountsStr); + } catch (NumberFormatException e) { + // 可选:记录日志或处理异常 + fansCount = 0; + } + } + if (likedVlogerCountsStr != null) { + try { + likeCount = Integer.parseInt(likedVlogerCountsStr); + } catch (NumberFormatException e) { + // 可选:记录日志或处理异常 + likeCount = 0; + } + } + + usersVO.setMyFansCounts(fansCount); + usersVO.setTotalLikeMeCounts(likeCount); + + if (isFollowed) { + String relationship = redis.get(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + usersVO.getId() + ":" + currentUserId); + if (StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")) { + usersVO.setFollowStatus("互相关注"); + }else { + usersVO.setFollowStatus("已关注"); + } + } else { + usersVO.setFollowStatus("未关注"); + } + }); + return userList; + +// +// +// +// +// // 获取当前用户关注的 +// List> followedRelations = fansMapper.getFollowedVlogerIds(currentUserId, vlogerIds); +// log.info("获取当前用户关注的: {}", followedRelations); +// // 构建 vlogerId 到 is_fan_friend_of_mine 的映射 +// java.util.Map relationMap = followedRelations.stream() +// .filter(Objects::nonNull) // 排除整个 map 为 null 的情况 +// .collect(Collectors.toMap( +// map -> (String) map.get("vloger_id"), +// map -> (Integer) map.get("is_fan_friend_of_mine") +// )); +// log.info("构造的 relationMap: {}", relationMap); +// Set followedVlogerIds = relationMap.keySet(); +// +// // 遍历设置每个用户的关注状态及展示状态 +// userList.forEach(usersVO -> { +// boolean isFollowed = followedVlogerIds.contains(usersVO.getId()); +// usersVO.setIsFollowed(isFollowed); +// if (isFollowed) { +// Integer isFanFriendOfMine = relationMap.get(usersVO.getId()); +// if (isFanFriendOfMine != null && isFanFriendOfMine == 1) { +// usersVO.setFollowStatus("互相关注"); // 假设 UsersVO 有此方法设置展示状态 +// } else { +// usersVO.setFollowStatus("已关注"); +// } +// } else { +// usersVO.setFollowStatus("未关注"); +// } +// }); +// +// log.info("用户列表" + userList); +// return userList; + } catch (Exception e) { + log.error("搜索用户时发生异常", e); + throw new RuntimeException("搜索用户时发生异常", e); + } + } +} + diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java new file mode 100644 index 000000000..5f537d368 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java @@ -0,0 +1,626 @@ +package com.wzj.soopin.content.service.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.pagehelper.PageHelper; +import com.imooc.base.BaseInfoProperties; +import com.imooc.bo.VlogBO; +import com.imooc.enums.MessageEnum; +import com.imooc.enums.YesOrNo; +import com.imooc.mapper.MyLikedVlogMapper; +import com.imooc.mapper.VlogMapper; +import com.imooc.mapper.VlogMapperCustom; +import com.imooc.pojo.MyLikedVlog; +import com.imooc.pojo.Vlog; +import com.imooc.service.FansService; +import com.imooc.service.MsgService; +import com.imooc.service.VlogService; +import com.imooc.utils.PagedGridResult; +import com.imooc.vo.IndexVlogVO; +import org.apache.commons.lang3.StringUtils; +import org.n3r.idworker.Sid; +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.*; + +@Service +public class VlogServiceImpl extends BaseInfoProperties implements VlogService { + + @Autowired + private VlogMapper vlogMapper; + + @Autowired + private VlogMapperCustom vlogMapperCustom; + + @Autowired + private MyLikedVlogMapper myLikedVlogMapper; + + @Autowired + private FansService fansService; + @Autowired + private MsgService msgService; + + @Autowired + private Sid sid; + + @Transactional + @Override + public void updateVlogStatus(String fileId,Integer status,String reason) { +// Example example = new Example(Vlog.class); +// Example.Criteria criteria = example.createCriteria(); +// criteria.andEqualTo("fileId", fileId); +// +// Vlog pendingVlog = new Vlog(); +// pendingVlog.setStatus(status); +// pendingVlog.setReason(reason); +// vlogMapper.updateVlogStatus(fileId, example); + + // 示例:更新 vlog 表 + Map updateFields = new HashMap<>(); + updateFields.put("status", status); + updateFields.put("reason", reason); + + vlogMapper.dynamicUpdate( + "file_id", // 主键字段名 + fileId, // 主键值 + updateFields // 更新字段 + ); + } + + @Transactional + @Override + public void updateVlogFirstImg(String fileId,String url,String fileUrl) { +// Example example = new Example(Vlog.class); +// Example.Criteria criteria = example.createCriteria(); +// criteria.andEqualTo("fileId", fileId); +// Vlog pendingVlog = new Vlog(); +// pendingVlog.setFirstFrameImg(url); +// pendingVlog.setUrl(fileUrl); +// +// vlogMapper.updateByExampleSelective(pendingVlog, example); + // 示例:更新 vlog 表 + Map updateFields = new HashMap<>(); + updateFields.put("first_frame_img", url); + updateFields.put("url", fileUrl); + + vlogMapper.dynamicUpdate( + "file_id", // 主键字段名 + fileId, // 主键值 + updateFields // 更新字段 + ); + + } + + @Transactional + @Override + public void createVlog(VlogBO vlogBO) { + +// String vid = sid.nextShort(); +// +// Vlog vlog = new Vlog(); +// BeanUtils.copyProperties(vlogBO, vlog); +// +// vlog.setId(vid); +// +// vlog.setLikeCounts(0); +// vlog.setCommentsCounts(0); +// vlog.setStatus(0); +// vlog.setIsPrivate(YesOrNo.NO.type); +// +// vlog.setCreatedTime(new Date()); +// vlog.setUpdatedTime(new Date()); +// +// vlogMapper.insert(vlog); + String vid = sid.nextShort(); + Map vlog = new HashMap<>(); + + vlog.put("id", vid); + vlog.put("vloger_id", vlogBO.getVlogerId()); + vlog.put("url", vlogBO.getUrl()); + vlog.put("title", vlogBO.getTitle()); + vlog.put("width", vlogBO.getWidth()); + vlog.put("height", vlogBO.getHeight()); + vlog.put("is_private", YesOrNo.NO.type); + vlog.put("created_time", new Date()); + vlog.put("updated_time", new Date()); + vlog.put("city_code", vlogBO.getCityCode()); + vlog.put("file_id", vlogBO.getFileId()); + vlog.put("first_frame_img", vlogBO.getFirstFrameImg()); + + + vlogMapper.dynamicInsert(vlog); + + //多条导入 +// List> vlogList = new ArrayList<>(); +// +// Map vlog1 = new HashMap<>(); +// vlog1.put("id", sid.nextShort()); +// vlog1.put("title", "视频1"); +// vlogList.add(vlog1); +// +// Map vlog2 = new HashMap<>(); +// vlog2.put("id", sid.nextShort()); +// vlog2.put("title", "视频2"); +// vlogList.add(vlog2); +// +// vlogMapper.dynamicBatchInsert(vlogList); + } + + @Override + public PagedGridResult getIndexVlogList(String userId, + String search, + String cityCode, + String status, + Integer page, + Integer pageSize) { + + PageHelper.startPage(page, pageSize); + + Map map = new HashMap<>(); + if (StringUtils.isNotBlank(search)) { + map.put("search", search); + } + if (StringUtils.isNotBlank(cityCode)) { + map.put("cityCode", cityCode); + } + if (StringUtils.isNotBlank(status)) { + map.put("status", status); + } + if(StringUtils.isNotBlank(userId)){ + // 从redis中获取举报信息 + String redisKey = REDIS_VIDEO_BLOCK + ":" + userId; + Boolean hasKey = redis.keyIsExist(redisKey); + if(hasKey){ + List blockVdList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理举报信息 + String vlogId = (String) reportMap.get("vlogId"); + blockVdList.add(vlogId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + map.put("blockVd",blockVdList); + } + } + if(StringUtils.isNotBlank(userId)){ + // 从redis中获取拉黑信息 + String redisKey = REDIS_USER_BLOCK + ":" + userId; + Boolean hasKey = redis.keyIsExist(redisKey); + if(hasKey){ + List blockUserList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理拉黑信息 + String vlogerId = (String) reportMap.get("vlogerId"); + blockUserList.add(vlogerId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + map.put("blockUser",blockUserList); + } + } + + List list = vlogMapperCustom.getIndexVlogList(map); + + for (IndexVlogVO v : list) { + String vlogerId = v.getVlogerId(); + String vlogId = v.getVlogId(); + + if (StringUtils.isNotBlank(userId)) { + // 用户是否关注该博主 + boolean doIFollowVloger = fansService.queryDoIFollowVloger(userId, vlogerId); + v.setDoIFollowVloger(doIFollowVloger); + + // 判断当前用户是否点赞过视频 + v.setDoILikeThisVlog(doILikeVlog(userId, vlogId)); + } + + // 获得当前视频被点赞过的总数 + v.setLikeCounts(getVlogBeLikedCounts(vlogId)); + // 评论数 + v.setCommentsCounts(getVlogComment(vlogId)); + } + +// return list; + return setterPagedGrid(list, page); + } + + private IndexVlogVO setterVO(IndexVlogVO v, String userId) { + String vlogerId = v.getVlogerId(); + String vlogId = v.getVlogId(); + + if (StringUtils.isNotBlank(userId)) { + // 用户是否关注该博主 + boolean doIFollowVloger = fansService.queryDoIFollowVloger(userId, vlogerId); + v.setDoIFollowVloger(doIFollowVloger); + + // 判断当前用户是否点赞过视频 + v.setDoILikeThisVlog(doILikeVlog(userId, vlogId)); + } + + // 获得当前视频被点赞过的总数 + v.setLikeCounts(getVlogBeLikedCounts(vlogId)); + + return v; + } +// + @Override + public Integer getVlogBeLikedCounts(String vlogId) { + String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId); + if (StringUtils.isBlank(countsStr)) { + countsStr = "0"; + } + return Integer.valueOf(countsStr); + } + + private Integer getVlogComment(String vlogId) { + String countsStr = redis.get(REDIS_VLOG_COMMENT_COUNTS + ":" + vlogId); + if (StringUtils.isBlank(countsStr)) { + countsStr = "0"; + } + return Integer.valueOf(countsStr); + } + + +// + private boolean doILikeVlog(String myId, String vlogId) { + + String doILike = redis.get(REDIS_USER_LIKE_VLOG + ":" + myId + ":" + vlogId); + boolean isLike = false; + if (StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1")) { + isLike = true; + } + return isLike; + } +// + @Override + public IndexVlogVO getVlogDetailById(String userId, String vlogId) { + + Map map = new HashMap<>(); + map.put("vlogId", vlogId); + + List list = vlogMapperCustom.getVlogDetailById(map); + + if (list != null && list.size() > 0 && !list.isEmpty()) { + IndexVlogVO vlogVO = list.get(0); +// return vlogVO; + return setterVO(vlogVO, userId); + } + + return null; + } + + @Transactional + @Override + public void changeToPrivateOrPublic(String userId, + String vlogId, + Integer yesOrNo) { +// Example example = new Example(Vlog.class); +// Example.Criteria criteria = example.createCriteria(); +// criteria.andEqualTo("id", vlogId); +// criteria.andEqualTo("vlogerId", userId); +// +// Vlog pendingVlog = new Vlog(); +// pendingVlog.setIsPrivate(yesOrNo); + + Map updates = new HashMap<>(); + updates.put("is_private", 2); + Map conditions = new HashMap<>(); + conditions.put("id", vlogId); + conditions.put("vloger_id", userId); + vlogMapper.updateVlogByConditions( + updates, + conditions + ); + + } + + @Transactional + @Override + public void changeVlogStatus(String userId, + String vlogId, + Integer status) { + Map updates = new HashMap<>(); + updates.put("status", status); + Map conditions = new HashMap<>(); + conditions.put("id", vlogId); + conditions.put("vloger_id", userId); + vlogMapper.updateVlogByConditions( + updates, + conditions + ); + + } + + @Override + public PagedGridResult queryMyVlogList(String userId, + String myId, + Integer page, + Integer pageSize, + Integer yesOrNo) { + + + PageHelper.startPage(page, pageSize); + Map map = new HashMap<>(); +// if (StringUtils.isNotBlank(search)) { +// map.put("search", search); +// } +// if (StringUtils.isNotBlank(cityCode)) { +// map.put("cityCode", cityCode); +// } +// if (StringUtils.isNotBlank(status)) { +// map.put("status", status); +// } + + map.put("vlogerId", userId); + if (StringUtils.isNotBlank(myId)) { + // 从redis中获取举报信息 + String redisKeyRp = REDIS_VIDEO_BLOCK + ":" + myId; + Boolean hasKeyRp = redis.keyIsExist(redisKeyRp); + if(hasKeyRp){ + List blockVdList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKeyRp, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理举报信息 + String vlogId = (String) reportMap.get("vlogId"); + blockVdList.add(vlogId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + map.put("blockVd",blockVdList); + } + } + + + List list = vlogMapper.selectMyPublic(map); + + for (IndexVlogVO v : list) { + String vlogId = v.getVlogId(); + // 获得当前视频被点赞过的总数 + v.setLikeCounts(getVlogBeLikedCounts(vlogId)); + // 评论数 + v.setCommentsCounts(getVlogComment(vlogId)); + } + return setterPagedGrid(list, page); + } + + @Transactional + @Override + public void userLikeVlog(String userId, String vlogId) { + + String rid = sid.nextShort(); + + MyLikedVlog likedVlog = new MyLikedVlog(); + likedVlog.setId(rid); + likedVlog.setVlogId(vlogId); + likedVlog.setUserId(userId); + likedVlog.setCreatedTime(new Date()); + + myLikedVlogMapper.insert(likedVlog); +// System.out.println(vlogId); +// +// Vlog vlog = new Vlog(); +// vlog.setId(vlogId); +// Vlog vlog1 = vlogMapper.selectOne(vlog); +// System.out.println(vlog1.toString()); +//// System.out.println(vlog1.getCreatedTime()); + +// Vlog vlog2 = vlogMapper.selectByPrimaryKey(vlogId); +// System.out.println(vlog2.toString()); + +// Vlog vlog1 = vlogMapper.selectOne(new Vlog().setId(vlogId)); +// Vlog vlog = vlog1 +// System.out.println(vlog); + + // 系统消息:点赞短视频 + Vlog vlog = this.getVlog(vlogId); + Map msgContent = new HashMap(); + msgContent.put("vlogId", vlogId); + msgContent.put("vlogCover", vlog.getCover()); + msgService.createMsg(userId, + vlog.getVlogerId(), + MessageEnum.LIKE_VLOG.type, + msgContent); + } +// + @Override + public Vlog getVlog(String id) { +// Vlog vlog = vlogMapper.selectByPrimaryKey(id); +// return vlog; + Map map = new HashMap<>(); + map.put("vlogId", id); + + List list = vlogMapper.getVlogDetailFromId(map); + + if (list != null && list.size() > 0 && !list.isEmpty()) { + IndexVlogVO result = list.get(0); + Vlog vlogVO = new Vlog(); + BeanUtils.copyProperties(result, vlogVO); + return vlogVO; + } + + return null; + } + + @Transactional + @Override + public void flushCounts(String vlogId, Integer counts) { +// +// Vlog vlog = new Vlog(); +// vlog.setId(vlogId); +// vlog.setLikeCounts(counts); +// int i = vlogMapper.updateByPrimaryKeySelective(vlog); + + // 示例:更新 vlog 表 + Map updateFields = new HashMap<>(); + updateFields.put("like_counts", counts); + + vlogMapper.dynamicUpdate( + "id", // 主键字段名 + vlogId, // 主键值 + updateFields // 更新字段 + ); + + } + + // + @Transactional + @Override + public void userUnLikeVlog(String userId, String vlogId) { + + MyLikedVlog likedVlog = new MyLikedVlog(); + likedVlog.setVlogId(vlogId); + likedVlog.setUserId(userId); + + myLikedVlogMapper.delete(likedVlog); + } + + @Override + public PagedGridResult getMyLikedVlogList(String userId, + String myId, + Integer page, + Integer pageSize) { + PageHelper.startPage(page, pageSize); + Map map = new HashMap<>(); + map.put("userId", userId); + String useWho; + if (StringUtils.isNotBlank(myId)) { + useWho = myId; + }else{ + useWho = userId; + } + // 从redis中获取拉黑信息 + String redisKey = REDIS_USER_BLOCK + ":" + useWho; + Boolean hasKey = redis.keyIsExist(redisKey); + if(hasKey){ + List blockUserList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKey, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理拉黑信息 + String vlogerId = (String) reportMap.get("vlogerId"); + blockUserList.add(vlogerId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + map.put("blockUser",blockUserList); + System.out.println(blockUserList); + } + + // 从redis中获取举报信息 + String redisKeyRp = REDIS_VIDEO_BLOCK + ":" + useWho; + Boolean hasKeyRp = redis.keyIsExist(redisKeyRp); + if(hasKeyRp){ + List blockVdList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKeyRp, 0, -1); // 查询用户的所有举报记录 + + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + // 处理举报信息 + String vlogId = (String) reportMap.get("vlogId"); + blockVdList.add(vlogId); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + map.put("blockVd",blockVdList); + } + + + List list = vlogMapperCustom.getMyLikedVlogList(map); + + return setterPagedGrid(list, page); + } + + @Override + public PagedGridResult getMyFollowVlogList(String myId, + Integer page, + Integer pageSize) { + PageHelper.startPage(page, pageSize); + + Map map = new HashMap<>(); + map.put("myId", myId); + + List list = vlogMapperCustom.getMyFollowVlogList(map); + + for (IndexVlogVO v : list) { + String vlogerId = v.getVlogerId(); + String vlogId = v.getVlogId(); + + if (StringUtils.isNotBlank(myId)) { + // 用户必定关注该博主 + v.setDoIFollowVloger(true); + + // 判断当前用户是否点赞过视频 + v.setDoILikeThisVlog(doILikeVlog(myId, vlogId)); + } + + // 获得当前视频被点赞过的总数 + v.setLikeCounts(getVlogBeLikedCounts(vlogId)); + } + + return setterPagedGrid(list, page); + } +// + @Override + public PagedGridResult getMyFriendVlogList(String myId, + Integer page, + Integer pageSize) { + + PageHelper.startPage(page, pageSize); + + Map map = new HashMap<>(); + map.put("myId", myId); + + List list = vlogMapperCustom.getMyFriendVlogList(map); + + for (IndexVlogVO v : list) { + String vlogerId = v.getVlogerId(); + String vlogId = v.getVlogId(); + + if (StringUtils.isNotBlank(myId)) { + // 用户必定关注该博主 + v.setDoIFollowVloger(true); + + // 判断当前用户是否点赞过视频 + v.setDoILikeThisVlog(doILikeVlog(myId, vlogId)); + } + + // 获得当前视频被点赞过的总数 + v.setLikeCounts(getVlogBeLikedCounts(vlogId)); + } + + return setterPagedGrid(list, page); + } + +// @Override +// public Vlog getVlog(String id) { +// return null; +// } +} diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapper.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapper.xml new file mode 100644 index 000000000..c4b56865a --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapperCustom.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapperCustom.xml new file mode 100644 index 000000000..2f2f4082e --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/CommentMapperCustom.xml @@ -0,0 +1,46 @@ + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapper.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapper.xml new file mode 100644 index 000000000..80c3b96ce --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + UPDATE t_fans + + vloger_id = #{vlogerId}, + fan_id = #{fanId}, + is_fan_friend_of_mine = #{isFanFriendOfMine}, + + WHERE id = #{id} + + + + + INSERT INTO t_fans + + ${key} + + VALUES + + #{value} + + + + + + + + DELETE FROM t_fans + WHERE id = #{id} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapperCustom.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapperCustom.xml new file mode 100644 index 000000000..a822bd848 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/FansMapperCustom.xml @@ -0,0 +1,49 @@ + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/MyLikedVlogMapper.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/MyLikedVlogMapper.xml new file mode 100644 index 000000000..ceb9219f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/MyLikedVlogMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UserMemberMapper.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UserMemberMapper.xml new file mode 100644 index 000000000..4448ba619 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UserMemberMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UsersMapper.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UsersMapper.xml new file mode 100644 index 000000000..62fafde66 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/UsersMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapper.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapper.xml new file mode 100644 index 000000000..ecdc68b66 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapper.xml @@ -0,0 +1,160 @@ + + + + + + + UPDATE t_vlog + + + ${key} = #{value} + + + WHERE ${primaryKey} = #{idValue} + + + + UPDATE t_vlog + + + ${key} = #{value} + + + + + + + + ${key} IS NULL + + + + ${key} IN + + #{item} + + + + + ${key} = #{value} + + + + + + + + + INSERT INTO t_vlog + + ${key} + + VALUES + + #{value} + + + + + + INSERT INTO t_vlog + + ${key} + + VALUES + + + #{value} + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapperCustom.xml b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapperCustom.xml new file mode 100644 index 000000000..374935082 --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/resources/mapper/content/VlogMapperCustom.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-goods/pom.xml b/ruoyi-modules/ruoyi-goods/pom.xml new file mode 100644 index 000000000..98af21c03 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/pom.xml @@ -0,0 +1,102 @@ + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-goods + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java new file mode 100644 index 000000000..41552af51 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java @@ -0,0 +1,82 @@ +package com.wzj.soopin.goods.controller; + + +import com.wzj.soopin.goods.service.BrandService; +import org.dromara.common.web.core.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 品牌管理Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="品牌管理接口列表") +@RestController +@RequestMapping("/pms/brand") +public class BrandController extends BaseController { + @Autowired + private BrandService service; + @Autowired + private BrandConvert convert; + + @ApiOperation("查询品牌管理列表") + @PreAuthorize("@ss.hasPermi('pms:brand:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody BrandQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + @ApiOperation("所有品牌管理列表") + @PreAuthorize("@ss.hasPermi('pms:brand:list')") + @PostMapping("/all") + public ResponseEntity> all(@RequestBody BrandQuery query) { + return ResponseEntity.ok(service.selectList(query, null)); + } + + @ApiOperation("导出品牌管理列表") + @PreAuthorize("@ss.hasPermi('pms:brand:export')") + @Log(title = "品牌管理", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(BrandQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(BrandVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "品牌管理数据")); + } + + @ApiOperation("获取品牌管理详细信息") + @PreAuthorize("@ss.hasPermi('pms:brand:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增品牌管理") + @PreAuthorize("@ss.hasPermi('pms:brand:add')") + @Log(title = "品牌管理", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody Brand brand) { + return ResponseEntity.ok(service.insert(brand)); + } + + @ApiOperation("修改品牌管理") + @PreAuthorize("@ss.hasPermi('pms:brand:edit')") + @Log(title = "品牌管理", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody Brand brand) { + return ResponseEntity.ok(service.update(brand)); + } + + @ApiOperation("删除品牌管理") + @PreAuthorize("@ss.hasPermi('pms:brand:remove')") + @Log(title = "品牌管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java new file mode 100644 index 000000000..00ca1dfe5 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java @@ -0,0 +1,73 @@ +package com.wzj.soopin.goods.controller; + +import com.cyl.manager.pms.convert.ProductCategoryConvert; +import com.cyl.manager.pms.domain.entity.ProductCategory; +import com.cyl.manager.pms.domain.query.ProductCategoryQuery; +import com.cyl.manager.pms.domain.vo.ProductCategoryVO; +import com.cyl.manager.pms.service.ProductCategoryService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 商品分类Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="商品分类接口列表") +@RestController +@RequestMapping("/pms/productCategory") +public class ProductCategoryController extends BaseController { + @Autowired + private ProductCategoryService service; + @Autowired + private ProductCategoryConvert convert; + + @ApiOperation("查询商品分类列表") + @PreAuthorize("@ss.hasPermi('pms:productCategory:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody ProductCategoryQuery query) { + List list = service.selectList(query, null); + return ResponseEntity.ok(list); + } + + @ApiOperation("获取商品分类详细信息") + @PreAuthorize("@ss.hasPermi('pms:productCategory:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增商品分类") + @PreAuthorize("@ss.hasPermi('pms:productCategory:add')") + @Log(title = "商品分类", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody ProductCategory productCategory) { + return ResponseEntity.ok(service.insert(productCategory)); + } + + @ApiOperation("修改商品分类") + @PreAuthorize("@ss.hasPermi('pms:productCategory:edit')") + @Log(title = "商品分类", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody ProductCategory productCategory) { + return ResponseEntity.ok(service.update(productCategory)); + } + + @ApiOperation("删除商品分类") + @PreAuthorize("@ss.hasPermi('pms:productCategory:remove')") + @Log(title = "商品分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java new file mode 100644 index 000000000..10f98c74a --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.goods.controller; + +import com.cyl.manager.pms.convert.ProductConvert; +import com.cyl.manager.pms.domain.entity.Product; +import com.cyl.manager.pms.domain.query.ProductQuery; +import com.cyl.manager.pms.domain.vo.ProductVO; +import com.cyl.manager.pms.service.ProductService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 商品信息Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="商品信息接口列表") +@RestController +@RequestMapping("/pms/product") +public class ProductController extends BaseController { + @Autowired + private ProductService service; + @Autowired + private ProductConvert convert; + + @ApiOperation("查询商品信息列表") + @PreAuthorize("@ss.hasPermi('pms:product:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody ProductQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出商品信息列表") + @PreAuthorize("@ss.hasPermi('pms:product:export')") + @Log(title = "商品信息", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(ProductQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(ProductVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "商品信息数据")); + } + + @ApiOperation("获取商品信息详细信息") + @PreAuthorize("@ss.hasPermi('pms:product:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增商品信息") + @PreAuthorize("@ss.hasPermi('pms:product:add')") + @Log(title = "商品信息", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody ProductVO product) { + return ResponseEntity.ok(service.insert(product)); + } + + @ApiOperation("修改商品信息") + @PreAuthorize("@ss.hasPermi('pms:product:edit')") + @Log(title = "商品信息", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody ProductVO product) { + return ResponseEntity.ok(service.update(product)); + } + + @ApiOperation("删除商品信息") + @PreAuthorize("@ss.hasPermi('pms:product:remove')") + @Log(title = "商品信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java new file mode 100644 index 000000000..fb11d2c06 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.goods.controller; + +import com.cyl.manager.pms.convert.SkuConvert; +import com.cyl.manager.pms.domain.entity.Sku; +import com.cyl.manager.pms.domain.query.SkuQuery; +import com.cyl.manager.pms.domain.vo.SkuVO; +import com.cyl.manager.pms.service.SkuService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * sku信息Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="sku信息接口列表") +@RestController +@RequestMapping("/pms/sku") +public class SkuController extends BaseController { + @Autowired + private SkuService service; + @Autowired + private SkuConvert convert; + + @ApiOperation("查询sku信息列表") + @PreAuthorize("@ss.hasPermi('pms:sku:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody SkuQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出sku信息列表") + @PreAuthorize("@ss.hasPermi('pms:sku:export')") + @Log(title = "sku信息", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(SkuQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(SkuVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "sku信息数据")); + } + + @ApiOperation("获取sku信息详细信息") + @PreAuthorize("@ss.hasPermi('pms:sku:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增sku信息") + @PreAuthorize("@ss.hasPermi('pms:sku:add')") + @Log(title = "sku信息", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody Sku sku) { + return ResponseEntity.ok(service.insert(sku)); + } + + @ApiOperation("修改sku信息") + @PreAuthorize("@ss.hasPermi('pms:sku:edit')") + @Log(title = "sku信息", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody Sku sku) { + return ResponseEntity.ok(service.update(sku)); + } + + @ApiOperation("删除sku信息") + @PreAuthorize("@ss.hasPermi('pms:sku:remove')") + @Log(title = "sku信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java new file mode 100644 index 000000000..d446d28ea --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.goods.convert; + +import com.cyl.manager.pms.domain.entity.Brand; +import com.cyl.manager.pms.domain.vo.BrandVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 品牌管理 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface BrandConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java new file mode 100644 index 000000000..ea7bad1e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java @@ -0,0 +1,20 @@ +package com.wzj.soopin.goods.convert; + +import com.cyl.h5.domain.dto.CategoryDTO; +import com.cyl.manager.pms.domain.entity.ProductCategory; +import com.cyl.manager.pms.domain.vo.ProductCategoryVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 商品分类 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface ProductCategoryConvert { + + List dos2vos(List list); + + CategoryDTO do2dto(ProductCategory it); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java new file mode 100644 index 000000000..206c09c3e --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java @@ -0,0 +1,22 @@ +package com.wzj.soopin.goods.convert; + +import com.cyl.h5.domain.vo.H5ProductVO; +import com.cyl.manager.pms.domain.entity.Product; +import com.cyl.manager.pms.domain.vo.ProductVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 商品信息 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface ProductConvert { + + List dos2vos(List list); + Product vo2do(ProductVO productVO); + ProductVO do2vo(Product product); + + List dos2dtos(List products); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java new file mode 100644 index 000000000..a09eb7c84 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.goods.convert; + +import com.cyl.manager.pms.domain.entity.Sku; +import com.cyl.manager.pms.domain.vo.SkuVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * sku信息 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface SkuConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Brand.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Brand.java new file mode 100644 index 000000000..fbdf27017 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Brand.java @@ -0,0 +1,39 @@ +package com.wzj.soopin.goods.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 品牌管理对象 pms_brand + * + * @author zcc + */ +@ApiModel(description="品牌管理对象") +@Data +@TableName("pms_brand") +public class Brand extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("NAME") + @Excel(name = "NAME") + private String name; + + @ApiModelProperty("SORT") + @Excel(name = "SORT") + private Integer sort; + + @ApiModelProperty("SHOW_STATUS") + @Excel(name = "SHOW_STATUS") + private Integer showStatus; + + @ApiModelProperty("品牌logo") + @Excel(name = "品牌logo") + private String logo; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Product.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Product.java new file mode 100644 index 000000000..b0ec81d09 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Product.java @@ -0,0 +1,89 @@ +package com.wzj.soopin.goods.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 商品信息对象 pms_product + * + * @author zcc + */ +@ApiModel(description="商品信息对象") +@Data +@TableName("pms_product") +public class Product extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("BRAND_ID") + @Excel(name = "BRAND_ID") + private Long brandId; + + @ApiModelProperty("CATEGORY_ID") + @Excel(name = "CATEGORY_ID") + private Long categoryId; + + @ApiModelProperty("商品编码") + @Excel(name = "商品编码") + private String outProductId; + + @ApiModelProperty("NAME") + @Excel(name = "NAME") + private String name; + + @ApiModelProperty("主图") + @Excel(name = "主图") + private String pic; + + @ApiModelProperty("画册图片,连产品图片限制为5张,以逗号分割") + @Excel(name = "画册图片,连产品图片限制为5张,以逗号分割") + private String albumPics; + + @ApiModelProperty("上架状态:0->下架;1->上架") + @Excel(name = "上架状态:0->下架;1->上架") + private Integer publishStatus; + + @ApiModelProperty("排序") + @Excel(name = "排序") + private Integer sort; + + @ApiModelProperty("PRICE") + @Excel(name = "PRICE") + private BigDecimal price; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unit; + + @ApiModelProperty("商品重量,默认为克") + @Excel(name = "商品重量,默认为克") + private BigDecimal weight; + + @ApiModelProperty("商品销售属性,json格式") + @Excel(name = "商品销售属性,json格式") + private String productAttr; + + @ApiModelProperty("产品详情网页内容") + @Excel(name = "产品详情网页内容") + private String detailHtml; + + @ApiModelProperty("移动端网页详情") + @Excel(name = "移动端网页详情") + private String detailMobileHtml; + + @ApiModelProperty("品牌名称") + @Excel(name = "品牌名称") + private String brandName; + + @ApiModelProperty("商品分类名称") + @Excel(name = "商品分类名称") + private String productCategoryName; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/ProductCategory.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/ProductCategory.java new file mode 100644 index 000000000..debe78ba5 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/ProductCategory.java @@ -0,0 +1,47 @@ +package com.wzj.soopin.goods.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 商品分类对象 pms_product_category + * + * @author zcc + */ +@ApiModel(description="商品分类对象") +@Data +@TableName("pms_product_category") +public class ProductCategory extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("上级分类的编号:0表示一级分类") + @Excel(name = "上级分类的编号:0表示一级分类") + private Long parentId; + + @ApiModelProperty("NAME") + @Excel(name = "NAME") + private String name; + + @ApiModelProperty("分类级别:0->1级;1->2级") + @Excel(name = "分类级别:0->1级;1->2级") + private Integer level; + + @ApiModelProperty("显示状态:0->不显示;1->显示") + @Excel(name = "显示状态:0->不显示;1->显示") + private Integer showStatus; + + @ApiModelProperty("SORT") + @Excel(name = "SORT") + private Integer sort; + + @ApiModelProperty("图标") + @Excel(name = "图标") + private String icon; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Sku.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Sku.java new file mode 100644 index 000000000..8bcd08482 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/entity/Sku.java @@ -0,0 +1,49 @@ +package com.wzj.soopin.goods.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +/** + * sku信息对象 pms_sku + * + * @author zcc + */ +@ApiModel(description="sku信息对象") +@Data +@TableName("pms_sku") +public class Sku extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("PRODUCT_ID") + @Excel(name = "PRODUCT_ID") + private Long productId; + + @ApiModelProperty("sku编码") + @Excel(name = "sku编码") + private String outSkuId; + + @ApiModelProperty("PRICE") + @Excel(name = "PRICE") + private BigDecimal price; + + @ApiModelProperty("展示图片") + @Excel(name = "展示图片") + private String pic; + + @ApiModelProperty("商品销售属性,json格式") + @Excel(name = "商品销售属性,json格式") + private String spData; + + @ApiModelProperty("库存数") + @Excel(name = "库存数") + private Integer stock; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/BrandQuery.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/BrandQuery.java new file mode 100644 index 000000000..d1ec303ac --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/BrandQuery.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.goods.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 品牌管理 查询 对象 + * + * @author zcc + */ +@ApiModel(description="品牌管理 查询 对象") +@Data +public class BrandQuery { + @ApiModelProperty("NAME 精确匹配") + private String nameLike; + + @ApiModelProperty("SORT 精确匹配") + private Integer sort; + + @ApiModelProperty("SHOW_STATUS 精确匹配") + private Integer showStatus; + + @ApiModelProperty("品牌logo 精确匹配") + private String logo; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductCategoryQuery.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductCategoryQuery.java new file mode 100644 index 000000000..0f3577ba0 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductCategoryQuery.java @@ -0,0 +1,33 @@ +package com.wzj.soopin.goods.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品分类 查询 对象 + * + * @author zcc + */ +@ApiModel(description="商品分类 查询 对象") +@Data +public class ProductCategoryQuery { + @ApiModelProperty("上级分类的编号:0表示一级分类 精确匹配") + private Long parentId; + + @ApiModelProperty("NAME 精确匹配") + private String nameLike; + + @ApiModelProperty("分类级别:0->1级;1->2级 精确匹配") + private Integer level; + + @ApiModelProperty("显示状态:0->不显示;1->显示 精确匹配") + private Integer showStatus; + + @ApiModelProperty("SORT 精确匹配") + private Integer sort; + + @ApiModelProperty("图标 精确匹配") + private String icon; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductQuery.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductQuery.java new file mode 100644 index 000000000..0d03b97e9 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/ProductQuery.java @@ -0,0 +1,80 @@ +package com.wzj.soopin.goods.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 商品信息 查询 对象 + * + * @author zcc + */ +@ApiModel(description="商品信息 查询 对象") +@Data +public class ProductQuery { + @ApiModelProperty("BRAND_ID 精确匹配") + private Long brandId; + + @ApiModelProperty("CATEGORY_ID 精确匹配") + private Long categoryId; + + @ApiModelProperty("商品编码 精确匹配") + private String outProductId; + + @ApiModelProperty("NAME 精确匹配") + private String nameLike; + + @ApiModelProperty("主图 精确匹配") + private String pic; + + @ApiModelProperty("画册图片,连产品图片限制为5张,以逗号分割 精确匹配") + private String albumPics; + + @ApiModelProperty("上架状态:0->下架;1->上架 精确匹配") + private Integer publishStatus; + + @ApiModelProperty("排序 精确匹配") + private Integer sort; + + @ApiModelProperty("PRICE 精确匹配") + private BigDecimal price; + + @ApiModelProperty("单位 精确匹配") + private String unit; + + @ApiModelProperty(name = "商品销售属性,json格式") + private String productAttr; + + @ApiModelProperty("商品重量,默认为克 精确匹配") + private BigDecimal weight; + + @ApiModelProperty("产品详情网页内容 精确匹配") + private String detailHtml; + + @ApiModelProperty("移动端网页详情 精确匹配") + private String detailMobileHtml; + + @ApiModelProperty("品牌名称 精确匹配") + private String brandNameLike; + + @ApiModelProperty("商品分类名称 精确匹配") + private String productCategoryNameLike; + + @ApiModelProperty("排序字段") + private String orderField = "sort"; + + @ApiModelProperty("排序规则") + private String orderSort = "desc"; + + @ApiModelProperty("搜索关键字") + private String search; + + //排查的id + private List excludeProductIds; + + private List ids; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/SkuQuery.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/SkuQuery.java new file mode 100644 index 000000000..41c6fca05 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/query/SkuQuery.java @@ -0,0 +1,32 @@ +package com.wzj.soopin.goods.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * sku信息 查询 对象 + * + * @author zcc + */ +@ApiModel(description="sku信息 查询 对象") +@Data +public class SkuQuery { + @ApiModelProperty("PRODUCT_ID 精确匹配") + private Long productId; + + @ApiModelProperty("sku编码 精确匹配") + private String outSkuId; + + @ApiModelProperty("PRICE 精确匹配") + private BigDecimal price; + + @ApiModelProperty("展示图片 精确匹配") + private String pic; + + @ApiModelProperty("商品销售属性,json格式 精确匹配") + private String spData; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/BrandVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/BrandVO.java new file mode 100644 index 000000000..91501f8e7 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/BrandVO.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.goods.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; +/** + * 品牌管理 数据视图对象 + * + * @author zcc + */ +@Data +public class BrandVO extends BaseAudit { + /** ID */ + private Long id; + /** NAME */ + @Excel(name = "NAME") + private String name; + /** SORT */ + @Excel(name = "SORT") + private Integer sort; + /** SHOW_STATUS */ + @Excel(name = "SHOW_STATUS") + private Integer showStatus; + /** 品牌logo */ + @Excel(name = "品牌logo") + private String logo; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductCategoryVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductCategoryVO.java new file mode 100644 index 000000000..22101b1ec --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductCategoryVO.java @@ -0,0 +1,30 @@ +package com.wzj.soopin.goods.domain.vo; + +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.util.List; + +/** + * 商品分类 数据视图对象 + * + * @author zcc + */ +@Data +public class ProductCategoryVO extends BaseAudit { + /** ID */ + private Long id; + /** 上级分类的编号:0表示一级分类 */ + private Long parentId; + /** NAME */ + private String name; + /** 分类级别:0->1级;1->2级 */ + private Integer level; + /** 显示状态:0->不显示;1->显示 */ + private Integer showStatus; + /** SORT */ + private Integer sort; + /** 图标 */ + private String icon; + private List children; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductVO.java new file mode 100644 index 000000000..863bd6f05 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/ProductVO.java @@ -0,0 +1,67 @@ +package com.wzj.soopin.goods.domain.vo; + +import com.cyl.manager.pms.domain.entity.Sku; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; +/** + * 商品信息 数据视图对象 + * + * @author zcc + */ +@Data +public class ProductVO extends BaseAudit { + /** ID */ + private Long id; + /** BRAND_ID */ + @Excel(name = "BRAND_ID") + private Long brandId; + /** CATEGORY_ID */ + @Excel(name = "CATEGORY_ID") + private Long categoryId; + /** 商品编码 */ + @Excel(name = "商品编码") + private String outProductId; + /** NAME */ + @Excel(name = "NAME") + private String name; + /** 主图 */ + @Excel(name = "主图") + private String pic; + /** 画册图片,连产品图片限制为5张,以逗号分割 */ + @Excel(name = "画册图片,连产品图片限制为5张,以逗号分割") + private String albumPics; + /** 上架状态:0->下架;1->上架 */ + @Excel(name = "上架状态:0->下架;1->上架") + private Integer publishStatus; + /** 排序 */ + @Excel(name = "排序") + private Integer sort; + /** PRICE */ + @Excel(name = "PRICE") + private BigDecimal price; + /** 单位 */ + @Excel(name = "单位") + private String unit; + /** 商品重量,默认为克 */ + @Excel(name = "商品重量,默认为克") + private BigDecimal weight; + /** 产品详情网页内容 */ + @Excel(name = "产品详情网页内容") + private String detailHtml; + /** 移动端网页详情 */ + @Excel(name = "移动端网页详情") + private String detailMobileHtml; + /** 品牌名称 */ + @Excel(name = "品牌名称") + private String brandName; + /** 商品分类名称 */ + @Excel(name = "商品分类名称") + private String productCategoryName; + @Excel(name = "商品销售属性,json格式") + private String productAttr; + private List skuList; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/SkuVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/SkuVO.java new file mode 100644 index 000000000..36243c160 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/vo/SkuVO.java @@ -0,0 +1,34 @@ +package com.wzj.soopin.goods.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +/** + * sku信息 数据视图对象 + * + * @author zcc + */ +@Data +public class SkuVO extends BaseAudit { + /** ID */ + private Long id; + /** PRODUCT_ID */ + @Excel(name = "PRODUCT_ID") + private Long productId; + /** sku编码 */ + @Excel(name = "sku编码") + private String outSkuId; + /** PRICE */ + @Excel(name = "PRICE") + private BigDecimal price; + /** 展示图片 */ + @Excel(name = "展示图片") + private String pic; + /** 商品销售属性,json格式 */ + @Excel(name = "商品销售属性,json格式") + private String spData; + @Excel(name = "库存数") + private Integer stock; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/BrandMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/BrandMapper.java new file mode 100644 index 000000000..281084084 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/BrandMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.pms.domain.entity.Brand; + +import java.util.List; + +/** + * 品牌管理Mapper接口 + * + * @author zcc + */ +public interface BrandMapper extends BaseMapper { + /** + * 查询品牌管理列表 + * + * @param brand 品牌管理 + * @return 品牌管理集合 + */ + List selectByEntity(Brand brand); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductCategoryMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductCategoryMapper.java new file mode 100644 index 000000000..8d91b9dd1 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductCategoryMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.pms.domain.entity.ProductCategory; + +import java.util.List; + +/** + * 商品分类Mapper接口 + * + * @author zcc + */ +public interface ProductCategoryMapper extends BaseMapper { + /** + * 查询商品分类列表 + * + * @param productCategory 商品分类 + * @return 商品分类集合 + */ + List selectByEntity(ProductCategory productCategory); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductMapper.java new file mode 100644 index 000000000..a7b5a9e33 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/ProductMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.pms.domain.entity.Product; + +import java.util.List; + +/** + * 商品信息Mapper接口 + * + * @author zcc + */ +public interface ProductMapper extends BaseMapper { + /** + * 查询商品信息列表 + * + * @param product 商品信息 + * @return 商品信息集合 + */ + List selectByEntity(Product product); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/SkuMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/SkuMapper.java new file mode 100644 index 000000000..4f027e68a --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/mapper/SkuMapper.java @@ -0,0 +1,25 @@ +package com.wzj.soopin.goods.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.pms.domain.entity.Sku; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * sku信息Mapper接口 + * + * @author zcc + */ +public interface SkuMapper extends BaseMapper { + /** + * 查询sku信息列表 + * + * @param sku sku信息 + * @return sku信息集合 + */ + List selectByEntity(Sku sku); + + int updateStockById(@Param("skuId")Long skuId, @Param("optDate")LocalDateTime optDate, @Param("quantity")Integer quantity); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java new file mode 100644 index 000000000..b05bb5a3f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java @@ -0,0 +1,99 @@ +package com.wzj.soopin.goods.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.pms.domain.entity.Brand; +import com.cyl.manager.pms.domain.query.BrandQuery; +import com.cyl.manager.pms.mapper.BrandMapper; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 品牌管理Service业务层处理 + * + * + * @author zcc + */ +@Service +public class BrandService { + @Autowired + private BrandMapper brandMapper; + + /** + * 查询品牌管理 + * + * @param id 品牌管理主键 + * @return 品牌管理 + */ + public Brand selectById(Long id) { + return brandMapper.selectById(id); + } + + /** + * 查询品牌管理列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 品牌管理 + */ + public List selectList(BrandQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String nameLike = query.getNameLike(); + if (!StringUtils.isEmpty(nameLike)) { + qw.like("name", nameLike); + } + Integer sort = query.getSort(); + if (sort != null) { + qw.eq("sort", sort); + } + Integer showStatus = query.getShowStatus(); + if (showStatus != null) { + qw.eq("show_status", showStatus); + } + String logo = query.getLogo(); + if (!StringUtils.isEmpty(logo)) { + qw.eq("logo", logo); + } + qw.orderByAsc("sort"); + return brandMapper.selectList(qw); + } + + /** + * 新增品牌管理 + * + * @param brand 品牌管理 + * @return 结果 + */ + public int insert(Brand brand) { + brand.setCreateTime(LocalDateTime.now()); + return brandMapper.insert(brand); + } + + /** + * 修改品牌管理 + * + * @param brand 品牌管理 + * @return 结果 + */ + public int update(Brand brand) { + return brandMapper.updateById(brand); + } + + /** + * 删除品牌管理信息 + * + * @param id 品牌管理主键 + * @return 结果 + */ + public int deleteById(Long id) { + return brandMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java new file mode 100644 index 000000000..d110905b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java @@ -0,0 +1,246 @@ +package com.wzj.soopin.goods.service; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cyl.h5.domain.dto.CategoryDTO; +import com.cyl.manager.pms.convert.ProductCategoryConvert; +import com.cyl.manager.pms.convert.ProductConvert; +import com.cyl.manager.pms.domain.entity.Product; +import com.cyl.manager.pms.domain.entity.ProductCategory; +import com.cyl.manager.pms.domain.query.ProductCategoryQuery; +import com.cyl.manager.pms.domain.vo.ProductCategoryVO; +import com.cyl.manager.pms.mapper.ProductCategoryMapper; +import com.cyl.manager.pms.mapper.ProductMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.exception.base.BaseException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品分类Service业务层处理 + * + * @author zcc + */ +@Service +public class ProductCategoryService { + @Autowired + private ProductCategoryMapper productCategoryMapper; + @Autowired + private ProductMapper productMapper; + @Autowired + private ProductCategoryConvert convert; + @Autowired + private ProductConvert productConvert; + + /** + * 查询商品分类 + * + * @param id 商品分类主键 + * @return 商品分类 + */ + public ProductCategory selectById(Long id) { + return productCategoryMapper.selectById(id); + } + + /** + * 查询商品分类列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 商品分类 + */ + public List selectList(ProductCategoryQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long parentId = query.getParentId(); + if (parentId != null) { + qw.eq("parent_id", parentId); + } + String nameLike = query.getNameLike(); + if (!StringUtils.isEmpty(nameLike)) { + qw.like("name", nameLike); + } + Integer level = query.getLevel(); + if (level != null) { + qw.eq("level", level); + } + Integer showStatus = query.getShowStatus(); + if (showStatus != null) { + qw.eq("show_status", showStatus); + } + Integer sort = query.getSort(); + if (sort != null) { + qw.eq("sort", sort); + } + String icon = query.getIcon(); + if (!StringUtils.isEmpty(icon)) { + qw.eq("icon", icon); + } + qw.orderByAsc("sort"); + + List productCategories = productCategoryMapper.selectList(qw); + List productCategoryVOS = convert.dos2vos(productCategories); + return formatTree(productCategoryVOS); + + } + + private List formatTree(List nodes) { + List tree = new ArrayList<>(); + List children = new ArrayList<>(); + // 1)先获取到所有根节点 + for (ProductCategoryVO node : nodes) { + if (node.getParentId() == null || node.getParentId() == 0) { + tree.add(node); + } else { + children.add(node); + } + } + // 2)把所有除根结点外的节点作为子节点,然后遍历每一个根节点 + for (ProductCategoryVO node : tree) { + // 3)递归构建此根的子节点 + recur(node, children); + } + return tree; + } + + private void recur(ProductCategoryVO rootNode, List children) { + // 1)遍历剩余子节点,找出当前根的子节点 + for (ProductCategoryVO node : children) { + // 2)如果子节点的父id等于根节点的id,那么就将这个节点加到根节点的children列表中 + if (rootNode.getId() == node.getParentId()) { + if (rootNode.getChildren() == null) { + rootNode.setChildren(new ArrayList<>()); + } + rootNode.getChildren().add(node); + // 3)以当前节点作为根节点进行递归,检查是否还有子节点。 + recur(node, children); + } + } + } + + + /** + * 新增商品分类 + * + * @param productCategory 商品分类 + * @return 结果 + */ + public int insert(ProductCategory productCategory) { + productCategory.setCreateTime(LocalDateTime.now()); + return productCategoryMapper.insert(productCategory); + } + + /** + * 修改商品分类 + * + * @param productCategory 商品分类 + * @return 结果 + */ + public int update(ProductCategory productCategory) { + return productCategoryMapper.updateById(productCategory); + } + + /** + * 删除商品分类信息 + * + * @param id 商品分类主键 + * @return 结果 + */ + public int deleteById(Long id) { + return productCategoryMapper.deleteById(id); + } + + public List queryCategoryWithProductsForH5() { + QueryWrapper qw1 = new QueryWrapper<>(); +// qw1.eq("level", 0); + qw1.eq("show_status", 1); + Page pageReq = new Page<>(); + pageReq.setCurrent(1L) + .setSize(10) + .setOrders(Collections.singletonList(OrderItem.desc("sort"))); + List categories = productCategoryMapper.selectPage(pageReq, qw1).getRecords(); + if (CollUtil.isEmpty(categories)) { + return Collections.emptyList(); + } + ; + return categories.stream().map(it -> { + CategoryDTO dto = convert.do2dto(it); + // 寻找该分类下的所有子类 + List allChildCate = queryAllChildCate(Collections.singletonList(it.getId()), 0); + QueryWrapper qw = new QueryWrapper<>(); + qw.select("id", "pic", "name", "price", "category_id"); + qw.in("category_id", allChildCate); + qw.le("sort", 100); + List categoryId2List = productMapper.selectList(qw); + dto.setProductList(productConvert.dos2dtos(categoryId2List)); + return dto; + }).collect(Collectors.toList()); + } + + private List queryAllChildCate(List categoryIds, int level) { + List res = new ArrayList<>(); + QueryWrapper qw = new QueryWrapper<>(); + qw.select("id"); + List ids = categoryIds; + while (true) { + qw.clear(); + qw.in("parent_id", ids); + qw.eq("level", level + 1); + qw.eq("show_status", 1); + ids = productCategoryMapper.selectList(qw).stream().map(ProductCategory::getId).collect(Collectors.toList()); + if (CollUtil.isEmpty(ids)) { + break; + } + res.addAll(ids); + level++; + } + res.addAll(categoryIds); + return res; + } + + public List h5Categories() { + QueryWrapper qw = new QueryWrapper<>(); + qw.select("id", "parent_id", "name", "level", "sort", "icon"); + qw.eq("show_status", 1); +// qw.le("level", 2); + return productCategoryMapper.selectList(qw); + } + + public List getBrotherAndChild(Long id, boolean withChild) { + ProductCategory category = productCategoryMapper.selectById(id); + if (category == null) { + throw new BaseException("参数错误"); + } + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(ProductCategory::getParentId, category.getParentId()); + qw.eq(ProductCategory::getLevel, category.getLevel()); + qw.eq(ProductCategory::getShowStatus, 1); + qw.select(ProductCategory::getId, ProductCategory::getParentId, ProductCategory::getName, ProductCategory::getLevel, ProductCategory::getSort, ProductCategory::getIcon); + List res = productCategoryMapper.selectList(qw); + if (withChild) { + qw.clear(); + qw.eq(ProductCategory::getParentId, category.getId()); + qw.eq(ProductCategory::getLevel, category.getLevel() + 1); + qw.eq(ProductCategory::getShowStatus, 1); + List childs = productCategoryMapper.selectList(qw); + res.addAll(childs); + } + if (category.getParentId() != null && category.getParentId() != -1) { + res.add(productCategoryMapper.selectById(category.getParentId())); + } + return res; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java new file mode 100644 index 000000000..10edd4d43 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java @@ -0,0 +1,212 @@ +package com.wzj.soopin.goods.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.h5.domain.vo.ProductDetailVO; +import com.cyl.manager.pms.convert.ProductConvert; +import com.cyl.manager.pms.domain.entity.Product; +import com.cyl.manager.pms.domain.entity.Sku; +import com.cyl.manager.pms.domain.query.ProductQuery; +import com.cyl.manager.pms.domain.vo.ProductVO; +import com.cyl.manager.pms.mapper.BrandMapper; +import com.cyl.manager.pms.mapper.ProductMapper; +import com.cyl.manager.pms.mapper.SkuMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.SecurityUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 商品信息Service业务层处理 + * + * + * @author zcc + */ +@Service +@Slf4j +public class ProductService { + @Autowired + private ProductMapper productMapper; + + @Autowired + private SkuMapper skuMapper; + @Autowired + private BrandMapper brandMapper; + @Autowired + private ProductConvert convert; + + /** + * 查询商品信息 + * + * @param id 商品信息主键 + * @return 商品信息 + */ + public ProductVO selectById(Long id) { + Product product = productMapper.selectById(id); + ProductVO productVO = convert.do2vo(product); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("product_id", product.getId()); + List skus = skuMapper.selectList(qw); + productVO.setSkuList(skus); + return productVO; + } + + /** + * 查询商品信息列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 商品信息 + */ + public List selectList(ProductQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + if (StringUtils.isNoneEmpty(query.getOrderField())){ + if (StringUtils.isNotEmpty(query.getOrderSort()) && "desc".equalsIgnoreCase(query.getOrderSort())) { + qw.orderByDesc(query.getOrderField()); + } else { + qw.orderByAsc(query.getOrderField()); + } + }else { + qw.orderByDesc("publish_status"); + qw.orderByAsc("sort"); + } + Long categoryId = query.getCategoryId(); + if (categoryId != null) { + qw.eq("category_id", categoryId); + } + Integer publishStatus = query.getPublishStatus(); + if (publishStatus != null) { + qw.eq("publish_status", publishStatus); + } + String search = query.getSearch(); + if (StringUtils.isNoneEmpty(search)){ + qw.like("name", "%".concat(query.getSearch().trim()).concat("%")); + } + if (CollectionUtil.isNotEmpty(query.getExcludeProductIds())) { + qw.notIn("id",query.getExcludeProductIds()); + } + if (CollectionUtil.isNotEmpty(query.getIds())) { + qw.in("id",query.getIds()); + } + return productMapper.selectList(qw); + } + + /** + * 新增商品信息 + * + * @param productVO 商品信息 + * @return 结果 + */ + @Transactional + public int insert(ProductVO productVO) { + + Product product = convert.vo2do(productVO); + product.setCreateTime(LocalDateTime.now()); + List skuList = productVO.getSkuList(); + productMapper.insert(product); + if(skuList!=null){ + skuList.forEach(sku -> { + sku.setProductId(product.getId()); + sku.setCreateTime(LocalDateTime.now()); + skuMapper.insert(sku); + }); + } + return 1; + } + + /** + * 修改商品信息 + * + * @param productVO 商品信息 + * @return 结果 + */ + @Transactional + public int update(ProductVO productVO) { + Product dbProduct = productMapper.selectById(productVO.getId()); + List idList = productVO.getSkuList().stream().filter(it -> it.getId() != null).map(it -> it.getId()).collect(Collectors.toList()); + if (dbProduct == null) { + return 0; + } + Long userId = SecurityUtils.getUserId(); + Product product = convert.vo2do(productVO); + List skuList = productVO.getSkuList(); + product.setUpdateBy(userId); + product.setUpdateTime(LocalDateTime.now()); + productMapper.updateById(product); + //查找库中所有的sku + Map map = new HashMap<>(); + map.put("product_id", product.getId()); + Map skuMap = skuMapper.selectByMap(map).stream().collect(Collectors.toMap(it -> it.getId(), it -> it)); + //针对已有的进行编辑 + List updateList = productVO.getSkuList().stream().filter(it -> it.getId() != null).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(updateList)) { + log.info("共有{}个sku需要修改,{},productId:{}",updateList.size(), JSONUtil.toJsonStr(updateList),productVO.getId()); + updateList.forEach(it->{ + Sku sku = skuMap.get(it.getId()); + sku.setUpdateBy(SecurityUtils.getUserId()); + sku.setUpdateTime(LocalDateTime.now()); + sku.setPrice(it.getPrice()); + sku.setSpData(it.getSpData()); + sku.setPic(it.getPic()); + sku.setOutSkuId(it.getOutSkuId()); + sku.setStock(it.getStock()); + skuMapper.updateById(sku); + }); + } + //针对没有的进行新增 + List addList = productVO.getSkuList().stream().filter(it -> it.getId() == null).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(addList)) { + log.info("共有{}个sku需要新增,{},productId:{}",addList.size(), JSONUtil.toJsonStr(addList),productVO.getId()); + addList.forEach(sku -> { + sku.setProductId(product.getId()); + sku.setCreateTime(LocalDateTime.now()); + skuMapper.insert(sku); + }); + } + //删除 + List deleteIds = skuMap.keySet().stream().filter(it -> !idList.contains(it)).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(deleteIds)) { + log.info("共有{}个sku需要删除,{},productId:{}",deleteIds.size(), JSONUtil.toJsonStr(deleteIds),productVO.getId()); + skuMapper.deleteBatchIds(deleteIds); + } + return 1; + } + + /** + * 删除商品信息信息 + * + * @param id 商品信息主键 + * @return 结果 + */ + public int deleteById(Long id) { + return productMapper.deleteById(id); + } + + public ProductDetailVO queryDetail(Long id) { + ProductDetailVO res = new ProductDetailVO(); + Product d = productMapper.selectById(id); + res.setProduct(d); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(Sku::getProductId, id); + res.setSkus(skuMapper.selectList(qw)); + if (d.getBrandId() != null) { + res.setBrand(brandMapper.selectById(d.getBrandId())); + } + return res; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java new file mode 100644 index 000000000..9c743dc0c --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java @@ -0,0 +1,103 @@ +package com.wzj.soopin.goods.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.pms.domain.entity.Sku; +import com.cyl.manager.pms.domain.query.SkuQuery; +import com.cyl.manager.pms.mapper.SkuMapper; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * sku信息Service业务层处理 + * + * + * @author zcc + */ +@Service +public class SkuService { + @Autowired + private SkuMapper skuMapper; + + /** + * 查询sku信息 + * + * @param id sku信息主键 + * @return sku信息 + */ + public Sku selectById(Long id) { + return skuMapper.selectById(id); + } + + /** + * 查询sku信息列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return sku信息 + */ + public List selectList(SkuQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long productId = query.getProductId(); + if (productId != null) { + qw.eq("product_id", productId); + } + String outSkuId = query.getOutSkuId(); + if (!StringUtils.isEmpty(outSkuId)) { + qw.eq("out_sku_id", outSkuId); + } + BigDecimal price = query.getPrice(); + if (price != null) { + qw.eq("price", price); + } + String pic = query.getPic(); + if (!StringUtils.isEmpty(pic)) { + qw.eq("pic", pic); + } + String spData = query.getSpData(); + if (!StringUtils.isEmpty(spData)) { + qw.eq("sp_data", spData); + } + return skuMapper.selectList(qw); + } + + /** + * 新增sku信息 + * + * @param sku sku信息 + * @return 结果 + */ + public int insert(Sku sku) { + sku.setCreateTime(LocalDateTime.now()); + return skuMapper.insert(sku); + } + + /** + * 修改sku信息 + * + * @param sku sku信息 + * @return 结果 + */ + public int update(Sku sku) { + return skuMapper.updateById(sku); + } + + /** + * 删除sku信息信息 + * + * @param id sku信息主键 + * @return 结果 + */ + public int deleteById(Long id) { + return skuMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/BrandMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/BrandMapper.xml new file mode 100644 index 000000000..aff89d087 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/BrandMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + select id, name, sort, show_status, logo, create_by, create_time, update_by, update_time from pms_brand + + + + diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductCategoryMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductCategoryMapper.xml new file mode 100644 index 000000000..c5cb90b3b --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductCategoryMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, parent_id, name, level, show_status, sort, icon, create_by, create_time, update_by, update_time from pms_product_category + + + + diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductMapper.xml new file mode 100644 index 000000000..1dfdbbeb5 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ProductMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, brand_id, category_id, out_product_id, name, pic, album_pics, publish_status, sort, price, unit, weight, detail_html, detail_mobile_html, brand_name, product_category_name, create_by, create_time, update_by, update_time from pms_product + + + + diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/SkuMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/SkuMapper.xml new file mode 100644 index 000000000..902c5f9f6 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/SkuMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, product_id, out_sku_id, price, pic, sp_data, create_by, create_time, update_by, update_time from pms_sku + + + update + pms_sku + set + stock = stock - #{quantity}, + update_time = #{optDate} + where id = #{skuId} + + + + diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/package-info.md new file mode 100644 index 000000000..c938b1e50 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-im/pom.xml b/ruoyi-modules/ruoyi-im/pom.xml new file mode 100644 index 000000000..533b40e91 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + + org.dromara + ruoyi-modules + 5.3.1 + + + ruoyi-im + + Maven + http://maven.apache.org/ + 2001 + + + + website + scp://webhost.company.com/www/website + + + + + UTF-8 + + + + + + maven-site-plugin + + en,fr + + + + + diff --git a/ruoyi-modules/ruoyi-im/src/site/apt/format.apt b/ruoyi-modules/ruoyi-im/src/site/apt/format.apt new file mode 100644 index 000000000..864419fdc --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/apt/format.apt @@ -0,0 +1,602 @@ + ----- + The APT format + ----- + The Maven Team + ----- + ----- + +The APT format +~~~~~~~~~~~~~~ + + In the following section, boxes containing text in typewriter-like font are + examples of APT source. + +* Document structure +~~~~~~~~~~~~~~~~~~~~ + + A short APT document is contained in a single text file. A longer document + may be contained in a ordered list of text files. For instance, first text + file contains section 1, second text file contains section 2, and so on. + + [Note:] Splitting the APT document in several text files on a section + boundary is not mandatory. The split may occur anywhere. + However doing so is recommended because a text file containing a + section is by itself a valid APT document. + + A file contains a sequence of paragraphs and ``displays'' (non paragraphs + such as tables) separated by open lines. + + A paragraph is simply a sequence of consecutive text lines. + ++------------------------------------------------------------------------+ + First line of first paragraph. + Second line of first paragraph. + Third line of first paragraph. + + Line 1 of paragraph 2 (separated from first paragraph by an open line). + Line 2 of paragraph 2. ++------------------------------------------------------------------------+ + + The indentation of the first line of a paragraph is the main method used by + an APT processor to recognize the type of the paragraph. For example, a + section title must not be indented at all. + + A ``plain'' paragraph must be indented by a certain amount of space. For + example, a plain paragraph which is not contained in a list may be indented + by two spaces. + ++-------------------------------------------------+ +My section title (not indented). + + My paragraph first line (indented by 2 spaces). ++-------------------------------------------------+ + + Indentation is not rigid. Any amount of space will do. You don't even need + to use a consistent indentation all over your document. What really matters + for an APT processor is whether the paragraph is not indented at all or, + when inside a list, whether a paragraph is more or less indented than the + first item of the list (more about this later). + ++-------------------------------------------------------+ + First paragraph has its first line indented by four +spaces. Then the author did even bother to indent the +other lines of the paragraph. + + Second paragraph contains several lines which are all + indented by two spaces. This style is much nicer than + the one used for the previous paragraph. ++-------------------------------------------------------+ + + Note that tabs are expanded with a tab width set to 8. + +* Document elements +~~~~~~~~~~~~~~~~~~~ + +** Block level elements +~~~~~~~~~~~~~~~~~~~~~~~ + +*** Title +~~~~~~~~~~ + + A title is optional. If used, it must appear as the first block of the + document. + ++----------------------------------------------------------------------------+ + ------ + Title + ------ + Author + ------ + Date ++----------------------------------------------------------------------------+ + + A title block is indented (centering it is nicer). It begins with a line + containing at least 3 dashes (<<<--->>>). + + After the first <<<--->>> line, one or several consecutive lines of text + (implicit line break after each line) specify the title of the document. + + This text may immediately be followed by another <<<--->>> line and one or + several consecutive lines of text which specifies the author of the + document. + + The author sub-block may optionaly be followed by a date sub-block using the + same syntax. + + The following example is used for a document with an title and a date but + with no declared author. + ++----------------------------------------------------------------------------+ + ------ + Title + ------ + ------ + Date + ------ ++----------------------------------------------------------------------------+ + + The last line is ignored. It is just there to make the block nicer. + +*** Paragraph +~~~~~~~~~~~~~ + + Paragraphs other than the title block may appear before the first section. + ++----------------------+ + Paragraph 1, line 1. + Paragraph 1, line 2. + + Paragraph 2, line 1. + Paragraph 2, line 2. ++----------------------+ + + Paragraphs are indented. They have already been described in the {{document + structure}} section. + +*** Section +~~~~~~~~~~~ + + Sections are created by inserting section titles into the document. Simple + documents need not contain sections. + ++-----------------------------------+ +Section title + +* Sub-section title + +** Sub-sub-section title + +*** Sub-sub-sub-section title + +**** Sub-sub-sub-sub-section title ++-----------------------------------+ + + Section titles are not indented. A sub-section title begins with one + asterisk (<<<*>>>), a sub-sub-section title begins with two asterisks + (<<<**>>>), and so forth up to four sub-section levels. + +*** List +~~~~~~~~ + ++---------------------------------------+ + * List item 1. + + * List item 2. + + Paragraph contained in list item 2. + + * Sub-list item 1. + + * Sub-list item 2. + + * List item 3. ++---------------------------------------+ + + List items are indented and begin with a asterisk (<<<*>>>). + + Plain paragraphs more indented than the first list item are nested in that + list. Displays such as tables (not indented) are always nested in the + current list. + + To nest a list inside a list, indent its first item more than its parent + list. To end a list, add a paragraph or list item less indented than the + current list. + + Section titles always end a list. Displays cannot end a list but the + <<<[]>>> pseudo-element may be used to force the end of a list. + ++------------------------------------+ + * List item 3. + Force end of list: + + [] + +-------------------------------------------- +Verbatim text not contained in list item 3 +-------------------------------------------- ++------------------------------------+ + + In the previous example, without the <<<[]>>>, the verbatim text (not + indented as all displays) would have been contained in list item 3. + + A single <<<[]>>> may be used to end several nested lists at the same + time. The indentation of <<<[]>>> may be used to specify exactly which + lists should be ended. Example: + ++------------------------------------+ + * List item 1. + + * List item 2. + + * Sub-list item 1. + + * Sub-list item 2. + + [] + +------------------------------------------------------------------- +Verbatim text contained in list item 2, but not in sub-list item 2 +------------------------------------------------------------------- ++------------------------------------+ + + There are three kind of lists, the bulleted lists we have already described, + the numbered lists and the definition lists. + ++-----------------------------------------+ + [[1]] Numbered item 1. + + [[A]] Numbered item A. + + [[B]] Numbered item B. + + [[2]] Numbered item 2. ++-----------------------------------------+ + + A numbered list item begins with a label beetween two square brackets. The + label of the first item establishes the numbering scheme for the whole list: + + [<<<[[1\]\]>>>] Decimal numbering: 1, 2, 3, 4, etc. + + [<<<[[a\]\]>>>] Lower-alpha numbering: a, b, c, d, etc. + + [<<<[[A\]\]>>>] Upper-alpha numbering: A, B, C, D, etc. + + [<<<[[i\]\]>>>] Lower-roman numbering: i, ii, iii, iv, etc. + + [<<<[[I\]\]>>>] Upper-roman numbering: I, II, III, IV, etc. + + The labels of the items other than the first one are ignored. It is + recommended to take the time to type the correct label for each item in + order to keep the APT source document readable. + ++-------------------------------------------+ + [Defined term 1] of definition list 2. + + [Defined term 2] of definition list 2. ++-------------------------------------------+ + + A definition list item begins with a defined term: text between square + brackets. + +*** Verbatim text +~~~~~~~~~~~~~~~~~ + ++----------------------------------------+ +---------------------------------------- +Verbatim + text, + preformatted, + escaped. +---------------------------------------- ++----------------------------------------+ + + A verbatim block is not indented. It begins with a non indented line + containing at least 3 dashes (<<<--->>>). It ends with a similar line. + + <<<+-->>> instead of <<<--->>> draws a box around verbatim text. + + Like in HTML, verbatim text is preformatted. Unlike HTML, verbatim text is + escaped: inside a verbatim display, markup is not interpreted by the APT + processor. + +*** Figure +~~~~~~~~~~ + ++---------------------------+ +[Figure name] Figure caption ++---------------------------+ + + A figure block is not indented. It begins with the figure name between + square brackets. The figure name is optionally followed by some text: the + figure caption. + + The figure name is the pathname of the file containing the figure but + without an extension. Example: if your figure is contained in + <<>>, the figure name is + <<>>. + + If the figure name comes from a relative pathname (recommended practice) + rather than from an absolute pathname, this relative pathname is taken to be + relative to the directory of the current APT document (a la HTML) + rather than relative to the current working directory. + + Why not leave the file extension in the figure name? This is better + explained by an example. You need to convert an APT document to PostScript + and your figure name is <<>>. A APT processor will + first try to load <<>>. When the desired format + is not found, a APT processor tries to convert one of the existing + formats. In our example, the APT processor tries to convert + <<>> to encapsulated PostScript. + +*** Table +~~~~~~~~~ + + A table block is not indented. It begins with a non indented line containing + an asterisk and at least 2 dashes (<<<*-->>>). It ends with a + similar line. + + The first line is not only used to recognize a table but also to specify + column justification. In the following example, + + * the second asterisk (<<<*>>>) is used to specify that column 1 is + centered, + + * the plus sign (<<<+>>>) specifies that column 2 is left aligned, + + * the colon (<<<:>>>) specifies that column 3 is right aligned. + + [] + ++---------------------------------------------+ +*----------*--------------+----------------: +| Centered | Left-aligned | Right-aligned | +| cell 1,1 | cell 1,2 | cell 1,3 | +*----------*--------------+----------------: +| cell 2,1 | cell 2,2 | cell 2,3 | +*----------*--------------+----------------: +Table caption ++---------------------------------------------+ + + Rows are separated by a non indented line beginning with <<<*-->>>. + + An optional table caption (non indented text) may immediately follow the + table. + + Rows may contain single line or multiple line cells. Each line of cell text + is separated from the adjacent cell by the pipe character (<<<|>>>). + (<<<|>>> may be used in the cell text if quoted: <<<\\|>>>.) + + The last <<<|>>> is only used to make the table nicer. The first <<<|>>> is + not only used to make the table nicer, but also to specify that a grid is to + be drawn around table cells. + + The following example shows a simple table with no grid and no caption. + ++---------------+ +*-----*------* + cell | cell +*-----*------* + cell | cell +*-----*------* ++---------------+ + +*** Horizontal rule +~~~~~~~~~~~~~~~~~~~ + ++---------------------+ +===================== ++---------------------+ + + A non indented line containing at least 3 equal signs (<<<===>>>). + +*** Page break +~~~~~~~~~~~~~~ + ++---+ +^L ++---+ + + A non indented line containing a single form feed character (Control-L). + +** Text level elements +~~~~~~~~~~~~~~~~~~~~~~ + +*** Font +~~~~~~~~ + ++-----------------------------------------------------+ + font. <> font. <<>> font. ++-----------------------------------------------------+ + + Text between \< and > must be rendered in italic. Text between \<\< and >> + must be rendered in bold. Text between \<\<\< and >>> must be rendered using + a monospaced, typewriter-like font. + + Font elements may appear anywhere except inside other font elements. + + It is not recommended to use font elements inside titles, section titles, + links and defined terms because a APT processor automatically applies + appropriate font styles to these elements. + +*** Anchor and link +~~~~~~~~~~~~~~~~~~~ + ++-----------------------------------------------------------------+ + {Anchor}. Link to {{anchor}}. Link to {{http://www.pixware.fr}}. + Link to {{{anchor}showing alternate text}}. + Link to {{{http://www.pixware.fr}Pixware home page}}. ++-----------------------------------------------------------------+ + + Text between curly braces (<<<\{}>>>) specifies an anchor. Text between + double curly braces (<<<\{\{}}>>>) specifies a link. + + It is an error to create a link element that does not refer to an anchor of + the same name. The name of an anchor/link is its text with all non + alphanumeric characters stripped. + + This rule does not apply to links to anchors. Text beginning + with <<>>, <<>>, <<>>, <<>>, <<>>, + <<<../>>>, <<<./>>> (<<<..\\>>> and <<<.\\>>> on Windows) is recognized as + an external anchor name. + + When the construct <<\{\{\{>><<}>><<}}>> is used, the link text + may differ from the link name . + + Anchor/link elements may appear anywhere except inside other anchor/link + elements. + + Section titles are implicitly defined anchors. + +*** Line break +~~~~~~~~~~~~~~ + ++-------------+ + Force line\ + break. ++-------------+ + + A backslash character (<<<\\>>>) followed by a newline character. + + Line breaks must not be used inside titles and tables (which are line + oriented blocks with implicit line breaks). + +*** Non breaking space +~~~~~~~~~~~~~~~~~~~~~~ + ++----------------------+ + Non\ breaking\ space. ++----------------------+ + + A backslash character (<<<\\>>>) followed by a space character. + +*** Special character +~~~~~~~~~~~~~~~~~~~~~ + ++---------------------------------------------------------------------------+ + Escaped special characters: \~, \=, \-, \+, \*, \[, \], \<, \>, \{, \}, \\. ++---------------------------------------------------------------------------+ + + In certain contexts, these characters have a special meaning and therefore + must be escaped if needed as is. They are escaped by adding a backslash in + front of them. The backslash may itself be escaped by adding another + backslash in front of it. + + Note that an asterisk, for example, needs to be escaped only if its begins a + paragraph. (<<<*>>> has no special meaning in the middle of a paragraph.) + ++--------------------------------------+ + Copyright symbol: \251, \xA9, \u00a9. ++--------------------------------------+ + + Latin-1 characters (whatever is the encoding of the APT document) may be + specified by their codes using a backslash followed by one to three octal + digits or by using the <<<\x>>> notation, where are two hexadecimal + digits. + + Unicode characters may be specified by their codes using the <<<\u>>> + notation, where are four hexadecimal digits. + +*** Comment +~~~~~~~~~~~ + ++---------------+ +~~Commented out. ++---------------+ + + Text found after two tildes (<<<\~~>>>) is ignored up to the end of line. + + A line of <<<~>>> is often used to ``underline'' section titles in order to + make them stand out of other paragraphs. + + +* The APT format at a glance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +------------------------------------------------------------------------------ + ------ + Title + ------ + Author + ------ + Date + + Paragraph 1, line 1. + Paragraph 1, line 2. + + Paragraph 2, line 1. + Paragraph 2, line 2. + +Section title + +* Sub-section title + +** Sub-sub-section title + +*** Sub-sub-sub-section title + +**** Sub-sub-sub-sub-section title + + * List item 1. + + * List item 2. + + Paragraph contained in list item 2. + + * Sub-list item 1. + + * Sub-list item 2. + + * List item 3. + Force end of list: + + [] + ++------------------------------------------+ +Verbatim text not contained in list item 3 ++------------------------------------------+ + + [[1]] Numbered item 1. + + [[A]] Numbered item A. + + [[B]] Numbered item B. + + [[2]] Numbered item 2. + + List numbering schemes: [[1]], [[a]], [[A]], [[i]], [[I]]. + + [Defined term 1] of definition list. + + [Defined term 2] of definition list. + ++-------------------------------+ +Verbatim text + in a box ++-------------------------------+ + + --- instead of +-- suppresses the box around verbatim text. + +[Figure name] Figure caption + +*----------*--------------+----------------: +| Centered | Left-aligned | Right-aligned | +| cell 1,1 | cell 1,2 | cell 1,3 | +*----------*--------------+----------------: +| cell 2,1 | cell 2,2 | cell 2,3 | +*----------*--------------+----------------: +Table caption + + No grid, no caption: + +*-----*------* + cell | cell +*-----*------* + cell | cell +*-----*------* + + Horizontal line: + +======================================================================= + +^L + New page. + + font. <> font. <<>> font. + + {Anchor}. Link to {{anchor}}. Link to {{http://www.pixware.fr}}. + Link to {{{anchor}showing alternate text}}. + Link to {{{http://www.pixware.fr}Pixware home page}}. + + Force line\ + break. + + Non\ breaking\ space. + + Escaped special characters: \~, \=, \-, \+, \*, \[, \], \<, \>, \{, \}, \\. + + Copyright symbol: \251, \xA9, \u00a9. + +~~Commented out. + +------------------------------------------------------------------------------ + diff --git a/ruoyi-modules/ruoyi-im/src/site/apt/index.apt b/ruoyi-modules/ruoyi-im/src/site/apt/index.apt new file mode 100644 index 000000000..985ddeba3 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/apt/index.apt @@ -0,0 +1,16 @@ + ----- + The Site + ----- + The Maven Team + ----- + +Maven Site for your project + + Congratulations! If you are looking at this page then you have successfully generated a + template site employing the site archetype and you have run: + ++-----+ + +mvn site + ++-----+ diff --git a/ruoyi-modules/ruoyi-im/src/site/fml/faq.fml b/ruoyi-modules/ruoyi-im/src/site/fml/faq.fml new file mode 100644 index 000000000..b8c4d47a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/fml/faq.fml @@ -0,0 +1,27 @@ + + + + + Where did Maven come from? + +

+ Maven was created by a group of software developers who were tired + of wasting their time fiddling around with builds and wanted to get + down to brass tacks and actually develop software! +

+
+
+ + Why is Maven so wildly popular? + +

+ Maven saves you so much time in your software development efforts that + you will have time to learn a second language, relax ten hours a + day, and train for that marathon you've always wanted to run! +

+
+
+
+
diff --git a/ruoyi-modules/ruoyi-im/src/site/fr/apt/format.apt b/ruoyi-modules/ruoyi-im/src/site/fr/apt/format.apt new file mode 100644 index 000000000..f8e67c213 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/fr/apt/format.apt @@ -0,0 +1,602 @@ + ----- + Le format APT + ----- + L'équipe Maven + ----- + ----- + +Le format APT +~~~~~~~~~~~~~ + + Dans la section suivante, les boîtes contenant du texte dans la police + de type machine à écrire sont des exemples de source APT. + +* Structure du document +~~~~~~~~~~~~~~~~~~~~~~~ + + A short APT document is contained in a single text file. A longer document + may be contained in a ordered list of text files. For instance, first text + file contains section 1, second text file contains section 2, and so on. + + [Note:] Splitting the APT document in several text files on a section + boundary is not mandatory. The split may occur anywhere. + However doing so is recommended because a text file containing a + section is by itself a valid APT document. + + A file contains a sequence of paragraphs and ``displays'' (non paragraphs + such as tables) separated by open lines. + + A paragraph is simply a sequence of consecutive text lines. + ++------------------------------------------------------------------------+ + First line of first paragraph. + Second line of first paragraph. + Third line of first paragraph. + + Line 1 of paragraph 2 (separated from first paragraph by an open line). + Line 2 of paragraph 2. ++------------------------------------------------------------------------+ + + The indentation of the first line of a paragraph is the main method used by + an APT processor to recognize the type of the paragraph. For example, a + section title must not be indented at all. + + A ``plain'' paragraph must be indented by a certain amount of space. For + example, a plain paragraph which is not contained in a list may be indented + by two spaces. + ++-------------------------------------------------+ +My section title (not indented). + + My paragraph first line (indented by 2 spaces). ++-------------------------------------------------+ + + Indentation is not rigid. Any amount of space will do. You don't even need + to use a consistent indentation all over your document. What really matters + for an APT processor is whether the paragraph is not indented at all or, + when inside a list, whether a paragraph is more or less indented than the + first item of the list (more about this later). + ++-------------------------------------------------------+ + First paragraph has its first line indented by four +spaces. Then the author did even bother to indent the +other lines of the paragraph. + + Second paragraph contains several lines which are all + indented by two spaces. This style is much nicer than + the one used for the previous paragraph. ++-------------------------------------------------------+ + + Note that tabs are expanded with a tab width set to 8. + +* Document elements +~~~~~~~~~~~~~~~~~~~ + +** Block level elements +~~~~~~~~~~~~~~~~~~~~~~~ + +*** Title +~~~~~~~~~~ + + A title is optional. If used, it must appear as the first block of the + document. + ++----------------------------------------------------------------------------+ + ------ + Title + ------ + Author + ------ + Date ++----------------------------------------------------------------------------+ + + A title block is indented (centering it is nicer). It begins with a line + containing at least 3 dashes (<<<--->>>). + + After the first <<<--->>> line, one or several consecutive lines of text + (implicit line break after each line) specify the title of the document. + + This text may immediately be followed by another <<<--->>> line and one or + several consecutive lines of text which specifies the author of the + document. + + The author sub-block may optionaly be followed by a date sub-block using the + same syntax. + + The following example is used for a document with an title and a date but + with no declared author. + ++----------------------------------------------------------------------------+ + ------ + Title + ------ + ------ + Date + ------ ++----------------------------------------------------------------------------+ + + The last line is ignored. It is just there to make the block nicer. + +*** Paragraph +~~~~~~~~~~~~~ + + Paragraphs other than the title block may appear before the first section. + ++----------------------+ + Paragraph 1, line 1. + Paragraph 1, line 2. + + Paragraph 2, line 1. + Paragraph 2, line 2. ++----------------------+ + + Paragraphs are indented. They have already been described in the {{document + structure}} section. + +*** Section +~~~~~~~~~~~ + + Sections are created by inserting section titles into the document. Simple + documents need not contain sections. + ++-----------------------------------+ +Section title + +* Sub-section title + +** Sub-sub-section title + +*** Sub-sub-sub-section title + +**** Sub-sub-sub-sub-section title ++-----------------------------------+ + + Section titles are not indented. A sub-section title begins with one + asterisk (<<<*>>>), a sub-sub-section title begins with two asterisks + (<<<**>>>), and so forth up to four sub-section levels. + +*** List +~~~~~~~~ + ++---------------------------------------+ + * List item 1. + + * List item 2. + + Paragraph contained in list item 2. + + * Sub-list item 1. + + * Sub-list item 2. + + * List item 3. ++---------------------------------------+ + + List items are indented and begin with a asterisk (<<<*>>>). + + Plain paragraphs more indented than the first list item are nested in that + list. Displays such as tables (not indented) are always nested in the + current list. + + To nest a list inside a list, indent its first item more than its parent + list. To end a list, add a paragraph or list item less indented than the + current list. + + Section titles always end a list. Displays cannot end a list but the + <<<[]>>> pseudo-element may be used to force the end of a list. + ++------------------------------------+ + * List item 3. + Force end of list: + + [] + +-------------------------------------------- +Verbatim text not contained in list item 3 +-------------------------------------------- ++------------------------------------+ + + In the previous example, without the <<<[]>>>, the verbatim text (not + indented as all displays) would have been contained in list item 3. + + A single <<<[]>>> may be used to end several nested lists at the same + time. The indentation of <<<[]>>> may be used to specify exactly which + lists should be ended. Example: + ++------------------------------------+ + * List item 1. + + * List item 2. + + * Sub-list item 1. + + * Sub-list item 2. + + [] + +------------------------------------------------------------------- +Verbatim text contained in list item 2, but not in sub-list item 2 +------------------------------------------------------------------- ++------------------------------------+ + + There are three kind of lists, the bulleted lists we have already described, + the numbered lists and the definition lists. + ++-----------------------------------------+ + [[1]] Numbered item 1. + + [[A]] Numbered item A. + + [[B]] Numbered item B. + + [[2]] Numbered item 2. ++-----------------------------------------+ + + A numbered list item begins with a label beetween two square brackets. The + label of the first item establishes the numbering scheme for the whole list: + + [<<<[[1\]\]>>>] Decimal numbering: 1, 2, 3, 4, etc. + + [<<<[[a\]\]>>>] Lower-alpha numbering: a, b, c, d, etc. + + [<<<[[A\]\]>>>] Upper-alpha numbering: A, B, C, D, etc. + + [<<<[[i\]\]>>>] Lower-roman numbering: i, ii, iii, iv, etc. + + [<<<[[I\]\]>>>] Upper-roman numbering: I, II, III, IV, etc. + + The labels of the items other than the first one are ignored. It is + recommended to take the time to type the correct label for each item in + order to keep the APT source document readable. + ++-------------------------------------------+ + [Defined term 1] of definition list 2. + + [Defined term 2] of definition list 2. ++-------------------------------------------+ + + A definition list item begins with a defined term: text between square + brackets. + +*** Verbatim text +~~~~~~~~~~~~~~~~~ + ++----------------------------------------+ +---------------------------------------- +Verbatim + text, + preformatted, + escaped. +---------------------------------------- ++----------------------------------------+ + + A verbatim block is not indented. It begins with a non indented line + containing at least 3 dashes (<<<--->>>). It ends with a similar line. + + <<<+-->>> instead of <<<--->>> draws a box around verbatim text. + + Like in HTML, verbatim text is preformatted. Unlike HTML, verbatim text is + escaped: inside a verbatim display, markup is not interpreted by the APT + processor. + +*** Figure +~~~~~~~~~~ + ++---------------------------+ +[Figure name] Figure caption ++---------------------------+ + + A figure block is not indented. It begins with the figure name between + square brackets. The figure name is optionally followed by some text: the + figure caption. + + The figure name is the pathname of the file containing the figure but + without an extension. Example: if your figure is contained in + <<>>, the figure name is + <<>>. + + If the figure name comes from a relative pathname (recommended practice) + rather than from an absolute pathname, this relative pathname is taken to be + relative to the directory of the current APT document (a la HTML) + rather than relative to the current working directory. + + Why not leave the file extension in the figure name? This is better + explained by an example. You need to convert an APT document to PostScript + and your figure name is <<>>. A APT processor will + first try to load <<>>. When the desired format + is not found, a APT processor tries to convert one of the existing + formats. In our example, the APT processor tries to convert + <<>> to encapsulated PostScript. + +*** Table +~~~~~~~~~ + + A table block is not indented. It begins with a non indented line containing + an asterisk and at least 2 dashes (<<<*-->>>). It ends with a + similar line. + + The first line is not only used to recognize a table but also to specify + column justification. In the following example, + + * the second asterisk (<<<*>>>) is used to specify that column 1 is + centered, + + * the plus sign (<<<+>>>) specifies that column 2 is left aligned, + + * the colon (<<<:>>>) specifies that column 3 is right aligned. + + [] + ++---------------------------------------------+ +*----------*--------------+----------------: +| Centered | Left-aligned | Right-aligned | +| cell 1,1 | cell 1,2 | cell 1,3 | +*----------*--------------+----------------: +| cell 2,1 | cell 2,2 | cell 2,3 | +*----------*--------------+----------------: +Table caption ++---------------------------------------------+ + + Rows are separated by a non indented line beginning with <<<*-->>>. + + An optional table caption (non indented text) may immediately follow the + table. + + Rows may contain single line or multiple line cells. Each line of cell text + is separated from the adjacent cell by the pipe character (<<<|>>>). + (<<<|>>> may be used in the cell text if quoted: <<<\\|>>>.) + + The last <<<|>>> is only used to make the table nicer. The first <<<|>>> is + not only used to make the table nicer, but also to specify that a grid is to + be drawn around table cells. + + The following example shows a simple table with no grid and no caption. + ++---------------+ +*-----*------* + cell | cell +*-----*------* + cell | cell +*-----*------* ++---------------+ + +*** Horizontal rule +~~~~~~~~~~~~~~~~~~~ + ++---------------------+ +===================== ++---------------------+ + + A non indented line containing at least 3 equal signs (<<<===>>>). + +*** Page break +~~~~~~~~~~~~~~ + ++---+ +^L ++---+ + + A non indented line containing a single form feed character (Control-L). + +** Text level elements +~~~~~~~~~~~~~~~~~~~~~~ + +*** Font +~~~~~~~~ + ++-----------------------------------------------------+ + font. <> font. <<>> font. ++-----------------------------------------------------+ + + Text between \< and > must be rendered in italic. Text between \<\< and >> + must be rendered in bold. Text between \<\<\< and >>> must be rendered using + a monospaced, typewriter-like font. + + Font elements may appear anywhere except inside other font elements. + + It is not recommended to use font elements inside titles, section titles, + links and defined terms because a APT processor automatically applies + appropriate font styles to these elements. + +*** Anchor and link +~~~~~~~~~~~~~~~~~~~ + ++-----------------------------------------------------------------+ + {Anchor}. Link to {{anchor}}. Link to {{http://www.pixware.fr}}. + Link to {{{anchor}showing alternate text}}. + Link to {{{http://www.pixware.fr}Pixware home page}}. ++-----------------------------------------------------------------+ + + Text between curly braces (<<<\{}>>>) specifies an anchor. Text between + double curly braces (<<<\{\{}}>>>) specifies a link. + + It is an error to create a link element that does not refer to an anchor of + the same name. The name of an anchor/link is its text with all non + alphanumeric characters stripped. + + This rule does not apply to links to anchors. Text beginning + with <<>>, <<>>, <<>>, <<>>, <<>>, + <<<../>>>, <<<./>>> (<<<..\\>>> and <<<.\\>>> on Windows) is recognized as + an external anchor name. + + When the construct <<\{\{\{>><<}>><<}}>> is used, the link text + may differ from the link name . + + Anchor/link elements may appear anywhere except inside other anchor/link + elements. + + Section titles are implicitly defined anchors. + +*** Line break +~~~~~~~~~~~~~~ + ++-------------+ + Force line\ + break. ++-------------+ + + A backslash character (<<<\\>>>) followed by a newline character. + + Line breaks must not be used inside titles and tables (which are line + oriented blocks with implicit line breaks). + +*** Non breaking space +~~~~~~~~~~~~~~~~~~~~~~ + ++----------------------+ + Non\ breaking\ space. ++----------------------+ + + A backslash character (<<<\\>>>) followed by a space character. + +*** Special character +~~~~~~~~~~~~~~~~~~~~~ + ++---------------------------------------------------------------------------+ + Escaped special characters: \~, \=, \-, \+, \*, \[, \], \<, \>, \{, \}, \\. ++---------------------------------------------------------------------------+ + + In certain contexts, these characters have a special meaning and therefore + must be escaped if needed as is. They are escaped by adding a backslash in + front of them. The backslash may itself be escaped by adding another + backslash in front of it. + + Note that an asterisk, for example, needs to be escaped only if its begins a + paragraph. (<<<*>>> has no special meaning in the middle of a paragraph.) + ++--------------------------------------+ + Copyright symbol: \251, \xA9, \u00a9. ++--------------------------------------+ + + Latin-1 characters (whatever is the encoding of the APT document) may be + specified by their codes using a backslash followed by one to three octal + digits or by using the <<<\x>>> notation, where are two hexadecimal + digits. + + Unicode characters may be specified by their codes using the <<<\u>>> + notation, where are four hexadecimal digits. + +*** Comment +~~~~~~~~~~~ + ++---------------+ +~~Commented out. ++---------------+ + + Text found after two tildes (<<<\~~>>>) is ignored up to the end of line. + + A line of <<<~>>> is often used to ``underline'' section titles in order to + make them stand out of other paragraphs. + + +* The APT format at a glance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +------------------------------------------------------------------------------ + ------ + Title + ------ + Author + ------ + Date + + Paragraph 1, line 1. + Paragraph 1, line 2. + + Paragraph 2, line 1. + Paragraph 2, line 2. + +Section title + +* Sub-section title + +** Sub-sub-section title + +*** Sub-sub-sub-section title + +**** Sub-sub-sub-sub-section title + + * List item 1. + + * List item 2. + + Paragraph contained in list item 2. + + * Sub-list item 1. + + * Sub-list item 2. + + * List item 3. + Force end of list: + + [] + ++------------------------------------------+ +Verbatim text not contained in list item 3 ++------------------------------------------+ + + [[1]] Numbered item 1. + + [[A]] Numbered item A. + + [[B]] Numbered item B. + + [[2]] Numbered item 2. + + List numbering schemes: [[1]], [[a]], [[A]], [[i]], [[I]]. + + [Defined term 1] of definition list. + + [Defined term 2] of definition list. + ++-------------------------------+ +Verbatim text + in a box ++-------------------------------+ + + --- instead of +-- suppresses the box around verbatim text. + +[Figure name] Figure caption + +*----------*--------------+----------------: +| Centered | Left-aligned | Right-aligned | +| cell 1,1 | cell 1,2 | cell 1,3 | +*----------*--------------+----------------: +| cell 2,1 | cell 2,2 | cell 2,3 | +*----------*--------------+----------------: +Table caption + + No grid, no caption: + +*-----*------* + cell | cell +*-----*------* + cell | cell +*-----*------* + + Horizontal line: + +======================================================================= + +^L + New page. + + font. <> font. <<>> font. + + {Anchor}. Link to {{anchor}}. Link to {{http://www.pixware.fr}}. + Link to {{{anchor}showing alternate text}}. + Link to {{{http://www.pixware.fr}Pixware home page}}. + + Force line\ + break. + + Non\ breaking\ space. + + Escaped special characters: \~, \=, \-, \+, \*, \[, \], \<, \>, \{, \}, \\. + + Copyright symbol: \251, \xA9, \u00a9. + +~~Commented out. + +------------------------------------------------------------------------------ + diff --git a/ruoyi-modules/ruoyi-im/src/site/fr/apt/index.apt b/ruoyi-modules/ruoyi-im/src/site/fr/apt/index.apt new file mode 100644 index 000000000..dde1c9fcc --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/fr/apt/index.apt @@ -0,0 +1,17 @@ + ----- + Le Site + ----- + L'équipe Maven + ----- + +Site Maven pour votre projet + + Félicitations! Si vous regardez cette page alors vous avez + généré avec succès un modèle de site en utilisant l'archétype + de site et vous avez lancé : + ++-----+ + +mvn site + ++-----+ diff --git a/ruoyi-modules/ruoyi-im/src/site/fr/fml/faq.fml b/ruoyi-modules/ruoyi-im/src/site/fr/fml/faq.fml new file mode 100644 index 000000000..22ab25566 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/fr/fml/faq.fml @@ -0,0 +1,27 @@ + + + + + D'où vient Maven ? + +

+ Maven was created by a group of software developers who were tired + of wasting their time fiddling around with builds and wanted to get + down to brass tacks and actually develop software! +

+
+
+ + Pourquoi Maven est-il si populaire ? + +

+ Maven saves you so much time in your software development efforts that + you will have time to learn a second language, relax ten hours a + day, and train for that marathon you've always wanted to run! +

+
+
+
+
diff --git a/ruoyi-modules/ruoyi-im/src/site/fr/xdoc/xdoc.xml b/ruoyi-modules/ruoyi-im/src/site/fr/xdoc/xdoc.xml new file mode 100644 index 000000000..49e79bb4a --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/fr/xdoc/xdoc.xml @@ -0,0 +1,17 @@ + + + + Bienvenue + The Maven Team + + + +
+

+ Ceci est du texte pour le fichier xdoc. +

+
+ +
+ diff --git a/ruoyi-modules/ruoyi-im/src/site/site.xml b/ruoyi-modules/ruoyi-im/src/site/site.xml new file mode 100644 index 000000000..843a968b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/site.xml @@ -0,0 +1,27 @@ + + + + + Maven + http://maven.apache.org/images/apache-maven-project.png + http://maven.apache.org/ + + + http://maven.apache.org/images/maven-small.gif + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-im/src/site/site_fr.xml b/ruoyi-modules/ruoyi-im/src/site/site_fr.xml new file mode 100644 index 000000000..d1fd75788 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/site_fr.xml @@ -0,0 +1,27 @@ + + + + + Maven + http://maven.apache.org/images/apache-maven-project.png + http://maven.apache.org/ + + + http://maven.apache.org/images/maven-small.gif + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-im/src/site/xdoc/xdoc.xml b/ruoyi-modules/ruoyi-im/src/site/xdoc/xdoc.xml new file mode 100644 index 000000000..557034e08 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/site/xdoc/xdoc.xml @@ -0,0 +1,17 @@ + + + + Welcome + The Maven Team + + + +
+

+ This is some text for the xdoc file. +

+
+ +
+ diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml new file mode 100644 index 000000000..14762f3b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -0,0 +1,103 @@ + + + org.dromara + ruoyi-modules + ${revision} + + + 4.0.0 + + ruoyi-member + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java new file mode 100644 index 000000000..da10e4b0c --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java @@ -0,0 +1,68 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.FeedbackConvert; +import com.cyl.manager.ums.domain.entity.Feedback; +import com.cyl.manager.ums.domain.query.FeedbackQuery; +import com.cyl.manager.ums.service.FeedbackService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 意见反馈Controller + * + * @author zcc + * @date 2024-02-26 + */ +@Api(description ="意见反馈接口列表") +@RestController +@RequestMapping("/ums/feedback") +public class FeedbackController extends BaseController { + @Autowired + private FeedbackService service; + @Autowired + private FeedbackConvert convert; + + @ApiOperation("查询意见反馈列表") + @PreAuthorize("@ss.hasPermi('ums:feedback:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody FeedbackQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + + @ApiOperation("修改意见反馈备注信息") + @Log(title = "意见反馈", businessType = BusinessType.UPDATE) + @PostMapping("/mark/update") + public ResponseEntity editMark(@RequestBody Feedback feedback) { + return ResponseEntity.ok(service.updateMark(feedback)); + } + + @ApiOperation(("修改状态")) + @Log(title = "意见反馈", businessType = BusinessType.UPDATE) + @PostMapping("/handle/status/change") + public ResponseEntity changeStatus(@RequestBody Feedback dto){ + return ResponseEntity.ok(service.changeStatus(dto)); + } + + + @ApiOperation("删除意见反馈") + @PreAuthorize("@ss.hasPermi('ums:feedback:remove')") + @Log(title = "意见反馈", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java new file mode 100644 index 000000000..a4bc40d11 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.MemberAccountConvert; +import com.cyl.manager.ums.domain.entity.MemberAccount; +import com.cyl.manager.ums.domain.query.MemberAccountQuery; +import com.cyl.manager.ums.domain.vo.MemberAccountVO; +import com.cyl.manager.ums.service.MemberAccountService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 会员账户表Controller + * + * @author zcc + * @date 2024-03-01 + */ +@Api(description ="会员账户表接口列表") +@RestController +@RequestMapping("/ums/memberAccount") +public class MemberAccountController extends BaseController { + @Autowired + private MemberAccountService service; + @Autowired + private MemberAccountConvert convert; + + @ApiOperation("查询会员账户表列表") + @PreAuthorize("@ss.hasPermi('ums:memberAccount:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody MemberAccountQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出会员账户表列表") + @PreAuthorize("@ss.hasPermi('ums:memberAccount:export')") + @Log(title = "会员账户表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberAccountQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(MemberAccountVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员账户表数据")); + } + + @ApiOperation("获取会员账户表详细信息") + @PreAuthorize("@ss.hasPermi('ums:memberAccount:query')") + @GetMapping(value = "/{memberId}") + public ResponseEntity getInfo(@PathVariable("memberId") Long memberId) { + return ResponseEntity.ok(service.selectByMemberId(memberId)); + } + + @ApiOperation("新增会员账户表") + @PreAuthorize("@ss.hasPermi('ums:memberAccount:add')") + @Log(title = "会员账户表", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody MemberAccount memberAccount) { + return ResponseEntity.ok(service.insert(memberAccount)); + } + + @ApiOperation("修改会员账户表") + @PreAuthorize("@ss.hasPermi('ums:memberAccount:edit')") + @Log(title = "会员账户表", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody MemberAccount memberAccount) { + return ResponseEntity.ok(service.update(memberAccount)); + } + + @ApiOperation("删除会员账户表") + @PreAuthorize("@ss.hasPermi('ums:memberAccount:remove')") + @Log(title = "会员账户表", businessType = BusinessType.DELETE) + @DeleteMapping("/{memberId}") + public ResponseEntity remove(@PathVariable Long memberId) { + return ResponseEntity.ok(service.deleteByMemberId(memberId)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java new file mode 100644 index 000000000..0b7e03dcc --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java @@ -0,0 +1,88 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.MemberAddressConvert; +import com.cyl.manager.ums.domain.entity.MemberAddress; +import com.cyl.manager.ums.domain.query.MemberAddressQuery; +import com.cyl.manager.ums.domain.vo.MemberAddressVO; +import com.cyl.manager.ums.service.MemberAddressService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 会员收货地址Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="会员收货地址接口列表") +@RestController +@RequestMapping("/ums/memberAddress") +public class MemberAddressController extends BaseController { + @Autowired + private MemberAddressService service; + @Autowired + private MemberAddressConvert convert; + + @ApiOperation("查询会员收货地址列表") + @PreAuthorize("@ss.hasPermi('ums:memberAddress:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody MemberAddressQuery query, Pageable page) { + List list = service.selectList(query, page); + List resList = convert.dos2vos(list); + return ResponseEntity.ok(new PageImpl<>(resList, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出会员收货地址列表") + @PreAuthorize("@ss.hasPermi('ums:memberAddress:export')") + @Log(title = "会员收货地址", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberAddressQuery query) { +// List list = service.selectList(query, null); +// ExcelUtil util = new ExcelUtil<>(MemberAddressVO.class); +// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员收货地址数据")); + return null; + } + + @ApiOperation("获取会员收货地址详细信息") + @PreAuthorize("@ss.hasPermi('ums:memberAddress:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增会员收货地址") + @PreAuthorize("@ss.hasPermi('ums:memberAddress:add')") + @Log(title = "会员收货地址", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody MemberAddress memberAddress) { + return ResponseEntity.ok(service.insert(memberAddress)); + } + + @ApiOperation("修改会员收货地址") + @PreAuthorize("@ss.hasPermi('ums:memberAddress:edit')") + @Log(title = "会员收货地址", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody MemberAddress memberAddress) { + return ResponseEntity.ok(service.update(memberAddress)); + } + + @ApiOperation("删除会员收货地址") + @PreAuthorize("@ss.hasPermi('ums:memberAddress:remove')") + @Log(title = "会员收货地址", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java new file mode 100644 index 000000000..f9aacfd9d --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java @@ -0,0 +1,83 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.MemberCartConvert; +import com.cyl.manager.ums.domain.entity.MemberCart; +import com.cyl.manager.ums.domain.query.MemberCartQuery; +import com.cyl.manager.ums.domain.vo.MemberCartVO; +import com.cyl.manager.ums.service.MemberCartService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 购物车Controller + * + * @author zcc + * @date 2022-11-29 + */ +@Api(description ="购物车接口列表") +@RestController +@RequestMapping("/ums/memberCart") +public class MemberCartController extends BaseController { + @Autowired + private MemberCartService service; + @Autowired + private MemberCartConvert convert; + + @ApiOperation("查询购物车列表") + @PreAuthorize("@ss.hasPermi('ums:memberCart:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody MemberCartQuery query, Pageable page) { + return ResponseEntity.ok(service.selectList(query, page)); + } + + @ApiOperation("导出购物车列表") + @PreAuthorize("@ss.hasPermi('ums:memberCart:export')") + @Log(title = "购物车", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberCartQuery query) { +// List list = service.selectList(query, null); +// ExcelUtil util = new ExcelUtil<>(MemberCartVO.class); +// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "购物车数据")); + return null; + } + + @ApiOperation("获取购物车详细信息") + @PreAuthorize("@ss.hasPermi('ums:memberCart:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增购物车") + @PreAuthorize("@ss.hasPermi('ums:memberCart:add')") + @Log(title = "购物车", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody MemberCart memberCart) { + return ResponseEntity.ok(service.insert(memberCart)); + } + + @ApiOperation("修改购物车") + @PreAuthorize("@ss.hasPermi('ums:memberCart:edit')") + @Log(title = "购物车", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody MemberCart memberCart) { + return ResponseEntity.ok(service.update(memberCart)); + } + + @ApiOperation("删除购物车") + @PreAuthorize("@ss.hasPermi('ums:memberCart:remove')") + @Log(title = "购物车", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java new file mode 100644 index 000000000..8189f2384 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java @@ -0,0 +1,122 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.MemberConvert; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.form.ChangeMemberStatusForm; +import com.cyl.manager.ums.domain.query.MemberQuery; +import com.cyl.manager.ums.domain.vo.MemberDataStatisticsVO; +import com.cyl.manager.ums.domain.vo.MemberVO; +import com.cyl.manager.ums.service.MemberService; +import com.cyl.wechat.WechatAuthService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; + +import java.util.List; +/** + * 会员信息Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="会员信息接口列表") +@RestController +public class MemberController extends BaseController { + @Autowired + private MemberService service; + @Autowired + private MemberConvert convert; + @Autowired + private WechatAuthService wechatAuthService; + + @RequestMapping(path ={"/ums/member/wechat/code","/h5/member/wechat/code","/no-auth/wechat/code"},method=RequestMethod.GET) + public AjaxResult getWechatCode(@RequestParam(required = false) String scene) { + return AjaxResult.successData(wechatAuthService.getQRCode(scene)); + } + + @ApiOperation("查询会员信息列表") + @PreAuthorize("@ss.hasPermi('ums:member:list')") + @PostMapping("/ums/member/list") + public ResponseEntity> list(@RequestBody MemberQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出会员信息列表") + @PreAuthorize("@ss.hasPermi('ums:member:export')") + @Log(title = "会员信息", businessType = BusinessType.EXPORT) + @GetMapping("/ums/member/export") + public ResponseEntity export(MemberQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(MemberVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员信息数据")); + } + + @ApiOperation("获取会员信息详细信息") + @PreAuthorize("@ss.hasPermi('ums:member:query')") + @GetMapping(value = "/ums/member/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增会员信息") + @PreAuthorize("@ss.hasPermi('ums:member:add')") + @Log(title = "会员信息", businessType = BusinessType.INSERT) + @PostMapping("/ums/member") + public ResponseEntity add(@RequestBody Member member) { + return ResponseEntity.ok(service.insert(member)); + } + + @ApiOperation("修改会员信息") + @PreAuthorize("@ss.hasPermi('ums:member:edit')") + @Log(title = "会员信息", businessType = BusinessType.UPDATE) + @PutMapping("/ums/member") + public ResponseEntity edit(@RequestBody Member member) { + return ResponseEntity.ok(service.update(member)); + } + + @ApiOperation("修改会员备注信息") + @PreAuthorize("@ss.hasPermi('ums:member:edit')") + @Log(title = "会员备注信息", businessType = BusinessType.UPDATE) + @PostMapping("/ums/member/mark/update") + public ResponseEntity editMark(@RequestBody Member member) { + return ResponseEntity.ok(service.updateMark(member)); + } + + @ApiOperation("删除会员信息") + @PreAuthorize("@ss.hasPermi('ums:member:remove')") + @Log(title = "会员信息", businessType = BusinessType.DELETE) + @DeleteMapping("/ums/member/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } + + @ApiOperation(("修改会员账户状态")) + @Log(title = "会员信息", businessType = BusinessType.UPDATE) + @PostMapping("/ums/member/status/change") + public ResponseEntity changeStatus(@RequestBody ChangeMemberStatusForm form){ + return ResponseEntity.ok(service.changeStatus(form)); + } + + @ApiOperation("会员手机号解密") + @GetMapping("/ums/member/phone/decrypt/{phoneEncrypted}") + public ResponseEntity getPhoneDecrypted(@PathVariable String phoneEncrypted){ + return ResponseEntity.ok(service.getPhoneDecrypted(phoneEncrypted)); + } + + @ApiOperation("查看会员统计数据") + @GetMapping("/ums/member/view/statistics/{memberId}") + public ResponseEntity viewStatistics(@PathVariable Long memberId){ + return ResponseEntity.ok(service.viewStatistics(memberId)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberLogininforController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberLogininforController.java new file mode 100644 index 000000000..c67894045 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberLogininforController.java @@ -0,0 +1,81 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.MemberLogininforConvert; +import com.cyl.manager.ums.domain.entity.MemberLogininfor; +import com.cyl.manager.ums.domain.query.MemberLogininforQuery; +import com.cyl.manager.ums.domain.vo.MemberLogininforVO; +import com.cyl.manager.ums.service.MemberLogininforService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.web.service.TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; + +import java.util.List; + +/** + * 会员登录记录Controller + * + * @author zcc + * @date 2023-07-26 + */ +@Api(description ="会员登录记录接口列表") +@RestController +@RequestMapping("/ums/memberLogininfor") +public class MemberLogininforController extends BaseController { + @Autowired + private MemberLogininforService service; + @Autowired + private MemberLogininforConvert convert; + @Autowired + private TokenService tokenService; + + @ApiOperation("查询会员登录记录列表") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody MemberLogininforQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出会员登录记录列表") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:export')") + @Log(title = "会员登录记录", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberLogininforQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(MemberLogininforVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员登录记录数据")); + } + + @ApiOperation("获取会员登录记录详细信息") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("修改会员登录记录") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:edit')") + @Log(title = "会员登录记录", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody MemberLogininfor memberLogininfor) { + return ResponseEntity.ok(service.update(memberLogininfor)); + } + + @ApiOperation("删除会员登录记录") + @PreAuthorize("@ss.hasPermi('ums:memberLogininfor:remove')") + @Log(title = "会员登录记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberWechatController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberWechatController.java new file mode 100644 index 000000000..c9d3c39cf --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberWechatController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.member.controller; + +import com.cyl.manager.ums.convert.MemberWechatConvert; +import com.cyl.manager.ums.domain.entity.MemberWechat; +import com.cyl.manager.ums.domain.query.MemberWechatQuery; +import com.cyl.manager.ums.domain.vo.MemberWechatVO; +import com.cyl.manager.ums.service.MemberWechatService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 用户微信信息Controller + * + * @author zcc + * @date 2022-11-28 + */ +@Api(description ="用户微信信息接口列表") +@RestController +@RequestMapping("/ums/memberWechat") +public class MemberWechatController extends BaseController { + @Autowired + private MemberWechatService service; + @Autowired + private MemberWechatConvert convert; + + @ApiOperation("查询用户微信信息列表") + @PreAuthorize("@ss.hasPermi('ums:memberWechat:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody MemberWechatQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出用户微信信息列表") + @PreAuthorize("@ss.hasPermi('ums:memberWechat:export')") + @Log(title = "用户微信信息", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberWechatQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(MemberWechatVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "用户微信信息数据")); + } + + @ApiOperation("获取用户微信信息详细信息") + @PreAuthorize("@ss.hasPermi('ums:memberWechat:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增用户微信信息") + @PreAuthorize("@ss.hasPermi('ums:memberWechat:add')") + @Log(title = "用户微信信息", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody MemberWechat memberWechat) { + return ResponseEntity.ok(service.insert(memberWechat)); + } + + @ApiOperation("修改用户微信信息") + @PreAuthorize("@ss.hasPermi('ums:memberWechat:edit')") + @Log(title = "用户微信信息", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody MemberWechat memberWechat) { + return ResponseEntity.ok(service.update(memberWechat)); + } + + @ApiOperation("删除用户微信信息") + @PreAuthorize("@ss.hasPermi('ums:memberWechat:remove')") + @Log(title = "用户微信信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/PlatformVerifyController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/PlatformVerifyController.java new file mode 100644 index 000000000..014869898 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/PlatformVerifyController.java @@ -0,0 +1,37 @@ +package com.wzj.soopin.member.controller; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PlatformVerifyController { + + @Autowired + private RedisService redisService; + + /** + * h5 生成验证码 + * @param code + * @return + */ + @GetMapping("/h5/verified/code/generate") + public AjaxResult createCode(String code){ + redisService.setVerifyCode(code); + return AjaxResult.success(true); + } + + + @GetMapping("/no-auth/verified/code") + public AjaxResult verifyCode(String code){ + String verifyCode = redisService.getVerifyCode(code); + if (StringUtils.isEmpty(verifyCode)) { + return AjaxResult.success(false); + } + redisService.deleteVerifyCode(code); + return AjaxResult.success(true); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java new file mode 100644 index 000000000..db89ead25 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.manager.ums.domain.entity.Feedback; +import com.cyl.manager.ums.domain.vo.FeedbackVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 意见反馈 DO <=> VO / BO + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface FeedbackConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java new file mode 100644 index 000000000..c30690b7b --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.manager.ums.domain.entity.MemberAccount; +import com.cyl.manager.ums.domain.vo.MemberAccountVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 会员账户表 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberAccountConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java new file mode 100644 index 000000000..99070049e --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.manager.ums.domain.entity.MemberAddress; +import com.cyl.manager.ums.domain.vo.MemberAddressVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 会员收货地址 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberAddressConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java new file mode 100644 index 000000000..0864fc916 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java @@ -0,0 +1,31 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.manager.pms.domain.entity.Product; +import com.cyl.manager.pms.domain.entity.Sku; +import com.cyl.manager.ums.domain.entity.MemberCart; +import com.cyl.manager.ums.domain.vo.MemberCartVO; +import org.mapstruct.BeanMapping; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; + +import java.util.List; + +/** + * 购物车 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberCartConvert { + + List dos2vos(List list); + + @Mapping(target = "id", ignore = true) + @Mapping(target = "skuId", source = "id") + MemberCart sku2Cart(Sku sku); + + @BeanMapping(ignoreByDefault = true) + @Mapping(source = "name", target = "productName") + void injectProduct(@MappingTarget MemberCart memberCart, Product p); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java new file mode 100644 index 000000000..9488204b5 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.vo.MemberVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 会员信息 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java new file mode 100644 index 000000000..d1843238c --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.manager.ums.domain.entity.MemberLogininfor; +import com.cyl.manager.ums.domain.vo.MemberLogininforVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 会员登录记录 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberLogininforConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java new file mode 100644 index 000000000..67ba3a7a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java @@ -0,0 +1,20 @@ +package com.wzj.soopin.member.convert; + +import com.cyl.external.resp.AccessTokenResp; +import com.cyl.manager.ums.domain.entity.MemberWechat; +import com.cyl.manager.ums.domain.vo.MemberWechatVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 用户微信信息 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface MemberWechatConvert { + + List dos2vos(List list); + + MemberWechat info2do(AccessTokenResp info); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/dto/AddressDTO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/dto/AddressDTO.java new file mode 100644 index 000000000..cf2377d27 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/dto/AddressDTO.java @@ -0,0 +1,19 @@ +package com.wzj.soopin.member.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 【请填写功能名称】 DTO 对象 + * + * @author sjm + */ +@Data +public class AddressDTO { + private Long id; + private Long pid; + private String name; + private String level; + private List children; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Address.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Address.java new file mode 100644 index 000000000..f9d0cc1e4 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Address.java @@ -0,0 +1,50 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 地址对象 + * + */ +@ApiModel(description="地址对象") +@Data +@TableName("address") +public class Address { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("地区邮编") + @Excel(name = "地区邮编") + private Long code; + + @ApiModelProperty("父地区邮编") + @Excel(name = "父地区邮编") + private Long parentCode; + + @ApiModelProperty("地区名") + @Excel(name = "地区名") + private String name; + + @ApiModelProperty("地区层级") + @Excel(name = "地区层级") + private Integer level; + + @ApiModelProperty("CREATED_AT") + @Excel(name = "CREATED_AT") + private String createdAt; + + @ApiModelProperty("UPDATED_AT") + @Excel(name = "UPDATED_AT") + private String updatedAt; + + @ApiModelProperty("DELETED_AT") + @Excel(name = "DELETED_AT") + private String deletedAt; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Feedback.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Feedback.java new file mode 100644 index 000000000..79ccf38db --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Feedback.java @@ -0,0 +1,58 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +/** + * 意见反馈对象 ums_feedback + * + * @author zcc + */ +@ApiModel(description="意见反馈对象") +@Data +@TableName("ums_feedback") +public class Feedback { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("类型") + @Excel(name = "类型") + private String type; + + @ApiModelProperty("具体说明") + @Excel(name = "具体说明") + private String content; + + @ApiModelProperty("图片") + @Excel(name = "图片") + private String images; + + @ApiModelProperty("联系电话") + @Excel(name = "联系电话") + private String phone; + + @ApiModelProperty("创建人") + private Long createBy; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("处理状态 0:未处理 1:已处理") + @Excel(name = "处理状态 0:未处理 1:已处理") + private Integer handleStatus; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("处理时间") + @Excel(name = "处理时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime handleTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Member.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Member.java new file mode 100644 index 000000000..b2925d051 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/Member.java @@ -0,0 +1,93 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +/** + * 会员信息对象 ums_member + * + * @author zcc + */ +@ApiModel(description="会员信息对象") +@Data +@TableName("ums_member") +public class Member extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("昵称") + @Excel(name = "昵称") + private String nickname; + + @ApiModelProperty("密码") + @Excel(name = "密码") + private String password; + + @ApiModelProperty("加密手机号") + private String phoneEncrypted; + + @ApiModelProperty("隐藏前三位后四位的手机号") + private String phoneHidden; + + @ApiModelProperty("用户备注") + @Excel(name = "用户备注") + private String mark; + + @ApiModelProperty("帐号启用状态:0->禁用;1->启用") + @Excel(name = "帐号启用状态:0->禁用;1->启用") + private Integer status; + + @ApiModelProperty("头像") + @Excel(name = "头像") + private String avatar; + + @ApiModelProperty("性别:0->未知;1->男;2->女") + @Excel(name = "性别:0->未知;1->男;2->女") + private Integer gender; + + @ApiModelProperty("用户所在城市") + @Excel(name = "用户所在城市") + private String city; + + @ApiModelProperty("用户所在省份") + @Excel(name = "用户所在省份") + private String province; + + @ApiModelProperty("用户所在国家") + @Excel(name = "用户所在国家") + private String country; + + @ApiModelProperty("公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注") + @Excel(name = "公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注") + private String remark; + + @ApiModelProperty("生日") + @Excel(name = "生日", width = 30, dateFormat = "yyyy-MM-dd") + private LocalDate birthday; + + @ApiModelProperty("推广员id") + @Excel(name = "推广员id") + private Long spreadUid; + + @ApiModelProperty("推广员关联时间") + @Excel(name = "推广员关联时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime spreadTime; + + @ApiModelProperty("等级") + @Excel(name = "等级") + private Integer level; + + @ApiModelProperty("用户剩余积分") + @Excel(name = "用户剩余积分") + private BigDecimal integral; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAccount.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAccount.java new file mode 100644 index 000000000..82929100f --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAccount.java @@ -0,0 +1,42 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +/** + * 会员账户表对象 ums_member_account + * + * @author zcc + */ +@ApiModel(description="会员账户表对象") +@Data +@TableName("ums_member_account") +public class MemberAccount { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("MEMBER_ID") + @TableId(value="member_id", type = IdType.ASSIGN_ID) + private Long memberId; + + @ApiModelProperty("积分余额") + @Excel(name = "积分余额") + private BigDecimal integralBalance; + + @ApiModelProperty("历史总共积分") + @Excel(name = "历史总共积分") + private BigDecimal totalIntegralBalance; + + @ApiModelProperty("修改时间") + private LocalDateTime updateTime; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAddress.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAddress.java new file mode 100644 index 000000000..42e076f09 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberAddress.java @@ -0,0 +1,79 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 会员收货地址对象 ums_member_address + * + * @author zcc + */ +@ApiModel(description="会员收货地址对象") +@Data +@TableName("ums_member_address") +public class MemberAddress extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("MEMBER_ID") + @Excel(name = "MEMBER_ID") + private Long memberId; + + @ApiModelProperty("收货人名称") + @Excel(name = "收货人名称") + private String name; + + @ApiModelProperty("隐藏前三位后四位的手机号") + @Excel(name = "隐藏前三位后四位的手机号") + private String phoneHidden; + + @ApiModelProperty("加密的手机号") + @Excel(name = "加密的手机号") + private String phoneEncrypted; + + @ApiModelProperty("是否为默认") + @Excel(name = "是否为默认") + private Integer defaultStatus; + + @ApiModelProperty("邮政编码") + @Excel(name = "邮政编码") + private String postCode; + + @ApiModelProperty("省份/直辖市") + @Excel(name = "省份/直辖市") + private String province; + + @ApiModelProperty("城市") + @Excel(name = "城市") + private String city; + + @ApiModelProperty("区") + @Excel(name = "区") + private String district; + + @ApiModelProperty("省份/直辖市id") + @Excel(name = "省份/直辖市id") + private Long provinceId; + + @ApiModelProperty("城市id") + @Excel(name = "城市id") + private Long cityId; + + @ApiModelProperty("区id") + @Excel(name = "区id") + private Long districtId; + + @ApiModelProperty("详细地址(街道)") + @Excel(name = "详细地址(街道)") + private String detailAddress; + + @ApiModelProperty("是否默认") + @Excel(name = "是否默认") + private Integer isDefault; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberCart.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberCart.java new file mode 100644 index 000000000..453661b4f --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberCart.java @@ -0,0 +1,55 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 购物车对象 ums_member_cart + * + * @author zcc + */ +@ApiModel(description="购物车对象") +@Data +@TableName("ums_member_cart") +public class MemberCart extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("购物车表ID") + private Long id; + + @ApiModelProperty("0->失效;1->有效") + @Excel(name = "0->失效;1->有效") + private Integer status; + + @ApiModelProperty("用户ID") + @Excel(name = "用户ID") + private Long memberId; + + @ApiModelProperty("商品ID") + @Excel(name = "商品ID") + private Long productId; + + @ApiModelProperty("展示图片") + @Excel(name = "展示图片") + private String pic; + + @ApiModelProperty("SKU ID") + @Excel(name = "SKU ID") + private Long skuId; + + @ApiModelProperty("PRODUCT_NAME") + @Excel(name = "PRODUCT_NAME") + private String productName; + + @ApiModelProperty("商品属性") + @Excel(name = "商品属性") + private String spData; + + @ApiModelProperty("商品数量") + @Excel(name = "商品数量") + private Integer quantity; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberLogininfor.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberLogininfor.java new file mode 100644 index 000000000..7b74d2d92 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberLogininfor.java @@ -0,0 +1,52 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +/** + * 会员登录记录对象 ums_member_logininfor + * + * @author zcc + */ +@ApiModel(description="会员登录记录对象") +@Data +@TableName("ums_member_logininfor") +public class MemberLogininfor { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("会员手机号") + @Excel(name = "会员手机号") + private String phone; + + @ApiModelProperty("会员id") + @Excel(name = "会员id") + private Long memberId; + + @ApiModelProperty("登录IP地址") + @Excel(name = "登录IP地址") + private String ipaddr; + + @ApiModelProperty("登录地点") + @Excel(name = "登录地点") + private String loginLocation; + + @ApiModelProperty("浏览器类型") + @Excel(name = "浏览器类型") + private String browser; + + @ApiModelProperty("操作系统") + @Excel(name = "操作系统") + private String os; + + @ApiModelProperty("登陆时间") + @Excel(name = "登陆时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime loginTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberWechat.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberWechat.java new file mode 100644 index 000000000..1025d03e7 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/entity/MemberWechat.java @@ -0,0 +1,77 @@ +package com.wzj.soopin.member.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +/** + * 用户微信信息对象 ums_member_wechat + * + * @author zcc + */ +@ApiModel(description="用户微信信息对象") +@Data +@TableName("ums_member_wechat") +public class MemberWechat extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("MEMBER_ID") + @Excel(name = "MEMBER_ID") + private Long memberId; + + @ApiModelProperty("只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段") + @Excel(name = "只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段") + private String unionid; + + @ApiModelProperty("用户的标识,对当前公众号唯一") + @Excel(name = "用户的标识,对当前公众号唯一") + private String openid; + + @ApiModelProperty("小程序唯一身份ID") + @Excel(name = "小程序唯一身份ID") + private String routineOpenid; + + @ApiModelProperty("用户所在的分组ID(兼容旧的用户分组接口)") + @Excel(name = "用户所在的分组ID", readConverterExp = "兼=容旧的用户分组接口") + private Integer groupid; + + @ApiModelProperty("用户被打上的标签ID列表") + @Excel(name = "用户被打上的标签ID列表") + private String tagidList; + + @ApiModelProperty("用户是否订阅该公众号标识") + @Excel(name = "用户是否订阅该公众号标识") + private Integer subscribe; + + @ApiModelProperty("关注公众号时间") + @Excel(name = "关注公众号时间") + private Integer subscribeTime; + + @ApiModelProperty("小程序用户会话密匙") + @Excel(name = "小程序用户会话密匙") + private String sessionKey; + + @ApiModelProperty("token") + @Excel(name = "token") + private String accessToken; + + @ApiModelProperty("过期时间") + @Excel(name = "过期时间") + private Integer expiresIn; + + @ApiModelProperty("刷新token") + @Excel(name = "刷新token") + private String refreshToken; + + @ApiModelProperty("过期时间") + @Excel(name = "过期时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime expireTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/AddMemberCartForm.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/AddMemberCartForm.java new file mode 100644 index 000000000..89bdacc29 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/AddMemberCartForm.java @@ -0,0 +1,23 @@ +package com.wzj.soopin.member.domain.form; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class AddMemberCartForm { + /** + * 规格id + */ + @NotNull(message = "规格必填!") + private Long skuId; + /** + * 数量 + */ + private Integer buyNum; + private Long productId; + private String pic; + private String productName; + private String spData; + private Integer quantity; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/ChangeMemberStatusForm.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/ChangeMemberStatusForm.java new file mode 100644 index 000000000..869572984 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/ChangeMemberStatusForm.java @@ -0,0 +1,9 @@ +package com.wzj.soopin.member.domain.form; + +import lombok.Data; + +@Data +public class ChangeMemberStatusForm { + private Long memberId; + private Integer status; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/MemberAddressForm.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/MemberAddressForm.java new file mode 100644 index 000000000..f37b51b71 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/MemberAddressForm.java @@ -0,0 +1,18 @@ +package com.wzj.soopin.member.domain.form; + +import lombok.Data; + +@Data +public class MemberAddressForm { + private Long id; + private Long memberId; + private String name; + private String phone; + private Integer defaultStatus; + private String postCode; + private String province; + private String city; + private String district; + private String detailAddress; + private Integer isDefault; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/UpdateMemberCartForm.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/UpdateMemberCartForm.java new file mode 100644 index 000000000..81a6256ad --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/form/UpdateMemberCartForm.java @@ -0,0 +1,18 @@ +package com.wzj.soopin.member.domain.form; + +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +@Data +public class UpdateMemberCartForm { + @NotNull(message = "id 不能为空") + private Long id; + + @NotNull(message = "数量必填") + @Min(value = 0, message = "数量不小于0") + @Max(value = Integer.MAX_VALUE, message = "数量不大于" + Integer.MAX_VALUE) + private Integer num; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/FeedbackQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/FeedbackQuery.java new file mode 100644 index 000000000..bfdcc9b77 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/FeedbackQuery.java @@ -0,0 +1,39 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 意见反馈 查询 对象 + * + * @author zcc + */ +@ApiModel(description="意见反馈 查询 对象") +@Data +public class FeedbackQuery { + @ApiModelProperty("类型 精确匹配") + private String type; + + @ApiModelProperty("具体说明 精确匹配") + private String content; + + @ApiModelProperty("图片 精确匹配") + private String images; + + @ApiModelProperty("联系电话 精确匹配") + private String phone; + + @ApiModelProperty("处理状态 0:未处理 1:已处理 精确匹配") + private Integer handleStatus; + + @ApiModelProperty("处理时间 精确匹配") + private LocalDateTime handleTime; + + private String beginTime; + + private String endTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAccountQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAccountQuery.java new file mode 100644 index 000000000..9ee6b846d --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAccountQuery.java @@ -0,0 +1,23 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 会员账户表 查询 对象 + * + * @author zcc + */ +@ApiModel(description="会员账户表 查询 对象") +@Data +public class MemberAccountQuery { + @ApiModelProperty("积分余额 精确匹配") + private BigDecimal integralBalance; + + @ApiModelProperty("历史总共积分 精确匹配") + private BigDecimal totalIntegralBalance; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAddressQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAddressQuery.java new file mode 100644 index 000000000..c539d46e6 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberAddressQuery.java @@ -0,0 +1,45 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 会员收货地址 查询 对象 + * + * @author zcc + */ +@ApiModel(description="会员收货地址 查询 对象") +@Data +public class MemberAddressQuery { + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("收货人名称 精确匹配") + private String nameLike; + + @ApiModelProperty("PHONE 精确匹配") + private String phone; + + @ApiModelProperty("是否为默认 精确匹配") + private Integer defaultStatus; + + @ApiModelProperty("邮政编码 精确匹配") + private String postCode; + + @ApiModelProperty("省份/直辖市 精确匹配") + private String province; + + @ApiModelProperty("城市 精确匹配") + private String city; + + @ApiModelProperty("区 精确匹配") + private String district; + + @ApiModelProperty("详细地址 精确匹配") + private String detailAddress; + + @ApiModelProperty("是否默认 精确匹配") + private Integer isDefault; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberCartQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberCartQuery.java new file mode 100644 index 000000000..63dddc8c1 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberCartQuery.java @@ -0,0 +1,42 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 购物车 查询 对象 + * + * @author zcc + */ +@ApiModel(description="购物车 查询 对象") +@Data +public class MemberCartQuery { + @ApiModelProperty("0->失效;1->有效 精确匹配") + private Integer status; + + @ApiModelProperty("用户ID 精确匹配") + private Long memberId; + + @ApiModelProperty("商品ID 精确匹配") + private Long productId; + + @ApiModelProperty("展示图片 精确匹配") + private String pic; + + @ApiModelProperty("SKU ID 精确匹配") + private Long skuId; + + @ApiModelProperty("商品名称 精确匹配") + private String productName; + + @ApiModelProperty("商品属性 精确匹配") + private String spData; + + @ApiModelProperty("商品数量 精确匹配") + private Integer quantity; + + @ApiModelProperty("用户手机号") + private String phone; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberLogininforQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberLogininforQuery.java new file mode 100644 index 000000000..668e34b4a --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberLogininforQuery.java @@ -0,0 +1,42 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 会员登录记录 查询 对象 + * + * @author zcc + */ +@ApiModel(description="会员登录记录 查询 对象") +@Data +public class MemberLogininforQuery { + @ApiModelProperty("会员手机号 精确匹配") + private String phone; + + @ApiModelProperty("会员id 精确匹配") + private Long memberId; + + @ApiModelProperty("登录IP地址 精确匹配") + private String ipaddr; + + @ApiModelProperty("登录地点 精确匹配") + private String loginLocation; + + @ApiModelProperty("浏览器类型 精确匹配") + private String browser; + + @ApiModelProperty("操作系统 精确匹配") + private String os; + + @ApiModelProperty("登陆时间 精确匹配") + private LocalDateTime loginTime; + + private String beginTime; + + private String endTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberQuery.java new file mode 100644 index 000000000..3e29c58fe --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberQuery.java @@ -0,0 +1,70 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 会员信息 查询 对象 + * + * @author zcc + */ +@ApiModel(description="会员信息 查询 对象") +@Data +public class MemberQuery { + @ApiModelProperty("昵称 精确匹配") + private String nickname; + + @ApiModelProperty("密码 精确匹配") + private String password; + + @ApiModelProperty("手机号码 精确匹配") + private String phone; + + @ApiModelProperty("有无备注 1:有备注 0:无备注") + private Integer hasMark; + + @ApiModelProperty("用户备注 精确匹配") + private String mark; + + @ApiModelProperty("帐号启用状态:0->禁用;1->启用 精确匹配") + private Integer status; + + @ApiModelProperty("头像 精确匹配") + private String avatar; + + @ApiModelProperty("性别:0->未知;1->男;2->女 精确匹配") + private Integer gender; + + @ApiModelProperty("用户所在城市 精确匹配") + private String city; + + @ApiModelProperty("用户所在省份 精确匹配") + private String province; + + @ApiModelProperty("用户所在国家 精确匹配") + private String country; + + @ApiModelProperty("生日 精确匹配") + private LocalDate birthday; + + @ApiModelProperty("推广员id 精确匹配") + private Long spreadUid; + + @ApiModelProperty("推广员关联时间 精确匹配") + private LocalDateTime spreadTime; + + @ApiModelProperty("等级 精确匹配") + private Integer level; + + @ApiModelProperty("用户剩余积分 精确匹配") + private BigDecimal integral; + + private String beginTime; + + private String endTime; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberWechatQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberWechatQuery.java new file mode 100644 index 000000000..29e072fcd --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/query/MemberWechatQuery.java @@ -0,0 +1,56 @@ +package com.wzj.soopin.member.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户微信信息 查询 对象 + * + * @author zcc + */ +@ApiModel(description="用户微信信息 查询 对象") +@Data +public class MemberWechatQuery { + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 精确匹配") + private String unionid; + + @ApiModelProperty("用户的标识,对当前公众号唯一 精确匹配") + private String openid; + + @ApiModelProperty("小程序唯一身份ID 精确匹配") + private String routineOpenid; + + @ApiModelProperty("用户所在的分组ID(兼容旧的用户分组接口) 精确匹配") + private Integer groupid; + + @ApiModelProperty("用户被打上的标签ID列表 精确匹配") + private String tagidList; + + @ApiModelProperty("用户是否订阅该公众号标识 精确匹配") + private Integer subscribe; + + @ApiModelProperty("关注公众号时间 精确匹配") + private Integer subscribeTime; + + @ApiModelProperty("小程序用户会话密匙 精确匹配") + private String sessionKey; + + @ApiModelProperty("token 精确匹配") + private String accessToken; + + @ApiModelProperty("过期时间 精确匹配") + private Integer expiresIn; + + @ApiModelProperty("刷新token 精确匹配") + private String refreshToken; + + @ApiModelProperty("过期时间 精确匹配") + private LocalDateTime expireTime; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FeedbackVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FeedbackVO.java new file mode 100644 index 000000000..2527f82ea --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/FeedbackVO.java @@ -0,0 +1,43 @@ +package com.wzj.soopin.member.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; + +import java.time.LocalDateTime; +/** + * 意见反馈 数据视图对象 + * + * @author zcc + */ +@Data +public class FeedbackVO { + /** ID */ + private Long id; + /** 类型 */ + @Excel(name = "类型") + private String type; + /** 具体说明 */ + @Excel(name = "具体说明") + private String content; + /** 图片 */ + @Excel(name = "图片") + private String images; + /** 联系电话 */ + @Excel(name = "联系电话") + private String phone; + /** 创建人 */ + private Long createBy; + /** 创建时间 */ + private LocalDateTime createTime; + /** 处理状态 0:未处理 1:已处理 */ + @Excel(name = "处理状态 0:未处理 1:已处理") + private Integer handleStatus; + /** 备注 */ + @Excel(name = "备注") + private String remark; + /** 处理时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "处理时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime handleTime; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAccountVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAccountVO.java new file mode 100644 index 000000000..0cf04b67d --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAccountVO.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.member.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +/** + * 会员账户表 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberAccountVO { + /** MEMBER_ID */ + private Long memberId; + /** 积分余额 */ + @Excel(name = "积分余额") + private BigDecimal integralBalance; + /** 历史总共积分 */ + @Excel(name = "历史总共积分") + private BigDecimal totalIntegralBalance; + /** 修改时间 */ + private LocalDateTime updateTime; + /** 创建时间 */ + private LocalDateTime createTime; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAddressVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAddressVO.java new file mode 100644 index 000000000..f31e33964 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberAddressVO.java @@ -0,0 +1,47 @@ +package com.wzj.soopin.member.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; +/** + * 会员收货地址 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberAddressVO extends BaseAudit { + /** ID */ + private Long id; + /** MEMBER_ID */ + @Excel(name = "MEMBER_ID") + private Long memberId; + /** 收货人名称 */ + @Excel(name = "收货人名称") + private String name; + /** PHONE */ + @Excel(name = "PHONE") + private String phone; + @Excel(name = "隐藏前三位后四位的手机号") + private String phoneHidden; + /** 是否为默认 */ + @Excel(name = "是否为默认") + private Integer defaultStatus; + /** 邮政编码 */ + @Excel(name = "邮政编码") + private String postCode; + /** 省份/直辖市 */ + @Excel(name = "省份/直辖市") + private String province; + /** 城市 */ + @Excel(name = "城市") + private String city; + /** 区 */ + @Excel(name = "区") + private String district; + /** 详细地址(街道) */ + @Excel(name = "详细地址(街道)") + private String detailAddress; + /** 是否默认 */ + @Excel(name = "是否默认") + private Integer isDefault; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberCartVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberCartVO.java new file mode 100644 index 000000000..ae040d4a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberCartVO.java @@ -0,0 +1,53 @@ +package com.wzj.soopin.member.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 购物车 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberCartVO extends BaseAudit { + /** 购物车表ID */ + private Long id; + /** 0->失效;1->有效 */ + @Excel(name = "0->失效;1->有效") + private Integer status; + /** 用户ID */ + @Excel(name = "用户ID") + private Long memberId; + private String nickname; + private String mark; + /** 商品ID */ + @Excel(name = "商品ID") + private Long productId; + /** 展示图片 */ + @Excel(name = "展示图片") + private String pic; + /** SKU ID */ + @Excel(name = "SKU ID") + private Long skuId; + /** PRODUCT_NAME */ + @Excel(name = "PRODUCT_NAME") + private String productName; + /** 商品属性 */ + @Excel(name = "商品属性") + private String spData; + /** 商品数量 */ + @Excel(name = "商品数量") + private Integer quantity; + /** 加入时间 */ + private LocalDateTime createTime; + /** sku价格 */ + private BigDecimal price; + /** sku是否存在 */ + private Integer skuIfExist; + /** 隐藏四位的手机号 */ + private String phoneHidden; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberDataStatisticsVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberDataStatisticsVO.java new file mode 100644 index 000000000..931ae00c1 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberDataStatisticsVO.java @@ -0,0 +1,20 @@ +package com.wzj.soopin.member.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel("会员下单数据统计对象") +public class MemberDataStatisticsVO { + @ApiModelProperty("购物车数") + private Integer cartCount; + @ApiModelProperty("订单数") + private Integer orderCount; + @ApiModelProperty("下单金额") + private BigDecimal orderAmount; + @ApiModelProperty("售后数") + private Integer aftersaleCount; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberLogininforVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberLogininforVO.java new file mode 100644 index 000000000..d98d926cf --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberLogininforVO.java @@ -0,0 +1,39 @@ +package com.wzj.soopin.member.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; + +import java.time.LocalDateTime; +/** + * 会员登录记录 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberLogininforVO { + /** ID */ + private Long id; + /** 会员手机号 */ + @Excel(name = "会员手机号") + private String phone; + /** 会员id */ + @Excel(name = "会员id") + private Long memberId; + /** 登录IP地址 */ + @Excel(name = "登录IP地址") + private String ipaddr; + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + /** 浏览器类型 */ + @Excel(name = "浏览器类型") + private String browser; + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + /** 登陆时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "登陆时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime loginTime; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberVO.java new file mode 100644 index 000000000..e48586b6c --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberVO.java @@ -0,0 +1,71 @@ +package com.wzj.soopin.member.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +/** + * 会员信息 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberVO extends BaseAudit { + /** ID */ + private Long id; + /** 昵称 */ + @Excel(name = "昵称") + private String nickname; + /** 手机号 */ + private String phone; + /** 隐藏前三位后四位的手机号 */ + private String phoneHidden; + /** 用户备注 */ + @Excel(name = "用户备注") + private String mark; + /** 帐号启用状态:0->禁用;1->启用 */ + @Excel(name = "帐号启用状态:0->禁用;1->启用") + private Integer status; + /** 头像 */ + @Excel(name = "头像") + private String avatar; + /** 性别:0->未知;1->男;2->女 */ + @Excel(name = "性别:0->未知;1->男;2->女") + private Integer gender; + /** 用户所在城市 */ + @Excel(name = "用户所在城市") + private String city; + /** 用户所在省份 */ + @Excel(name = "用户所在省份") + private String province; + /** 用户所在国家 */ + @Excel(name = "用户所在国家") + private String country; + /** 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 */ + @Excel(name = "公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注") + private String remark; + /** 生日 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "生日", width = 30, dateFormat = "yyyy-MM-dd") + private LocalDate birthday; + /** 推广员id */ + @Excel(name = "推广员id") + private Long spreadUid; + /** 推广员关联时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "推广员关联时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime spreadTime; + /** 等级 */ + @Excel(name = "等级") + private Integer level; + /** 用户剩余积分 */ + @Excel(name = "用户剩余积分") + private BigDecimal integral; + /** openId */ + @Excel(name = "openId") + private String openId; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberWechatVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberWechatVO.java new file mode 100644 index 000000000..9d3750e20 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberWechatVO.java @@ -0,0 +1,58 @@ +package com.wzj.soopin.member.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.time.LocalDateTime; +/** + * 用户微信信息 数据视图对象 + * + * @author zcc + */ +@Data +public class MemberWechatVO extends BaseAudit { + /** ID */ + private Long id; + /** MEMBER_ID */ + @Excel(name = "MEMBER_ID") + private Long memberId; + /** 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 */ + @Excel(name = "只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段") + private String unionid; + /** 用户的标识,对当前公众号唯一 */ + @Excel(name = "用户的标识,对当前公众号唯一") + private String openid; + /** 小程序唯一身份ID */ + @Excel(name = "小程序唯一身份ID") + private String routineOpenid; + /** 用户所在的分组ID(兼容旧的用户分组接口) */ + @Excel(name = "用户所在的分组ID", readConverterExp = "兼=容旧的用户分组接口") + private Integer groupid; + /** 用户被打上的标签ID列表 */ + @Excel(name = "用户被打上的标签ID列表") + private String tagidList; + /** 用户是否订阅该公众号标识 */ + @Excel(name = "用户是否订阅该公众号标识") + private Integer subscribe; + /** 关注公众号时间 */ + @Excel(name = "关注公众号时间") + private Integer subscribeTime; + /** 小程序用户会话密匙 */ + @Excel(name = "小程序用户会话密匙") + private String sessionKey; + /** token */ + @Excel(name = "token") + private String accessToken; + /** 过期时间 */ + @Excel(name = "过期时间") + private Integer expiresIn; + /** 刷新token */ + @Excel(name = "刷新token") + private String refreshToken; + /** 过期时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "过期时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime expireTime; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java new file mode 100644 index 000000000..50595a610 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java @@ -0,0 +1,22 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.Address; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author sjm + */ +public interface AddressMapper extends BaseMapper
{ + /** + * 查询【请填写功能名称】列表 + * + * @param address 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + List
selectByEntity(Address address); + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/FeedbackMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/FeedbackMapper.java new file mode 100644 index 000000000..1bf1df8fb --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/FeedbackMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.Feedback; + +import java.util.List; + +/** + * 意见反馈Mapper接口 + * + * @author zcc + */ +public interface FeedbackMapper extends BaseMapper { + /** + * 查询意见反馈列表 + * + * @param feedback 意见反馈 + * @return 意见反馈集合 + */ + List selectByEntity(Feedback feedback); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountMapper.java new file mode 100644 index 000000000..4a7625d52 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountMapper.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.MemberAccount; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 会员账户表Mapper接口 + * + * @author zcc + */ +public interface MemberAccountMapper extends BaseMapper { + /** + * 查询会员账户表列表 + * + * @param memberAccount 会员账户表 + * @return 会员账户表集合 + */ + List selectByEntity(MemberAccount memberAccount); + + int updateIntegralBalance(@Param("amount") BigDecimal amount, @Param("memberId") Long memberId); + + int updateIntegral(@Param("useIntegral") BigDecimal useIntegral, @Param("memberId") Long memberId); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAddressMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAddressMapper.java new file mode 100644 index 000000000..b16641336 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAddressMapper.java @@ -0,0 +1,25 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.MemberAddress; + +import java.util.List; + +/** + * 会员收货地址Mapper接口 + * + * @author zcc + */ +public interface MemberAddressMapper extends BaseMapper { + /** + * 查询会员收货地址列表 + * + * @param memberAddress 会员收货地址 + * @return 会员收货地址集合 + */ + List selectByEntity(MemberAddress memberAddress); + + int updateByPrimaryKeySelective(MemberAddress address); + + void updateDefault(int IsDefault, Long id); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberCartMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberCartMapper.java new file mode 100644 index 000000000..5e03e3fcb --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberCartMapper.java @@ -0,0 +1,32 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.MemberCart; +import com.cyl.manager.ums.domain.query.MemberCartQuery; +import com.cyl.manager.ums.domain.vo.MemberCartVO; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 购物车Mapper接口 + * + * @author zcc + */ +public interface MemberCartMapper extends BaseMapper { + /** + * 查询购物车列表 + * + * @param memberCart 购物车 + * @return 购物车集合 + */ + List selectByEntity(MemberCart memberCart); + + /** + * + */ + List selectByPage(MemberCartQuery query); + + int statAddCount(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberLogininforMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberLogininforMapper.java new file mode 100644 index 000000000..3ecb6a419 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberLogininforMapper.java @@ -0,0 +1,25 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.MemberLogininfor; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 会员登录记录Mapper接口 + * + * @author zcc + */ +public interface MemberLogininforMapper extends BaseMapper { + /** + * 查询会员登录记录列表 + * + * @param memberLogininfor 会员登录记录 + * @return 会员登录记录集合 + */ + List selectByEntity(MemberLogininfor memberLogininfor); + + int statLoginMember(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java new file mode 100644 index 000000000..448a6c598 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.Member; + +import java.util.List; + +/** + * 会员信息Mapper接口 + * + * @author zcc + */ +public interface MemberMapper extends BaseMapper { + /** + * 查询会员信息列表 + * + * @param member 会员信息 + * @return 会员信息集合 + */ + List selectByEntity(Member member); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberWechatMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberWechatMapper.java new file mode 100644 index 000000000..132d4efd2 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberWechatMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.member.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.ums.domain.entity.MemberWechat; + +import java.util.List; + +/** + * 用户微信信息Mapper接口 + * + * @author zcc + */ +public interface MemberWechatMapper extends BaseMapper { + /** + * 查询用户微信信息列表 + * + * @param memberWechat 用户微信信息 + * @return 用户微信信息集合 + */ + List selectByEntity(MemberWechat memberWechat); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/FeedbackService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/FeedbackService.java new file mode 100644 index 000000000..9d601a8b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/FeedbackService.java @@ -0,0 +1,130 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.cyl.h5.config.SecurityUtil; +import com.cyl.manager.ums.domain.entity.Feedback; +import com.cyl.manager.ums.domain.query.FeedbackQuery; +import com.cyl.manager.ums.mapper.FeedbackMapper; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 意见反馈Service业务层处理 + * + * + * @author zcc + */ +@Service +public class FeedbackService { + @Autowired + private FeedbackMapper feedbackMapper; + + /** + * 查询意见反馈 + * + * @param id 意见反馈主键 + * @return 意见反馈 + */ + public Feedback selectById(Long id) { + return feedbackMapper.selectById(id); + } + + /** + * 查询意见反馈列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 意见反馈 + */ + public List selectList(FeedbackQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String type = query.getType(); + if (!StringUtils.isEmpty(type)) { + qw.eq("type", type); + } + String content = query.getContent(); + if (!StringUtils.isEmpty(content)) { + qw.eq("content", content); + } + String images = query.getImages(); + if (!StringUtils.isEmpty(images)) { + qw.eq("images", images); + } + String phone = query.getPhone(); + if (!StringUtils.isEmpty(phone)) { + qw.eq("phone", phone); + } + Integer handleStatus = query.getHandleStatus(); + if (handleStatus != null) { + qw.eq("handle_status", handleStatus); + } + LocalDateTime handleTime = query.getHandleTime(); + if (handleTime != null) { + qw.eq("handle_time", handleTime); + } + if (!StringUtils.isEmpty(query.getBeginTime()) && !StringUtils.isEmpty(query.getEndTime())){ + qw.ge("create_time", query.getBeginTime()); + qw.lt("create_time", query.getEndTime()); + } + qw.orderByDesc("id"); + return feedbackMapper.selectList(qw); + } + + /** + * 新增意见反馈 + * + * @param feedback 意见反馈 + * @return 结果 + */ + public int insert(Feedback feedback) { + feedback.setCreateTime(LocalDateTime.now()); + feedback.setCreateBy(SecurityUtil.getLocalMember().getId()); + feedback.setHandleStatus(0); + return feedbackMapper.insert(feedback); + } + + /** + * 修改意见反馈 + * + * @param feedback 意见反馈 + * @return 结果 + */ + public int update(Feedback feedback) { + return feedbackMapper.updateById(feedback); + } + + /** + * 删除意见反馈信息 + * + * @param id 意见反馈主键 + * @return 结果 + */ + public int deleteById(Long id) { + return feedbackMapper.deleteById(id); + } + + public Integer updateMark(Feedback feedback) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("remark",feedback.getRemark()) + .eq("id",feedback.getId()); + return feedbackMapper.update(null,updateWrapper); + } + + public Integer changeStatus(Feedback dto) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("id", dto.getId()); + wrapper.set("handle_status", dto.getHandleStatus()) + .set("handle_time",LocalDateTime.now()); + return feedbackMapper.update(null, wrapper); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAccountService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAccountService.java new file mode 100644 index 000000000..48ae4d48a --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAccountService.java @@ -0,0 +1,90 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.ums.domain.entity.MemberAccount; +import com.cyl.manager.ums.domain.query.MemberAccountQuery; +import com.cyl.manager.ums.mapper.MemberAccountMapper; +import com.github.pagehelper.PageHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 会员账户表Service业务层处理 + * + * + * @author zcc + */ +@Service +public class MemberAccountService { + @Autowired + private MemberAccountMapper memberAccountMapper; + + /** + * 查询会员账户表 + * + * @param memberId 会员账户表主键 + * @return 会员账户表 + */ + public MemberAccount selectByMemberId(Long memberId) { + return memberAccountMapper.selectById(memberId); + } + + /** + * 查询会员账户表列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 会员账户表 + */ + public List selectList(MemberAccountQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + BigDecimal integralBalance = query.getIntegralBalance(); + if (integralBalance != null) { + qw.eq("integral_balance", integralBalance); + } + BigDecimal totalIntegralBalance = query.getTotalIntegralBalance(); + if (totalIntegralBalance != null) { + qw.eq("total_integral_balance", totalIntegralBalance); + } + return memberAccountMapper.selectList(qw); + } + + /** + * 新增会员账户表 + * + * @param memberAccount 会员账户表 + * @return 结果 + */ + public int insert(MemberAccount memberAccount) { + memberAccount.setCreateTime(LocalDateTime.now()); + return memberAccountMapper.insert(memberAccount); + } + + /** + * 修改会员账户表 + * + * @param memberAccount 会员账户表 + * @return 结果 + */ + public int update(MemberAccount memberAccount) { + return memberAccountMapper.updateById(memberAccount); + } + + /** + * 删除会员账户表信息 + * + * @param memberId 会员账户表主键 + * @return 结果 + */ + public int deleteByMemberId(Long memberId) { + return memberAccountMapper.deleteById(memberId); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAddressService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAddressService.java new file mode 100644 index 000000000..410769584 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberAddressService.java @@ -0,0 +1,136 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.ums.convert.MemberAddressConvert; +import com.cyl.manager.ums.domain.entity.MemberAddress; +import com.cyl.manager.ums.domain.query.MemberAddressQuery; +import com.cyl.manager.ums.mapper.MemberAddressMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.AesCryptoUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 会员收货地址Service业务层处理 + * + * @author zcc + */ +@Service +public class MemberAddressService { + @Autowired + private MemberAddressMapper memberAddressMapper; + @Autowired + private MemberAddressConvert memberAddressConvert; + @Value("${aes.key}") + private String aesKey; + + /** + * 查询会员收货地址 + * + * @param id 会员收货地址主键 + * @return 会员收货地址 + */ + public MemberAddress selectById(Long id) { + return memberAddressMapper.selectById(id); + } + + /** + * 查询会员收货地址列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 会员收货地址 + */ + public List selectList(MemberAddressQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String nameLike = query.getNameLike(); + if (!StringUtils.isEmpty(nameLike)) { + qw.like("name", nameLike); + } + String phone = query.getPhone(); + if (!StringUtils.isEmpty(phone)) { + qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, phone)); + } + String postCode = query.getPostCode(); + if (!StringUtils.isEmpty(postCode)) { + qw.eq("post_code", postCode); + } + String province = query.getProvince(); + if (!StringUtils.isEmpty(province)) { + qw.eq("province", province); + } + String city = query.getCity(); + if (!StringUtils.isEmpty(city)) { + qw.eq("city", city); + } + String district = query.getDistrict(); + if (!StringUtils.isEmpty(district)) { + qw.eq("district", district); + } + String detailAddress = query.getDetailAddress(); + if (!StringUtils.isEmpty(detailAddress)) { + qw.like("detail_address", detailAddress); + } + return memberAddressMapper.selectList(qw); + } + + /** + * 新增会员收货地址 + * + * @param memberAddress 会员收货地址 + * @return 结果 + */ + public int insert(MemberAddress memberAddress) { + memberAddress.setCreateTime(LocalDateTime.now()); + return memberAddressMapper.insert(memberAddress); + } + + /** + * 修改会员收货地址 + * + * @param memberAddress 会员收货地址 + * @return 结果 + */ + public int update(MemberAddress memberAddress) { + return memberAddressMapper.updateById(memberAddress); + } + + /** + * 删除会员收货地址信息 + * + * @param id 会员收货地址主键 + * @return 结果 + */ + public int deleteById(Long id) { + return memberAddressMapper.deleteById(id); + } + + public Integer deleteUserIds(List ids) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(MemberAddress::getMemberId, SecurityUtils.getUserId()); + qw.in(MemberAddress::getId, ids); + return memberAddressMapper.delete(qw); + } + + public MemberAddress selectByUserAndId(Long id) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(MemberAddress::getMemberId, SecurityUtils.getUserId()); + qw.eq(MemberAddress::getId, id); + return memberAddressMapper.selectOne(qw); + } + + public int updateSelective(MemberAddress address) { + return memberAddressMapper.updateByPrimaryKeySelective(address); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberCartService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberCartService.java new file mode 100644 index 000000000..1a300453e --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberCartService.java @@ -0,0 +1,199 @@ +package com.wzj.soopin.member.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.h5.config.SecurityUtil; +import com.cyl.manager.pms.domain.entity.Sku; +import com.cyl.manager.pms.mapper.ProductMapper; +import com.cyl.manager.pms.mapper.SkuMapper; +import com.cyl.manager.ums.convert.MemberCartConvert; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.entity.MemberCart; +import com.cyl.manager.ums.domain.form.UpdateMemberCartForm; +import com.cyl.manager.ums.domain.query.MemberCartQuery; +import com.cyl.manager.ums.domain.vo.MemberCartVO; +import com.cyl.manager.ums.mapper.MemberCartMapper; +import com.cyl.manager.ums.mapper.MemberMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.exception.base.BaseException; +import com.ruoyi.common.utils.AesCryptoUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.SortUtil; +import com.ruoyi.framework.config.LocalDataUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 购物车Service业务层处理 + * + * @author zcc + */ +@Service +public class MemberCartService { + @Autowired + private MemberCartMapper memberCartMapper; + @Autowired + private SkuMapper skuMapper; + @Autowired + private MemberMapper memberMapper; + @Autowired + private ProductMapper productMapper; + @Autowired + private MemberCartConvert memberCartConvert; + @Value("${aes.key}") + private String aesKey; + + /** + * 查询购物车 + * + * @param id 购物车主键 + * @return 购物车 + */ + public MemberCart selectById(Long id) { + return memberCartMapper.selectById(id); + } + + /** + * 查询购物车列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 购物车 + */ + public PageImpl selectList(MemberCartQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize(), SortUtil.sort2string(page.getSort(),"id desc")); + } + if (!StrUtil.isEmpty(query.getPhone())){ + query.setPhone(AesCryptoUtils.encrypt(aesKey, query.getPhone())); + } + List memberCartList = memberCartMapper.selectByPage(query); + long total = ((com.github.pagehelper.Page)memberCartList).getTotal(); + if (CollectionUtil.isEmpty(memberCartList)){ + return new PageImpl<>(Collections.EMPTY_LIST, page, total); + } + //查sku + List skuIdList = memberCartList.stream().map(MemberCartVO::getSkuId).collect(Collectors.toList()); + QueryWrapper skuQw = new QueryWrapper<>(); + skuQw.in("id", skuIdList); + Map skuMap = skuMapper.selectList(skuQw).stream().collect(Collectors.toMap(Sku::getId, it -> it)); + memberCartList.forEach(item -> { + if (!skuMap.containsKey(item.getSkuId())){ + item.setStatus(0); + item.setSkuIfExist(0); + }else { + Sku sku = skuMap.get(item.getSkuId()); + item.setPrice(sku.getPrice()); + item.setSkuIfExist(1); + } + }); + return new PageImpl<>(memberCartList, page, total); + } + + /** + * 新增购物车 + * + * @param memberCart 购物车 + * @return 结果 + */ + public int insert(MemberCart memberCart) { + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + memberCart.setMemberId(member.getId()); + //判断cart是否存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("member_id",member.getId()); + queryWrapper.eq("sku_id",memberCart.getSkuId()); + queryWrapper.eq("product_id",memberCart.getProductId()); + List memberCarts = memberCartMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(memberCarts)) { + memberCart.setStatus(1); + memberCart.setCreateTime(LocalDateTime.now()); + memberCart.setCreateBy(member.getId()); + return memberCartMapper.insert(memberCart); + } + MemberCart dbCart = memberCarts.get(0); + dbCart.setUpdateTime(LocalDateTime.now()); + dbCart.setQuantity(dbCart.getQuantity() + memberCart.getQuantity()); + return memberCartMapper.updateById(dbCart); + } + + /** + * 修改购物车 + * + * @param memberCart 购物车 + * @return 结果 + */ + public int update(MemberCart memberCart) { + MemberCart cart = memberCartMapper.selectById(memberCart.getId()); + if (cart == null){ + return 0; + } + cart.setQuantity(memberCart.getQuantity()); + cart.setUpdateTime(LocalDateTime.now()); + cart.setUpdateBy(SecurityUtil.getLocalMember().getId()); + return memberCartMapper.updateById(cart); + } + public int update(UpdateMemberCartForm form) { + if (form.getNum() == null || form.getId() == null) { + throw new BaseException("参数错误"); + } + Long userId = SecurityUtils.getUserId(); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(MemberCart::getMemberId, userId); + qw.eq(MemberCart::getId, form.getId()); + if (form.getNum() <= 0) { + return memberCartMapper.delete(qw); + } + MemberCart e = new MemberCart(); + e.setQuantity(form.getNum()); + return memberCartMapper.update(e, qw); + } + + /** + * 删除购物车信息 + * + * @param id 购物车主键 + * @return 结果 + */ + public int deleteById(Long id) { + return memberCartMapper.deleteById(id); + } + + /** + * 删除购物车信息 + * + * @param ids 购物车主键 + * @return 结果 + */ + public int deleteByIds(String ids) { + List idList = Arrays.stream(ids.split(",")).map(it -> Long.parseLong(it)).collect(Collectors.toList()); + return memberCartMapper.deleteBatchIds(idList); + } + + public Integer mineCartNum() { + Long userId = SecurityUtils.getUserId(); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("member_id", userId); + qw.eq("status", 1); + qw.select("count(quantity) quantity"); + MemberCart c = memberCartMapper.selectOne(qw); + if (c == null) { + return 0; + } + return c.getQuantity(); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberLogininforService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberLogininforService.java new file mode 100644 index 000000000..4677d3862 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberLogininforService.java @@ -0,0 +1,113 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.entity.MemberLogininfor; +import com.cyl.manager.ums.domain.query.MemberLogininforQuery; +import com.cyl.manager.ums.mapper.MemberLogininforMapper; +import com.cyl.manager.ums.mapper.MemberMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.AesCryptoUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 会员登录记录Service业务层处理 + * + * + * @author zcc + */ +@Service +public class MemberLogininforService { + @Autowired + private MemberLogininforMapper memberLogininforMapper; + + @Autowired + private MemberMapper memberMapper; + + @Value("${aes.key}") + private String aesKey; + + /** + * 查询会员登录记录 + * + * @param id 会员登录记录主键 + * @return 会员登录记录 + */ + public MemberLogininfor selectById(Long id) { + return memberLogininforMapper.selectById(id); + } + + /** + * 查询会员登录记录列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 会员登录记录 + */ + public List selectList(MemberLogininforQuery query, Pageable page) { + QueryWrapper qw = new QueryWrapper<>(); + String phone = query.getPhone(); + if (!StringUtils.isEmpty(phone)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Member::getPhoneEncrypted, AesCryptoUtils.encrypt(aesKey, phone)); + Member member = memberMapper.selectOne(wrapper); + if (member != null){ + qw.eq("phone", member.getPhoneEncrypted()); + }else { + qw.eq("phone", "-1"); + } + } + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + String ipaddr = query.getIpaddr(); + if (!StringUtils.isEmpty(ipaddr)) { + qw.eq("ipaddr", ipaddr); + } + String loginLocation = query.getLoginLocation(); + if (!StringUtils.isEmpty(loginLocation)) { + qw.eq("login_location", loginLocation); + } + String browser = query.getBrowser(); + if (!StringUtils.isEmpty(browser)) { + qw.eq("browser", browser); + } + String os = query.getOs(); + if (!StringUtils.isEmpty(os)) { + qw.eq("os", os); + } + if (query.getBeginTime() != null && query.getEndTime() != null) { + qw.ge("login_time", query.getBeginTime()); + qw.lt("login_time", query.getEndTime()); + } + qw.orderByDesc("login_time"); + return memberLogininforMapper.selectList(qw); + } + + /** + * 修改会员登录记录 + * + * @param memberLogininfor 会员登录记录 + * @return 结果 + */ + public int update(MemberLogininfor memberLogininfor) { + return memberLogininforMapper.updateById(memberLogininfor); + } + + /** + * 删除会员登录记录信息 + * + * @param id 会员登录记录主键 + * @return 结果 + */ + public int deleteById(Long id) { + return memberLogininforMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberService.java new file mode 100644 index 000000000..1857344c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberService.java @@ -0,0 +1,160 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.cyl.manager.oms.mapper.AftersaleMapper; +import com.cyl.manager.oms.mapper.OrderMapper; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.entity.MemberCart; +import com.cyl.manager.ums.domain.form.ChangeMemberStatusForm; +import com.cyl.manager.ums.domain.query.MemberQuery; +import com.cyl.manager.ums.domain.vo.MemberDataStatisticsVO; +import com.cyl.manager.ums.mapper.MemberCartMapper; +import com.cyl.manager.ums.mapper.MemberMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.AesCryptoUtils; +import com.ruoyi.common.utils.SortUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 会员信息Service业务层处理 + * + * + * @author zcc + */ +@Service +public class MemberService { + @Autowired + private MemberMapper memberMapper; + @Value("${aes.key}") + private String aesKey; + + @Autowired + private MemberCartMapper memberCartMapper; + + @Autowired + private OrderMapper orderMapper; + + @Autowired + private AftersaleMapper aftersaleMapper; + + /** + * 查询会员信息 + * + * @param id 会员信息主键 + * @return 会员信息 + */ + public Member selectById(Long id) { + return memberMapper.selectById(id); + } + + /** + * 查询会员信息列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 会员信息 + */ + public List selectList(MemberQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize(), SortUtil.sort2string(page.getSort(),"id desc")); + } + QueryWrapper qw = new QueryWrapper<>(); + String nicknameLike = query.getNickname(); + if (!StringUtils.isEmpty(nicknameLike)) { + qw.like("nickname", nicknameLike); + } + String phone = query.getPhone(); + if (!StringUtils.isEmpty(phone)) { + qw.eq("phone_encrypted", AesCryptoUtils.encrypt(aesKey, phone)); + } + if (!StringUtils.isEmpty(query.getBeginTime()) && !StringUtils.isEmpty(query.getEndTime())){ + qw.ge("create_time", query.getBeginTime()); + qw.lt("create_time", query.getEndTime()); + } + if (query.getHasMark() != null) { + switch (query.getHasMark()) { + case 0: + qw.isNull("mark").or().eq("mark",""); + break; + case 1: + qw.isNotNull("mark").ne("mark",""); + break; + default: + break; + } + } + if (query.getStatus() != null){ + qw.eq("status", query.getStatus()); + } + return memberMapper.selectList(qw); + } + + /** + * 新增会员信息 + * + * @param member 会员信息 + * @return 结果 + */ + public int insert(Member member) { + member.setCreateTime(LocalDateTime.now()); + return memberMapper.insert(member); + } + + /** + * 修改会员信息 + * + * @param member 会员信息 + * @return 结果 + */ + public int update(Member member) { + return memberMapper.updateById(member); + } + + public int updateMark(Member member) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("mark",member.getMark()) + .set("update_time",LocalDateTime.now()) + .eq("id",member.getId()); + return memberMapper.update(null,updateWrapper); + } + + /** + * 删除会员信息信息 + * + * @param id 会员信息主键 + * @return 结果 + */ + public int deleteById(Long id) { + return memberMapper.deleteById(id); + } + + public Integer changeStatus(ChangeMemberStatusForm dto) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("id", dto.getMemberId()); + wrapper.set("status", dto.getStatus()); + return memberMapper.update(null, wrapper); + } + + public String getPhoneDecrypted(String phoneEncrypted) { + return AesCryptoUtils.decrypt(aesKey, phoneEncrypted); + } + + public MemberDataStatisticsVO viewStatistics(Long memberId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MemberCart::getMemberId, memberId); + int cartCount = memberCartMapper.selectCount(wrapper); + MemberDataStatisticsVO vo = orderMapper.statOrderCountAndAmount(memberId); + vo.setCartCount(cartCount); + vo.setAftersaleCount(aftersaleMapper.countByMemberId(memberId)); + return vo; + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberWechatService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberWechatService.java new file mode 100644 index 000000000..2bdc2b293 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberWechatService.java @@ -0,0 +1,248 @@ +package com.wzj.soopin.member.service; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.external.WechatUtil; +import com.cyl.external.resp.AccessTokenResp; +import com.cyl.external.resp.UserInfoResp; +import com.cyl.h5.domain.form.WechatLoginForm; +import com.cyl.h5.service.H5MemberService; +import com.cyl.manager.ums.convert.MemberWechatConvert; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.entity.MemberWechat; +import com.cyl.manager.ums.domain.query.MemberWechatQuery; +import com.cyl.manager.ums.mapper.MemberWechatMapper; +import com.cyl.wechat.WechatPayData; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.ExtraUserBody; +import com.ruoyi.framework.web.service.SysLoginService; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; + +/** + * 用户微信信息Service业务层处理 + * + * + * @author zcc + */ +@Slf4j +@Service +public class MemberWechatService { + @Autowired + private MemberWechatMapper memberWechatMapper; + @Autowired + private MemberWechatConvert memberWechatConvert; + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private ISysUserService userService; + @Autowired + private SysLoginService loginService; + @Autowired + private RestTemplate restTemplate; + @Autowired + private H5MemberService memberService; + private static String LOGIN_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=#{APPID}&secret=#{SECRET}&js_code=#{JSCODE}&grant_type=authorization_code"; + + + /** + * 查询用户微信信息 + * + * @param id 用户微信信息主键 + * @return 用户微信信息 + */ + public MemberWechat selectById(Long id) { + return memberWechatMapper.selectById(id); + } + + /** + * 查询用户微信信息列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 用户微信信息 + */ + public List selectList(MemberWechatQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long memberId = query.getMemberId(); + if (memberId != null) { + qw.eq("member_id", memberId); + } + String unionid = query.getUnionid(); + if (!StringUtils.isEmpty(unionid)) { + qw.eq("unionid", unionid); + } + String openid = query.getOpenid(); + if (!StringUtils.isEmpty(openid)) { + qw.eq("openid", openid); + } + String routineOpenid = query.getRoutineOpenid(); + if (!StringUtils.isEmpty(routineOpenid)) { + qw.eq("routine_openid", routineOpenid); + } + Integer groupid = query.getGroupid(); + if (groupid != null) { + qw.eq("groupid", groupid); + } + String tagidList = query.getTagidList(); + if (!StringUtils.isEmpty(tagidList)) { + qw.eq("tagid_list", tagidList); + } + Integer subscribe = query.getSubscribe(); + if (subscribe != null) { + qw.eq("subscribe", subscribe); + } + Integer subscribeTime = query.getSubscribeTime(); + if (subscribeTime != null) { + qw.eq("subscribe_time", subscribeTime); + } + String sessionKey = query.getSessionKey(); + if (!StringUtils.isEmpty(sessionKey)) { + qw.eq("session_key", sessionKey); + } + String accessToken = query.getAccessToken(); + if (!StringUtils.isEmpty(accessToken)) { + qw.eq("access_token", accessToken); + } + Integer expiresIn = query.getExpiresIn(); + if (expiresIn != null) { + qw.eq("expires_in", expiresIn); + } + String refreshToken = query.getRefreshToken(); + if (!StringUtils.isEmpty(refreshToken)) { + qw.eq("refresh_token", refreshToken); + } + LocalDateTime expireTime = query.getExpireTime(); + if (expireTime != null) { + qw.eq("expire_time", expireTime); + } + return memberWechatMapper.selectList(qw); + } + + /** + * 新增用户微信信息 + * + * @param memberWechat 用户微信信息 + * @return 结果 + */ + public int insert(MemberWechat memberWechat) { + memberWechat.setCreateTime(LocalDateTime.now()); + return memberWechatMapper.insert(memberWechat); + } + + /** + * 修改用户微信信息 + * + * @param memberWechat 用户微信信息 + * @return 结果 + */ + public int update(MemberWechat memberWechat) { + return memberWechatMapper.updateById(memberWechat); + } + + /** + * 删除用户微信信息信息 + * + * @param id 用户微信信息主键 + * @return 结果 + */ + public int deleteById(Long id) { + return memberWechatMapper.deleteById(id); + } + + public String login(WechatLoginForm form) { + // 1. code -> token + AccessTokenResp tokenResp = WechatUtil.getAccessToken(form.getCode()); + // 2. token -> user_info + UserInfoResp info = null; + try { + info = WechatUtil.getUserInfo(tokenResp.getAccessToken(), tokenResp.getOpenid()); + } catch (Exception e) { + log.error("form: {}", form.getCode(), e); + } + // 3. 查找用户是否存在, 若没有则创建 + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(MemberWechat::getOpenid, tokenResp.getOpenid()); + MemberWechat m = memberWechatMapper.selectOne(qw); + SysUser u; + if (m != null) { + SysUser update = new SysUser(); + if (info != null) { + if (StrUtil.isNotEmpty(info.getNickname())) { + update.setNickName(info.getNickname()); + } + if (info.getSex() != null) { + update.setSex(info.getSex() + ""); + } + if (StrUtil.isNotEmpty(info.getHeadimgurl())) { + update.setAvatar(info.getHeadimgurl()); + } + update.setUserId(m.getMemberId()); + sysUserMapper.updateUser(update); + } + u = sysUserMapper.selectUserById(m.getMemberId()); + } else { + ExtraUserBody body = ExtraUserBody.builder() + .nickname(info == null ? "" : info.getNickname()) + .avatar(info == null ? "" : info.getHeadimgurl()) + .login(RandomUtil.randomNumbers(9)) + .sex(info == null ? null : info.getSex()) + .build(); + u = loginService.initVipUser(body); + MemberWechat w = memberWechatConvert.info2do(tokenResp); + w.setMemberId(u.getUserId()); + w.setExpireTime(LocalDateTime.now().plus(tokenResp.getExpiresIn(), ChronoUnit.SECONDS)); + memberWechatMapper.insert(w); + } + // 4. 生成token + return loginService.createToken(u); + } + + public JSONObject getSessionId(String code) { + String url = LOGIN_URL.replace("#{APPID}", WechatPayData.miniProgramAppId) + .replace("#{SECRET}", WechatPayData.miniProgramSecret) + .replace("#{JSCODE}", code); + log.info("获取openid,url:{}", url); + try { + ResponseEntity res = restTemplate.getForEntity(url, String.class); + String body = res.getBody(); + if (com.ruoyi.common.utils.StringUtils.isEmpty(body)) { + throw new Exception("获取openid出错"); + } + return JSONObject.parseObject(body); + } catch (Exception e) { + log.error("获取openid报错", e); + return null; + } + } + + public String getToken(String openId) { + //判断openid是否存在 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("routine_openid", openId); + MemberWechat memberWechat = memberWechatMapper.selectOne(qw); + if (memberWechat == null) { + return null; + } + Member member = memberService.selectById(memberWechat.getMemberId()); + return memberService.getLoginResponse(member.getId()).getToken(); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/AddressMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/AddressMapper.xml new file mode 100644 index 000000000..e19506e65 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/AddressMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + select id, code, parent_code, name, level, created_at, updated_at, deleted_at from address + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/FeedbackMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/FeedbackMapper.xml new file mode 100644 index 000000000..c83404ffd --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/FeedbackMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + select id, type, content, images, phone, create_by, create_time, handle_status, remark, handle_time from ums_feedback + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAccountMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAccountMapper.xml new file mode 100644 index 000000000..d1677012d --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAccountMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + select member_id, integral_balance, total_integral_balance, update_time, create_time from ums_member_account + + + update ums_member_account set integral_balance = integral_balance + #{amount},total_integral_balance = total_integral_balance + #{amount},update_time = now() + where member_id = #{memberId} + + + update ums_member_account set integral_balance = integral_balance - #{useIntegral},update_time = now() + where member_id = #{memberId} + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAddressMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAddressMapper.xml new file mode 100644 index 000000000..e53837ccb --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberAddressMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, member_id, name, phone_hidden,phone_encrypted, default_status, post_code, province, city, district, detail_address, is_default, create_by, create_time, update_by, update_time from ums_member_address + + + + + + update ums_member_address + + + member_id = #{memberId, jdbcType=BIGINT}, + + + name = #{name, jdbcType=BIGINT}, + + + phone = #{phone, jdbcType=BIGINT}, + + + default_status = #{defaultStatus, jdbcType=BIGINT}, + + + post_code = #{postCode, jdbcType=BIGINT}, + + + province = #{province, jdbcType=BIGINT}, + + + city = #{city, jdbcType=BIGINT}, + + + district = #{district, jdbcType=BIGINT}, + + + detail_address = #{detailAddress, jdbcType=BIGINT}, + + + is_default = #{isDefault, jdbcType=BIGINT}, + + + create_by = #{createBy, jdbcType=BIGINT}, + + + create_time = #{createTime, jdbcType=BIGINT}, + + + update_by = #{updateBy, jdbcType=BIGINT}, + + + update_time = #{updateTime, jdbcType=BIGINT}, + + + where id = #{id, jdbcType=BIGINT} + + + update ums_member_address + set is_default = #{param1} + where member_id = #{param2} + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberCartMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberCartMapper.xml new file mode 100644 index 000000000..0ae91ce4d --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberCartMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, status, member_id, product_id, pic, sku_id, product_name, sp_data, quantity, create_by, create_time, update_by, update_time from ums_member_cart + + + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberLogininforMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberLogininforMapper.xml new file mode 100644 index 000000000..b16e51e2a --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberLogininforMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + select id, phone, member_id, ipaddr, login_location, browser, os, login_time from ums_member_logininfor + + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberMapper.xml new file mode 100644 index 000000000..d0ce8e1c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, nickname, password, phone, mark, status, avatar, gender, city, province, country, remark, birthday, spread_uid, spread_time, level, integral, create_by, create_time, update_by, update_time from ums_member + + + + diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberWechatMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberWechatMapper.xml new file mode 100644 index 000000000..61d29f698 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/ums/MemberWechatMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, member_id, unionid, openid, routine_openid, groupid, tagid_list, subscribe, subscribe_time, session_key, access_token, expires_in, refresh_token, expire_time, create_by, create_time, update_by, update_time from ums_member_wechat + + + + diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml new file mode 100644 index 000000000..e8faeab3e --- /dev/null +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -0,0 +1,102 @@ + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-order + + + system系统模块 + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java new file mode 100644 index 000000000..c4fed83d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java @@ -0,0 +1,101 @@ +package com.wzj.soopin.order.controller; + + +import java.util.List; + +/** + * 订单售后Controller + * + * @author zcc + * @date 2022-12-29 + */ +@Api(description ="订单售后接口列表") +@RestController +@RequestMapping("/oms/aftersale") +@Slf4j +public class AftersaleController extends BaseController { + @Autowired + private AftersaleService service; + @Autowired + private AftersaleConvert convert; + @Autowired + private RedisService redisService; + + @ApiOperation("查询订单售后列表") + @PreAuthorize("@ss.hasPermi('oms:aftersale:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody ManagerAftersaleOrderForm query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出订单售后列表") + @PreAuthorize("@ss.hasPermi('oms:aftersale:export')") + @Log(title = "订单售后", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(AftersaleQuery query) { +// List list = service.selectList(query, null); +// ExcelUtil util = new ExcelUtil<>(AftersaleVO.class); +// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单售后数据")); + return null; + } + + @ApiOperation("获取订单售后详细信息") + @PreAuthorize("@ss.hasPermi('oms:aftersale:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long orderId) { + return ResponseEntity.ok(service.selectById(orderId)); + } + + @ApiOperation("新增订单售后") + @PreAuthorize("@ss.hasPermi('oms:aftersale:add')") + @Log(title = "订单售后", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody Aftersale aftersale) { + return ResponseEntity.ok(service.insert(aftersale)); + } + + @ApiOperation("修改订单售后") + @PreAuthorize("@ss.hasPermi('oms:aftersale:edit')") + @Log(title = "订单售后", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody Aftersale aftersale) { + return ResponseEntity.ok(service.update(aftersale)); + } + + @ApiOperation("删除订单售后") + @PreAuthorize("@ss.hasPermi('oms:aftersale:remove')") + @Log(title = "订单售后", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } + + @ApiOperation("售后订单操作") + @PostMapping("/dealWith") + public ResponseEntity updateStatus(@RequestBody DealWithAftersaleForm request){ + LoginUser user = SecurityUtils.getLoginUser(); + String redisKey = "manager_oms_order_updateOrderStatus_" + user.getUserId(); + String redisValue = user.getUserId() + "_" + System.currentTimeMillis(); + try { + redisService.lock(redisKey, redisValue, 60); + service.dealWith(request, user.getUserId(), user.getUser().getNickName()); + return ResponseEntity.ok(true); + } catch (Exception e) { + log.error("售后订单操作发生异常", e); + throw new RuntimeException(e.getMessage()); + } finally { + try { + redisService.unLock(redisKey, redisValue); + } catch (Exception e) { + log.error("", e); + } + } + } + + @ApiOperation("查看日志") + @GetMapping("/log/{orderId}") + public ResponseEntity> log(@PathVariable Long orderId){ + return ResponseEntity.ok(service.log(orderId)); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java new file mode 100644 index 000000000..0f267928e --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.order.controller; + +import com.cyl.manager.oms.convert.AftersaleItemConvert; +import com.cyl.manager.oms.domain.entity.AftersaleItem; +import com.cyl.manager.oms.domain.query.AftersaleItemQuery; +import com.cyl.manager.oms.domain.vo.AftersaleItemVO; +import com.cyl.manager.oms.service.AftersaleItemService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 订单售后Controller + * + * @author zcc + * @date 2022-12-29 + */ +@Api(description ="订单售后接口列表") +@RestController +@RequestMapping("/oms/aftersaleItem") +public class AftersaleItemController extends BaseController { + @Autowired + private AftersaleItemService service; + @Autowired + private AftersaleItemConvert convert; + + @ApiOperation("查询订单售后列表") + @PreAuthorize("@ss.hasPermi('oms:aftersaleItem:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody AftersaleItemQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出订单售后列表") + @PreAuthorize("@ss.hasPermi('oms:aftersaleItem:export')") + @Log(title = "订单售后", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(AftersaleItemQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(AftersaleItemVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单售后数据")); + } + + @ApiOperation("获取订单售后详细信息") + @PreAuthorize("@ss.hasPermi('oms:aftersaleItem:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增订单售后") + @PreAuthorize("@ss.hasPermi('oms:aftersaleItem:add')") + @Log(title = "订单售后", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody AftersaleItem aftersaleItem) { + return ResponseEntity.ok(service.insert(aftersaleItem)); + } + + @ApiOperation("修改订单售后") + @PreAuthorize("@ss.hasPermi('oms:aftersaleItem:edit')") + @Log(title = "订单售后", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody AftersaleItem aftersaleItem) { + return ResponseEntity.ok(service.update(aftersaleItem)); + } + + @ApiOperation("删除订单售后") + @PreAuthorize("@ss.hasPermi('oms:aftersaleItem:remove')") + @Log(title = "订单售后", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java new file mode 100644 index 000000000..72b6833f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java @@ -0,0 +1,143 @@ +package com.wzj.soopin.order.controller; + +import com.cyl.manager.oms.convert.OrderConvert; +import com.cyl.manager.oms.domain.entity.Order; +import com.cyl.manager.oms.domain.form.DeliverProductForm; +import com.cyl.manager.oms.domain.form.ManagerOrderQueryForm; +import com.cyl.manager.oms.domain.query.OrderQuery; +import com.cyl.manager.oms.domain.vo.ManagerOrderDetailVO; +import com.cyl.manager.oms.domain.vo.ManagerOrderVO; +import com.cyl.manager.oms.domain.vo.OrderOperateHistoryVO; +import com.cyl.manager.oms.service.OrderService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +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.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; + +import java.util.List; +/** + * 订单表Controller + * + * @author zcc + * @date 2022-12-01 + */ +@Api(description ="订单表接口列表") +@RestController +@RequestMapping("/oms/order") +@Slf4j +public class OrderController extends BaseController { + @Autowired + private OrderService service; + @Autowired + private OrderConvert convert; + @Autowired + private RedisService redisService; + + @ApiOperation("查询订单表列表") + @PreAuthorize("@ss.hasPermi('oms:order:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody ManagerOrderQueryForm query, Pageable page) { + return ResponseEntity.ok(service.selectList(query, page)); + } + + @ApiOperation("修改收件人信息") + @PostMapping("/receiver/update") + public ResponseEntity updateReceiver(@RequestBody Order order) { + return ResponseEntity.ok(service.updateReceiver(order)); + } + + @ApiOperation("导出订单表列表") + @PreAuthorize("@ss.hasPermi('oms:order:export')") + @Log(title = "订单表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(OrderQuery query) { +// List list = service.selectList(query, null); +// ExcelUtil util = new ExcelUtil<>(OrderVO.class); +// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单表数据")); + return null; + } + + @ApiOperation("获取订单表详细信息") + @PreAuthorize("@ss.hasPermi('oms:order:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增订单表") + @PreAuthorize("@ss.hasPermi('oms:order:add')") + @Log(title = "订单表", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody Order order) { + return ResponseEntity.ok(service.insert(order)); + } + + @ApiOperation("修改订单表") + @PreAuthorize("@ss.hasPermi('oms:order:edit')") + @Log(title = "订单表", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody Order order) { + return ResponseEntity.ok(service.update(order)); + } + + @ApiOperation("删除订单表") + @PreAuthorize("@ss.hasPermi('oms:order:remove')") + @Log(title = "订单表", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } + + @ApiOperation("添加备注") + @PreAuthorize("@ss.hasPermi('oms:order:note:add')") + @Log(title = "订单表", businessType = BusinessType.UPDATE) + @PostMapping("/merchantNote/add") + public ResponseEntity saveMerchantNote(@RequestBody Order order){ + return ResponseEntity.ok(service.saveMerchantNote(order)); + } + + @ApiOperation("管理后台订单发货") + @PreAuthorize("@ss.hasPermi('oms:order:delivery')") + @PostMapping("/deliverProduct") + public ResponseEntity delivery(@RequestBody DeliverProductForm request){ + Long userId = SecurityUtils.getUserId(); + String redisKey = "oms_order_deliverProduct" + request.getOrderId(); + String redisValue = request.getOrderId() + "_" + System.currentTimeMillis(); + try{ + redisService.lock(redisKey, redisValue, 60); + return ResponseEntity.ok(service.deliverProduct(request, userId)); + }catch (Exception e){ + log.error("订单发货接口异常"); + throw new RuntimeException("发货失败"); + }finally { + try{ + redisService.unLock(redisKey, redisValue);; + }catch (Exception e){ + log.error("", e); + } + } + } + + @ApiOperation("订单日志") + @GetMapping("/log/{orderId}") + public ResponseEntity> log(@PathVariable Long orderId){ + return ResponseEntity.ok(service.log(orderId)); + } + + @PreAuthorize("@ss.hasAnyRoles('admin')") + @ApiOperation("订单解密") + @GetMapping("/decryptPhone/{orderId}") + public ResponseEntity decryptPhone(@PathVariable Long orderId){ + String decryptPhone = service.decryptPhone(orderId); + return ResponseEntity.ok(decryptPhone); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java new file mode 100644 index 000000000..3cc554488 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.order.controller; + +import com.cyl.manager.oms.convert.OrderDeliveryHistoryConvert; +import com.cyl.manager.oms.domain.entity.OrderDeliveryHistory; +import com.cyl.manager.oms.domain.query.OrderDeliveryHistoryQuery; +import com.cyl.manager.oms.domain.vo.OrderDeliveryHistoryVO; +import com.cyl.manager.oms.service.OrderDeliveryHistoryService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 订单发货记录Controller + * + * @author zcc + * @date 2022-12-01 + */ +@Api(description ="订单发货记录接口列表") +@RestController +@RequestMapping("/oms/orderDeliveryHistory") +public class OrderDeliveryHistoryController extends BaseController { + @Autowired + private OrderDeliveryHistoryService service; + @Autowired + private OrderDeliveryHistoryConvert convert; + + @ApiOperation("查询订单发货记录列表") + @PreAuthorize("@ss.hasPermi('oms:orderDeliveryHistory:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody OrderDeliveryHistoryQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出订单发货记录列表") + @PreAuthorize("@ss.hasPermi('oms:orderDeliveryHistory:export')") + @Log(title = "订单发货记录", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(OrderDeliveryHistoryQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(OrderDeliveryHistoryVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单发货记录数据")); + } + + @ApiOperation("获取订单发货记录详细信息") + @PreAuthorize("@ss.hasPermi('oms:orderDeliveryHistory:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增订单发货记录") + @PreAuthorize("@ss.hasPermi('oms:orderDeliveryHistory:add')") + @Log(title = "订单发货记录", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody OrderDeliveryHistory orderDeliveryHistory) { + return ResponseEntity.ok(service.insert(orderDeliveryHistory)); + } + + @ApiOperation("修改订单发货记录") + @PreAuthorize("@ss.hasPermi('oms:orderDeliveryHistory:edit')") + @Log(title = "订单发货记录", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody OrderDeliveryHistory orderDeliveryHistory) { + return ResponseEntity.ok(service.update(orderDeliveryHistory)); + } + + @ApiOperation("删除订单发货记录") + @PreAuthorize("@ss.hasPermi('oms:orderDeliveryHistory:remove')") + @Log(title = "订单发货记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java new file mode 100644 index 000000000..3e32e73aa --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.order.controller; + +import com.cyl.manager.oms.convert.OrderItemConvert; +import com.cyl.manager.oms.domain.entity.OrderItem; +import com.cyl.manager.oms.domain.query.OrderItemQuery; +import com.cyl.manager.oms.domain.vo.OrderItemVO; +import com.cyl.manager.oms.service.OrderItemService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 订单中所包含的商品Controller + * + * @author zcc + * @date 2022-12-01 + */ +@Api(description ="订单中所包含的商品接口列表") +@RestController +@RequestMapping("/oms/orderItem") +public class OrderItemController extends BaseController { + @Autowired + private OrderItemService service; + @Autowired + private OrderItemConvert convert; + + @ApiOperation("查询订单中所包含的商品列表") + @PreAuthorize("@ss.hasPermi('oms:orderItem:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody OrderItemQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出订单中所包含的商品列表") + @PreAuthorize("@ss.hasPermi('oms:orderItem:export')") + @Log(title = "订单中所包含的商品", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(OrderItemQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(OrderItemVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单中所包含的商品数据")); + } + + @ApiOperation("获取订单中所包含的商品详细信息") + @PreAuthorize("@ss.hasPermi('oms:orderItem:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增订单中所包含的商品") + @PreAuthorize("@ss.hasPermi('oms:orderItem:add')") + @Log(title = "订单中所包含的商品", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody OrderItem orderItem) { + return ResponseEntity.ok(service.insert(orderItem)); + } + + @ApiOperation("修改订单中所包含的商品") + @PreAuthorize("@ss.hasPermi('oms:orderItem:edit')") + @Log(title = "订单中所包含的商品", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody OrderItem orderItem) { + return ResponseEntity.ok(service.update(orderItem)); + } + + @ApiOperation("删除订单中所包含的商品") + @PreAuthorize("@ss.hasPermi('oms:orderItem:remove')") + @Log(title = "订单中所包含的商品", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java new file mode 100644 index 000000000..0e93e2971 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.order.controller; + +import com.cyl.manager.oms.convert.OrderOperateHistoryConvert; +import com.cyl.manager.oms.domain.entity.OrderOperateHistory; +import com.cyl.manager.oms.domain.query.OrderOperateHistoryQuery; +import com.cyl.manager.oms.domain.vo.OrderOperateHistoryVO; +import com.cyl.manager.oms.service.OrderOperateHistoryService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 订单操作历史记录Controller + * + * @author zcc + * @date 2022-12-01 + */ +@Api(description ="订单操作历史记录接口列表") +@RestController +@RequestMapping("/oms/orderOperateHistory") +public class OrderOperateHistoryController extends BaseController { + @Autowired + private OrderOperateHistoryService service; + @Autowired + private OrderOperateHistoryConvert convert; + + @ApiOperation("查询订单操作历史记录列表") + @PreAuthorize("@ss.hasPermi('oms:orderOperateHistory:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody OrderOperateHistoryQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出订单操作历史记录列表") + @PreAuthorize("@ss.hasPermi('oms:orderOperateHistory:export')") + @Log(title = "订单操作历史记录", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(OrderOperateHistoryQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(OrderOperateHistoryVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单操作历史记录数据")); + } + + @ApiOperation("获取订单操作历史记录详细信息") + @PreAuthorize("@ss.hasPermi('oms:orderOperateHistory:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增订单操作历史记录") + @PreAuthorize("@ss.hasPermi('oms:orderOperateHistory:add')") + @Log(title = "订单操作历史记录", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody OrderOperateHistory orderOperateHistory) { + return ResponseEntity.ok(service.insert(orderOperateHistory)); + } + + @ApiOperation("修改订单操作历史记录") + @PreAuthorize("@ss.hasPermi('oms:orderOperateHistory:edit')") + @Log(title = "订单操作历史记录", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody OrderOperateHistory orderOperateHistory) { + return ResponseEntity.ok(service.update(orderOperateHistory)); + } + + @ApiOperation("删除订单操作历史记录") + @PreAuthorize("@ss.hasPermi('oms:orderOperateHistory:remove')") + @Log(title = "订单操作历史记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java new file mode 100644 index 000000000..7838d1c03 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.order.controller; + +import com.cyl.manager.oms.convert.WechatPaymentHistoryConvert; +import com.cyl.manager.oms.domain.entity.WechatPaymentHistory; +import com.cyl.manager.oms.domain.query.WechatPaymentHistoryQuery; +import com.cyl.manager.oms.domain.vo.WechatPaymentHistoryVO; +import com.cyl.manager.oms.service.WechatPaymentHistoryService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +/** + * 微信订单表Controller + * + * @author zcc + * @date 2023-07-12 + */ +@Api(description ="微信订单表接口列表") +@RestController +@RequestMapping("/pms/omsWechatPaymentHistory") +public class WechatPaymentHistoryController extends BaseController { + @Autowired + private WechatPaymentHistoryService service; + @Autowired + private WechatPaymentHistoryConvert convert; + + @ApiOperation("查询微信订单表列表") + @PreAuthorize("@ss.hasPermi('pms:omsWechatPaymentHistory:list')") + @PostMapping("/list") + public ResponseEntity> list(@RequestBody WechatPaymentHistoryQuery query, Pageable page) { + List list = service.selectList(query, page); + return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); + } + + @ApiOperation("导出微信订单表列表") + @PreAuthorize("@ss.hasPermi('pms:omsWechatPaymentHistory:export')") + @Log(title = "微信订单表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(WechatPaymentHistoryQuery query) { + List list = service.selectList(query, null); + ExcelUtil util = new ExcelUtil<>(WechatPaymentHistoryVO.class); + return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "微信订单表数据")); + } + + @ApiOperation("获取微信订单表详细信息") + @PreAuthorize("@ss.hasPermi('pms:omsWechatPaymentHistory:query')") + @GetMapping(value = "/{id}") + public ResponseEntity getInfo(@PathVariable("id") Long id) { + return ResponseEntity.ok(service.selectById(id)); + } + + @ApiOperation("新增微信订单表") + @PreAuthorize("@ss.hasPermi('pms:omsWechatPaymentHistory:add')") + @Log(title = "微信订单表", businessType = BusinessType.INSERT) + @PostMapping + public ResponseEntity add(@RequestBody WechatPaymentHistory wechatPaymentHistory) { + return ResponseEntity.ok(service.insert(wechatPaymentHistory)); + } + + @ApiOperation("修改微信订单表") + @PreAuthorize("@ss.hasPermi('pms:omsWechatPaymentHistory:edit')") + @Log(title = "微信订单表", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseEntity edit(@RequestBody WechatPaymentHistory wechatPaymentHistory) { + return ResponseEntity.ok(service.update(wechatPaymentHistory)); + } + + @ApiOperation("删除微信订单表") + @PreAuthorize("@ss.hasPermi('pms:omsWechatPaymentHistory:remove')") + @Log(title = "微信订单表", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public ResponseEntity remove(@PathVariable Long id) { + return ResponseEntity.ok(service.deleteById(id)); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java new file mode 100644 index 000000000..2c94841d9 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.Aftersale; +import com.cyl.manager.oms.domain.vo.AftersaleVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 订单售后 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface AftersaleConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java new file mode 100644 index 000000000..f918723de --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.AftersaleItem; +import com.cyl.manager.oms.domain.vo.AftersaleItemVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 订单售后 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface AftersaleItemConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java new file mode 100644 index 000000000..2a5746d3f --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java @@ -0,0 +1,19 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.Order; +import com.cyl.manager.oms.domain.vo.OrderVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 订单表 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface OrderConvert { + + List dos2vos(List list); + + OrderVO do2vo(Order order); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java new file mode 100644 index 000000000..2abab9130 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.OrderDeliveryHistory; +import com.cyl.manager.oms.domain.vo.OrderDeliveryHistoryVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 订单发货记录 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface OrderDeliveryHistoryConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java new file mode 100644 index 000000000..e6449abf2 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.OrderItem; +import com.cyl.manager.oms.domain.vo.OrderItemVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 订单中所包含的商品 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface OrderItemConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java new file mode 100644 index 000000000..01c192007 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.OrderOperateHistory; +import com.cyl.manager.oms.domain.vo.OrderOperateHistoryVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 订单操作历史记录 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface OrderOperateHistoryConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java new file mode 100644 index 000000000..b2724c77f --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java @@ -0,0 +1,17 @@ +package com.wzj.soopin.order.convert; + +import com.cyl.manager.oms.domain.entity.WechatPaymentHistory; +import com.cyl.manager.oms.domain.vo.WechatPaymentHistoryVO; +import org.mapstruct.Mapper; + +import java.util.List; +/** + * 微信订单表 DO <=> DTO <=> VO / BO / Query + * + * @author zcc + */ +@Mapper(componentModel = "spring") +public interface WechatPaymentHistoryConvert { + + List dos2vos(List list); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Aftersale.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Aftersale.java new file mode 100644 index 000000000..ab7d69785 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Aftersale.java @@ -0,0 +1,85 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +/** + * 订单售后对象 oms_aftersale + * + * @author zcc + */ +@ApiModel(description="订单售后对象") +@Data +@TableName("oms_aftersale") +public class Aftersale extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + @ApiModelProperty("MEMBER_ID") + @Excel(name = "MEMBER_ID") + private Long memberId; + + @ApiModelProperty("订单id") + @Excel(name = "订单id") + private Long orderId; + + @ApiModelProperty("退款金额") + @Excel(name = "退款金额") + private BigDecimal returnAmount; + + @ApiModelProperty("售后类型:1:退款,2:退货退款") + @Excel(name = "售后类型:1:退款,2:退货退款") + private Integer type; + + @ApiModelProperty("申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝") + @Excel(name = "申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝") + private Integer status; + + @ApiModelProperty("处理时间") + @Excel(name = "处理时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime handleTime; + + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private Integer quantity; + + @ApiModelProperty("原因") + @Excel(name = "原因") + private String reason; + + @ApiModelProperty("描述") + @Excel(name = "描述") + private String description; + + @ApiModelProperty("凭证图片,以逗号隔开") + @Excel(name = "凭证图片,以逗号隔开") + private String proofPics; + + @ApiModelProperty("处理备注") + @Excel(name = "处理备注") + private String handleNote; + + @ApiModelProperty("处理人员") + @Excel(name = "处理人员") + private String handleMan; + + @ApiModelProperty("退款快递公司") + @Excel(name = "退款快递公司") + private String refundWpCode; + + @ApiModelProperty("退货快递号") + @Excel(name = "退货快递号") + private String refundWaybillCode; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java new file mode 100644 index 000000000..20017bc2b --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/AftersaleItem.java @@ -0,0 +1,49 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 订单售后对象 oms_aftersale_item + * + * @author zcc + */ +@ApiModel(description="订单售后对象") +@Data +@TableName("oms_aftersale_item") +public class AftersaleItem extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("MEMBER_ID") + @Excel(name = "MEMBER_ID") + private Long memberId; + + @ApiModelProperty("售后单id") + @Excel(name = "售后单id") + private Long aftersaleId; + + @ApiModelProperty("订单id") + @Excel(name = "订单id") + private Long orderId; + + @ApiModelProperty("子订单id") + @Excel(name = "子订单id") + private Long orderItemId; + + @ApiModelProperty("退款金额") + @Excel(name = "退款金额") + private BigDecimal returnAmount; + + @ApiModelProperty("退货数量") + @Excel(name = "退货数量") + private Integer quantity; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java new file mode 100644 index 000000000..db4a49248 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java @@ -0,0 +1,162 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +/** + * 订单表对象 oms_order + * + * @author zcc + */ +@ApiModel(description="订单表对象") +@Data +@TableName("oms_order") +public class Order extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("订单id") + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + @ApiModelProperty("支付id") + private Long payId; + + @ApiModelProperty("订单编号") + @Excel(name = "订单编号") + private String orderSn; + + @ApiModelProperty("MEMBER_ID") + @Excel(name = "MEMBER_ID") + private Long memberId; + + @ApiModelProperty("用户帐号") + @Excel(name = "用户帐号") + private String memberUsername; + + @ApiModelProperty("订单总金额") + @Excel(name = "订单总金额") + private BigDecimal totalAmount; + + @ApiModelProperty("采购价") + @Excel(name = "采购价") + private BigDecimal purchasePrice; + + @ApiModelProperty("应付金额(实际支付金额)") + @Excel(name = "应付金额", readConverterExp = "实=际支付金额") + private BigDecimal payAmount; + + @ApiModelProperty("运费金额") + @Excel(name = "运费金额") + private BigDecimal freightAmount; + + @ApiModelProperty("支付方式:0->未支付;1->支付宝;2->微信") + @Excel(name = "支付方式:0->未支付;1->支付宝;2->微信") + private Integer payType; + + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + @Excel(name = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + private Integer status; + + @ApiModelProperty("退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") + @Excel(name = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") + private Integer aftersaleStatus; + + @ApiModelProperty("物流公司(配送方式)") + @Excel(name = "物流公司(配送方式)") + private String deliveryCompany; + + @ApiModelProperty("物流单号") + @Excel(name = "物流单号") + private String deliverySn; + + @ApiModelProperty("自动确认时间(天)") + @Excel(name = "自动确认时间", readConverterExp = "天=") + private Integer autoConfirmDay; + + @ApiModelProperty("收货人姓名") + @Excel(name = "收货人姓名") + private String receiverName; + + @ApiModelProperty("收货人电话") + @Excel(name = "收货人电话") + private String receiverPhone; + + @ApiModelProperty("加密的手机号") + @Excel(name = "加密的手机号") + private String receiverPhoneEncrypted; + + @ApiModelProperty("收货人邮编") + @Excel(name = "收货人邮编") + private String receiverPostCode; + + @ApiModelProperty("省份/直辖市") + @Excel(name = "省份/直辖市") + private String receiverProvince; + + @ApiModelProperty("城市") + @Excel(name = "城市") + private String receiverCity; + + @ApiModelProperty("区") + @Excel(name = "区") + private String receiverDistrict; + + @ApiModelProperty("省份/直辖市id") + @Excel(name = "省份/直辖市id") + private Long receiverProvinceId; + + @ApiModelProperty("城市id") + @Excel(name = "城市id") + private Long receiverCityId; + + @ApiModelProperty("区id") + @Excel(name = "区id") + private Long receiverDistrictId; + + @ApiModelProperty("详细地址") + @Excel(name = "详细地址") + private String receiverDetailAddress; + + @ApiModelProperty("订单备注") + @Excel(name = "订单备注") + private String note; + + @ApiModelProperty("商家备注") + @Excel(name = "商家备注") + private String merchantNote; + + @ApiModelProperty("确认收货状态:0->未确认;1->已确认") + @Excel(name = "确认收货状态:0->未确认;1->已确认") + private Integer confirmStatus; + + @ApiModelProperty("删除状态:0->未删除;1->已删除") + @Excel(name = "删除状态:0->未删除;1->已删除") + private Integer deleteStatus; + + @ApiModelProperty("支付时间") + @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime paymentTime; + + @ApiModelProperty("发货时间") + @Excel(name = "发货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime deliveryTime; + + @ApiModelProperty("确认收货时间") + @Excel(name = "确认收货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime receiveTime; + + @ApiModelProperty("优惠券ID") + private Long memberCouponId; + + @ApiModelProperty("优惠券金额") + private BigDecimal couponAmount; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderDeliveryHistory.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderDeliveryHistory.java new file mode 100644 index 000000000..a9cb62951 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderDeliveryHistory.java @@ -0,0 +1,35 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 订单发货记录对象 oms_order_delivery_history + * + * @author zcc + */ +@ApiModel(description="订单发货记录对象") +@Data +@TableName("oms_order_delivery_history") +public class OrderDeliveryHistory extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("订单id") + @Excel(name = "订单id") + private Long orderId; + + @ApiModelProperty("物流公司(配送方式)") + @Excel(name = "物流公司(配送方式)") + private String deliveryCompany; + + @ApiModelProperty("物流单号") + @Excel(name = "物流单号") + private String deliverySn; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java new file mode 100644 index 000000000..9d4966faa --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderItem.java @@ -0,0 +1,84 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 订单中所包含的商品对象 oms_order_item + * + * @author zcc + */ +@ApiModel(description="订单中所包含的商品对象") +@Data +@TableName("oms_order_item") +public class OrderItem extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + @ApiModelProperty("订单id") + @Excel(name = "订单id") + private Long orderId; + + @ApiModelProperty("PRODUCT_ID") + @Excel(name = "PRODUCT_ID") + private Long productId; + + @ApiModelProperty("商品编码") + @Excel(name = "商品编码") + private String outProductId; + + @ApiModelProperty("商品sku id") + @Excel(name = "商品sku id") + private Long skuId; + + @ApiModelProperty("sku编码") + @Excel(name = "sku编码") + private String outSkuId; + + @ApiModelProperty("商品快照id") + @Excel(name = "商品快照id") + private Long productSnapshotId; + + @ApiModelProperty("sku快照id") + @Excel(name = "sku快照id") + private Long skuSnapshotId; + + @ApiModelProperty("展示图片") + @Excel(name = "展示图片") + private String pic; + + @ApiModelProperty("PRODUCT_NAME") + @Excel(name = "PRODUCT_NAME") + private String productName; + + @ApiModelProperty("销售价格") + @Excel(name = "销售价格") + private BigDecimal salePrice; + + @ApiModelProperty("采购价") + @Excel(name = "采购价") + private BigDecimal purchasePrice; + + @ApiModelProperty("购买数量") + @Excel(name = "购买数量") + private Integer quantity; + + @ApiModelProperty("商品分类id") + @Excel(name = "商品分类id") + private Long productCategoryId; + + @ApiModelProperty("商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]") + @Excel(name = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]") + private String spData; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderOperateHistory.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderOperateHistory.java new file mode 100644 index 000000000..06c3b8624 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/OrderOperateHistory.java @@ -0,0 +1,43 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * 订单操作历史记录对象 oms_order_operate_history + * + * @author zcc + */ +@ApiModel(description="订单操作历史记录对象") +@Data +@TableName("oms_order_operate_history") +public class OrderOperateHistory extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("订单id") + @Excel(name = "订单id") + private Long orderId; + + @ApiModelProperty("订单号") + @Excel(name = "订单号") + private String orderSn; + + @ApiModelProperty("操作人:用户;系统;后台管理员") + @Excel(name = "操作人:用户;系统;后台管理员") + private String operateMan; + + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + @Excel(name = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + private Integer orderStatus; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String note; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/WechatPaymentHistory.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/WechatPaymentHistory.java new file mode 100644 index 000000000..7e823eb47 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/WechatPaymentHistory.java @@ -0,0 +1,73 @@ +package com.wzj.soopin.order.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 微信订单表对象 oms_wechat_payment_history + * + * @author zcc + */ +@ApiModel(description="微信订单表对象") +@Data +@TableName("oms_wechat_payment_history") +public class WechatPaymentHistory extends BaseAudit { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + private Long id; + + @ApiModelProperty("payment_id") + @Excel(name = "payment_id") + private String paymentId; + + @ApiModelProperty("用户 ID") + @Excel(name = "用户 ID") + private Long memberId; + + @ApiModelProperty("OPENID") + @Excel(name = "OPENID") + private String openid; + + @ApiModelProperty("真实姓名,提现需要") + @Excel(name = "真实姓名,提现需要") + private String realName; + + @ApiModelProperty("标题|商品名称") + @Excel(name = "标题|商品名称") + private String title; + + @ApiModelProperty("订单号 支付时是payId 其他为orderId") + @Excel(name = "订单号 支付时是payId 其他为orderId") + private Long orderId; + + @ApiModelProperty("金额,单位分") + @Excel(name = "金额,单位分") + private BigDecimal money; + + @ApiModelProperty("交易类型(1为支付 2为提现 3为退款)") + @Excel(name = "交易类型", readConverterExp = "1=为支付,2=为提现,3=为退款") + private Integer opType; + + @ApiModelProperty("状态(0:未完成交易 1:完成关键交易)") + @Excel(name = "状态", readConverterExp = "0=:未完成交易,1=:完成关键交易") + private Integer paymentStatus; + + @ApiModelProperty("备注") + @Excel(name = "备注") + private String remark; + + @ApiModelProperty("附加数据") + @Excel(name = "附加数据") + private String attach; + + @ApiModelProperty("响应内容") + @Excel(name = "响应内容") + private String responseBody; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DealWithAftersaleForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DealWithAftersaleForm.java new file mode 100644 index 000000000..dca458157 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DealWithAftersaleForm.java @@ -0,0 +1,23 @@ + package com.wzj.soopin.order.domain.form; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + + @Data + @ApiModel(value = "商城售后订单处理操作请求体") + public class DealWithAftersaleForm { + @ApiModelProperty(name = "orderId",value = "订单id",required = true,dataType = "Long") + @NotBlank(message = "订单id不能为空") + private Long orderId; + + @ApiModelProperty(name = "optType",value = "操作类型 1同意 2拒绝 3确认收货",required = true,dataType = "String") + @NotNull(message = "操作类型不能为空") + private Integer optType; + + @ApiModelProperty(name = "remark",value = "拒绝理由 操作类型为2时必填",required = true,dataType = "String") + private String remark; + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java new file mode 100644 index 000000000..290edd35d --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.order.domain.form; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +@Getter +@Setter +public class DeliverProductForm { + @ApiModelProperty("订单id") + @NotBlank(message = "订单id不能为空") + @Excel(name = "订单号") + private Long orderId; + + @ApiModelProperty("快递名称") + @NotBlank(message = "快递名称不能为空") + @Excel(name = "快递公司") + private String expressName; + + @ApiModelProperty("快递单号") + @NotBlank(message = "快递单号不能为空") + @Excel(name = "运单号") + private String expressSn; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java new file mode 100644 index 000000000..65f638cf4 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java @@ -0,0 +1,41 @@ +package com.wzj.soopin.order.domain.form; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + + +@Data +@ApiModel(value = "商城订单请求体") +public class ManagerAftersaleOrderForm { + + @ApiModelProperty(name = "id", value = "售后单号", required = true, dataType = "Long") + private Long id; + + @ApiModelProperty(name = "orderSn", value = "订单号", required = true, dataType = "String") + private String orderSn; + + @ApiModelProperty(name = "userPhone", value = "用户名称(手机号)", required = true, dataType = "String") + private String userPhone; + + @ApiModelProperty(name = "status", value = "售后申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝;4->用户取消", required = true, dataType = "String") + private Integer status; + + @ApiModelProperty(name = "type", value = "售后类型:1->退款;2->退货退款", required = true, dataType = "String") + private Integer type; + + @ApiModelProperty(name = "startTime", value = "开始时间", required = true, dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty(name = "endTime", value = "结束时间", required = true, dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java new file mode 100644 index 000000000..2663832b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java @@ -0,0 +1,54 @@ +package com.wzj.soopin.order.domain.form; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +@Data +@ApiModel("后台订单查询请求体") +public class ManagerOrderQueryForm { + @ApiModelProperty(name = "orderId", value = "订单id", required = true, dataType = "Long") + private Long orderId; + + @ApiModelProperty(name = "orderSn", value = "订单编号", required = true, dataType = "String") + private String orderSn; + + + @ApiModelProperty(name = "productId", value = "商品id", required = true, dataType = "Long") + private Long productId; + + @ApiModelProperty(name = "productName", value = "商品名称", required = true, dataType = "String") + private String productName; + + @ApiModelProperty(name = "userPhone", value = "用户名称(手机号)", required = true, dataType = "String") + private String userPhone; + + @ApiModelProperty(name = "payType", value = "支付方式 0->未支付;1->支付宝;2->微信", required = true, dataType = "Integer") + private Integer payType; + + @ApiModelProperty(name = "status", value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单", required = true, dataType = "String") + private Integer status; + + @ApiModelProperty("省份/直辖市 精确匹配") + private String receiverProvince; + + @ApiModelProperty("城市 精确匹配") + private String receiverCity; + + @ApiModelProperty("区 精确匹配") + private String receiverDistrict; + + @ApiModelProperty(name = "startTime", value = "开始时间", required = true, dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty(name = "endTime", value = "结束时间", required = true, dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java new file mode 100644 index 000000000..ff3a77318 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java @@ -0,0 +1,32 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单售后 查询 对象 + * + * @author zcc + */ +@ApiModel(description="订单售后 查询 对象") +@Data +public class AftersaleItemQuery { + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("子订单id 精确匹配") + private Long orderItemId; + + @ApiModelProperty("退款金额 精确匹配") + private BigDecimal returnAmount; + + @ApiModelProperty("退货数量 精确匹配") + private Integer quantity; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java new file mode 100644 index 000000000..ef85f9e2c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java @@ -0,0 +1,54 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 订单售后 查询 对象 + * + * @author zcc + */ +@ApiModel(description="订单售后 查询 对象") +@Data +public class AftersaleQuery { + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("退款金额 精确匹配") + private BigDecimal returnAmount; + + @ApiModelProperty("售后类型:1:退款,2:退货退款 精确匹配") + private Integer type; + + @ApiModelProperty("申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝 精确匹配") + private Integer status; + + @ApiModelProperty("处理时间 精确匹配") + private LocalDateTime handleTime; + + @ApiModelProperty("退货数量 精确匹配") + private Integer quantity; + + @ApiModelProperty("原因 精确匹配") + private String reason; + + @ApiModelProperty("描述 精确匹配") + private String description; + + @ApiModelProperty("凭证图片,以逗号隔开 精确匹配") + private String proofPics; + + @ApiModelProperty("处理备注 精确匹配") + private String handleNote; + + @ApiModelProperty("处理人员 精确匹配") + private String handleMan; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java new file mode 100644 index 000000000..ca101e948 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java @@ -0,0 +1,24 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单发货记录 查询 对象 + * + * @author zcc + */ +@ApiModel(description="订单发货记录 查询 对象") +@Data +public class OrderDeliveryHistoryQuery { + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("物流公司 精确匹配") + private String deliveryCompany; + + @ApiModelProperty("物流单号 精确匹配") + private String deliverySn; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java new file mode 100644 index 000000000..4e737ffdb --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java @@ -0,0 +1,59 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单中所包含的商品 查询 对象 + * + * @author zcc + */ +@ApiModel(description="订单中所包含的商品 查询 对象") +@Data +public class OrderItemQuery { + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("PRODUCT_ID 精确匹配") + private Long productId; + + @ApiModelProperty("商品编码 精确匹配") + private String outProductId; + + @ApiModelProperty("商品sku id 精确匹配") + private Long skuId; + + @ApiModelProperty("sku编码 精确匹配") + private String outSkuId; + + @ApiModelProperty("商品快照id 精确匹配") + private Long productSnapshotId; + + @ApiModelProperty("sku快照id 精确匹配") + private Long skuSnapshotId; + + @ApiModelProperty("展示图片 精确匹配") + private String pic; + + @ApiModelProperty("PRODUCT_NAME 精确匹配") + private String productNameLike; + + @ApiModelProperty("销售价格 精确匹配") + private BigDecimal salePrice; + + @ApiModelProperty("采购价 精确匹配") + private BigDecimal purchasePrice; + + @ApiModelProperty("购买数量 精确匹配") + private Integer quantity; + + @ApiModelProperty("商品分类id 精确匹配") + private Long productCategoryId; + + @ApiModelProperty("商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] 精确匹配") + private String spData; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java new file mode 100644 index 000000000..e4a6f034b --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单操作历史记录 查询 对象 + * + * @author zcc + */ +@ApiModel(description="订单操作历史记录 查询 对象") +@Data +public class OrderOperateHistoryQuery { + @ApiModelProperty("订单号 精确匹配") + private String orderSn; + + @ApiModelProperty("操作人:用户;系统;后台管理员 精确匹配") + private String operateMan; + + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 精确匹配") + private Integer orderStatus; + + @ApiModelProperty("备注 精确匹配") + private String note; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java new file mode 100644 index 000000000..4c90cd574 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java @@ -0,0 +1,107 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 订单表 查询 对象 + * + * @author zcc + */ +@ApiModel(description="订单表 查询 对象") +@Data +public class OrderQuery { + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("用户帐号 精确匹配") + private String memberUsernameLike; + + @ApiModelProperty("订单总金额 精确匹配") + private BigDecimal totalAmount; + + @ApiModelProperty("采购价 精确匹配") + private BigDecimal purchasePrice; + + @ApiModelProperty("应付金额(实际支付金额) 精确匹配") + private BigDecimal payAmount; + + @ApiModelProperty("运费金额 精确匹配") + private BigDecimal freightAmount; + + @ApiModelProperty("支付方式:0->未支付;1->支付宝;2->微信 精确匹配") + private Integer payType; + + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 精确匹配") + private Integer status; + + @ApiModelProperty("退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功 精确匹配") + private Integer aftersaleStatus; + + @ApiModelProperty("物流公司 精确匹配") + private String deliveryCompany; + + @ApiModelProperty("物流单号 精确匹配") + private String deliverySn; + + @ApiModelProperty("自动确认时间(天) 精确匹配") + private Integer autoConfirmDay; + + @ApiModelProperty("收货人姓名 精确匹配") + private String receiverNameLike; + + @ApiModelProperty("收货人电话 精确匹配") + private String receiverPhone; + + @ApiModelProperty("收货人邮编 精确匹配") + private String receiverPostCode; + + @ApiModelProperty("省份/直辖市 精确匹配") + private String receiverProvince; + + @ApiModelProperty("城市 精确匹配") + private String receiverCity; + + @ApiModelProperty("区 精确匹配") + private String receiverDistrict; + + @ApiModelProperty("省份/直辖市id 精确匹配") + private Long receiverProvinceId; + + @ApiModelProperty("城市id 精确匹配") + private Long receiverCityId; + + @ApiModelProperty("区id 精确匹配") + private Long receiverDistrictId; + + @ApiModelProperty("详细地址 精确匹配") + private String receiverDetailAddress; + + @ApiModelProperty("订单备注 精确匹配") + private String note; + + @ApiModelProperty("确认收货状态:0->未确认;1->已确认 精确匹配") + private Integer confirmStatus; + + @ApiModelProperty("删除状态:0->未删除;1->已删除 精确匹配") + private Integer deleteStatus; + + @ApiModelProperty("支付时间 精确匹配") + private LocalDateTime paymentTime; + + @ApiModelProperty("发货时间 精确匹配") + private LocalDateTime deliveryTime; + + @ApiModelProperty("确认收货时间 精确匹配") + private LocalDateTime receiveTime; + + @ApiModelProperty("创建订单开始时间") + private LocalDateTime startTime; + + @ApiModelProperty("创建订单结束时间") + private LocalDateTime endTime; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java new file mode 100644 index 000000000..36a18fe90 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java @@ -0,0 +1,50 @@ +package com.wzj.soopin.order.domain.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 微信订单表 查询 对象 + * + * @author zcc + */ +@ApiModel(description="微信订单表 查询 对象") +@Data +public class WechatPaymentHistoryQuery { + @ApiModelProperty("payment_id 精确匹配") + private String paymentId; + + @ApiModelProperty("用户 ID 精确匹配") + private Long memberId; + + @ApiModelProperty("OPENID 精确匹配") + private String openid; + + @ApiModelProperty("真实姓名,提现需要 精确匹配") + private String realNameLike; + + @ApiModelProperty("标题|商品名称 精确匹配") + private String title; + + @ApiModelProperty("订单号 支付时是payId 其他为orderId 精确匹配") + private Long orderId; + + @ApiModelProperty("金额,单位分 精确匹配") + private BigDecimal money; + + @ApiModelProperty("交易类型(1为支付 2为提现 3为退款) 精确匹配") + private Integer opType; + + @ApiModelProperty("状态(0:未完成交易 1:完成关键交易) 精确匹配") + private Integer paymentStatus; + + @ApiModelProperty("附加数据 精确匹配") + private String attach; + + @ApiModelProperty("响应内容 精确匹配") + private String responseBody; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleItemVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleItemVO.java new file mode 100644 index 000000000..90f7ddb99 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleItemVO.java @@ -0,0 +1,35 @@ +package com.wzj.soopin.order.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 订单售后 数据视图对象 + * + * @author zcc + */ +@Data +public class AftersaleItemVO extends BaseAudit { + /** ID */ + private Long id; + /** MEMBER_ID */ + @Excel(name = "MEMBER_ID") + private Long memberId; + /** 售后单id */ + @Excel(name = "售后单id") + private Long aftersaleId; + /** 订单id */ + @Excel(name = "订单id") + private Long orderId; + /** 子订单id */ + @Excel(name = "子订单id") + private Long orderItemId; + /** 退款金额 */ + @Excel(name = "退款金额") + private BigDecimal returnAmount; + /** 退货数量 */ + @Excel(name = "退货数量") + private Integer quantity; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleVO.java new file mode 100644 index 000000000..0ceca8f42 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/AftersaleVO.java @@ -0,0 +1,56 @@ +package com.wzj.soopin.order.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +/** + * 订单售后 数据视图对象 + * + * @author zcc + */ +@Data +public class AftersaleVO extends BaseAudit { + /** ID */ + private Long id; + /** MEMBER_ID */ + @Excel(name = "MEMBER_ID") + private Long memberId; + /** 订单id */ + @Excel(name = "订单id") + private Long orderId; + /** 退款金额 */ + @Excel(name = "退款金额") + private BigDecimal returnAmount; + /** 售后类型:1:退款,2:退货退款 */ + @Excel(name = "售后类型:1:退款,2:退货退款") + private Integer type; + /** 申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝 */ + @Excel(name = "申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝") + private Integer status; + /** 处理时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "处理时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime handleTime; + /** 退货数量 */ + @Excel(name = "退货数量") + private Integer quantity; + /** 原因 */ + @Excel(name = "原因") + private String reason; + /** 描述 */ + @Excel(name = "描述") + private String description; + /** 凭证图片,以逗号隔开 */ + @Excel(name = "凭证图片,以逗号隔开") + private String proofPics; + /** 处理备注 */ + @Excel(name = "处理备注") + private String handleNote; + /** 处理人员 */ + @Excel(name = "处理人员") + private String handleMan; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderAddressVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderAddressVo.java new file mode 100644 index 000000000..f63f55516 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderAddressVo.java @@ -0,0 +1,26 @@ +package com.wzj.soopin.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @author: Jinxin + * @date: 2022/4/22 14:12 + * @Description: + */ +@Getter +@Setter +@ApiModel("订单收获地址") +public class ManagerOrderAddressVo { + @ApiModelProperty("收货人姓名") + private String name; + @ApiModelProperty("收货人手机号") + private String userPhone; + @ApiModelProperty("收获区域") + private String area; + @ApiModelProperty("详细地址") + private String address; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderDetailVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderDetailVO.java new file mode 100644 index 000000000..26001aeec --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderDetailVO.java @@ -0,0 +1,47 @@ +package com.wzj.soopin.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@ApiModel("后台订单详情对象") +public class ManagerOrderDetailVO { + @ApiModelProperty("订单id") + private Long orderId; + @ApiModelProperty("订单编号") + private String orderSn; + @ApiModelProperty("用户昵称") + private String userName; + @ApiModelProperty("用户手机号") + private String userPhone; + @ApiModelProperty("下单时间") + private LocalDateTime createTime; + @ApiModelProperty("支付方式:0->未支付;1->支付宝;2->微信") + private Integer payType; + @ApiModelProperty("支付时间") + private LocalDateTime payTime; + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + private Integer orderStatus; + @ApiModelProperty("订单收获地址信息") + private ManagerOrderAddressVo addressInfo; + @ApiModelProperty("订单商品信息") + private List productInfo; + @ApiModelProperty("发货时间") + private LocalDateTime deliveryTime; + @ApiModelProperty("收货时间") + private LocalDateTime receiveTime; + @ApiModelProperty("物流单号") + private String expressNo; + @ApiModelProperty("物流名称") + private String expressName; + @ApiModelProperty("支付金额") + private BigDecimal payAmount; + @ApiModelProperty("订单金额") + private BigDecimal totalAmount; + private BigDecimal couponAmount; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java new file mode 100644 index 000000000..d259f41f8 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java @@ -0,0 +1,25 @@ +package com.wzj.soopin.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel("订单") +public class ManagerOrderProductVO { + @ApiModelProperty("商品id") + private Long productId; + @ApiModelProperty("商品名称") + private String productName; + @ApiModelProperty("商品规格") + private String spData; + @ApiModelProperty("商品图片") + private String pic; + @ApiModelProperty("购买数量") + private Integer buyNum; + @ApiModelProperty("销售价格") + private BigDecimal salePrice; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java new file mode 100644 index 000000000..0e82b5ef9 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java @@ -0,0 +1,104 @@ +package com.wzj.soopin.order.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@ApiModel(value = "管理后台订单VO") +public class ManagerOrderVO { + @ApiModelProperty(name = "id",value = "订单id",required = true,dataType = "Long") + private Long id; + @ApiModelProperty(name = "orderSn",value = "订单编号",required = true,dataType = "String") + private String orderSn; + @ApiModelProperty(name = "productId",value = "商品id",required = true,dataType = "Long") + private Long productId; + + @ApiModelProperty(name = "productName",value = "商品名称",required = true,dataType = "String") + private String productName; + + @ApiModelProperty(name = "userPhone",value = "用户账号",required = true,dataType = "String") + private String userPhone; + + @ApiModelProperty(name = "nickName",value = "用户昵称",required = true,dataType = "String") + private String nickName; + + @ApiModelProperty(name = "avatar",value = "用户头像",required = true,dataType = "String") + private String avatar; + + @ApiModelProperty(name = "status",value = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单",required = true,dataType = "Integer") + private Integer status; + + @ApiModelProperty("退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") + private Integer aftersaleStatus; + + @ApiModelProperty(name = "pic",value = "商品图片",required = true,dataType = "String") + private String pic; + + @ApiModelProperty(name = "userName",value = "用户名称",required = true,dataType = "String") + private String userName; + + @ApiModelProperty(name = "buyNum",value = "购买数量",required = true,dataType = "Integer") + private Integer buyNum; + + @ApiModelProperty(name = "totalAmount",value = "订单总金额",required = true,dataType = "BigDecimal") + private BigDecimal totalAmount; + + @ApiModelProperty(name = "payAmount",value = "应付金额",required = true,dataType = "BigDecimal") + private BigDecimal payAmount; + + @ApiModelProperty(name = "createTime",value = "下单时间",required = true,dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @ApiModelProperty(name = "payTime",value = "支付时间",required = true,dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime payTime; + + @ApiModelProperty(name = "payType",value = "支付方式 支付方式:0->未支付;1->支付宝;2->微信",required = true,dataType = "Integer") + private Integer payType; + + @ApiModelProperty(name = "receiveTime",value = "确认收货时间",required = true,dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime receiveTime; + + @ApiModelProperty(name = "note",value = "备注",required = true,dataType = "String") + private String note; + + @ApiModelProperty("商家备注") + private String merchantNote; + + @ApiModelProperty(name = "spData",value = "商品sku属性",required = true,dataType = "String") + private String spData; + + @ApiModelProperty(name = "productInfo", value = "订单商品数据") + private List productList; + + @ApiModelProperty(name = "deliveryTime",value = "发货时间",required = true,dataType = "LocalDataTime") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime deliveryTime; + + @ApiModelProperty(name = "deliverySn",value = "物流单号",required = true,dataType = "String") + private String deliverySn; + + private String receiverName; + + private String receiverPhone; + + private String receiverProvince; + + private String receiverCity; + + private String receiverDistrict; + + private String receiverDetailAddress; + + private String mark; + + private BigDecimal couponAmount; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderDetailVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderDetailVO.java new file mode 100644 index 000000000..2fb049458 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderDetailVO.java @@ -0,0 +1,52 @@ +package com.wzj.soopin.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author: Jinxin + * @date: 2022/4/22 14:12 + * @Description: + */ +@Data +@ApiModel("售后订单详情") +public class ManagerRefundOrderDetailVO { + @ApiModelProperty("订单id") + private Long orderId; + @ApiModelProperty("订单号") + private String orderSn; + @ApiModelProperty("用户昵称") + private String nickName; + @ApiModelProperty("用户手机号") + private String phone; + @ApiModelProperty("下单时间") + private LocalDateTime createTime; + @ApiModelProperty("支付方式:0->未支付;1->支付宝;2->微信") + private Integer payType; + @ApiModelProperty("支付时间") + private LocalDateTime payTime; + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + private Integer status; + @ApiModelProperty("订单收获地址信息") + private OrderAddressVO addressInfo; + @ApiModelProperty("订单商品信息") + private List productList; + @ApiModelProperty("售后信息") + private List refundInfoList; + @ApiModelProperty("退货时间") + private LocalDateTime deliveryTime; + @ApiModelProperty("物流单号") + private String expressNo; + @ApiModelProperty("物流名称") + private String expressName; + @ApiModelProperty("订单总金额") + private BigDecimal totalAmount; + @ApiModelProperty("应付金额(实际支付金额)") + private BigDecimal payAmount; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderVO.java new file mode 100644 index 000000000..85a8b7e32 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerRefundOrderVO.java @@ -0,0 +1,86 @@ + package com.wzj.soopin.order.domain.vo; + + import io.swagger.annotations.ApiModel; + import io.swagger.annotations.ApiModelProperty; + import lombok.Data; + + import java.math.BigDecimal; + import java.time.LocalDateTime; + import java.util.List; + + + @Data + @ApiModel(value = "售后订单vo") + public class ManagerRefundOrderVO { + @ApiModelProperty(name = "id",value = "售后单id",required = true,dataType = "Long") + private Long id; + + @ApiModelProperty(name = "orderId",value = "订单id",required = true,dataType = "Long") + private Long orderId; + + @ApiModelProperty(name = "orderSn",value = "订单号",required = true,dataType = "String") + private String orderSn; + + @ApiModelProperty(name = "payId",value = "支付ID",required = true,dataType = "Long") + private Long payId; + + @ApiModelProperty(name = "phone",value = "用户手机号",required = true,dataType = "String") + private String phone; + + @ApiModelProperty(name = "nickName",value = "用户昵称",required = true,dataType = "String") + private String nickName; + + @ApiModelProperty(name = "status",value = "订单状态 0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单",required = true,dataType = "Integer") + private Integer status; + + @ApiModelProperty(name = "userName",value = "用户名称",required = true,dataType = "String") + private String userName; + + @ApiModelProperty(name = "payTime",value = "支付时间",required = true,dataType = "String") + private String payTime; + + @ApiModelProperty(name = "payType",value = "支付方式 支付方式:0->未支付;1->支付宝;2->微信",required = true,dataType = "Integer") + private Integer payType; + + @ApiModelProperty(name = "applyRefundTime",value = "申请售后的时间",required = true,dataType = "String") + private String applyRefundTime; + + @ApiModelProperty(name = "refundFinishTime",value = "售后完成的时间",required = true,dataType = "String") + private String refundFinishTime; + + @ApiModelProperty(name = "aftersaleStatus",value = "0->待处理;1->退货中;2->已完成;3->已拒绝; 4->用户取消",required = true,dataType = "String") + private Integer aftersaleStatus; + @ApiModelProperty(name = "note",value = "备注",required = true,dataType = "String") + private String note; + @ApiModelProperty(name = "applyRefundAmount",value = "退款金额",required = true,dataType = "BigDecimal") + private BigDecimal applyReturnAmount; + @ApiModelProperty(name = "refundNum",value = "退款数量",required = true,dataType = "Integer") + private Integer refundNum; + + @ApiModelProperty(name = "applyRefundType",value = "申请退货方式:1-仅退款,2-退货退款",required = true,dataType = "String") + private Integer applyRefundType; + @ApiModelProperty(name = "handleTime",value = "处理时间",required = true,dataType = "LocalDateTime") + private LocalDateTime handleTime; + + @ApiModelProperty(name = "reason",value = "原因",required = true,dataType = "String") + private String reason; + + @ApiModelProperty(name = "description",value = "描述",required = true,dataType = "String") + private String description; + + @ApiModelProperty(name = "proofPics",value = "凭证图片",required = true,dataType = "String") + private String proofPics; + + @ApiModelProperty(name = "productInfo", value = "售后单商品数据") + private List productList; + + @ApiModelProperty(name = "handleMan", value = "处理人员") + private String handleMan; + + private String mark; + + private String refundWpCode; + + @ApiModelProperty("退货快递号") + private String refundWaybillCode; + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderAddressVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderAddressVO.java new file mode 100644 index 000000000..278b0083a --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderAddressVO.java @@ -0,0 +1,26 @@ +package com.wzj.soopin.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @author: Jinxin + * @date: 2022/4/22 14:12 + * @Description: + */ +@Getter +@Setter +@ApiModel("订单收获地址") +public class OrderAddressVO { + @ApiModelProperty("收货人姓名") + private String name; + @ApiModelProperty("收货人手机号") + private String userPhone; + @ApiModelProperty("收获区域") + private String area; + @ApiModelProperty("详细地址") + private String address; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderDeliveryHistoryVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderDeliveryHistoryVO.java new file mode 100644 index 000000000..553d34550 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderDeliveryHistoryVO.java @@ -0,0 +1,24 @@ +package com.wzj.soopin.order.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; +/** + * 订单发货记录 数据视图对象 + * + * @author zcc + */ +@Data +public class OrderDeliveryHistoryVO extends BaseAudit { + /** ID */ + private Long id; + /** 订单id */ + @Excel(name = "订单id") + private Long orderId; + /** 物流公司(配送方式) */ + @Excel(name = "物流公司(配送方式)") + private String deliveryCompany; + /** 物流单号 */ + @Excel(name = "物流单号") + private String deliverySn; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderItemVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderItemVO.java new file mode 100644 index 000000000..b64afc41b --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderItemVO.java @@ -0,0 +1,59 @@ +package com.wzj.soopin.order.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 订单中所包含的商品 数据视图对象 + * + * @author zcc + */ +@Data +public class OrderItemVO extends BaseAudit { + /** ID */ + private Long id; + /** 订单id */ + @Excel(name = "订单id") + private Long orderId; + /** PRODUCT_ID */ + @Excel(name = "PRODUCT_ID") + private Long productId; + /** 商品编码 */ + @Excel(name = "商品编码") + private String outProductId; + /** 商品sku id */ + @Excel(name = "商品sku id") + private Long skuId; + /** sku编码 */ + @Excel(name = "sku编码") + private String outSkuId; + /** 商品快照id */ + @Excel(name = "商品快照id") + private Long productSnapshotId; + /** sku快照id */ + @Excel(name = "sku快照id") + private Long skuSnapshotId; + /** 展示图片 */ + @Excel(name = "展示图片") + private String pic; + /** PRODUCT_NAME */ + @Excel(name = "PRODUCT_NAME") + private String productName; + /** 销售价格 */ + @Excel(name = "销售价格") + private BigDecimal salePrice; + /** 采购价 */ + @Excel(name = "采购价") + private BigDecimal purchasePrice; + /** 购买数量 */ + @Excel(name = "购买数量") + private Integer quantity; + /** 商品分类id */ + @Excel(name = "商品分类id") + private Long productCategoryId; + /** 商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] */ + @Excel(name = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]") + private String spData; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderOperateHistoryVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderOperateHistoryVO.java new file mode 100644 index 000000000..5ad382ea8 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderOperateHistoryVO.java @@ -0,0 +1,30 @@ +package com.wzj.soopin.order.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; +/** + * 订单操作历史记录 数据视图对象 + * + * @author zcc + */ +@Data +public class OrderOperateHistoryVO extends BaseAudit { + /** ID */ + private Long id; + /** 订单id */ + @Excel(name = "订单id") + private Long orderId; + /** 订单号 */ + @Excel(name = "订单号") + private String orderSn; + /** 操作人:用户;系统;后台管理员 */ + @Excel(name = "操作人:用户;系统;后台管理员") + private String operateMan; + /** 订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 */ + @Excel(name = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + private Integer orderStatus; + /** 备注 */ + @Excel(name = "备注") + private String note; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java new file mode 100644 index 000000000..d8454b172 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java @@ -0,0 +1,113 @@ +package com.wzj.soopin.order.domain.vo; + +import com.cyl.manager.oms.domain.entity.OrderItem; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +/** + * 订单表 数据视图对象 + * + * @author zcc + */ +@Data +public class OrderVO extends BaseAudit { + /** 订单id */ + private Long id; + /** 支付id */ + private Long payId; + /** 订单编号 */ + private String orderSn; + /** MEMBER_ID */ + @Excel(name = "MEMBER_ID") + private Long memberId; + /** 用户帐号 */ + @Excel(name = "用户帐号") + private String memberUsername; + /** 订单总金额 */ + @Excel(name = "订单总金额") + private BigDecimal totalAmount; + /** 采购价 */ + @Excel(name = "采购价") + private BigDecimal purchasePrice; + /** 应付金额(实际支付金额) */ + @Excel(name = "应付金额", readConverterExp = "实=际支付金额") + private BigDecimal payAmount; + /** 运费金额 */ + @Excel(name = "运费金额") + private BigDecimal freightAmount; + /** 支付方式:0->未支付;1->支付宝;2->微信 */ + @Excel(name = "支付方式:0->未支付;1->支付宝;2->微信") + private Integer payType; + /** 订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 */ + @Excel(name = "订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单") + private Integer status; + /** 退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功 */ + @Excel(name = "退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功") + private Integer aftersaleStatus; + /** 物流公司(配送方式) */ + @Excel(name = "物流公司(配送方式)") + private String deliveryCompany; + /** 物流单号 */ + @Excel(name = "物流单号") + private String deliverySn; + /** 自动确认时间(天) */ + @Excel(name = "自动确认时间", readConverterExp = "天=") + private Integer autoConfirmDay; + /** 收货人姓名 */ + @Excel(name = "收货人姓名") + private String receiverName; + /** 收货人电话 */ + @Excel(name = "收货人电话") + private String receiverPhone; + /** 收货人邮编 */ + @Excel(name = "收货人邮编") + private String receiverPostCode; + /** 省份/直辖市 */ + @Excel(name = "省份/直辖市") + private String receiverProvince; + /** 城市 */ + @Excel(name = "城市") + private String receiverCity; + /** 区 */ + @Excel(name = "区") + private String receiverDistrict; + /** 省份/直辖市id */ + @Excel(name = "省份/直辖市id") + private Long receiverProvinceId; + /** 城市id */ + @Excel(name = "城市id") + private Long receiverCityId; + /** 区id */ + @Excel(name = "区id") + private Long receiverDistrictId; + /** 详细地址 */ + @Excel(name = "详细地址") + private String receiverDetailAddress; + /** 订单备注 */ + @Excel(name = "订单备注") + private String note; + /** 确认收货状态:0->未确认;1->已确认 */ + @Excel(name = "确认收货状态:0->未确认;1->已确认") + private Integer confirmStatus; + /** 删除状态:0->未删除;1->已删除 */ + @Excel(name = "删除状态:0->未删除;1->已删除") + private Integer deleteStatus; + /** 支付时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime paymentTime; + /** 发货时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "发货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime deliveryTime; + /** 确认收货时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "确认收货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime receiveTime; + private List items; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/RefundInfoVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/RefundInfoVO.java new file mode 100644 index 000000000..c40459613 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/RefundInfoVO.java @@ -0,0 +1,50 @@ +package com.wzj.soopin.order.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author: Jinxin + * @date: 2022/4/22 14:12 + * @Description: + */ +@Getter +@Setter +@ApiModel("售后信息") +public class RefundInfoVO { + @ApiModelProperty("退款单号") + private Long id; + @ApiModelProperty("申请退货方式:1-仅退款,2-退货退款") + private Integer applyRefundType; + @ApiModelProperty("申请售后时间") + private LocalDateTime applyRefundTime; + @ApiModelProperty("售后金额") + private BigDecimal refundAmount; + @ApiModelProperty("申请原因") + private String reason; + @ApiModelProperty("描述") + private String description; + @ApiModelProperty("凭证") + private String proofPics; + @ApiModelProperty("申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝; 4->用户取消") + private Integer refundStatus; + @ApiModelProperty("平台拒绝理由") + private String remark; + @ApiModelProperty("物流单号") + private String expressNo; + @ApiModelProperty("物流名称") + private String expressName; + @ApiModelProperty("最新物流数据") + private String logistics; + @ApiModelProperty("所有物流信息 JSON格式") + private String allLogistics; + private String refundWpCode; + + @ApiModelProperty("退货快递号") + private String refundWaybillCode; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/WechatPaymentHistoryVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/WechatPaymentHistoryVO.java new file mode 100644 index 000000000..ebbd80e6d --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/WechatPaymentHistoryVO.java @@ -0,0 +1,53 @@ +package com.wzj.soopin.order.domain.vo; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseAudit; +import lombok.Data; + +import java.math.BigDecimal; +/** + * 微信订单表 数据视图对象 + * + * @author zcc + */ +@Data +public class WechatPaymentHistoryVO extends BaseAudit { + /** ID */ + private Long id; + /** payment_id */ + @Excel(name = "payment_id") + private String paymentId; + /** 用户 ID */ + @Excel(name = "用户 ID") + private Long memberId; + /** OPENID */ + @Excel(name = "OPENID") + private String openid; + /** 真实姓名,提现需要 */ + @Excel(name = "真实姓名,提现需要") + private String realName; + /** 标题|商品名称 */ + @Excel(name = "标题|商品名称") + private String title; + /** 订单号 支付时是payId 其他为orderId */ + @Excel(name = "订单号 支付时是payId 其他为orderId") + private Long orderId; + /** 金额,单位分 */ + @Excel(name = "金额,单位分") + private BigDecimal money; + /** 交易类型(1为支付 2为提现 3为退款) */ + @Excel(name = "交易类型", readConverterExp = "1=为支付,2=为提现,3=为退款") + private Integer opType; + /** 状态(0:未完成交易 1:完成关键交易) */ + @Excel(name = "状态", readConverterExp = "0=:未完成交易,1=:完成关键交易") + private Integer paymentStatus; + /** 备注 */ + @Excel(name = "备注") + private String remark; + /** 附加数据 */ + @Excel(name = "附加数据") + private String attach; + /** 响应内容 */ + @Excel(name = "响应内容") + private String responseBody; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java new file mode 100644 index 000000000..595de210b --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java @@ -0,0 +1,25 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.oms.domain.entity.AftersaleItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 订单售后Mapper接口 + * + * @author zcc + */ +public interface AftersaleItemMapper extends BaseMapper { + /** + * 查询订单售后列表 + * + * @param aftersaleItem 订单售后 + * @return 订单售后集合 + */ + List selectByEntity(AftersaleItem aftersaleItem); + + Integer insertBatch(@Param("list") List list); + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java new file mode 100644 index 000000000..ea27ce188 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java @@ -0,0 +1,30 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.oms.domain.entity.Aftersale; +import com.cyl.manager.oms.domain.form.ManagerAftersaleOrderForm; +import com.cyl.manager.oms.domain.vo.ManagerRefundOrderVO; +import com.cyl.manager.statistics.domain.vo.OrderAndAftersaleStatisticsVO; + +import java.util.List; + +/** + * 订单售后Mapper接口 + * + * @author zcc + */ +public interface AftersaleMapper extends BaseMapper { + /** + * 查询订单售后列表 + * + * @param aftersale 订单售后 + * @return 订单售后集合 + */ + List selectByEntity(Aftersale aftersale); + + List selectManagerRefundOrder(ManagerAftersaleOrderForm managerAftersaleOrderPageRequest); + + int countByMemberId(Long memberId); + + OrderAndAftersaleStatisticsVO statPendingAndProcessing(); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java new file mode 100644 index 000000000..3cd23a7f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.oms.domain.entity.OrderDeliveryHistory; + +import java.util.List; + +/** + * 订单发货记录Mapper接口 + * + * @author zcc + */ +public interface OrderDeliveryHistoryMapper extends BaseMapper { + /** + * 查询订单发货记录列表 + * + * @param orderDeliveryHistory 订单发货记录 + * @return 订单发货记录集合 + */ + List selectByEntity(OrderDeliveryHistory orderDeliveryHistory); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java new file mode 100644 index 000000000..226f2ae6e --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.oms.domain.entity.OrderItem; + +import java.util.List; + +/** + * 订单中所包含的商品Mapper接口 + * + * @author zcc + */ +public interface OrderItemMapper extends BaseMapper { + /** + * 查询订单中所包含的商品列表 + * + * @param orderItem 订单中所包含的商品 + * @return 订单中所包含的商品集合 + */ + List selectByEntity(OrderItem orderItem); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java new file mode 100644 index 000000000..16504569d --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java @@ -0,0 +1,51 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.h5.domain.vo.CountOrderVO; +import com.cyl.h5.domain.vo.H5OrderVO; +import com.cyl.manager.aws.domain.entity.SystemStatistics; +import com.cyl.manager.oms.domain.entity.Order; +import com.cyl.manager.oms.domain.form.ManagerOrderQueryForm; +import com.cyl.manager.oms.domain.vo.ManagerOrderVO; +import com.cyl.manager.statistics.domain.vo.OrderAndAftersaleStatisticsVO; +import com.cyl.manager.ums.domain.vo.MemberDataStatisticsVO; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单表Mapper接口 + * + * @author zcc + */ +public interface OrderMapper extends BaseMapper { + /** + * 查询订单表列表 + * + * @param order 订单表 + * @return 订单表集合 + */ + List selectByEntity(Order order); + + List selectManagerOrderPage(ManagerOrderQueryForm request); + + List orderPage(@Param("status") Integer status, @Param("memberId")Long memberId); + + H5OrderVO selectOrderDetail(Long orderId); + + CountOrderVO countByStatusAndMemberId(Long memberId); + + Integer cancelBatch(@Param("list") List orderList); + + MemberDataStatisticsVO statOrderCountAndAmount(Long memberId); + + + Integer statWaitDelivered(); + + OrderAndAftersaleStatisticsVO statTodayData(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); + + SystemStatistics statNewAndDeal(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime); + + int statDealMember(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java new file mode 100644 index 000000000..c1407ecef --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.oms.domain.entity.OrderOperateHistory; + +import java.util.List; + +/** + * 订单操作历史记录Mapper接口 + * + * @author zcc + */ +public interface OrderOperateHistoryMapper extends BaseMapper { + /** + * 查询订单操作历史记录列表 + * + * @param orderOperateHistory 订单操作历史记录 + * @return 订单操作历史记录集合 + */ + List selectByEntity(OrderOperateHistory orderOperateHistory); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java new file mode 100644 index 000000000..36330198c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java @@ -0,0 +1,21 @@ +package com.wzj.soopin.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cyl.manager.oms.domain.entity.WechatPaymentHistory; + +import java.util.List; + +/** + * 微信订单表Mapper接口 + * + * @author zcc + */ +public interface WechatPaymentHistoryMapper extends BaseMapper { + /** + * 查询微信订单表列表 + * + * @param wechatPaymentHistory 微信订单表 + * @return 微信订单表集合 + */ + List selectByEntity(WechatPaymentHistory wechatPaymentHistory); +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java new file mode 100644 index 000000000..6ea9ba7bc --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java @@ -0,0 +1,102 @@ +package com.wzj.soopin.order.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.oms.domain.entity.AftersaleItem; +import com.cyl.manager.oms.domain.query.AftersaleItemQuery; +import com.cyl.manager.oms.mapper.AftersaleItemMapper; +import com.github.pagehelper.PageHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单售后Service业务层处理 + * + * + * @author zcc + */ +@Service +public class AftersaleItemService { + @Autowired + private AftersaleItemMapper aftersaleItemMapper; + + /** + * 查询订单售后 + * + * @param id 订单售后主键 + * @return 订单售后 + */ + public AftersaleItem selectById(Long id) { + return aftersaleItemMapper.selectById(id); + } + + /** + * 查询订单售后列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单售后 + */ + public List selectList(AftersaleItemQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long memberId = query.getMemberId(); + if (memberId != null) { + qw.eq("member_id", memberId); + } + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + Long orderItemId = query.getOrderItemId(); + if (orderItemId != null) { + qw.eq("order_item_id", orderItemId); + } + BigDecimal returnAmount = query.getReturnAmount(); + if (returnAmount != null) { + qw.eq("return_amount", returnAmount); + } + Integer quantity = query.getQuantity(); + if (quantity != null) { + qw.eq("quantity", quantity); + } + return aftersaleItemMapper.selectList(qw); + } + + /** + * 新增订单售后 + * + * @param aftersaleItem 订单售后 + * @return 结果 + */ + public int insert(AftersaleItem aftersaleItem) { + aftersaleItem.setCreateTime(LocalDateTime.now()); + return aftersaleItemMapper.insert(aftersaleItem); + } + + /** + * 修改订单售后 + * + * @param aftersaleItem 订单售后 + * @return 结果 + */ + public int update(AftersaleItem aftersaleItem) { + return aftersaleItemMapper.updateById(aftersaleItem); + } + + /** + * 删除订单售后信息 + * + * @param id 订单售后主键 + * @return 结果 + */ + public int deleteById(Long id) { + return aftersaleItemMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java new file mode 100644 index 000000000..5cfc76c60 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java @@ -0,0 +1,471 @@ +package com.wzj.soopin.order.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cyl.manager.act.service.MemberCouponService; +import com.cyl.manager.oms.convert.OrderOperateHistoryConvert; +import com.cyl.manager.oms.domain.entity.*; +import com.cyl.manager.oms.domain.form.DealWithAftersaleForm; +import com.cyl.manager.oms.domain.form.ManagerAftersaleOrderForm; +import com.cyl.manager.oms.domain.vo.*; +import com.cyl.manager.oms.mapper.*; +import com.cyl.manager.pms.mapper.SkuMapper; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.domain.entity.MemberWechat; +import com.cyl.manager.ums.mapper.MemberMapper; +import com.cyl.manager.ums.mapper.MemberWechatMapper; +import com.cyl.wechat.WechatPayService; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.enums.AftersaleStatus; +import com.ruoyi.common.enums.OrderRefundStatus; +import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.refund.model.RefundNotification; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单售后Service业务层处理 + * + * @author zcc + */ +@Service +@Slf4j +public class AftersaleService { + @Autowired + private AftersaleMapper aftersaleMapper; + + @Autowired + private OrderMapper orderMapper; + + @Autowired + private OrderItemMapper orderItemMapper; + + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + + @Autowired + private MemberMapper memberMapper; + + @Autowired + private OrderOperateHistoryConvert historyConvert; + @Autowired + private SkuMapper skuMapper; + @Autowired + private MemberCouponService memberCouponService; + @Autowired + private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; + @Autowired + private MemberWechatMapper memberWechatMapper; + @Autowired(required = false) + private WechatPayService wechatPayService; + @Autowired + private OrderOperateHistoryMapper operateHistoryMapper; + + /** + * 查询订单售后 + * + * @param id 订单售后主键 + * @return 订单售后 + */ + public ManagerRefundOrderDetailVO selectById(Long id) { + Order order = orderMapper.selectById(id); + if (order == null) { + throw new RuntimeException("无该订单信息"); + } + ManagerRefundOrderDetailVO result = new ManagerRefundOrderDetailVO(); + //订单基本信息 + result.setOrderId(order.getId()); + result.setOrderSn(order.getOrderSn()); + result.setCreateTime(order.getCreateTime()); + result.setPayType(order.getPayType()); + result.setPayTime(order.getPaymentTime()); + result.setStatus(order.getStatus()); + result.setExpressName(order.getDeliveryCompany()); + result.setDeliveryTime(order.getDeliveryTime()); + result.setExpressNo(order.getDeliverySn()); + result.setTotalAmount(order.getTotalAmount()); + result.setPayAmount(order.getPayAmount()); + //用户信息 + Member member = memberMapper.selectById(order.getMemberId()); + result.setNickName(member.getNickname()); + result.setPhone(member.getPhoneHidden()); + //收货信息 + OrderAddressVO orderAddressVO = new OrderAddressVO(); + orderAddressVO.setAddress(order.getReceiverDetailAddress()); + orderAddressVO.setName(order.getReceiverName()); + orderAddressVO.setUserPhone(order.getReceiverPhone()); + orderAddressVO.setArea(order.getReceiverProvince() + order.getReceiverCity() + order.getReceiverDistrict()); + result.setAddressInfo(orderAddressVO); + //orderItem + QueryWrapper orderItemQw = new QueryWrapper<>(); + orderItemQw.eq("order_id", id); + List orderItemList = orderItemMapper.selectList(orderItemQw); + List productList = new ArrayList<>(); + orderItemList.forEach(orderItem -> { + ManagerOrderProductVO productVO = new ManagerOrderProductVO(); + productVO.setPic(orderItem.getPic()); + productVO.setSpData(orderItem.getSpData()); + productVO.setProductName(orderItem.getProductName()); + productVO.setSalePrice(orderItem.getSalePrice()); + productVO.setBuyNum(orderItem.getQuantity()); + productVO.setProductId(orderItem.getProductId()); + productList.add(productVO); + }); + result.setProductList(productList); + //售后信息 + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("order_id", order.getId()); + aftersaleQw.orderByDesc("create_time"); + List aftersaleList = aftersaleMapper.selectList(aftersaleQw); + List refundInfoList = new ArrayList<>(); + aftersaleList.forEach(aftersale -> { + RefundInfoVO refundInfo = new RefundInfoVO(); + refundInfo.setId(aftersale.getId()); + refundInfo.setApplyRefundType(aftersale.getType()); + refundInfo.setApplyRefundTime(aftersale.getCreateTime()); + refundInfo.setRefundAmount(aftersale.getReturnAmount()); + refundInfo.setReason(aftersale.getReason()); + refundInfo.setDescription(aftersale.getDescription()); + refundInfo.setProofPics(aftersale.getProofPics()); + refundInfo.setRefundStatus(aftersale.getStatus()); + refundInfo.setRefundWpCode(aftersale.getRefundWpCode()); + refundInfo.setRefundWaybillCode(aftersale.getRefundWaybillCode()); + refundInfo.setRefundStatus(aftersale.getStatus()); + refundInfo.setRemark(aftersale.getHandleNote()); + refundInfoList.add(refundInfo); + }); + result.setRefundInfoList(refundInfoList); + return result; + } + + /** + * 查询订单售后列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单售后 + */ + public List selectList(ManagerAftersaleOrderForm query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + if (StrUtil.isNotBlank(query.getOrderSn()) && query.getOrderSn().length() > 7) { + query.setOrderSn(query.getOrderSn().substring(7)); + } + List managerRefundOrderVOS = aftersaleMapper.selectManagerRefundOrder(query); + if (CollectionUtil.isEmpty(managerRefundOrderVOS)) { + return managerRefundOrderVOS; + } + Set idSet = managerRefundOrderVOS.stream().map(ManagerRefundOrderVO::getOrderId).collect(Collectors.toSet()); + //查一下orderSn集合 + QueryWrapper orderQw = new QueryWrapper<>(); + orderQw.in("id", idSet); + Map orderMap = orderMapper.selectList(orderQw).stream().collect(Collectors.toMap(Order::getId, it -> it)); + //封装售后单商品数据 + QueryWrapper orderItemQw = new QueryWrapper<>(); + orderItemQw.in("order_id", idSet); + Map> orderItemMap = orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + managerRefundOrderVOS.forEach(vo -> { + Order order = orderMap.get(vo.getOrderId()); + vo.setOrderSn(order.getOrderSn()); + List orderItemList = orderItemMap.get(vo.getOrderId()); + List productList = new ArrayList<>(); + orderItemList.forEach(item -> { + ManagerOrderProductVO productVO = new ManagerOrderProductVO(); + productVO.setProductName(item.getProductName()); + productVO.setSalePrice(item.getSalePrice()); + productVO.setPic(item.getPic()); + productVO.setBuyNum(item.getQuantity()); + productVO.setProductId(item.getProductId()); + productVO.setSpData(item.getSpData()); + productList.add(productVO); + }); + vo.setProductList(productList); + }); + return managerRefundOrderVOS; + } + + /** + * 新增订单售后 + * + * @param aftersale 订单售后 + * @return 结果 + */ + public int insert(Aftersale aftersale) { + aftersale.setCreateTime(LocalDateTime.now()); + return aftersaleMapper.insert(aftersale); + } + + /** + * 修改订单售后 + * + * @param aftersale 订单售后 + * @return 结果 + */ + public int update(Aftersale aftersale) { + return aftersaleMapper.updateById(aftersale); + } + + /** + * 删除订单售后信息 + * + * @param id 订单售后主键 + * @return 结果 + */ + public int deleteById(Long id) { + return aftersaleMapper.deleteById(id); + } + + /** + * 售后处理 + * + * @param request 请求体 + * @param user 操作人 + * @return + */ + @Transactional(rollbackFor = Exception.class) + public void dealWith(DealWithAftersaleForm request, Long userId, String optUserName) { + Order order = orderMapper.selectById(request.getOrderId()); + if (order == null) { + throw new RuntimeException("无该订单"); + } + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("order_id", request.getOrderId()); + if (request.getOptType() == 3) { + aftersaleQw.eq("status", 1); + } else { + aftersaleQw.eq("status", 0); + } + Aftersale aftersale = aftersaleMapper.selectOne(aftersaleQw); + if (aftersale == null) { + throw new RuntimeException("没有售后单"); + } + //售后状态与售后类型是否对应 + if (Constants.OptType.AGREE.equals(request.getOptType()) || Constants.OptType.REFUSE.equals(request.getOptType())) { + if (!AftersaleStatus.APPLY.getType().equals(aftersale.getStatus())) { + throw new RuntimeException("订单状态错误,请刷新页面后重试!"); + } + } else { + if (!AftersaleStatus.WAIT.getType().equals(aftersale.getStatus())) { + throw new RuntimeException("订单状态错误,请刷新页面后重试!"); + } + } + //拒绝则理由必填 + if (Constants.OptType.REFUSE.equals(request.getOptType()) && StrUtil.isBlank(request.getRemark())) { + throw new RuntimeException("请填写拒绝理由"); + } + LocalDateTime optDate = LocalDateTime.now(); + //要创建的订单操作记录,status后续判断再设置 + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(order.getId()); + optHistory.setOrderSn(order.getOrderSn()); + optHistory.setOperateMan("后台管理员"); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(userId); + optHistory.setUpdateBy(userId); + optHistory.setUpdateTime(optDate); + //封装售后wrapper + UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); + aftersaleWrapper.eq("order_id", request.getOrderId()); + aftersaleWrapper.eq("status", AftersaleStatus.APPLY.getType()); + aftersaleWrapper.set("handle_man", optUserName); + aftersaleWrapper.set("update_time", optDate); + aftersaleWrapper.set("handle_time", optDate); + aftersaleWrapper.set("update_by", userId); + //封装订单wrapper + UpdateWrapper orderWrapper = new UpdateWrapper<>(); + orderWrapper.eq("id", request.getOrderId()); + orderWrapper.set("update_time", optDate); + orderWrapper.set("update_by", userId); + //更新订单、售后单,创建操作记录 + if (request.getOptType().equals(Constants.OptType.REFUSE)) { + aftersaleWrapper.set("status", AftersaleStatus.REJECT.getType()); + aftersaleWrapper.set("handle_note", request.getRemark()); + orderWrapper.set("aftersale_status", OrderRefundStatus.NO_REFUND.getType()); + optHistory.setOrderStatus(14); + } else if (request.getOptType().equals(Constants.OptType.AGREE)) { + aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType()); + orderWrapper.set("aftersale_status", Objects.equals(aftersale.getType(), 1) ? 3 : 2); + optHistory.setOrderStatus(12); + } else { + //如果是退货退款 order身上的售后状态应该是保持不变的 仅退款的话就进入退款了 + orderWrapper.set("aftersale_status", 3); + int row = orderMapper.update(null, orderWrapper); + if (row != 1) { + throw new RuntimeException("修改订单状态失败"); + } + } + int rows = aftersaleMapper.update(null, aftersaleWrapper); +// if (rows < 1) { +// throw new RuntimeException("更新售后单失败"); +// } + rows = orderMapper.update(null, orderWrapper); + if (rows < 1) { + throw new RuntimeException("更新订单失败"); + } + rows = orderOperateHistoryMapper.insert(optHistory); + if (rows < 1) { + throw new RuntimeException("创建订单操作记录失败"); + } + // 是否需要发起退款 + if ((request.getOptType() == Constants.OptType.GIVING || (request.getOptType() == Constants.OptType.AGREE && aftersale.getType() == 1))) { + tradeRefund(aftersale, order, optDate, userId); + } + } + + public void tradeRefund(Aftersale returnApply, Order order, LocalDateTime optDate, Long userId) { + //查一下微信订单 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("order_id", order.getPayId()).eq("op_type", 1); + WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw); + //查用户的微信信息 + QueryWrapper wechatQw = new QueryWrapper<>(); + wechatQw.eq("member_id", order.getMemberId()); + MemberWechat memberWechat = memberWechatMapper.selectOne(wechatQw); + //查订单item + QueryWrapper itemQw = new QueryWrapper<>(); + itemQw.eq("order_id", order.getId()); + OrderItem orderItem = orderItemMapper.selectList(itemQw).get(0); + //开始退款 + Refund wechatResponse = wechatPayService.refundPay(returnApply.getId() + "", + order.getPayId() + "", + "https://mall.ichengle.top/api/no-auth/wechat/weChatRefundNotify", + returnApply.getReturnAmount().multiply(new BigDecimal("100")).longValue(), + history.getMoney().multiply(new BigDecimal("100")).longValue(), returnApply.getReason()); + log.info("发起微信退款返回信息,tradeRefund:{}", JSONObject.toJSONString(wechatResponse == null ? "" : wechatResponse)); + + if (wechatResponse != null && Arrays.asList("PROCESSING", "SUCCESS").contains(wechatResponse.getStatus().name())) { + qw = new QueryWrapper<>(); + qw.eq("order_id", order.getId()).eq("op_type", 3); + WechatPaymentHistory refundHistory = wechatPaymentHistoryMapper.selectOne(qw); + if (refundHistory == null) { + WechatPaymentHistory wechatPaymentHistory = new WechatPaymentHistory(); + wechatPaymentHistory.setPaymentId(wechatResponse.getRefundId()); + wechatPaymentHistory.setMemberId(order.getMemberId()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(WechatPaymentHistory::getOrderId, order.getPayId()); + queryWrapper.eq(WechatPaymentHistory::getOpType, Constants.PaymentOpType.PAY); + WechatPaymentHistory payHistory = wechatPaymentHistoryMapper.selectOne(queryWrapper); + wechatPaymentHistory.setOpenid(payHistory.getOpenid()); + wechatPaymentHistory.setTitle(orderItem.getProductName()); + wechatPaymentHistory.setOrderId(order.getId()); + wechatPaymentHistory.setMoney(returnApply.getReturnAmount().multiply(new BigDecimal("100"))); + wechatPaymentHistory.setOpType(3); + wechatPaymentHistory.setPaymentStatus(0); + wechatPaymentHistory.setResponseBody(JSON.toJSONString(wechatResponse)); + wechatPaymentHistory.setCreateTime(optDate); + wechatPaymentHistory.setUpdateTime(optDate); + wechatPaymentHistory.setCreateBy(userId); + wechatPaymentHistory.setUpdateBy(userId); + wechatPaymentHistoryMapper.insert(wechatPaymentHistory); + } else { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", refundHistory.getId()) + .set("payment_id", wechatResponse.getRefundId()).set("update_time", optDate); + wechatPaymentHistoryMapper.update(null, updateWrapper); + } + } + } + + /** + * 订单退款回调MQ + * + * @param weChatRefundNotify + */ + @Transactional + public void refundOrderExc(RefundNotification weChatRefundNotify) { + log.info("收到订单回调MQ:" + JSONObject.toJSONString(weChatRefundNotify)); + if ("PROCESSING".equals(weChatRefundNotify.getRefundStatus().name())) { + return; + } + //查一下微信订单 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3); + WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw); + if (history == null) { + log.info("未找到退款单"); + throw new RuntimeException(); + } + LocalDateTime optDate = LocalDateTime.now(); + QueryWrapper orderQw = new QueryWrapper<>(); + orderQw.eq("id", history.getOrderId()); + Order order = orderMapper.selectOne(orderQw); + if (order.getStatus() == OrderRefundStatus.SUCCESS.getType()) { + log.info("订单已经是退款成功状态"); + throw new RuntimeException(); + } + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("order_id", history.getOrderId()).eq("status", AftersaleStatus.WAIT.getType()); + if ("SUCCESS".equals(weChatRefundNotify.getRefundStatus().name())) { + //更改订单表 + UpdateWrapper orderUpdateWrapper = new UpdateWrapper<>(); + orderUpdateWrapper.eq("id", history.getOrderId()) + .set("aftersale_status", OrderRefundStatus.SUCCESS.getType()); + orderMapper.update(null, orderUpdateWrapper); + + //更改 售后表 + UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); + aftersaleWrapper.eq("order_id", history.getOrderId()).set("status", AftersaleStatus.SUCCESS.getType()); + aftersaleMapper.update(null, aftersaleWrapper); + + //更改 微信表 + UpdateWrapper paymentWrapper = new UpdateWrapper<>(); + paymentWrapper.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3) + .set("payment_status", 1); + wechatPaymentHistoryMapper.update(null, paymentWrapper); + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(order.getId()); + optHistory.setOperateMan("系统"); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(order.getMemberId()); + optHistory.setUpdateBy(order.getMemberId()); + optHistory.setUpdateTime(optDate); + optHistory.setOrderStatus(13); + operateHistoryMapper.insert(optHistory); + // 回滚商品和sku销量 + OrderItem orderItem = orderItemMapper.selectOne(new QueryWrapper().eq("order_id", order.getId())); + skuMapper.updateStockById(orderItem.getSkuId(), LocalDateTime.now(), -1 * orderItem.getQuantity()); + //退还优惠券 + if (order.getMemberCouponId() != null) { + memberCouponService.backCoupon(Arrays.asList(order.getMemberCouponId())); + } + } else { + //更改订单表 + UpdateWrapper orderUpdateWrapper = new UpdateWrapper<>(); + orderUpdateWrapper.eq("id", history.getOrderId()) + .set("aftersale_status", OrderRefundStatus.FAIL.getType()); + orderMapper.update(null, orderUpdateWrapper); + } + } + + public List log(Long orderId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderOperateHistory::getOrderId, orderId); + wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(11, 12, 13, 14)); + wrapper.orderByDesc(OrderOperateHistory::getCreateTime); + List historyList = orderOperateHistoryMapper.selectList(wrapper); + return historyConvert.dos2vos(historyList); + } + + public Aftersale queryAfterSale(Long orderId) { + QueryWrapper itemQw = new QueryWrapper<>(); + itemQw.eq("order_id",orderId); + itemQw.in("status",Arrays.asList(AftersaleStatus.APPLY.getType(),AftersaleStatus.WAIT.getType())); + return aftersaleMapper.selectOne(itemQw); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java new file mode 100644 index 000000000..fb3098402 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java @@ -0,0 +1,94 @@ +package com.wzj.soopin.order.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.oms.domain.entity.OrderDeliveryHistory; +import com.cyl.manager.oms.domain.query.OrderDeliveryHistoryQuery; +import com.cyl.manager.oms.mapper.OrderDeliveryHistoryMapper; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单发货记录Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderDeliveryHistoryService { + @Autowired + private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; + + /** + * 查询订单发货记录 + * + * @param id 订单发货记录主键 + * @return 订单发货记录 + */ + public OrderDeliveryHistory selectById(Long id) { + return orderDeliveryHistoryMapper.selectById(id); + } + + /** + * 查询订单发货记录列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单发货记录 + */ + public List selectList(OrderDeliveryHistoryQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + String deliveryCompany = query.getDeliveryCompany(); + if (!StringUtils.isEmpty(deliveryCompany)) { + qw.eq("delivery_company", deliveryCompany); + } + String deliverySn = query.getDeliverySn(); + if (!StringUtils.isEmpty(deliverySn)) { + qw.eq("delivery_sn", deliverySn); + } + return orderDeliveryHistoryMapper.selectList(qw); + } + + /** + * 新增订单发货记录 + * + * @param orderDeliveryHistory 订单发货记录 + * @return 结果 + */ + public int insert(OrderDeliveryHistory orderDeliveryHistory) { + orderDeliveryHistory.setCreateTime(LocalDateTime.now()); + return orderDeliveryHistoryMapper.insert(orderDeliveryHistory); + } + + /** + * 修改订单发货记录 + * + * @param orderDeliveryHistory 订单发货记录 + * @return 结果 + */ + public int update(OrderDeliveryHistory orderDeliveryHistory) { + return orderDeliveryHistoryMapper.updateById(orderDeliveryHistory); + } + + /** + * 删除订单发货记录信息 + * + * @param id 订单发货记录主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderDeliveryHistoryMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java new file mode 100644 index 000000000..c681613ae --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java @@ -0,0 +1,173 @@ +package com.wzj.soopin.order.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cyl.h5.domain.dto.OrderProductListDTO; +import com.cyl.manager.oms.domain.entity.OrderItem; +import com.cyl.manager.oms.domain.query.OrderItemQuery; +import com.cyl.manager.oms.mapper.OrderItemMapper; +import com.cyl.manager.ums.domain.entity.Member; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.IDGenerator; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 订单中所包含的商品Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderItemService extends ServiceImpl { + @Autowired + private OrderItemMapper orderItemMapper; + + /** + * 查询订单中所包含的商品 + * + * @param id 订单中所包含的商品主键 + * @return 订单中所包含的商品 + */ + public OrderItem selectById(Long id) { + return orderItemMapper.selectById(id); + } + + /** + * 查询订单中所包含的商品列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单中所包含的商品 + */ + public List selectList(OrderItemQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + Long productId = query.getProductId(); + if (productId != null) { + qw.eq("product_id", productId); + } + String outProductId = query.getOutProductId(); + if (!StringUtils.isEmpty(outProductId)) { + qw.eq("out_product_id", outProductId); + } + Long skuId = query.getSkuId(); + if (skuId != null) { + qw.eq("sku_id", skuId); + } + String outSkuId = query.getOutSkuId(); + if (!StringUtils.isEmpty(outSkuId)) { + qw.eq("out_sku_id", outSkuId); + } + Long productSnapshotId = query.getProductSnapshotId(); + if (productSnapshotId != null) { + qw.eq("product_snapshot_id", productSnapshotId); + } + Long skuSnapshotId = query.getSkuSnapshotId(); + if (skuSnapshotId != null) { + qw.eq("sku_snapshot_id", skuSnapshotId); + } + String pic = query.getPic(); + if (!StringUtils.isEmpty(pic)) { + qw.eq("pic", pic); + } + String productNameLike = query.getProductNameLike(); + if (!StringUtils.isEmpty(productNameLike)) { + qw.like("product_name", productNameLike); + } + BigDecimal salePrice = query.getSalePrice(); + if (salePrice != null) { + qw.eq("sale_price", salePrice); + } + BigDecimal purchasePrice = query.getPurchasePrice(); + if (purchasePrice != null) { + qw.eq("purchase_price", purchasePrice); + } + Integer quantity = query.getQuantity(); + if (quantity != null) { + qw.eq("quantity", quantity); + } + Long productCategoryId = query.getProductCategoryId(); + if (productCategoryId != null) { + qw.eq("product_category_id", productCategoryId); + } + String spData = query.getSpData(); + if (!StringUtils.isEmpty(spData)) { + qw.eq("sp_data", spData); + } + return orderItemMapper.selectList(qw); + } + + /** + * 新增订单中所包含的商品 + * + * @param orderItem 订单中所包含的商品 + * @return 结果 + */ + public int insert(OrderItem orderItem) { + orderItem.setCreateTime(LocalDateTime.now()); + return orderItemMapper.insert(orderItem); + } + + /** + * 修改订单中所包含的商品 + * + * @param orderItem 订单中所包含的商品 + * @return 结果 + */ + public int update(OrderItem orderItem) { + return orderItemMapper.updateById(orderItem); + } + + /** + * 删除订单中所包含的商品信息 + * + * @param id 订单中所包含的商品主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderItemMapper.deleteById(id); + } + + @Transactional + public void saveOrderItem(Member member, LocalDateTime optTime, + Long orderId, List list){ + List addOrderItemList = new ArrayList<>(); + list.forEach(item -> { + OrderItem orderItem = new OrderItem(); + orderItem.setId(IDGenerator.generateId()); + orderItem.setOrderId(orderId); + orderItem.setProductId(item.getProduct().getId()); + orderItem.setOutProductId(item.getProduct().getOutProductId()); + orderItem.setSkuId(item.getSku().getId()); + orderItem.setOutSkuId(item.getSku().getOutSkuId()); + orderItem.setPic(item.getSku().getPic()); + orderItem.setProductName(item.getProduct().getName()); + orderItem.setSalePrice(item.getSku().getPrice()); + orderItem.setQuantity(item.getQuantity()); + orderItem.setProductCategoryId(item.getProduct().getCategoryId()); + orderItem.setSpData(item.getSku().getSpData()); + orderItem.setCreateBy(member.getId()); + orderItem.setCreateTime(optTime); + addOrderItemList.add(orderItem); + }); + boolean flag = saveBatch(addOrderItemList); + if (!flag){ + throw new RuntimeException("新增订单item失败"); + } + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java new file mode 100644 index 000000000..25dac1e33 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java @@ -0,0 +1,101 @@ +package com.wzj.soopin.order.service; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cyl.manager.oms.domain.entity.OrderOperateHistory; +import com.cyl.manager.oms.domain.query.OrderOperateHistoryQuery; +import com.cyl.manager.oms.mapper.OrderOperateHistoryMapper; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单操作历史记录Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderOperateHistoryService extends ServiceImpl { + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + + /** + * 查询订单操作历史记录 + * + * @param id 订单操作历史记录主键 + * @return 订单操作历史记录 + */ + public OrderOperateHistory selectById(Long id) { + return orderOperateHistoryMapper.selectById(id); + } + + /** + * 查询订单操作历史记录列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单操作历史记录 + */ + public List selectList(OrderOperateHistoryQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String orderSn = query.getOrderSn(); + if (StrUtil.isNotBlank(orderSn)) { + qw.eq("order_sn", orderSn); + } + String operateMan = query.getOperateMan(); + if (!StringUtils.isEmpty(operateMan)) { + qw.eq("operate_man", operateMan); + } + Integer orderStatus = query.getOrderStatus(); + if (orderStatus != null) { + qw.eq("order_status", orderStatus); + } + String note = query.getNote(); + if (!StringUtils.isEmpty(note)) { + qw.eq("note", note); + } + qw.orderByDesc("create_time"); + return orderOperateHistoryMapper.selectList(qw); + } + + /** + * 新增订单操作历史记录 + * + * @param orderOperateHistory 订单操作历史记录 + * @return 结果 + */ + public int insert(OrderOperateHistory orderOperateHistory) { + orderOperateHistory.setCreateTime(LocalDateTime.now()); + return orderOperateHistoryMapper.insert(orderOperateHistory); + } + + /** + * 修改订单操作历史记录 + * + * @param orderOperateHistory 订单操作历史记录 + * @return 结果 + */ + public int update(OrderOperateHistory orderOperateHistory) { + return orderOperateHistoryMapper.updateById(orderOperateHistory); + } + + /** + * 删除订单操作历史记录信息 + * + * @param id 订单操作历史记录主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderOperateHistoryMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java new file mode 100644 index 000000000..044b06efe --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java @@ -0,0 +1,403 @@ +package com.wzj.soopin.order.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cyl.h5.domain.query.OrderH5Query; +import com.cyl.manager.oms.convert.OrderConvert; +import com.cyl.manager.oms.convert.OrderOperateHistoryConvert; +import com.cyl.manager.oms.domain.entity.Order; +import com.cyl.manager.oms.domain.entity.OrderDeliveryHistory; +import com.cyl.manager.oms.domain.entity.OrderItem; +import com.cyl.manager.oms.domain.entity.OrderOperateHistory; +import com.cyl.manager.oms.domain.form.DeliverProductForm; +import com.cyl.manager.oms.domain.form.ManagerOrderQueryForm; +import com.cyl.manager.oms.domain.vo.*; +import com.cyl.manager.oms.mapper.OrderDeliveryHistoryMapper; +import com.cyl.manager.oms.mapper.OrderItemMapper; +import com.cyl.manager.oms.mapper.OrderMapper; +import com.cyl.manager.oms.mapper.OrderOperateHistoryMapper; +import com.cyl.manager.pms.convert.SkuConvert; +import com.cyl.manager.pms.mapper.ProductMapper; +import com.cyl.manager.pms.mapper.SkuMapper; +import com.cyl.manager.ums.domain.entity.Member; +import com.cyl.manager.ums.mapper.MemberAddressMapper; +import com.cyl.manager.ums.mapper.MemberCartMapper; +import com.cyl.manager.ums.mapper.MemberMapper; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.AesCryptoUtils; +import com.ruoyi.common.utils.PhoneUtils; +import com.ruoyi.common.utils.SecurityUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单表Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderService { + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderConvert orderConvert; + @Autowired + private OrderItemMapper orderItemMapper; + @Autowired + private MemberAddressMapper memberAddressMapper; + @Autowired + private SkuMapper skuMapper; + @Autowired + private ProductMapper productMapper; + @Autowired + private SkuConvert skuConvert; + @Autowired + private OrderItemService orderItemService; + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + @Autowired + private MemberCartMapper memberCartMapper; + @Autowired + private MemberMapper memberMapper; + @Value("${aes.key}") + private String aesKey; + @Autowired + private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; + @Autowired + private OrderOperateHistoryConvert historyConvert; + + /** + * 查询订单表 + * + * @param id 订单表主键 + * @return 订单表 + */ + public ManagerOrderDetailVO selectById(Long id) { + Order order = orderMapper.selectById(id); + if (order == null){ + throw new RuntimeException("查不到订单信息"); + } + ManagerOrderDetailVO managerOrderDetailVO = new ManagerOrderDetailVO(); + //封装订单信息 + managerOrderDetailVO.setOrderId(id); + managerOrderDetailVO.setCouponAmount(order.getCouponAmount()); + managerOrderDetailVO.setOrderSn(order.getOrderSn()); + managerOrderDetailVO.setOrderStatus(order.getStatus()); + managerOrderDetailVO.setCreateTime(order.getCreateTime()); + managerOrderDetailVO.setDeliveryTime(order.getDeliveryTime()); + managerOrderDetailVO.setExpressName(order.getDeliveryCompany()); + managerOrderDetailVO.setExpressNo(order.getDeliverySn()); + managerOrderDetailVO.setPayAmount(order.getPayAmount()); + managerOrderDetailVO.setPayTime(order.getPaymentTime()); + managerOrderDetailVO.setPayType(order.getPayType()); + managerOrderDetailVO.setTotalAmount(order.getTotalAmount()); + managerOrderDetailVO.setPayAmount(order.getPayAmount()); + managerOrderDetailVO.setReceiveTime(order.getReceiveTime()); + //封装订单地址信息 + ManagerOrderAddressVo managerOrderAddressVo = new ManagerOrderAddressVo(); + managerOrderAddressVo.setUserPhone(order.getReceiverPhone()); + managerOrderAddressVo.setAddress(order.getReceiverDetailAddress()); + managerOrderAddressVo.setArea( + order.getReceiverProvince() + + order.getReceiverCity() + + order.getReceiverDistrict()); + managerOrderAddressVo.setName(order.getReceiverName()); + managerOrderDetailVO.setAddressInfo(managerOrderAddressVo); + //查询会员信息 + Member member = memberMapper.selectById(order.getMemberId()); + managerOrderDetailVO.setUserName(member.getNickname()); + managerOrderDetailVO.setUserPhone(member.getPhoneHidden()); + //查询购买商品信息 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("order_id", order.getId()); + List orderItemList = orderItemMapper.selectList(qw); + List productList = new ArrayList<>(); + orderItemList.forEach(item -> { + ManagerOrderProductVO productVO = new ManagerOrderProductVO(); + productVO.setProductId(item.getProductId()); + productVO.setBuyNum(item.getQuantity()); + productVO.setPic(item.getPic()); + productVO.setProductName(item.getProductName()); + productVO.setSalePrice(item.getSalePrice()); + productVO.setSpData(item.getSpData()); + productList.add(productVO); + }); + managerOrderDetailVO.setProductInfo(productList); + return managerOrderDetailVO; + } + + /** + * 查询订单表列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单表 + */ + public PageImpl selectList(ManagerOrderQueryForm query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + if (!StringUtils.isEmpty(query.getUserPhone())){ + query.setUserPhone(AesCryptoUtils.encrypt(aesKey, query.getUserPhone())); + } + List managerOrderVOList = orderMapper.selectManagerOrderPage(query); + if (CollectionUtil.isEmpty(managerOrderVOList)){ + return new PageImpl<>(managerOrderVOList, page, 0); + } + long total = ((com.github.pagehelper.Page) managerOrderVOList).getTotal(); + Map orderMap = managerOrderVOList.stream().collect(Collectors.toMap(ManagerOrderVO::getId, it -> it, (v1,v2) -> v2, LinkedHashMap::new)); + //查orderItem + QueryWrapper qw = new QueryWrapper<>(); + qw.in("order_id", orderMap.keySet()); + Map> groupedOrderItemMap = orderItemMapper.selectList(qw) + .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + groupedOrderItemMap.keySet().forEach(key -> { + ManagerOrderVO managerOrderVO = orderMap.get(key); + managerOrderVO.setBuyNum(0); + List orderItemList = groupedOrderItemMap.get(key); + List addProductList = new ArrayList<>(); + orderItemList.forEach(item -> { + ManagerOrderProductVO vo = new ManagerOrderProductVO(); + vo.setProductName(item.getProductName()); + vo.setSalePrice(item.getSalePrice()); + vo.setPic(item.getPic()); + vo.setBuyNum(item.getQuantity()); + vo.setProductId(item.getProductId()); + vo.setSpData(item.getSpData()); + addProductList.add(vo); + managerOrderVO.setBuyNum(managerOrderVO.getBuyNum() + item.getQuantity()); + }); + managerOrderVO.setProductList(addProductList); + }); + return new PageImpl<>(new ArrayList<>(orderMap.values()), page, total); + } + + /** + * 新增订单表 + * + * @param order 订单表 + * @return 结果 + */ + public int insert(Order order) { + order.setCreateTime(LocalDateTime.now()); + return orderMapper.insert(order); + } + + /** + * 修改订单表 + * + * @param order 订单表 + * @return 结果 + */ + public int update(Order order) { + return orderMapper.updateById(order); + } + + /** + * 删除订单表信息 + * + * @param id 订单表主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderMapper.deleteById(id); + } + + public Page queryOrderPage(OrderH5Query query, Pageable pageReq) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("member_id", SecurityUtils.getUserId()); + IPage page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(); + page.setCurrent(pageReq.getPageNumber()) + .setSize(pageReq.getPageSize()); + if (CollUtil.isEmpty(pageReq.getSort())) { + pageReq.getSort().forEach(it -> { + qw.orderBy(true, it.getDirection().isAscending(), it.getProperty()); + }); + } + Integer tab = query.getTab(); + if (tab != null) { + qw.eq("delete_status", 0); + if (tab == 1) { + qw.eq("status", 0); + } else if (tab == 2) { + qw.eq("status", 1); + qw.eq("aftersale_status", 1); + } else if (tab == 3) { + qw.eq("status", 2); + qw.eq("confirm_status", 0); + } else if (tab == 4) { + qw.eq("status", 2); + qw.eq("confirm_status", 1); + } + } + orderMapper.selectPage(page, qw); + List orders = page.getRecords(); + long total = page.getPages(); + if (CollUtil.isEmpty(orders)) { + return new PageImpl<>(Collections.emptyList(), pageReq, total); + } + LambdaQueryWrapper qw1 = new LambdaQueryWrapper<>(); + qw1.in(OrderItem::getOrderId, orders.stream().map(Order::getId).collect(Collectors.toList())); + Map> oid2items = orderItemMapper.selectList(qw1) + .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + List res = orderConvert.dos2vos(orders); + res.forEach(it -> { + it.setItems(oid2items.get(it.getId())); + }); + return new PageImpl<>(res, pageReq, total); + } + + + public Integer saveMerchantNote(Order order) { + Order orderInDb = orderMapper.selectById(order.getId()); + if (orderInDb == null){ + throw new RuntimeException("订单不存在"); + } + UpdateWrapper qw = new UpdateWrapper<>(); + qw.eq("id", order.getId()); + qw.set("merchant_note", order.getMerchantNote()); + return orderMapper.update(null, qw); + } + + /** + * 管理后台发货 + * 目前发货是这样的:待发货、已发货、已完成都能执行发货,每次都会创建一条新的发货记录且修改订单发货信息 + * @param request 发货请求 + * @param userId 操作人 + * @return 结果 + */ + @Transactional + public String deliverProduct(DeliverProductForm request, Long userId) { + //查询订单 + Order order = orderMapper.selectById(request.getOrderId()); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("order_id", request.getOrderId()); + List orderItemList = orderItemMapper.selectList(qw); + if (order == null || CollectionUtil.isEmpty(orderItemList)){ + throw new RuntimeException("未找到该订单信息"); + } + // 是否为待发货、已发货 、已完成 + if (!(Constants.OrderStatus.SEND.equals(order.getStatus()) + || Constants.OrderStatus.GET.equals(order.getStatus()) + || Constants.OrderStatus.CONFIRM.equals(order.getStatus()))){ + throw new RuntimeException("订单状态错误"); + } + Integer orderStatus = + Constants.OrderStatus.SEND.equals(order.getStatus()) ? Constants.OrderStatus.GET : order.getStatus(); + //更新订单 + LocalDateTime optDate = LocalDateTime.now(); + order.setUpdateBy(null); + order.setStatus(orderStatus); + order.setDeliveryTime(optDate); + order.setUpdateTime(optDate); + order.setDeliveryCompany(request.getExpressName()); + order.setDeliverySn(request.getExpressSn()); + orderMapper.updateById(order); + //创建新的发货记录 + this.createDeliveryHistory(request, userId, optDate); + //创建订单操作记录 + this.createOrderOptHistory(order.getId(), order.getOrderSn(), orderStatus, userId, optDate); + return "发货成功"; + } + + /** + * 创建发货记录 + * @param request 发货请求 + * @param userId 操作人 + * @param optDate 操作时间 + */ + private void createDeliveryHistory(DeliverProductForm request, Long userId, LocalDateTime optDate){ + OrderDeliveryHistory orderDeliveryHistory = new OrderDeliveryHistory(); + orderDeliveryHistory.setOrderId(request.getOrderId()); + orderDeliveryHistory.setDeliveryCompany(request.getExpressName()); + orderDeliveryHistory.setDeliverySn(request.getExpressSn()); + orderDeliveryHistory.setCreateTime(optDate); + orderDeliveryHistory.setCreateBy(userId); + int rows = orderDeliveryHistoryMapper.insert(orderDeliveryHistory); + if (rows < 1) { + throw new RuntimeException("新增订单发货记录失败"); + } + } + + /** + * 创建订单操作历史 + * @param orderId 订单id + * @param orderStatus 订单状态 + * @param userId 操作人 + * @param optDate 操作时间 + */ + private void createOrderOptHistory(Long orderId, String orderSn, Integer orderStatus, Long userId, LocalDateTime optDate){ + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(orderId); + optHistory.setOrderSn(orderSn); + optHistory.setOperateMan(SecurityUtils.getUsername()); + optHistory.setOrderStatus(orderStatus); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(userId); + optHistory.setUpdateBy(userId); + optHistory.setUpdateTime(optDate); + int rows = orderOperateHistoryMapper.insert(optHistory); + if (rows < 1) { + throw new RuntimeException("新增订单操作记录失败"); + } + } + + /** + * 根据订单id查询订单操作日志 + * @param orderId 订单id + * @return 结果 + */ + public List log(Long orderId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderOperateHistory::getOrderId, orderId); + wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(0, 1, 2, 3, 4)); + wrapper.orderByDesc(OrderOperateHistory::getCreateTime); + List historyList = orderOperateHistoryMapper.selectList(wrapper); + return historyConvert.dos2vos(historyList); + } + + public String decryptPhone(Long orderId) { + Order order = orderMapper.selectById(orderId); + String receiverPhoneEncrypted = order.getReceiverPhoneEncrypted(); + if(receiverPhoneEncrypted!=null){ + return AesCryptoUtils.decrypt(aesKey,receiverPhoneEncrypted); + }else { + return null; + } + } + + public Boolean updateReceiver(Order order) { + Order dbOrder = orderMapper.selectById(order.getId()); + if (dbOrder == null) { + return false; + } + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("receiver_name",order.getReceiverName()) + .set("receiver_phone",PhoneUtils.hidePhone(order.getReceiverPhone())) + .set("receiver_city",order.getReceiverCity()) + .set("receiver_district",order.getReceiverDistrict()) + .set("receiver_province",order.getReceiverProvince()) + .set("receiver_detail_address",order.getReceiverDetailAddress()) + .set("receiver_phone_encrypted",AesCryptoUtils.encrypt(aesKey, order.getReceiverPhone())) + .set("update_time",LocalDateTime.now()); + updateWrapper.eq("id",order.getId()); + int update = orderMapper.update(null, updateWrapper); + return update == 1; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java new file mode 100644 index 000000000..b75fedf40 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java @@ -0,0 +1,127 @@ +package com.wzj.soopin.order.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.cyl.manager.oms.domain.entity.WechatPaymentHistory; +import com.cyl.manager.oms.domain.query.WechatPaymentHistoryQuery; +import com.cyl.manager.oms.mapper.WechatPaymentHistoryMapper; +import com.github.pagehelper.PageHelper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 微信订单表Service业务层处理 + * + * + * @author zcc + */ +@Service +public class WechatPaymentHistoryService { + @Autowired + private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; + + /** + * 查询微信订单表 + * + * @param id 微信订单表主键 + * @return 微信订单表 + */ + public WechatPaymentHistory selectById(Long id) { + return wechatPaymentHistoryMapper.selectById(id); + } + + /** + * 查询微信订单表列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 微信订单表 + */ + public List selectList(WechatPaymentHistoryQuery query, Pageable page) { + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String paymentId = query.getPaymentId(); + if (!StringUtils.isEmpty(paymentId)) { + qw.eq("payment_id", paymentId); + } + Long memberId = query.getMemberId(); + if (memberId != null) { + qw.eq("member_id", memberId); + } + String openid = query.getOpenid(); + if (!StringUtils.isEmpty(openid)) { + qw.eq("openid", openid); + } + String realNameLike = query.getRealNameLike(); + if (!StringUtils.isEmpty(realNameLike)) { + qw.like("real_name", realNameLike); + } + String title = query.getTitle(); + if (!StringUtils.isEmpty(title)) { + qw.eq("title", title); + } + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + BigDecimal money = query.getMoney(); + if (money != null) { + qw.eq("money", money); + } + Integer opType = query.getOpType(); + if (opType != null) { + qw.eq("op_type", opType); + } + Integer paymentStatus = query.getPaymentStatus(); + if (paymentStatus != null) { + qw.eq("payment_status", paymentStatus); + } + String attach = query.getAttach(); + if (!StringUtils.isEmpty(attach)) { + qw.eq("attach", attach); + } + String responseBody = query.getResponseBody(); + if (!StringUtils.isEmpty(responseBody)) { + qw.eq("response_body", responseBody); + } + return wechatPaymentHistoryMapper.selectList(qw); + } + + /** + * 新增微信订单表 + * + * @param wechatPaymentHistory 微信订单表 + * @return 结果 + */ + public int insert(WechatPaymentHistory wechatPaymentHistory) { + wechatPaymentHistory.setCreateTime(LocalDateTime.now()); + return wechatPaymentHistoryMapper.insert(wechatPaymentHistory); + } + + /** + * 修改微信订单表 + * + * @param wechatPaymentHistory 微信订单表 + * @return 结果 + */ + public int update(WechatPaymentHistory wechatPaymentHistory) { + return wechatPaymentHistoryMapper.updateById(wechatPaymentHistory); + } + + /** + * 删除微信订单表信息 + * + * @param id 微信订单表主键 + * @return 结果 + */ + public int deleteById(Long id) { + return wechatPaymentHistoryMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml new file mode 100644 index 000000000..eed785c68 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, member_id, order_id, order_item_id, return_amount, quantity, create_by, create_time, update_by, update_time from oms_aftersale_item + + + + insert into oms_aftersale_item + (member_id,order_id,aftersale_id,order_item_id,return_amount,quantity,create_by,create_time,update_by,update_time) + values + + + #{item.memberId,jdbcType=BIGINT}, + #{item.orderId,jdbcType=BIGINT}, + #{item.aftersaleId,jdbcType=BIGINT}, + #{item.orderItemId,jdbcType=BIGINT}, + #{item.returnAmount,jdbcType=DECIMAL}, + #{item.quantity,jdbcType=BIGINT}, + #{item.createBy,jdbcType=BIGINT}, + #{item.createTime,jdbcType=DATE}, + #{item.updateBy,jdbcType=BIGINT}, + #{item.updateTime,jdbcType=DATE} + + + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleMapper.xml new file mode 100644 index 000000000..116178708 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, member_id, order_id, return_amount, type, status, handle_time, quantity, reason, description, proof_pics, handle_note, handle_man, create_by, create_time, update_by, update_time from oms_aftersale + + + + + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml new file mode 100644 index 000000000..e1d2b6109 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + select id, order_id, delivery_company, delivery_sn, create_by, create_time, update_by, update_time from oms_order_delivery_history + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml new file mode 100644 index 000000000..1b647a78c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, order_id, product_id, out_product_id, sku_id, out_sku_id, product_snapshot_id, sku_snapshot_id, pic, product_name, sale_price, purchase_price, quantity, product_category_id, sp_data, create_by, create_time, update_by, update_time from oms_order_item + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 000000000..b717d9dc3 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale_status, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, delete_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time from oms_order + + + + update oms_order + set + status=#{item.status}, + update_by=#{item.updateBy}, + update_time=#{item.updateTime} + where id=#{item.id} + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderOperateHistoryMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderOperateHistoryMapper.xml new file mode 100644 index 000000000..203d6b44d --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderOperateHistoryMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, order_id, operate_man, order_status, note, create_by, create_time, update_by, update_time from oms_order_operate_history + + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml new file mode 100644 index 000000000..5da1d11ab --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, payment_id, member_id, openid, real_name, title, order_id, money, op_type, payment_status, remark, attach, response_body, create_by, create_time, update_by, update_time from oms_wechat_payment_history + + + +