From 3e7932d378b607f75379b463ae4ae2f4f1ccfe12 Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期三, 18 六月 2025 10:31:30 +0800 Subject: [PATCH] Merge branch '2.0' of http://120.76.84.145:10101/gitblit/r/java/HongRuiTang into 2.0 --- ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml | 20 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Banner.java | 7 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtAdvertEditDto.java | 28 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java | 9 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventPrize.java | 61 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java | 181 + ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java | 334 ++ ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java | 20 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java | 112 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MyAppointmentListVo.java | 22 ruoyi-modules/ruoyi-order/pom.xml | 22 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppLotteryEventPageVo.java | 30 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsAnswersMapper.java | 11 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java | 11 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BannerMapper.xml | 13 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java | 14 ruoyi-api/ruoyi-api-goods/pom.xml | 51 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopWinningRecordDto.java | 17 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Advert.java | 51 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestions.java | 37 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtAllCustomConfigVo.java | 28 ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopAppointableTimeMapper.xml | 44 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtBannerEditDto.java | 7 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventMapper.java | 27 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java | 128 ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedissonConfig.java | 38 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/WeChatSubscribeMessageSender.java | 83 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AppointmentTimeDto.java | 18 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.java | 11 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/LotteryEventQuestionsDto.java | 18 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/ConfigController.java | 27 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java | 2 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java | 102 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java | 68 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java | 41 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java | 2 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ShopRelUserVo.java | 14 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/MerLotteryEventController.java | 39 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java | 4 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppQuickEntryVo.java | 24 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteRegionService.java | 33 ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml | 3 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/ClientTokenUtil.java | 70 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/LotteryEventListDto.java | 21 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventInfoVo.java | 32 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BottomNavServiceImpl.java | 52 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java | 90 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java | 181 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java | 13 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsMapper.java | 11 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsAnswersService.java | 22 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsAnswersServiceImpl.java | 48 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/WebHook.java | 29 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/DelShopLotteryDrawDto.java | 16 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/QuickEntry.java | 13 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/CancelReservationDto.java | 16 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteConfigFallbackFactory.java | 11 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsAnswersServiceImpl.java | 15 ruoyi-api/ruoyi-api-goods/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 1 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java | 2 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopReservationConfigVo.java | 22 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java | 53 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java | 60 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopNonAppointableTime.java | 43 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerHomeShopTotalVo.java | 11 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBannerVo.java | 19 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopAppointableTimeService.java | 44 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtQuickEntryGetVo.java | 5 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml | 57 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsService.java | 11 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppPopVo.java | 5 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseGroupVO.java | 20 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtStoreCurriculumEditDto.java | 27 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestionsAnswers.java | 54 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java | 20 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtQuickEntryEditDto.java | 6 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtGoodsPageDto.java | 4 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopNonAppointableTimeService.java | 17 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/OrderWebHook.java | 21 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/CancelMerOrderDto.java | 16 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppIntegralController.java | 27 ruoyi-modules/ruoyi-member/src/main/resources/mapper/birthday/BirthdayCardMapper.xml | 32 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopRelUserServiceImpl.java | 7 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java | 13 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java | 112 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/TaskUtil.java | 40 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerMemberOrderVo.java | 17 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventService.java | 22 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java | 6 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java | 36 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/CouponInfoVo.java | 48 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtPopGetVo.java | 5 ruoyi-modules/ruoyi-goods/pom.xml | 6 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java | 26 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java | 6 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java | 4 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerConsumerGoodsListVo.java | 37 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java | 41 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java | 9 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BannerServiceImpl.java | 14 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java | 138 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopAppointableTimeMapper.java | 45 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveRecordMapper.java | 17 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ActivenessServiceImpl.java | 6 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppCouponController.java | 97 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java | 46 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/BottomNav.java | 25 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java | 182 + ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ActivenessService.java | 2 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberCoupon.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsMapper.java | 11 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java | 66 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java | 2 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventPrizeMapper.xml | 5 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/AnswerQuestionDto.java | 18 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/DelayTaskEnum.java | 1 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberPageVo.java | 11 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/BottomNavMapper.java | 13 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java | 4 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventPrizeService.java | 11 ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java | 18 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyAwardVo.java | 2 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MyAppointmentListDto.java | 20 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtBannerGetVo.java | 5 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRegionFallbackFactory.java | 42 ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 1 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java | 254 + ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventMapper.xml | 43 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GeneratorMybatisPlus.java | 12 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsAnswersService.java | 11 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerConsumerController.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsServiceImpl.java | 15 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java | 458 ++ ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java | 342 + ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventQuestionsVo.java | 29 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/QuickEntryMapper.xml | 3 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsServiceImpl.java | 15 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/Order.java | 35 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/PageShopMgtGoodsDTO.java | 44 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveAppointmentService.java | 22 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java | 5 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopWinningRecordVo.java | 21 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventPrizeServiceImpl.java | 15 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java | 96 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLiveController.java | 54 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventMapper.xml | 15 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopLotteryDrawListDto.java | 15 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java | 28 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopAppointableTimeListDto.java | 17 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java | 8 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java | 51 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java | 38 ruoyi-modules/ruoyi-member/pom.xml | 17 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopAppointableTimeServiceImpl.java | 79 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java | 157 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveRecordServiceImpl.java | 70 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEvent.java | 137 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/BottomNavService.java | 17 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/AdvertServiceImpl.java | 8 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsService.java | 11 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java | 26 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestions.java | 55 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java | 6 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveAppointmentMapper.xml | 5 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java | 3 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseChapterVO.java | 36 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteConfigService.java | 18 ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopNonAppointableTimeMapper.xml | 10 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/PageShopMgtGoodsVO.java | 80 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawVo.java | 19 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/factory/LotteryEventFallbackFactory.java | 25 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java | 43 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java | 24 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java | 10 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopNonAppointableTimeDto.java | 23 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java | 23 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/member/IntegralRecord.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveAppointment.java | 63 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java | 63 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopAppointableTimeListVo.java | 28 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventVo.java | 32 ruoyi-api/pom.xml | 1 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/UserLotteryEventVo.java | 28 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java | 21 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBottomNavVO.java | 13 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopAppointmentTimeDto.java | 18 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java | 23 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/PopMapper.xml | 3 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopNonAppointableTimeServiceImpl.java | 24 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/QYWXCallBackController.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveTeacherVo.java | 23 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopRelUserService.java | 4 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java | 14 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/service/LotteryEventClient.java | 28 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/AdvertMapper.xml | 17 ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BottomNavMapper.xml | 14 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopAppointableTime.java | 54 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/LiveController.java | 33 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventService.java | 55 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/ConfigEnum.java | 4 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveAppointmentServiceImpl.java | 57 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberGiftRecord.java | 14 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/QuickEntryServiceImpl.java | 2 ruoyi-auth/pom.xml | 6 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventPrizeMapper.java | 11 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveAppointmentMapper.java | 17 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java | 255 + ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVo.java | 112 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEvent.java | 64 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventServiceImpl.java | 74 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppAdvertVo.java | 42 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/staff/StaffLiveController.java | 39 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java | 11 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLotteryEventController.java | 153 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppHomeController.java | 34 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventQuestionsMapper.xml | 5 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DYWebHookController.java | 123 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MerGoodsPageVo.java | 36 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java | 69 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventMapper.java | 37 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java | 90 ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml | 28 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java | 123 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java | 6 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java | 34 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java | 26 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java | 7 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java | 16 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopNonAppointableTimeMapper.java | 17 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BottomNavDto.java | 10 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveRecordMapper.xml | 5 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppPlaceOrderVo.java | 11 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java | 6 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ConsumerGoodsServiceImpl.java | 45 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java | 485 ++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopRelUser.java | 15 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java | 35 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveRecord.java | 64 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseVO.java | 53 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java | 27 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java | 25 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtPopEditDto.java | 5 ruoyi-common/ruoyi-common-core/pom.xml | 5 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawListVo.java | 24 ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestionsAnswers.java | 39 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppMemberController.java | 2 248 files changed, 8,896 insertions(+), 857 deletions(-) diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml index 3d9d971..15ccea7 100644 --- a/ruoyi-api/pom.xml +++ b/ruoyi-api/pom.xml @@ -10,6 +10,7 @@ <modules> <module>ruoyi-api-system</module> + <module>ruoyi-api-goods</module> </modules> <artifactId>ruoyi-api</artifactId> diff --git a/ruoyi-api/ruoyi-api-goods/pom.xml b/ruoyi-api/ruoyi-api-goods/pom.xml new file mode 100644 index 0000000..765606d --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/pom.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-api</artifactId> + <version>3.6.2</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>ruoyi-api-goods</artifactId> + + <description> + ruoyi-api-goods系统接口模块 + </description> + + <dependencies> + + <!-- RuoYi Common Core--> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-core</artifactId> + </dependency> + + <!-- MYBATIS PLUS--> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-boot-starter</artifactId> + <version>3.4.1</version> + <!-- pagehelper 包含该依赖存在版本冲突,因此不建议和 mp 一起混用 --> + <exclusions> + <exclusion> + <groupId>com.github.jsqlparser</groupId> + <artifactId>jsqlparser</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-annotation</artifactId> + <version>3.4.1</version> + </dependency> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-generate</artifactId> + <version>2.3.3</version> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEvent.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEvent.java new file mode 100644 index 0000000..124b5f4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEvent.java @@ -0,0 +1,137 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 17:03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_lottery_event") +public class LotteryEvent { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.INPUT) + @ApiModelProperty("活动id") + private String id; + /** + * 门店id + */ + @TableField("shop_id") + @ApiModelProperty("门店id") + private Integer shopId; + /** + * 抽奖名称 + */ + @TableField("name") + @ApiModelProperty("抽奖名称") + private String name; + /** + * 活动简介名称 + */ + @TableField("activity_profile") + @ApiModelProperty("活动简介名称") + private String activityProfile; + /** + * 开启方式(1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖) + */ + @TableField("activity_type") + @ApiModelProperty("开启方式(1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖)") + private Integer activityType; + /** + * 可抽奖次数 + */ + @TableField("times") + @ApiModelProperty("可抽奖次数") + private Integer times; + /** + * 活动开始时间 + */ + @TableField("start_time") + @ApiModelProperty("活动开始时间") + private LocalDateTime startTime; + /** + * 活动结束时间 + */ + @TableField("end_time") + @ApiModelProperty("活动结束时间") + private LocalDateTime endTime; + /** + * 分享抽奖间隔天数 + */ + @TableField("interval_time") + @ApiModelProperty("分享抽奖间隔天数") + private Integer intervalTime; + /** + * 下单支付金额 + */ + @TableField("pay_money") + @ApiModelProperty("下单支付金额") + private BigDecimal payMoney; + /** + * 答题抽奖正确率% + */ + @TableField("accuracy") + @ApiModelProperty("答题抽奖正确率%") + private BigDecimal accuracy; + /** + * 答题时间限制(分钟) + */ + @TableField("answering_time") + @ApiModelProperty("答题时间限制(分钟)") + private Integer answeringTime; + /** + * 封面图 + */ + @TableField("cover_image") + @ApiModelProperty("封面图") + private String coverImage; + /** + * 详情介绍 + */ + @TableField("activity_content") + @ApiModelProperty("详情介绍") + private String activityContent; + /** + * 删除标记 + */ + @TableField("del_flag") + private Integer delFlag; + /** + * 创建用户id + */ + @TableField("create_user_id") + private Integer createUserId; + /** + * 创建时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + /** + * 更新用户id + */ + @TableField("update_user_id") + private Long updateUserId; + /** + * 更新时间 + */ + @TableField("update_time") + private LocalDateTime updateTime; + + @ApiModelProperty("奖品列表") + private List<LotteryEventPrize> prizes; +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventPrize.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventPrize.java new file mode 100644 index 0000000..1a7eeae --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventPrize.java @@ -0,0 +1,61 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author zhibing.pu + * @Date 2025/5/12 9:50 + */ +@Data +@TableName("t_lottery_event_prize") +public class LotteryEventPrize { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty("奖品id") + private String id; + /** + * 抽奖id + */ + @TableField("lottery_event_id") + @ApiModelProperty("抽奖id") + private String lotteryEventId; + /** + * 奖品类型(1=优惠券,2=平台商品,3=线下商品,4=积分) + */ + @TableField("prize_type") + @ApiModelProperty("奖品类型(1=优惠券,2=平台商品,3=线下商品,4=积分)") + private Integer prizeType; + /** + * 奖品id + */ + @TableField("object_id") + @ApiModelProperty("奖品id") + private String objectId; + /** + * 奖品名称 + */ + @TableField("object_name") + @ApiModelProperty("奖品名称") + private String objectName; + /** + * 奖品数量 + */ + @TableField("number") + @ApiModelProperty("奖品数量") + private Integer number; + /** + * 中奖率% + */ + @TableField("win_rate") + @ApiModelProperty("中奖率%") + private BigDecimal winRate; +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestions.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestions.java new file mode 100644 index 0000000..a85df08 --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestions.java @@ -0,0 +1,37 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:00 + */ +@Data +@TableName("t_lottery_event_questions") +public class LotteryEventQuestions { + /** + * 数据id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 抽奖活动id + */ + @TableField(value = "lottery_event_id") + private String lotteryEventId; + /** + * 题干名称 + */ + @TableField(value = "name") + private String name; + /** + * 排序 + */ + @TableField(value = "sort") + private Integer sort; + +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestionsAnswers.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestionsAnswers.java new file mode 100644 index 0000000..167fba8 --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEventQuestionsAnswers.java @@ -0,0 +1,39 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/5/19 16:15 + */ +@Data +@TableName("t_lottery_event_questions_answers") +public class LotteryEventQuestionsAnswers { + /** + * id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 抽奖id + */ + @TableField(value = "lottery_event_id") + private String lotteryEventId; + /** + * 抽奖答题id + */ + @TableField(value = "lottery_event_questions_id") + private String lotteryEventQuestionsId; + /** + * 答案 + */ + @TableField(value = "answer") + private String answer; + /** + * 是否是正确答案(0=否,1=是) + */ + @TableField(value = "is_right") + private Integer isRight; +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEvent.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEvent.java new file mode 100644 index 0000000..b42026e --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEvent.java @@ -0,0 +1,64 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author zhibing.pu + * @Date 2025/5/12 10:34 + */ +@Data +@TableName("t_user_lottery_event") +public class UserLotteryEvent { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 用户id + */ + @TableField(value = "user_id") + private Long userId; + /** + * 抽奖id + */ + @TableField(value = "lottery_event_id") + private String lotteryEventId; + /** + * 抽奖奖品id + */ + @TableField(value = "lottery_event_prize_id") + private String lotteryEventPrizeId; + /** + * 奖品类型(1=优惠券,2=平台商品,3=线下商品,4=积分,5=未中奖) + */ + @TableField(value = "prize_type") + private Integer prizeType; + /** + * 奖品id + */ + @TableField(value = "object_id") + private String objectId; + /** + * 奖品名称 + */ + @TableField(value = "object_name") + private String objectName; + /** + * 奖品数量 + */ + @TableField(value = "number") + private Integer number; + /** + * 中奖时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestions.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestions.java new file mode 100644 index 0000000..e7f51c4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestions.java @@ -0,0 +1,55 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 用户抽奖答题记录 + * @author zhibing.pu + * @Date 2025/5/19 16:01 + */ +@Data +@TableName("t_user_lottery_event_questions") +public class UserLotteryEventQuestions { + /** + * id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 用户id + */ + @TableField(value = "user_id") + private Long userId; + /** + * 抽奖活动id + */ + @TableField(value = "lottery_event_id") + private String lotteryEventId; + /** + * 答题开始时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; + /** + * 答题结束时间 + */ + @TableField(value = "end_time") + private LocalDateTime endTime; + /** + * 状态(1=已开始,2=已结束) + */ + @TableField(value = "status") + private Integer status; + /** + * 正确率 + */ + @TableField(value = "correct_answer_rate") + private BigDecimal correctAnswerRate; +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestionsAnswers.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestionsAnswers.java new file mode 100644 index 0000000..01a8100 --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/UserLotteryEventQuestionsAnswers.java @@ -0,0 +1,54 @@ +package com.ruoyi.goods.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户抽奖答题记录 + * @author zhibing.pu + * @Date 2025/5/19 16:01 + */ +@Data +@TableName("t_user_lottery_event_questions_answers") +public class UserLotteryEventQuestionsAnswers { + /** + * id + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 用户id + */ + @TableField(value = "user_id") + private Long userId; + /** + * 抽奖活动id + */ + @TableField(value = "lottery_event_id") + private String lotteryEventId; + /** + * 抽奖活动题干id + */ + @TableField(value = "lottery_event_question_id") + private String lotteryEventQuestionId; + /** + * 抽奖活动题干选项id + */ + @TableField(value = "lottery_event_questions_answers_id") + private String lotteryEventQuestionsAnswersId; + /** + * 是否正确(0=否,1=是) + */ + @TableField(value = "is_correct") + private Integer isCorrect; + /** + * 创建时间 + */ + @TableField(value = "create_time") + private LocalDateTime createTime; +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/factory/LotteryEventFallbackFactory.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/factory/LotteryEventFallbackFactory.java new file mode 100644 index 0000000..f0216ad --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/factory/LotteryEventFallbackFactory.java @@ -0,0 +1,25 @@ +package com.ruoyi.goods.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.service.LotteryEventClient; +import org.springframework.cloud.openfeign.FallbackFactory; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:12 + */ +public class LotteryEventFallbackFactory implements FallbackFactory<LotteryEventClient> { + @Override + public LotteryEventClient create(Throwable cause) { + return new LotteryEventClient() { + + @Override + public R<List<LotteryEvent>> getLotteryEventList(Integer activityType) { + return R.fail("根据开启方式获取活动列表失败:" + cause.getMessage()); + } + }; + } +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/service/LotteryEventClient.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/service/LotteryEventClient.java new file mode 100644 index 0000000..4ce86d5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/service/LotteryEventClient.java @@ -0,0 +1,28 @@ +package com.ruoyi.goods.api.service; + +import com.ruoyi.common.core.constant.ServiceNameConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.factory.LotteryEventFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:11 + */ +@FeignClient(contextId = "LotteryEventClient", value = ServiceNameConstants.GOODS_SERVICE, fallbackFactory = LotteryEventFallbackFactory.class) +public interface LotteryEventClient { + + + /** + * 根据开启方式获取活动列表 + * @param activityType + * @return + */ + @PostMapping("/lotteryEvent/getLotteryEventList") + R<List<LotteryEvent>> getLotteryEventList(@RequestParam("activityType") Integer activityType); +} diff --git a/ruoyi-api/ruoyi-api-goods/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-goods/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..03a067b --- /dev/null +++ b/ruoyi-api/ruoyi-api-goods/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.ruoyi.goods.api.factory.LotteryEventFallbackFactory diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/ConfigEnum.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/ConfigEnum.java index ff5a58a..952bbe7 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/ConfigEnum.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/ConfigEnum.java @@ -38,7 +38,9 @@ HOME_STYLE("HOME_STYLE", 2,"首页风格"), HOME_SLOGAN("HOME_SLOGAN", 1,"首页广告语"), HOME_LOGO("HOME_LOGO", 1,"首页logo"), - SHOP_COMMON_PROPORTION("SHOP_COMMON_PROPORTION", 3,"商户统一分成"); + SHOP_COMMON_PROPORTION("SHOP_COMMON_PROPORTION", 3,"商户统一分成"), + STORE_COURSE_DISPLAY_NAME("STORE_COURSE_DISPLAY_NAME", 2,"门店课程设置-展示名称"), + STORE_COURSE_DISPLAY_PASSWORD("STORE_COURSE_DISPLAY_PASSWORD", 2,"门店课程设置-验证密码"); diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/DelayTaskEnum.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/DelayTaskEnum.java index d22b973..f9781f6 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/DelayTaskEnum.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/DelayTaskEnum.java @@ -14,6 +14,7 @@ COUPON_SEND_DELAY_TASK("优惠券延时任务","定时启动优惠券发送"), ACTIVITY_START_TASK("活动延时任务","定时开始任务"), ACTIVITY_END_TASK("活动延时任务","定时结束任务"), + LIVE_APPOINTMENT_TASK("直播预约任务","直播预约任务") ; String name; diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AppointmentTimeDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AppointmentTimeDto.java new file mode 100644 index 0000000..abd8d5c --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/AppointmentTimeDto.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.api.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:49 + */ +@Data +@ApiModel +public class AppointmentTimeDto { + @ApiModelProperty("门店id") + private Integer shopId; + @ApiModelProperty("预约时间(2025-01-01 14:00:00)") + private String time; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/LotteryEventListDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/LotteryEventListDto.java new file mode 100644 index 0000000..2fcc431 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/LotteryEventListDto.java @@ -0,0 +1,21 @@ +package com.ruoyi.system.api.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/26 16:20 + */ +@Data +@ApiModel +public class LotteryEventListDto extends AppBaseDto { + + @ApiModelProperty(name = "pagenum", value = "页码") + private Integer pageNum = 1; + + + @ApiModelProperty(name = "pagesize", value = "每页显示条数") + private Integer pageSize = 20; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopAppointmentTimeDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopAppointmentTimeDto.java new file mode 100644 index 0000000..ca62bf8 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/ShopAppointmentTimeDto.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.api.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:38 + */ +@Data +public class ShopAppointmentTimeDto extends AppBaseDto{ + + @ApiModelProperty(value = "请求对象id") + private String id; + + @ApiModelProperty(value = "查询时间(2025-01-01)") + private String date; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java index 9a3e5b7..83dd638 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/Member.java @@ -162,19 +162,24 @@ */ @TableField("belong_district") private String belongDistrict; - + @TableField("frozen_flag") private Integer frozenFlag; - + /** * 绑定类型1商城订单2活动订单3线下订单4核销优惠券5核销奖品6商户创建7平台变动8商户绑定 */ @TableField("binding_type") private Integer bindingType; - + /** + * 上次确认服务的id + */ + @TableField("last_service_id") + private String lastServiceId; + @Override protected Serializable pkVal() { return this.userId; } - + } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberCoupon.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberCoupon.java index 5330316..e0f3777 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberCoupon.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberCoupon.java @@ -64,7 +64,7 @@ @TableField("coupon_name") private String couponName; /** - * 发送类型1.手动领取2.指定发放 + * 发送类型1.手动领取2.指定发放,3.抽奖领取 */ @TableField("send_type") private Integer sendType; diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberGiftRecord.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberGiftRecord.java index e6bd7c0..8950d83 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberGiftRecord.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/member/MemberGiftRecord.java @@ -49,19 +49,24 @@ * 礼品id */ @TableField("gift_id") - private Long giftId; + private String giftId; /** * 礼物来源1平台2商户 */ @TableField("gift_from") private Integer giftFrom; /** + * 奖品来源(1=生日卡,2=抽奖) + */ + @TableField("prize_from") + private Integer prizeFrom; + /** * 商户id */ @TableField("shop_id") private Long shopId; /** - * 礼物类型1优惠券2商品3现金4实物 + * 礼物类型1优惠券2商品3现金4实物5积分 */ @TableField("gift_type") private Integer giftType; @@ -100,6 +105,11 @@ */ private BigDecimal money; /** + * 积分数量 + */ + @TableField("integral_number") + private Integer integralNumber; + /** * 创建时间 */ @TableField("create_time") diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java index 11230b8..db4e83d 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java @@ -222,6 +222,11 @@ @TableField("platform_birthday_flag") private Integer platformBirthdayFlag; /** + * 抽奖1开2关 + */ + @TableField("lottery_draw_flag") + private Integer lotteryDrawFlag; + /** * 店铺设置状态 */ @TableField("shop_custom_status") @@ -291,11 +296,35 @@ */ @TableField("shop_code") private String shopCode; - - + + /** + * 小鹅通讲师id + */ + @TableField("xiaoe_user_id") + private String xiaoeUserId; + + /** + * 预约状态(0=关,1=开) + */ + @TableField("subscribe") + private Integer subscribe; + + /** + * 修改价格权限(0=关,1=开) + */ + @TableField("modify_price_permission") + private Integer modifyPricePermission; + + /** + * 抖音门店id + */ + @TableField("poi_id") + private String poiId; + + @Override protected Serializable pkVal() { return this.shopId; } - + } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopAppointableTime.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopAppointableTime.java new file mode 100644 index 0000000..eb88915 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopAppointableTime.java @@ -0,0 +1,54 @@ +package com.ruoyi.system.api.domain.poji.shop; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:54 + */ +@Data +@TableName +public class ShopAppointableTime { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 商户id + */ + @TableField("shop_id") + private Integer shopId; + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + /** + * 预约时间 + */ + @TableField("appointable_time") + private LocalDateTime appointableTime; + /** + * 状态(0=已取消,1=待确认,2=等待中,3=已结束) + */ + @TableField("status") + private Integer status; + /** + * 添加时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + /** + * 商家取消原因 + */ + @TableField("reason") + private String reason; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopNonAppointableTime.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopNonAppointableTime.java new file mode 100644 index 0000000..a307341 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/ShopNonAppointableTime.java @@ -0,0 +1,43 @@ +package com.ruoyi.system.api.domain.poji.shop; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:25 + */ +@Data +@ApiModel +@TableName("t_shop_non_appointable_time") +public class ShopNonAppointableTime { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.INPUT) + private String id; + /** + * 商户id + */ + @TableField("shop_id") + private Integer shopId; + /** + * 不可预约开始时间 + */ + @TableField("non_appointable_start_time") + @ApiModelProperty("不可预约开始时间") + private LocalDateTime nonAppointableStartTime; + /** + * 不可预约结束时间 + */ + @TableField("non_appointable_end_time") + @ApiModelProperty("不可预约结束时间") + private LocalDateTime nonAppointableEndTime; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerHomeShopTotalVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerHomeShopTotalVo.java index 2668b19..e04b328 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerHomeShopTotalVo.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerHomeShopTotalVo.java @@ -35,14 +35,17 @@ @ApiModelProperty(value = "剩余周期人数") private Integer cycleSurp; - + @ApiModelProperty(value = "剩余体验人数") private Integer explorationSurp; - + @ApiModelProperty(value = "领券1开2关") private Integer platformCouponFlag; - + @ApiModelProperty(value = "生日卡1开2关") private Integer platformBirthdayFlag; - + + @ApiModelProperty(value = "待处理预约单数量") + private Integer unHandleReserve; + } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ShopRelUserVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ShopRelUserVo.java index da70ce0..4535120 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ShopRelUserVo.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/ShopRelUserVo.java @@ -5,10 +5,16 @@ @Data public class ShopRelUserVo { - - @ApiModelProperty(value="商户id") + + @ApiModelProperty(value = "商户id") private Long shopId; - - @ApiModelProperty(value="用户姓名") + + @ApiModelProperty(value = "商户数量") + private Integer shopNum; + + @ApiModelProperty(value = "商户名称") + private String shopName; + + @ApiModelProperty(value = "用户姓名") private String userName; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteConfigFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteConfigFallbackFactory.java index 06d7049..21c63b0 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteConfigFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteConfigFallbackFactory.java @@ -95,10 +95,19 @@ @Override + public R<String> getStoreCurriculumPassword() { + return R.fail("获取门店课程验证密码失败:" + throwable.getMessage()); + } + @Override + public R<String> getStoreCurriculumName() { + return R.fail("获取门店课程展示名称失败:" + throwable.getMessage()); + } + + @Override public R<List<SysTag>> listSysTag(Integer tagType) { return R.fail("获取标签失败:" + throwable.getMessage()); } - + @Override public R<List<Activeness>> listActiveness() { return R.fail("获取活跃度列表失败:" + throwable.getMessage()); diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java index 15b0547..e120368 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteCouponFallbackFactory.java @@ -56,16 +56,21 @@ public R useMemberCoupon(String memberCouponIds) { return R.fail("使用优惠券失败" + throwable.getMessage()); } - + @Override public R backMemberCoupon(String memberCouponIds) { return R.fail("回退优惠券失败" + throwable.getMessage()); } - + @Override public R sureMemberCoupon(MerVerifyMemberCouponDto merVerifyMemberCouponDto) { return R.fail("确认核销优惠券失败" + throwable.getMessage()); } + + @Override + public R addMemberCoupon(String couponId, Integer number, Long userId) { + return R.fail("手动添加用户优惠券失败:" + throwable.getMessage()); + } }; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java index 8513675..a5e8c61 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java @@ -80,6 +80,11 @@ public R<List<String>> listGoodsNameByGoodsClass(Long classId) { return R.fail("获取分类商品列表失败:" + throwable.getMessage()); } + + @Override + public R<?> push(Long appointmentId) { + return R.fail("推送小程序订阅消息失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java index 94369ad..75e9145 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java @@ -3,12 +3,12 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.member.BirthdayCard; +import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.domain.poji.member.MemberGiftRecord; import com.ruoyi.system.api.domain.vo.*; -import com.ruoyi.system.api.service.RemoteMemberService; -import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.model.AppMiniLoginDto; import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.service.RemoteMemberService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -119,22 +119,28 @@ public R<Integer> getUnReplaySuggestVo() { return null; } - + @Override public R<MemberGiftRecord> getVerifyPrize(String verifyPrize) { return R.fail("获取核销奖品信息失败:" + throwable.getMessage()); } - + + + @Override + public R<MemberGiftRecord> getVerifyPrizeByGiftId(String giftId) { + return R.fail("根据礼品id获取数据失败:" + throwable.getMessage()); + } + @Override public R signShare(IntegralChangeDto integralChangeDto) { return R.fail("积分变动失败:" + throwable.getMessage()); } - + @Override public R<Integer> getAreaNewMember(List<Long> shopIdList) { return null; } - + @Override public R updateMemberShopName(MgtMemberShopNameDto mgtMemberShopNameDto) { return R.fail("更新商户绑定会员失败:" + throwable.getMessage()); @@ -149,16 +155,32 @@ public R verifyPrize(MerVerifyPrizeFinalDto merVerifyPrizeFinalDto) { return R.fail("核销奖品失败:" + throwable.getMessage()); } - + @Override public R<List<Long>> listUserIdByAgeType(Integer ageType) { return R.fail("获取用户id列表失败:" + throwable.getMessage()); } - + @Override public R<MgtBulletinBoardVo> boardMemberTotal(BoardMemberTotalDto boardMemberTotalDto) { return R.fail(throwable.getMessage()); } + + + @Override + public R addIntegralRecord(Integer integral, Long userId, String orderId) { + return R.fail("手动添加用户积分失败:" + throwable.getMessage()); + } + + @Override + public R saveMemberGiftRecord(MemberGiftRecord memberGiftRecord) { + return R.fail("添加奖品数据失败:" + throwable.getMessage()); + } + + @Override + public R editMember(Member member) { + return R.fail("修改会员失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRegionFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRegionFallbackFactory.java new file mode 100644 index 0000000..9369291 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteRegionFallbackFactory.java @@ -0,0 +1,42 @@ +package com.ruoyi.system.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.api.domain.dto.AGStockChangeDto; +import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto; +import com.ruoyi.system.api.domain.dto.ActivityTotalChangeDto; +import com.ruoyi.system.api.domain.dto.MerActivityShopDto; +import com.ruoyi.system.api.domain.poji.activity.Activity; +import com.ruoyi.system.api.domain.poji.activity.ActivityGoods; +import com.ruoyi.system.api.domain.poji.activity.ActivityRecord; +import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo; +import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo; +import com.ruoyi.system.api.service.RemoteActivityService; +import com.ruoyi.system.api.service.RemoteRegionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 省市区三级联动服务 + * + * @author jqs + */ +@Component +public class RemoteRegionFallbackFactory implements FallbackFactory<RemoteRegionService> +{ + private static final Logger log = LoggerFactory.getLogger(RemoteRegionFallbackFactory.class); + + @Override + public RemoteRegionService create(Throwable throwable) + { + log.error("省市区三级联动服务:{}", throwable.getMessage()); + return new RemoteRegionService() + { + + + }; + } +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java index 8c83b8a..3696a02 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestBody; +import java.util.Collections; import java.util.List; /** @@ -156,6 +157,11 @@ public List<Shop> getShopBySysUserIds(BoardMemberTotalDto boardMemberTotalDto) { return null; } + + @Override + public List<Shop> getFranchiseeIdsBYDealerId(Long shopId) { + return Collections.emptyList(); + } }; } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java index f0c8c72..50e9f61 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java @@ -5,19 +5,25 @@ @Data public class OauthUserVo { - - @ApiModelProperty(value="商户id") + + @ApiModelProperty(value = "商户id") private Long shopId; - - @ApiModelProperty(value="成员UserID") + + @ApiModelProperty(value = "商户数量") + private Integer shopNum; + + @ApiModelProperty(value = "商户名称") + private String shopName; + + @ApiModelProperty(value = "成员UserID") private String userid; - - @ApiModelProperty(value="手机") + + @ApiModelProperty(value = "手机") private String mobile; - - @ApiModelProperty(value="token凭证") + + @ApiModelProperty(value = "token凭证") private String token; - - @ApiModelProperty(value="过期时间") + + @ApiModelProperty(value = "过期时间") private Long expiresIn; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java index 4d930ed..170585e 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java @@ -6,16 +6,22 @@ @Data public class QwH5LoginVo { - - @ApiModelProperty(value="成员UserID") + + @ApiModelProperty(value = "成员UserID") private String userid; - - @ApiModelProperty(value="商户id") + + @ApiModelProperty(value = "商户id") private Long shopId; - - @ApiModelProperty(value="手机") + + @ApiModelProperty(value = "商户数量") + private Integer shopNum; + + @ApiModelProperty(value = "商户名称") + private String shopName; + + @ApiModelProperty(value = "手机") private String mobile; - + @ApiModelProperty(value = "用户信息") private SysUser sysUser; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteConfigService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteConfigService.java index 15b925d..83a62b2 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteConfigService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteConfigService.java @@ -155,4 +155,22 @@ */ @PostMapping("/config/createFileRecord") public R createFileRecord(@RequestBody FileRecord fileRecord); + + + + /** + * 获取门店课程验证密码 + * @return + */ + @PostMapping("/config/getStoreCurriculumPassword") + public R<String> getStoreCurriculumPassword(); + + + + /** + * 获取门店课程展示名称 + * @return + */ + @PostMapping("/config/getStoreCurriculumName") + public R<String> getStoreCurriculumName(); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java index 04c6e7d..2194ecd 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteCouponService.java @@ -11,6 +11,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -81,15 +82,26 @@ */ @PostMapping("/coupon/backMemberCoupon") public R backMemberCoupon(@RequestBody String memberCouponIds); - - + + /** - * @description 确认核销优惠券 - * @author jqs - * @date 2023/8/15 11:37 * @param merVerifyMemberCouponDto - * @return R + * @return R + * @description 确认核销优惠券 + * @author jqs + * @date 2023/8/15 11:37 */ @PostMapping("/coupon/verifyMemberCoupon") public R sureMemberCoupon(@RequestBody MerVerifyMemberCouponDto merVerifyMemberCouponDto); + + + /** + * 手动添加用户优惠券 + * + * @param couponId + * @param number + * @return + */ + @PostMapping("/coupon/addMemberCoupon") + R addMemberCoupon(@RequestParam("couponId") String couponId, @RequestParam("number") Integer number, @RequestParam("userId") Long userId); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java index b82e6a5..0fca1fe 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java @@ -11,6 +11,8 @@ import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo; import com.ruoyi.system.api.factory.RemoteGoodsFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -78,4 +80,12 @@ */ @PostMapping("/goods/listGoodsNameByGoodsClass") public R<List<String>> listGoodsNameByGoodsClass(@RequestBody Long classId); + + /** + * 推送微信小程序订阅消息 + * @param appointmentId + * @return + */ + @GetMapping("/live/push/{appointmentId}") + R<?> push(@PathVariable("appointmentId") Long appointmentId); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java index c5cf9a8..e3d1e8b 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java @@ -13,15 +13,16 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @FeignClient(contextId = "remoteMemberService", value = ServiceNameConstants.MEMBER_SERVICE, fallbackFactory = RemoteMemberFallbackFactory.class) public interface RemoteMemberService { - + @PostMapping("/member/getMember") public R<Member> getMember(@RequestBody Long userId); - + /** * 小程序登录 * @@ -30,7 +31,7 @@ */ @PostMapping("/member/miniLogin") public R<AppMiniLoginVo> miniLogin(@RequestBody AppMiniLoginDto appMiniLoginDto); - + /** * 小程序注册 * @@ -39,8 +40,8 @@ */ @PostMapping("/member/miniRegister") public R<AppMiniRegisterVo> miniRegister(@RequestBody AppMiniRegisterDto appUserRegisterDto); - - + + /** * 更新绑定 * @@ -49,7 +50,7 @@ */ @PostMapping("/member/updateMemberBinding") public R updateMemberBinding(@RequestBody AppMemberBindingDto appMemberBindingDto); - + /** * 更新会员商品类型 * @@ -58,7 +59,7 @@ */ @PostMapping("/member/updateMemberGoodsType") public R updateMemberGoodsType(@RequestBody AppMemberGoodsTypeDto appMemberGoodsTypeDto); - + /** * 通过手机号获取会员 * @@ -67,7 +68,7 @@ */ @PostMapping("/member/getMemberByMobile") public R<Member> getMemberByMobile(@RequestBody String mobile); - + /** * 订单创建新用户 * @@ -76,7 +77,7 @@ */ @PostMapping("/member/createNewMember") public R createNewMember(@RequestBody Member member); - + /** * @param tag * @return R @@ -86,7 +87,7 @@ */ @PostMapping("/member/deleteMemberTag") public R deleteMemberTag(@RequestBody String tag); - + /** * @param suggestTag * @return R @@ -96,7 +97,7 @@ */ @PostMapping("/member/deleteMemberSuggestTag") public R deleteMemberSuggestTag(@RequestBody String suggestTag); - + /** * @param mgtBaseBathDto * @return R<List < MgtSimpleMemberVo>> @@ -106,7 +107,7 @@ */ @PostMapping("/member/listSimpleVoByIds") public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody String userIds); - + /** * @param mgtUserIdByKeywordDto * @return R<MgtUserIdByKeywordVo> @@ -116,7 +117,7 @@ */ @PostMapping("/member/getUserIdByKeyword") public R<MgtUserIdByKeywordVo> getUserIdByKeyword(@RequestBody MgtUserIdByKeywordDto mgtUserIdByKeywordDto); - + /** * @param * @return R<MgtBulletinBoardVo> @@ -126,7 +127,7 @@ */ @PostMapping("/member/boardMemberTotal") public R<MgtBulletinBoardVo> boardMemberTotal(@RequestBody BoardMemberTotalDto boardMemberTotalDto); - + /** * @param mgtActivityAgeDto * @return R<List < Long>> @@ -136,8 +137,8 @@ */ @PostMapping("/member/listUserIdByAge") public R<List<Long>> listUserIdByAge(@RequestBody MgtActivityAgeDto mgtActivityAgeDto); - - + + /** * @param shopIdlist * @return R<List < Long>> @@ -147,7 +148,7 @@ */ @PostMapping("/member/listUserIdByShopId") public R<List<Long>> listUserIdByShopId(@RequestBody List<Long> shopIdlist); - + /** * @param shopIdlist * @return R<MgtShopTotalMemberVo> @@ -157,7 +158,7 @@ */ @PostMapping("/member/getUserTotalByShopId") public R<MgtShopTotalMemberVo> getUserTotalByShopId(@RequestBody List<Long> shopIdlist); - + /** * @param memberTotalChangeDto * @return R @@ -167,8 +168,8 @@ */ @PostMapping("/member/changeMemberTotal") public R changeMemberTotal(@RequestBody MemberTotalChangeDto memberTotalChangeDto); - - + + /** * @param merTotalDto * @return R<MerOrderAgeUserVo> @@ -178,7 +179,7 @@ */ @PostMapping("/member/listOrderAgeUser") public R<List<MerOrderAgeUserVo>> listOrderAgeUser(@RequestBody MerTotalDto merTotalDto); - + /** * @param * @return R<Integer> @@ -188,8 +189,8 @@ */ @PostMapping("/member/getUnReplaySuggestVo") public R<Integer> getUnReplaySuggestVo(); - - + + /** * @param verifyPrize * @return R<MemberGiftRecord> @@ -199,8 +200,19 @@ */ @PostMapping("/member/getVerifyPrize") public R<MemberGiftRecord> getVerifyPrize(@RequestBody String verifyPrize); - - + + + /** + * @param giftId + * @return R<MemberGiftRecord> + * @description 根据礼品id获取数据 + * @author jqs + * @date 2023/7/8 17:43 + */ + @PostMapping("/member/getVerifyPrizeByGiftId") + public R<MemberGiftRecord> getVerifyPrizeByGiftId(@RequestBody String giftId); + + /** * @param integralChangeDto * @return R @@ -210,8 +222,8 @@ */ @PostMapping("/member/changeIntegral") public R signShare(@RequestBody IntegralChangeDto integralChangeDto); - - + + /** * @param shopIdList * @return R<Integer> @@ -221,8 +233,8 @@ */ @PostMapping("/member/getAreaNewMember") public R<Integer> getAreaNewMember(@RequestBody List<Long> shopIdList); - - + + /** * @param mgtMemberShopNameDto * @return R @@ -232,7 +244,7 @@ */ @PostMapping("/member/updateMemberShopName") public R updateMemberShopName(@RequestBody MgtMemberShopNameDto mgtMemberShopNameDto); - + /** * @description * @author jqs @@ -242,7 +254,7 @@ */ @PostMapping("/member/getBirthdayCard") public R<BirthdayCard> getBirthdayCard(); - + /** * @description 核销奖品 * @author jqs @@ -252,14 +264,42 @@ */ @PostMapping("/member/verifyPrize") public R verifyPrize(@RequestBody MerVerifyPrizeFinalDto merVerifyPrizeFinalDto); - + /** - * @description - * @author jqs - * @date 2023/8/23 19:06 * @param ageType - * @return R<List<Long>> + * @return R<List < Long>> + * @description + * @author jqs + * @date 2023/8/23 19:06 */ @PostMapping("/member/listUserIdByAgeType") public R<List<Long>> listUserIdByAgeType(@RequestBody Integer ageType); + + /** + * 手动添加用户积分 + * + * @param integral + * @param userId + * @return + */ + @PostMapping("/member/addIntegralRecord") + R addIntegralRecord(@RequestParam("integral") Integer integral, @RequestParam("userId") Long userId, @RequestParam("orderId") String orderId); + + /** + * 添加奖品数据 + * + * @param memberGiftRecord + * @return + */ + @PostMapping("/member/saveMemberGiftRecord") + R saveMemberGiftRecord(@RequestBody MemberGiftRecord memberGiftRecord); + + /** + * 修改会员数据 + * + * @param member + * @return + */ + @PostMapping("/member/editMember") + R editMember(@RequestBody Member member); } \ No newline at end of file diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteRegionService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteRegionService.java new file mode 100644 index 0000000..0d277a5 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteRegionService.java @@ -0,0 +1,33 @@ +package com.ruoyi.system.api.service; + +import com.ruoyi.common.core.constant.ServiceNameConstants; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.api.domain.dto.AGStockChangeDto; +import com.ruoyi.system.api.domain.dto.ActivityGoodsGetDto; +import com.ruoyi.system.api.domain.dto.ActivityTotalChangeDto; +import com.ruoyi.system.api.domain.dto.MerActivityShopDto; +import com.ruoyi.system.api.domain.poji.activity.Activity; +import com.ruoyi.system.api.domain.poji.activity.ActivityGoods; +import com.ruoyi.system.api.domain.poji.activity.ActivityRecord; +import com.ruoyi.system.api.domain.vo.ActivityGoodsGetVo; +import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo; +import com.ruoyi.system.api.factory.RemoteActivityFallbackFactory; +import com.ruoyi.system.api.factory.RemoteRegionFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * @author jqs34 + * @version 1.0 + * @classname RemoteRegionService + * @description: TODO + * @date 2023 2025/6/12 15:12 + */ +@FeignClient(contextId = "remoteRegionService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteRegionFallbackFactory.class) +public interface RemoteRegionService { + + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java index 5e744ae..53fa050 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java @@ -208,4 +208,12 @@ */ @PostMapping("/shop/getShopBySysUserIds") List<Shop> getShopBySysUserIds(@RequestBody BoardMemberTotalDto boardMemberTotalDto); + + /** + * 根据经销商id查询加盟商ids + * @param shopId + * @return + */ + @PostMapping("/shop/getFranchiseeIdsBYDealerId") + List<Shop> getFranchiseeIdsBYDealerId(@RequestBody Long shopId); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index d8b0324..942e14b 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -9,3 +9,4 @@ com.ruoyi.system.api.factory.RemoteUserFallbackFactory com.ruoyi.system.api.factory.RemoteMemberFallbackFactory com.ruoyi.system.api.factory.RemoteStaffFallbackFactory +com.ruoyi.system.api.factory.RemoteRegionFallbackFactory diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml index 26b3f04..ced64dc 100644 --- a/ruoyi-auth/pom.xml +++ b/ruoyi-auth/pom.xml @@ -66,6 +66,12 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-swagger</artifactId> </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-api-goods</artifactId> + <version>3.6.2</version> + <scope>compile</scope> + </dependency> </dependencies> diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java index dcd1562..32643d7 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java @@ -87,9 +87,9 @@ // 2、生成Token return R.ok(tokenService.createQwH5Token(qwH5LoginVo)); } - + @GetMapping("/h5/oauthUser") - @ApiOperation("通过code获取商户端用户登录") + @ApiOperation("通过code获取商户端用户登录【2.0】") public R<OauthUserVo> oauthUser(@ApiParam(value = "成员授权获取到的code", required = true) @RequestParam("code") String code) throws IOException { // 通过code获取访问用户敏感信息 JSONObject result = qywxInnerService.getOauthUser(code); diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java index d9f93ed..a8092a0 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java @@ -1,7 +1,10 @@ package com.ruoyi.auth.controller; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.service.LotteryEventClient; import com.ruoyi.system.api.domain.dto.AppMiniRegisterDto; import com.ruoyi.system.api.model.AppMiniLoginDto; import com.ruoyi.system.api.model.AppMiniLoginVo; @@ -23,85 +26,93 @@ import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.model.LoginUser; +import java.util.List; +import java.util.Map; + /** * token 控制 - * + * * @author jqs */ @RestController @Api(value = "系统和小程序登录", tags = "系统和小程序登录") -public class TokenController -{ - @Autowired - private TokenService tokenService; - - @Autowired - private SysLoginService sysLoginService; - - @ApiOperation("系统登录") - @PostMapping("login") - public R<?> login(@RequestBody LoginBody form) - { - // 用户登录 - LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); - // 获取登录token - return R.ok(tokenService.createToken(userInfo)); - } - - @ApiOperation("小程序登录") - @PostMapping("miniLogin") - public R<?> miniLogin(@RequestBody AppMiniLoginDto appMiniLoginDto) - { - // 小程序用户登录 - AppMiniLoginVo appMiniLoginVo = sysLoginService.miniLogin(appMiniLoginDto); - // 获取登录token - return R.ok(tokenService.createMiniToken(appMiniLoginVo)); - } - - @ApiOperation("小程序注册") - @PostMapping("miniRegister") - public R<?> miniRegister(@RequestBody AppMiniRegisterDto appUserRegisterDto) - { - // 小程序用户登录 - AppMiniLoginVo appMiniLoginVo = sysLoginService.miniRegister(appUserRegisterDto); - // 获取登录token - return R.ok(tokenService.createMiniToken(appMiniLoginVo)); - } - - @DeleteMapping("logout") - public R<?> logout(HttpServletRequest request) - { - String token = SecurityUtils.getToken(request); - if (StringUtils.isNotEmpty(token)) - { - String username = JwtUtils.getUserName(token); - // 删除用户缓存记录 - AuthUtil.logoutByToken(token); - // 记录用户退出日志 - sysLoginService.logout(username); +public class TokenController { + @Autowired + private TokenService tokenService; + + @Autowired + private SysLoginService sysLoginService; + + @Resource + private LotteryEventClient lotteryEventClient; + + + + + + @ApiOperation("系统登录") + @PostMapping("login") + public R<?> login(@RequestBody LoginBody form) { + // 用户登录 + LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); + // 获取登录token + return R.ok(tokenService.createToken(userInfo)); + } + + @ApiOperation("小程序登录") + @PostMapping("miniLogin") + public R<?> miniLogin(@RequestBody AppMiniLoginDto appMiniLoginDto) { + // 小程序用户登录 + AppMiniLoginVo appMiniLoginVo = sysLoginService.miniLogin(appMiniLoginDto); + Map<String, Object> miniToken = tokenService.createMiniToken(appMiniLoginVo); + return R.ok(miniToken); + } + + @ApiOperation("小程序注册【2.0】") + @PostMapping("miniRegister") + public R<?> miniRegister(@RequestBody AppMiniRegisterDto appUserRegisterDto) { + // 小程序用户登录 + AppMiniLoginVo appMiniLoginVo = sysLoginService.miniRegister(appUserRegisterDto); + // 获取登录token + Map<String, Object> miniToken = tokenService.createMiniToken(appMiniLoginVo); + //判断新用户是都符合抽奖条件 + miniToken.put("lotteryDraw", false); + List<LotteryEvent> data = lotteryEventClient.getLotteryEventList(1).getData(); + if (data.size() > 0) { + miniToken.put("lotteryDraw", true); } - return R.ok(); - } - - @PostMapping("refresh") - public R<?> refresh(HttpServletRequest request) - { - LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser)) - { - // 刷新令牌有效期 - tokenService.refreshToken(loginUser); - return R.ok(); - } - return R.ok(); - } - - @PostMapping("register") - public R<?> register(@RequestBody RegisterBody registerBody) - { - // 用户注册 - sysLoginService.register(registerBody.getUsername(), registerBody.getPassword()); - return R.ok(); - } + return R.ok(); + } + + @DeleteMapping("logout") + public R<?> logout(HttpServletRequest request) { + String token = SecurityUtils.getToken(request); + if (StringUtils.isNotEmpty(token)) { + String username = JwtUtils.getUserName(token); + // 删除用户缓存记录 + AuthUtil.logoutByToken(token); + // 记录用户退出日志 + sysLoginService.logout(username); + } + return R.ok(); + } + + @PostMapping("refresh") + public R<?> refresh(HttpServletRequest request) { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) { + // 刷新令牌有效期 + tokenService.refreshToken(loginUser); + return R.ok(); + } + return R.ok(); + } + + @PostMapping("register") + public R<?> register(@RequestBody RegisterBody registerBody) { + // 用户注册 + sysLoginService.register(registerBody.getUsername(), registerBody.getPassword()); + return R.ok(); + } } diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java index 5337b8f..7558700 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java @@ -238,26 +238,28 @@ throw new ServiceException(userResult.getMsg()); } ShopRelUserVo shopInfo = shopResult.getData(); - if(null == shopInfo){ + if (null == shopInfo) { throw new ServiceException("未查询到商户信息"); } Long shopId = shopInfo.getShopId(); Shop shop = remoteShopService.getShop(shopId).getData(); - if(-1 == shop.getShopStatus()){ - recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对应商户已删除,请联系管理员",Constants.FROM_SHOP); + if (-1 == shop.getShopStatus()) { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对应商户已删除,请联系管理员", Constants.FROM_SHOP); throw new ServiceException("对应商户已删除,请联系管理员"); } - if(0 == shop.getShopStatus()){ - recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对应商户已冻结,请联系管理员",Constants.FROM_SHOP); + if (0 == shop.getShopStatus()) { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对应商户已冻结,请联系管理员", Constants.FROM_SHOP); throw new ServiceException("对应商户已冻结,请联系管理员"); } - if(2 == shop.getShopStatus()){ - recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对应商户已终止合作,请联系管理员",Constants.FROM_SHOP); + if (2 == shop.getShopStatus()) { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对应商户已终止合作,请联系管理员", Constants.FROM_SHOP); throw new ServiceException("对应商户已终止合作,请联系管理员"); } userInfo.setShopId(shopInfo.getShopId()); - recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功",Constants.FROM_SHOP); + userInfo.setShopName(shopInfo.getShopName()); + userInfo.setShopNum(shopInfo.getShopNum()); + recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功", Constants.FROM_SHOP); return userInfo; } diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index ed4df6a..ad70db5 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -118,6 +118,11 @@ <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> + <dependency> + <groupId>cn.hutool</groupId> + <artifactId>hutool-all</artifactId> + <version>5.8.22</version> + </dependency> </dependencies> diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java index dee9fc5..71ea2c8 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java @@ -222,4 +222,15 @@ } return sb.toString(); } + + public static Date getTodayStartTime() { + // 获取今天的日期 + LocalDate today = LocalDate.now(); + + // 获取当天的开始时间(00:00:00) + LocalDateTime startOfDay = today.atStartOfDay(); + + // 转换为 Date 类型 + return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); + } } diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedissonConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedissonConfig.java new file mode 100644 index 0000000..2310cac --- /dev/null +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedissonConfig.java @@ -0,0 +1,38 @@ +package com.ruoyi.common.redis.configure; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.codec.JsonJacksonCodec; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * redis配置 + * + * @author jqs + */ +@Configuration +public class RedissonConfig { + + @Value("${spring.redis.host}") + private String redisHost; + + @Value("${spring.redis.password}") + private String password; + + @Value("${spring.redis.port}") + private int port = 6379; + + @Bean + public RedissonClient getRedisson() { + Config config = new Config(); + config.useSingleServer(). + setAddress("redis://" + redisHost + ":" + port). + setPassword(password); + config.setCodec(new JsonJacksonCodec()); + return Redisson.create(config); + } + +} diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java index e064b56..fc63adc 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java @@ -125,7 +125,7 @@ loginUser.setUsername(userName); loginUser.setIpaddr(IpUtils.getIpAddr()); refreshToken(loginUser); - + // Jwt存储信息 Map<String, Object> claimsMap = new HashMap<String, Object>(); claimsMap.put(SecurityConstants.USER_KEY, token); @@ -135,6 +135,8 @@ // 接口返回信息 OauthUserVo oauthUserVo = new OauthUserVo(); oauthUserVo.setShopId(qwH5LoginVo.getShopId()); + oauthUserVo.setShopNum(qwH5LoginVo.getShopNum()); + oauthUserVo.setShopName(qwH5LoginVo.getShopName()); oauthUserVo.setToken(JwtUtils.createToken(claimsMap)); oauthUserVo.setExpiresIn(EXPIRE_TIME); oauthUserVo.setUserid(qwH5LoginVo.getUserid()); diff --git a/ruoyi-modules/ruoyi-goods/pom.xml b/ruoyi-modules/ruoyi-goods/pom.xml index 33f3f85..fcd06ba 100644 --- a/ruoyi-modules/ruoyi-goods/pom.xml +++ b/ruoyi-modules/ruoyi-goods/pom.xml @@ -121,6 +121,12 @@ <version>4.13.1</version> <scope>test</scope> </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-api-goods</artifactId> + <version>3.6.2</version> + <scope>compile</scope> + </dependency> </dependencies> diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java new file mode 100644 index 0000000..ba31001 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java @@ -0,0 +1,68 @@ +package com.ruoyi.goods.controller.business; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseVO; +import com.ruoyi.goods.service.biz.XiaoeCourseService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author mitao + * @date 2025/1/10 + */ +@Api(tags = {"商户端海恒课程相关接口"}) +@Validated +@RestController +@RequestMapping("/mer/course") +@RequiredArgsConstructor +public class MerCourseController { + private final XiaoeCourseService xiaoeCourseService; + + /** + * 课程列表 + * @param dto + * @return + */ + @ApiOperation("课程列表") + @PostMapping("/page") + public R<Page<XiaoeCourseVO>> page(@Valid @RequestBody XiaoeCourseQueryDto dto) { + return R.ok(xiaoeCourseService.getCoursePageList(dto,0)); + } + + /** + * 课程章节详情 + * @param id + * @return + */ + @ApiOperation("课程章节详情") + @GetMapping("/detail/{id}") + public R<List<XiaoeCourseChapterVO>> detail(@ApiParam(name = "id",value = "课程id",required = true)@PathVariable("id") String id) { + return R.ok(xiaoeCourseService.getCourseDetail(id)); + } + + /** + * 获取课程分组列表 + * @return + */ + @ApiOperation("获取课程分组列表") + @GetMapping("/group") + public R<List<XiaoeCourseGroupVO>> getCourseGroupList() { + return R.ok(xiaoeCourseService.getCourseGroupList(0)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java index 25d422c..8bdf72c 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java @@ -1,5 +1,6 @@ package com.ruoyi.goods.controller.business; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.utils.SecurityUtils; @@ -8,8 +9,12 @@ import com.ruoyi.goods.domain.dto.MgtSelectGoodsPageDto; import com.ruoyi.goods.domain.vo.MerGoodsPageVo; import com.ruoyi.goods.service.goods.GoodsService; +import com.ruoyi.goods.service.goods.ShopGoodsService; import com.ruoyi.system.api.domain.dto.MerBaseDto; +import com.ruoyi.system.api.domain.poji.goods.ShopGoods; +import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo; +import com.ruoyi.system.api.service.RemoteShopService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.RequestBody; @@ -31,19 +36,41 @@ @RestController @RequestMapping("/mer/goods") public class MerGoodsController { - + @Resource private GoodsService goodsService; - + + @Resource + private RemoteShopService remoteShopService; + + @Resource + private ShopGoodsService shopGoodsService; + + @RequestMapping(value = "/pageMerShopGoods", method = RequestMethod.POST) - @ApiOperation(value = "分页获取商户商品列表") + @ApiOperation(value = "分页获取商户商品列表【2.0】") public R<Page<MerGoodsPageVo>> pageMerShopGoods(@RequestBody MerGoodsPageDto merGoodsPageDto) { Long userId = SecurityUtils.getUserId(); Page<MerGoodsPageVo> page = new Page<>(); page.setSize(merGoodsPageDto.getPageSize()); page.setCurrent(merGoodsPageDto.getPageNum()); page.setOptimizeCountSql(false); - List<MerGoodsPageVo> merGoodsPageVoList = goodsService.pageMerShopGoods(page,merGoodsPageDto); + List<MerGoodsPageVo> merGoodsPageVoList = goodsService.pageMerShopGoods(page, merGoodsPageDto); + Shop shop = remoteShopService.getShop(merGoodsPageDto.getShopId()).getData(); + Shop belongShop = remoteShopService.getShop(shop.getBelongShopId()).getData(); + merGoodsPageVoList.forEach(merGoodsPageVo -> { + ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(belongShop.getShopId(), merGoodsPageVo.getGoodsId()); + //后台开启经销商统一售价,且经销商设置了统一售价,加盟商不能修改价格 + if (1 == belongShop.getModifyPricePermission() && null != shopGoods) { + merGoodsPageVo.setModifyPricePermission(0); + merGoodsPageVo.setIsUnifiedPrice(1); + merGoodsPageVo.setUnifiedPrice(shopGoods.getSalesPrice()); + merGoodsPageVo.setUnifiedServerNum(shopGoods.getServiceNum()); + } else { + merGoodsPageVo.setModifyPricePermission(1); + merGoodsPageVo.setIsUnifiedPrice(0); + } + }); return R.ok(page.setRecords(merGoodsPageVoList)); } @@ -53,16 +80,26 @@ List<MerGoodsPageVo> merGoodsPageVoList = goodsService.listMerCycleGoods(merBaseDto.getShopId()); return R.ok(merGoodsPageVoList); } - + @RequestMapping(value = "/editMerShopGoods", method = RequestMethod.POST) - @ApiOperation(value = "编辑商户商品价格") + @ApiOperation(value = "编辑商户商品价格【2.0】") public R editMerShopGoods(@RequestBody MerShopGoodsEditDto merShopGoodsEditDto) { Long userId = SecurityUtils.getUserId(); merShopGoodsEditDto.setUserId(userId); goodsService.editMerShopGoods(merShopGoodsEditDto); return R.ok(); } - + + + @RequestMapping(value = "/cancelUniformPrice", method = RequestMethod.POST) + @ApiOperation(value = "取消统一售价【2.0】") + public R cancelUniformPrice(@RequestBody MerShopGoodsEditDto merShopGoodsEditDto) { + shopGoodsService.remove(new LambdaUpdateWrapper<ShopGoods>().eq(ShopGoods::getShopId, merShopGoodsEditDto.getShopId()) + .eq(ShopGoods::getGoodsId, merShopGoodsEditDto.getGoodsId())); + return R.ok(); + } + + @RequestMapping(value = "/pageMerSelectGoods", method = RequestMethod.POST) @ApiOperation(value = "分页获取商品选择列表") public R<Page<MgtSelectGoodsPageVo>> pageMerSelectGoods(@RequestBody MgtSelectGoodsPageDto mgtSelectGoodsPageDto) { @@ -70,7 +107,7 @@ page.setSize(mgtSelectGoodsPageDto.getPageSize()); page.setCurrent(mgtSelectGoodsPageDto.getPageNum()); page.setOptimizeCountSql(false); - List<MgtSelectGoodsPageVo> mgtSelectGoodsPageVos = goodsService.pageMgtSelectGoods(page,mgtSelectGoodsPageDto); + List<MgtSelectGoodsPageVo> mgtSelectGoodsPageVos = goodsService.pageMgtSelectGoods(page, mgtSelectGoodsPageDto); return R.ok(page.setRecords(mgtSelectGoodsPageVos)); } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java new file mode 100644 index 0000000..cb6fe5e --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java @@ -0,0 +1,112 @@ +package com.ruoyi.goods.controller.business; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.domain.dto.XiaoeLiveDto; +import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2; +import com.ruoyi.goods.domain.vo.XiaoeLiveVo; +import com.ruoyi.goods.service.biz.XiaoeLiveService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author mitao + * @date 2025/1/9 + */ +@Validated +@RestController +@RequiredArgsConstructor +@Api(tags = "商户端直播相关接口") +@RequestMapping("/mer/live") +public class MerLiveController { + private final XiaoeLiveService xiaoeLiveService; + + /** + * 直播首页分页列表 + * @param dto + * @return + */ + @ApiOperation("直播首页分页列表") + @PostMapping("/page") + public R<Page<XiaoeLiveVo>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) { + return R.ok(xiaoeLiveService.getLivePage(dto)); + } + + /** + * 直播详情 + * @param id + * @return + */ + @ApiOperation("直播详情") + @GetMapping("/detail/{id}") + public R<XiaoeLiveDetailVOV2> detail(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) { + return R.ok(xiaoeLiveService.getLiveDetail(id)); + } + + /** + * 预约直播 + * @param id + * @return + */ + @ApiOperation("预约") + @GetMapping("/appointment/{id}") + public R<Boolean> appointment(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) { + return R.ok(xiaoeLiveService.appointment(id)); + } + + /** + * 我的直播 + * @param dto + * @return + */ + @ApiOperation("我的直播") + @PostMapping("/mine") + public R<Page<XiaoeLiveVo>> minePage(@Valid @RequestBody XiaoeLiveQueryDto dto) { + return R.ok(xiaoeLiveService.getMineLivePage(dto)); + } + + /** + * 获取当前店铺讲师id列表/创建直播前校验讲师信息 + * @return + */ + @ApiOperation("获取当前店铺讲师id列表/创建直播前校验讲师信息") + @GetMapping("/xiaoe/ids") + public R<List<String>> getShopXiaoeUserIdList() { + return R.ok(xiaoeLiveService.getShopXiaoeUserIdList()); + } + /** + * 创建直播 + * @param dto + * @return + */ + @ApiOperation("创建直播") + @PostMapping("/create") + public R<?> create(@Valid @RequestBody XiaoeLiveDto dto) { + xiaoeLiveService.create(dto,2); + return R.ok(); + } + + /** + * 编辑直播 + * @param dto + * @return + */ + @ApiOperation("编辑直播") + @PostMapping + public R<Boolean> edit(@Valid @RequestBody XiaoeLiveDto dto) { + return R.ok(xiaoeLiveService.edit(dto)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLotteryEventController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLotteryEventController.java new file mode 100644 index 0000000..52f9647 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLotteryEventController.java @@ -0,0 +1,153 @@ +package com.ruoyi.goods.controller.business; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.uuid.IdUtils; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.domain.LotteryEventPrize; +import com.ruoyi.goods.domain.dto.DelShopLotteryDrawDto; +import com.ruoyi.goods.domain.dto.ShopLotteryDrawListDto; +import com.ruoyi.goods.domain.dto.ShopWinningRecordDto; +import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; +import com.ruoyi.goods.domain.vo.ShopLotteryDrawVo; +import com.ruoyi.goods.domain.vo.ShopWinningRecordVo; +import com.ruoyi.goods.service.goods.GoodsService; +import com.ruoyi.goods.service.lottery.ILotteryEventPrizeService; +import com.ruoyi.goods.service.lottery.ILotteryEventService; +import com.ruoyi.goods.service.lottery.IUserLotteryEventService; +import com.ruoyi.system.api.domain.poji.goods.Goods; +import com.ruoyi.system.api.domain.poji.shop.Shop; +import com.ruoyi.system.api.service.RemoteShopService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang.StringUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:13 + */ +@Api(value = "商户端商户相关接口", tags = "商户端商户相关接口", description = "商户端商户相关接口") +@RestController +@RequestMapping("/mer/lotteryEvent") +public class MerLotteryEventController { + + @Resource + private ILotteryEventService lotteryEventService; + + @Resource + private RemoteShopService remoteShopService; + + @Resource + private ILotteryEventPrizeService lotteryEventPrizeService; + + @Resource + private IUserLotteryEventService userLotteryEventService; + + @Resource + private GoodsService goodsService; + + + @RequestMapping(value = "/getShopLotteryDrawList", method = RequestMethod.POST) + @ApiOperation(value = "获取门店抽奖活动列表【2.0】") + public R<ShopLotteryDrawVo> getShopLotteryDrawList(@RequestBody ShopLotteryDrawListDto dto) { + Page<ShopLotteryDrawListVo> page = new Page<>(); + page.setSize(dto.getPageSize()); + page.setCurrent(dto.getPageNum()); + Shop shop = remoteShopService.getShop(dto.getShopId()).getData(); + ShopLotteryDrawVo shopLotteryDrawVo = new ShopLotteryDrawVo(); + shopLotteryDrawVo.setLotteryDrawFlag(shop.getLotteryDrawFlag()); + List<ShopLotteryDrawListVo> shopLotteryDrawList = lotteryEventService.getShopLotteryDrawList(page, dto.getShopId()); + page.setRecords(shopLotteryDrawList); + shopLotteryDrawVo.setPage(page); + return R.ok(shopLotteryDrawVo); + } + + @RequestMapping(value = "/delShopLotteryDraw", method = RequestMethod.POST) + @ApiOperation(value = "门店删除抽奖活动【2.0】") + public R delShopLotteryDraw(@RequestBody DelShopLotteryDrawDto dto) { + LotteryEvent lotteryEvent = lotteryEventService.getById(dto.getId()); + if (null == lotteryEvent) { + return R.fail("抽奖活动不存在"); + } + if (LocalDateTime.now().isAfter(lotteryEvent.getStartTime())) { + return R.fail("删除失败"); + } + if (!lotteryEvent.getShopId().equals(dto.getShopId())) { + return R.fail("删除失败"); + } + lotteryEvent.setDelFlag(1); + lotteryEventService.updateById(lotteryEvent); + return R.ok(); + } + + + @RequestMapping(value = "/getShopLotteryDrawInfo", method = RequestMethod.POST) + @ApiOperation(value = "获取门店抽奖详情【2.0】") + public R<LotteryEvent> getShopLotteryDrawInfo(@RequestBody DelShopLotteryDrawDto dto) { + LotteryEvent lotteryEvent = lotteryEventService.getById(dto.getId()); + if (null == lotteryEvent) { + return R.fail("抽奖活动不存在"); + } + if (!lotteryEvent.getShopId().equals(dto.getShopId())) { + return R.fail("查询失败"); + } + List<LotteryEventPrize> list = lotteryEventPrizeService.list(new LambdaQueryWrapper<LotteryEventPrize>().eq(LotteryEventPrize::getLotteryEventId, dto.getId())); + lotteryEvent.setPrizes(list); + return R.ok(lotteryEvent); + } + + + @RequestMapping(value = "/editShopLotteryDraw", method = RequestMethod.POST) + @ApiOperation(value = "保存门店抽奖【2.0】") + public R editShopLotteryDraw(@RequestBody LotteryEvent lotteryEvent) { + if (lotteryEvent.getId() == null) { + lotteryEvent.setId(IdUtils.simpleUUID()); + } + lotteryEvent.setUpdateTime(LocalDateTime.now()); + lotteryEvent.setUpdateUserId(SecurityUtils.getUserId()); + lotteryEventService.saveOrUpdate(lotteryEvent); + //先删除原有的奖品 + lotteryEventPrizeService.remove(new LambdaQueryWrapper<LotteryEventPrize>().eq(LotteryEventPrize::getLotteryEventId, lotteryEvent.getId())); + //添加新的奖品 + List<LotteryEventPrize> prizes = lotteryEvent.getPrizes(); + prizes.forEach(s -> { + s.setId(IdUtils.simpleUUID()); + if (s.getPrizeType() == 2 && StringUtils.isEmpty(s.getObjectName())) { + Goods goods = goodsService.getById(s.getObjectId()); + s.setObjectName(goods.getGoodsName()); + } + s.setLotteryEventId(lotteryEvent.getId()); + }); + lotteryEventPrizeService.saveOrUpdateBatch(prizes); + return R.ok(); + } + + @RequestMapping(value = "/getShopWinningRecord", method = RequestMethod.POST) + @ApiOperation(value = "获取中奖记录列表【2.0】") + public R<Page<ShopWinningRecordVo>> getShopWinningRecord(@RequestBody ShopWinningRecordDto dto) { + LotteryEvent lotteryEvent = lotteryEventService.getById(dto.getId()); + if (null == lotteryEvent) { + return R.fail("抽奖活动不存在"); + } + if (!lotteryEvent.getShopId().equals(dto.getShopId())) { + return R.fail("查询失败"); + } + Page<ShopWinningRecordVo> page = new Page<>(); + page.setSize(dto.getPageSize()); + page.setCurrent(dto.getPageNum()); + List<ShopWinningRecordVo> shopWinningRecordVoList = userLotteryEventService.getShopWinningRecord(page, dto.getId()); + return R.ok(page.setRecords(shopWinningRecordVoList)); + } + + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/LiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/LiveController.java new file mode 100644 index 0000000..73cda39 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/LiveController.java @@ -0,0 +1,33 @@ +package com.ruoyi.goods.controller.concole; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.service.live.IXiaoeLiveAppointmentService; +import com.ruoyi.goods.utils.XiaoeUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author mitao + * @date 2025/1/10 + */ +@RestController +@RequestMapping("/live") +@RequiredArgsConstructor +public class LiveController { + private final XiaoeUtils xiaoeUtils; + private final IXiaoeLiveAppointmentService xiaoeLiveAppointmentService; + + /** + * 推送微信小程序订阅消息 + * @param appointmentId + * @return + */ + @GetMapping("/push/{appointmentId}") + public R<?> push(@PathVariable("appointmentId") Long appointmentId) { + xiaoeLiveAppointmentService.push(appointmentId); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/MerLotteryEventController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/MerLotteryEventController.java new file mode 100644 index 0000000..357dd78 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/MerLotteryEventController.java @@ -0,0 +1,39 @@ +package com.ruoyi.goods.controller.concole; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.service.lottery.ILotteryEventService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:13 + */ +@RestController +@RequestMapping("/lotteryEvent") +public class MerLotteryEventController { + + @Resource + private ILotteryEventService lotteryEventService; + + + /** + * 根据开启方式获取活动列表 + * + * @param activityType + * @return + */ + @ResponseBody + @PostMapping("/getLotteryEventList") + public R<List<LotteryEvent>> getLotteryEventList(@RequestParam("activityType") Integer activityType) { + List<LotteryEvent> list = lotteryEventService.list(new LambdaQueryWrapper<LotteryEvent>().eq(LotteryEvent::getActivityType, activityType) + .eq(LotteryEvent::getDelFlag, 0).last(" and now() between start_time and end_time")); + return R.ok(list); + } + + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java index 348a5f2..e08b353 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java @@ -10,6 +10,7 @@ import com.ruoyi.goods.domain.vo.MgtGoodsEditInfoVo; import com.ruoyi.goods.domain.vo.MgtGoodsPageVo; import com.ruoyi.goods.domain.vo.MgtGoodsTotalVo; +import com.ruoyi.goods.domain.vo.PageShopMgtGoodsVO; import com.ruoyi.goods.service.goods.GoodsService; import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo; @@ -131,4 +132,17 @@ MgtGoodsEditInfoVo mgtGoodsEditInfoVo = goodsService.getMgtGoodsEditInfo(mgtBaseGetDto); return R.ok(mgtGoodsEditInfoVo); } + + @RequestMapping(value = "/pageShopMgtGoods", method = RequestMethod.POST) + @ApiOperation(value = "分页获取门店内商品信息",tags = "管理台商户相关接口") + public R<Page<PageShopMgtGoodsVO>> pageShopMgtGoods(@RequestBody PageShopMgtGoodsDTO pageShopMgtGoodsDTO) { + Page<PageShopMgtGoodsVO> page = new Page<>(); + page.setSize(pageShopMgtGoodsDTO.getPageSize()); + page.setCurrent(pageShopMgtGoodsDTO.getPageNum()); + page.setOptimizeCountSql(false); + List<PageShopMgtGoodsVO> pageShopMgtGoods = goodsService.pageShopMgtGoods(page,pageShopMgtGoodsDTO); + return R.ok(page.setRecords(pageShopMgtGoods)); + } + + //修改价格 转为经销商 } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java new file mode 100644 index 0000000..07530dd --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java @@ -0,0 +1,90 @@ +package com.ruoyi.goods.controller.management; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.domain.dto.XiaoeLiveDto; +import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2; +import com.ruoyi.goods.domain.vo.XiaoeLiveVo; +import com.ruoyi.goods.service.biz.XiaoeLiveService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * @author mitao + * @date 2025/1/12 + */ +@Api(tags = {"管理后台直播相关接口"}) +@RestController +@RequestMapping("/mgt/live") +@RequiredArgsConstructor +public class MgtLiveController { + private final XiaoeLiveService xiaoeLiveService; + + /** + * 直播分页列表 + * @param dto + * @return + */ + @ApiOperation("直播分页列表") + @PostMapping("/page") + public R<Page<XiaoeLiveVo>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) { + return R.ok(xiaoeLiveService.getMgtLivePage(dto)); + } + /** + * 直播详情 + * @param id + * @return + */ + @ApiOperation("直播详情") + @GetMapping("/detail/{id}") + public R<XiaoeLiveDetailVOV2> detail(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) { + return R.ok(xiaoeLiveService.getLiveDetail(id)); + } + /** + * 创建直播 + * @param dto + * @return + */ + @ApiOperation("添加直播") + @PostMapping("/create") + public R<?> create(@Valid @RequestBody XiaoeLiveDto dto) { + xiaoeLiveService.create(dto,1); + return R.ok(); + } + + /** + * 编辑直播 + * @param dto + * @return + */ + @ApiOperation("编辑直播") + @PutMapping + public R<Boolean> edit(@Valid @RequestBody XiaoeLiveDto dto) { + return R.ok(xiaoeLiveService.edit(dto)); + } + + /** + * 删除直播 + * @param id + * @return + */ + @ApiOperation("删除") + @DeleteMapping("/{id}") + public R<?> delete(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) { + xiaoeLiveService.deleteLive(id); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java new file mode 100644 index 0000000..5411181 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java @@ -0,0 +1,90 @@ +package com.ruoyi.goods.controller.miniapp; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseVO; +import com.ruoyi.goods.service.biz.XiaoeCourseService; +import com.ruoyi.system.api.service.RemoteConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author mitao + * @date 2025/1/10 + */ +@Api(tags = {"小程序海恒课程相关接口"}) +@Validated +@RestController +@RequestMapping("/app/course") +@RequiredArgsConstructor +public class AppCourseController { + private final XiaoeCourseService xiaoeCourseService; + + private final RemoteConfigService remoteConfigService; + + + /** + * 课程列表 + * @param dto + * @return + */ + @ApiOperation("课程列表") + @PostMapping("/page") + public R<Page<XiaoeCourseVO>> page(@Valid @RequestBody XiaoeCourseQueryDto dto) { + return R.ok(xiaoeCourseService.getCoursePageList(dto,1)); + } + + /** + * 课程章节详情 + * @param id + * @return + */ + @ApiOperation("课程章节详情") + @GetMapping("/detail/{id}") + public R<List<XiaoeCourseChapterVO>> detail(@ApiParam(name = "id",value = "课程id",required = true)@PathVariable("id") String id) { + return R.ok(xiaoeCourseService.getCourseDetail(id)); + } + + /** + * 获取课程分组列表 + * @return + */ + @ApiOperation("获取课程分组列表") + @GetMapping("/group") + public R<List<XiaoeCourseGroupVO>> getCourseGroupList() { + return R.ok(xiaoeCourseService.getCourseGroupList(1)); + } + + + + @ApiOperation("门店身份校验") + @PostMapping("/storeIdentityVerification") + public R storeIdentityVerification(@RequestParam("password") String password){ + String data = remoteConfigService.getStoreCurriculumPassword().getData(); + if(StringUtils.isNotEmpty(data)){ + if(password.equals(data)){ + return R.ok(); + } + } + return R.fail("身份校验失败"); + } + + + @ApiOperation("门店身份校验展示名称") + @PostMapping("/getStoreCurriculumName") + public R getStoreCurriculumName(){ + String data = remoteConfigService.getStoreCurriculumName().getData(); + return R.ok(data); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLiveController.java new file mode 100644 index 0000000..5c006fb --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLiveController.java @@ -0,0 +1,54 @@ +package com.ruoyi.goods.controller.miniapp; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeLiveVo; +import com.ruoyi.goods.service.biz.XiaoeLiveService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * @author mitao + * @date 2025/1/10 + */ +@Validated +@RestController +@RequiredArgsConstructor +@Api(tags = "小程序直播相关接口") +@RequestMapping("/app/live") +public class AppLiveController { + private final XiaoeLiveService xiaoeLiveService; + /** + * 直播首页分页列表 + * @param dto + * @return + */ + @ApiOperation("直播首页分页列表") + @PostMapping("/page") + public R<Page<XiaoeLiveVo>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) { + return R.ok(xiaoeLiveService.getLivePage(dto)); + } + + /** + * 预约直播 + * @param id + * @return + */ + @ApiOperation("预约") + @GetMapping("/appointment/{id}") + public R<Boolean> appointment(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) { + return R.ok(xiaoeLiveService.appointment(id)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java new file mode 100644 index 0000000..aaec304 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java @@ -0,0 +1,255 @@ +package com.ruoyi.goods.controller.miniapp; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.uuid.IdUtils; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.api.domain.*; +import com.ruoyi.goods.domain.dto.AnswerQuestionDto; +import com.ruoyi.goods.domain.dto.LotteryEventQuestionsDto; +import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; +import com.ruoyi.goods.domain.vo.LotteryEventInfoVo; +import com.ruoyi.goods.domain.vo.LotteryEventQuestionsVo; +import com.ruoyi.goods.domain.vo.LotteryEventVo; +import com.ruoyi.goods.service.lottery.*; +import com.ruoyi.system.api.domain.dto.LotteryEventListDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author zhibing.pu + * @Date 2025/5/26 15:26 + */ +@Validated +@RestController +@RequiredArgsConstructor +@Api(tags = "小程序抽奖相关接口") +@RequestMapping("/app/lotteryEvent") +public class AppLotteryEventController { + + @Resource + private ILotteryEventService lotteryEventService; + + @Resource + private IUserLotteryEventService userLotteryEventService; + + @Resource + private IUserLotteryEventQuestionsService userLotteryEventQuestionsService; + + @Resource + private IUserLotteryEventQuestionsAnswersService userLotteryEventQuestionsAnswersService; + + @Resource + private ILotteryEventQuestionsService lotteryEventServiceQuestionsService; + + @Resource + private ILotteryEventQuestionsAnswersService lotteryEventQuestionsAnswersService; + + + @ResponseBody + @PostMapping("/getLotteryEvent/{id}") + @ApiOperation(value = "获取抽奖页详情【2.0】", tags = "抽奖活动") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "抽奖活动id", required = true, dataType = "String", paramType = "path") + }) + public R<LotteryEventVo> getLotteryEvent(@PathVariable("id") String id) { + LotteryEventVo lotteryEvent = lotteryEventService.getLotteryEvent(id); + return R.ok(lotteryEvent); + } + + + @ResponseBody + @PostMapping("/lotteryDraw/{id}") + @ApiOperation(value = "抽奖操作【2.0】", tags = "抽奖活动", notes = "返回奖品ID") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "抽奖活动id", required = true, dataType = "String", paramType = "path") + }) + public R lotteryDraw(@PathVariable("id") String id) { + return lotteryEventService.lotteryDraw(id); + } + + + @ResponseBody + @PostMapping("/getLotteryEventList") + @ApiOperation(value = "获取普通抽奖列表【2.0】", tags = "抽奖活动") + public R<Page<AppLotteryEventPageVo>> getLotteryEventList(@RequestBody LotteryEventListDto dto){ + Long userId = SecurityUtils.getUserId(); + Page<AppLotteryEventPageVo> page = new Page<>(); + page.setSize(dto.getPageSize()); + page.setCurrent(dto.getPageNum()); + List<AppLotteryEventPageVo> activityPageVoList = lotteryEventService.pageAppLotteryEvent(page,userId); + return R.ok(page.setRecords(activityPageVoList)); + } + + + @ResponseBody + @PostMapping("/getLotteryEventInfo/{id}") + @ApiOperation(value = "获取抽奖活动详情【2.0】", tags = "抽奖活动") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "抽奖活动id", required = true, dataType = "String", paramType = "path") + }) + public R<LotteryEventInfoVo> getLotteryEventInfo(@PathVariable("id") String id){ + Long userId = SecurityUtils.getUserId(); + LotteryEvent lotteryEvent = lotteryEventService.getById(id); + LotteryEventInfoVo vo = new LotteryEventInfoVo(); + vo.setId(lotteryEvent.getId()); + vo.setName(lotteryEvent.getName()); + vo.setActivityProfile(lotteryEvent.getActivityProfile()); + vo.setStartTime(lotteryEvent.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + vo.setActivityContent(lotteryEvent.getActivityContent()); + int count = userLotteryEventService.count(new QueryWrapper<UserLotteryEvent>().eq("lottery_event_id", id).eq("user_id", userId)); + vo.setParticipation(count > 0); + //答题抽奖需要判断是否答题完成 + if (5 == lotteryEvent.getActivityType()) { + UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", id).eq("user_id", userId)); + vo.setContinueAnswer(null != questionsServiceOne ? questionsServiceOne.getStatus() : 0); + vo.setAnswerStartTime(null != questionsServiceOne ? questionsServiceOne.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null); + vo.setAnswerTimeLimit(lotteryEvent.getAnsweringTime()); + } + return R.ok(vo); + } + + @ResponseBody + @PostMapping("/getLotteryEventQuestions") + @ApiOperation(value = "获取答题题目【2.0】", tags = "抽奖活动") + public R<LotteryEventQuestionsVo> getLotteryEventQuestions(@RequestBody LotteryEventQuestionsDto dto) { + Long userId = SecurityUtils.getUserId(); + UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", dto.getId()).eq("user_id", userId)); + LotteryEventQuestionsVo vo = new LotteryEventQuestionsVo(); + int count = lotteryEventServiceQuestionsService.count(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId())); + vo.setTotal(count); + //没有答题,直接从第一题开始 + if (null == questionsServiceOne) { + if (-1 == dto.getStepOrDown()) { + return R.fail("操作失败"); + } + LotteryEventQuestions questions = lotteryEventServiceQuestionsService.getOne(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()).orderByAsc("sort")); + vo.setCurrent(1); + vo.setName(questions.getName()); + List<LotteryEventQuestionsAnswers> list = lotteryEventQuestionsAnswersService.list(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_questions_id", questions.getId())); + //封装答题 + List<Map<String, String>> options = list.stream().map(item -> { + Map<String, String> map = new HashMap<>(); + map.put("id", item.getId()); + map.put("name", item.getAnswer()); + return map; + }).collect(Collectors.toList()); + vo.setOptions(options); + } else { + //上一题 + Integer current = dto.getCurrent(); + if (-1 == dto.getStepOrDown()) { + if (current - 1 <= 0) { + return R.fail("操作失败"); + } + current--; + } else { + //下一题 + if (current >= count) { + return R.fail("操作失败"); + } + current++; + } + List<LotteryEventQuestions> list = lotteryEventServiceQuestionsService.list(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()).orderByAsc("sort")); + LotteryEventQuestions lotteryEventQuestions = list.get(current); + vo.setCurrent(current); + vo.setName(lotteryEventQuestions.getName()); + List<LotteryEventQuestionsAnswers> list1 = lotteryEventQuestionsAnswersService.list(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_questions_id", lotteryEventQuestions.getId())); + //封装答题 + List<Map<String, String>> options = list1.stream().map(item -> { + Map<String, String> map = new HashMap<>(); + map.put("id", item.getId()); + map.put("name", item.getAnswer()); + return map; + }).collect(Collectors.toList()); + if (-1 == dto.getStepOrDown()) { + UserLotteryEventQuestionsAnswers one = userLotteryEventQuestionsAnswersService.getOne(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("lottery_event_id", dto.getId()).eq("user_id", userId).orderByDesc("create_time").last(" limit 0, 1")); + if (null != one) { + vo.setAnswer(lotteryEventQuestionsAnswersService.getById(one.getLotteryEventQuestionsAnswersId()).getAnswer()); + } + } + vo.setOptions(options); + } + return R.ok(vo); + } + + @ResponseBody + @PostMapping("/answerQuestion") + @ApiOperation(value = "答题操作【2.0】", tags = "抽奖活动") + public R answerQuestion(@RequestBody AnswerQuestionDto dto) { + List<LotteryEventQuestions> list = lotteryEventServiceQuestionsService.list(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()).orderByAsc("sort")); + LotteryEventQuestions lotteryEventQuestions = list.get(dto.getCurrent()); + List<LotteryEventQuestionsAnswers> list1 = lotteryEventQuestionsAnswersService.list(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_questions_id", lotteryEventQuestions.getId())); + LotteryEventQuestionsAnswers lotteryEventQuestionsAnswers = list1.stream().filter(item -> item.getAnswer().equals(dto.getAnswer())).findAny().orElse(null); + //构建答题数据 + Long userId = SecurityUtils.getUserId(); + UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", dto.getId()).eq("user_id", userId)); + if (null == questionsServiceOne) { + questionsServiceOne = new UserLotteryEventQuestions(); + questionsServiceOne.setId(IdUtils.simpleUUID()); + questionsServiceOne.setUserId(userId); + questionsServiceOne.setLotteryEventId(dto.getId()); + questionsServiceOne.setStatus(1); + questionsServiceOne.setCreateTime(LocalDateTime.now()); + userLotteryEventQuestionsService.save(questionsServiceOne); + } + //构建或者修改答题数据 + UserLotteryEventQuestionsAnswers one = userLotteryEventQuestionsAnswersService.getOne(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("lottery_event_question_id", lotteryEventQuestions.getId()).eq("user_id", userId)); + if (null == one) { + one = new UserLotteryEventQuestionsAnswers(); + one.setId(IdUtils.simpleUUID()); + one.setLotteryEventId(dto.getId()); + one.setUserId(userId); + one.setLotteryEventQuestionId(lotteryEventQuestions.getId()); + one.setLotteryEventQuestionsAnswersId(lotteryEventQuestionsAnswers.getId()); + one.setCreateTime(LocalDateTime.now()); + } + one.setIsCorrect(0); + //答案正确 + if (null != lotteryEventQuestionsAnswers && 1 == lotteryEventQuestionsAnswers.getIsRight()) { + one.setIsCorrect(1); + } + userLotteryEventQuestionsAnswersService.saveOrUpdate(one); + return R.ok(); + } + + @ResponseBody + @PostMapping("/endAnswerQuestion/{id}") + @ApiOperation(value = "结束答题【2.0】", tags = "抽奖活动") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "抽奖活动id", required = true, dataType = "String", paramType = "path") + }) + public R<Boolean> endAnswerQuestion(@PathVariable("id") String id) { + Long userId = SecurityUtils.getUserId(); + LotteryEvent lotteryEvent = lotteryEventService.getById(id); + UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", id).eq("user_id", userId)); + questionsServiceOne.setStatus(2); + questionsServiceOne.setEndTime(LocalDateTime.now()); + //计算正确率 + List<UserLotteryEventQuestionsAnswers> list = userLotteryEventQuestionsAnswersService.list(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("lottery_event_id", id).eq("user_id", userId)); + int count = list.size(); + int right = list.stream().filter(item -> 1 == item.getIsCorrect()).collect(Collectors.toList()).size(); + BigDecimal multiply = new BigDecimal(right).divide(new BigDecimal(count), 4, BigDecimal.ROUND_HALF_UP).setScale(4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + questionsServiceOne.setCorrectAnswerRate(multiply); + userLotteryEventQuestionsService.updateById(questionsServiceOne); + if (multiply.compareTo(lotteryEvent.getAccuracy()) >= 0) { + return R.ok(true); + } + return R.ok(false); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/staff/StaffLiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/staff/StaffLiveController.java new file mode 100644 index 0000000..ad947c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/staff/StaffLiveController.java @@ -0,0 +1,39 @@ +package com.ruoyi.goods.controller.staff; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeLiveVo; +import com.ruoyi.goods.service.biz.XiaoeLiveService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * @author mitao + * @date 2025/1/15 + */ +@Api(tags = {"员工端直播相关接口"}) +@RestController +@RequestMapping("/staff/live") +@RequiredArgsConstructor +public class StaffLiveController { + private final XiaoeLiveService xiaoeLiveService; + + /** + * 员工端直播列表 + * @param dto + * @return + */ + @ApiOperation("直播列表") + @PostMapping("/page") + public R<Page<XiaoeLiveVo>> minePage(@Valid @RequestBody XiaoeLiveQueryDto dto) { + return R.ok(xiaoeLiveService.getStaffLivePage(dto)); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/AnswerQuestionDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/AnswerQuestionDto.java new file mode 100644 index 0000000..27a53f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/AnswerQuestionDto.java @@ -0,0 +1,18 @@ +package com.ruoyi.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/5/27 10:45 + */ +@Data +@ApiModel +public class AnswerQuestionDto { + @ApiModelProperty(value = "抽奖id") + private String id; + @ApiModelProperty(value = "当前题号") + private Integer current; + @ApiModelProperty(value = "答案") + private String answer; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/DelShopLotteryDrawDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/DelShopLotteryDrawDto.java new file mode 100644 index 0000000..a2be9f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/DelShopLotteryDrawDto.java @@ -0,0 +1,16 @@ +package com.ruoyi.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/5 10:32 + */ +@ApiModel +@Data +public class DelShopLotteryDrawDto { + @ApiModelProperty("门店id") + private Long shopId; + @ApiModelProperty("抽奖活动id") + private String id; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/LotteryEventQuestionsDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/LotteryEventQuestionsDto.java new file mode 100644 index 0000000..5f7530c --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/LotteryEventQuestionsDto.java @@ -0,0 +1,18 @@ +package com.ruoyi.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/5/27 10:22 + */ +@Data +@ApiModel +public class LotteryEventQuestionsDto { + @ApiModelProperty(value = "抽奖id") + private String id; + @ApiModelProperty(value = "当前题号") + private Integer current; + @ApiModelProperty(value = "-1=上一题,1=下一题") + private Integer stepOrDown; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtGoodsPageDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtGoodsPageDto.java index d3fdf28..ed9fd6b 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtGoodsPageDto.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtGoodsPageDto.java @@ -28,4 +28,8 @@ @ApiModelProperty(value = "创建时间") private String createEndTime; + + @ApiModelProperty(value = "商品状态-1删除1上架2下架") + private Integer goodsStatus; + } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/PageShopMgtGoodsDTO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/PageShopMgtGoodsDTO.java new file mode 100644 index 0000000..f4dcc42 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/PageShopMgtGoodsDTO.java @@ -0,0 +1,44 @@ +package com.ruoyi.goods.domain.dto; + +import com.ruoyi.system.api.domain.dto.MgtPageDto; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author jqs34 + * @ClassName MerGoodsPageDto + * @description: TODO + * @date 2023年05月04日 + * @version: 1.0 + */ +@Data +public class PageShopMgtGoodsDTO extends MgtPageDto { + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品类型1周期2服务3体验4单品") + private Integer goodsType; + + @ApiModelProperty(value = "商品分类id") + private Long goodsClassId; + + @ApiModelProperty(value = "创建时间") + private String createStartTime; + + @ApiModelProperty(value = "创建时间") + private String createEndTime; + + @ApiModelProperty(value = "商品状态-1删除1上架2下架") + private Integer goodsStatus; + + @ApiModelProperty(value = "所属门店") + private String shopName; + + @ApiModelProperty(value = "商户id") + private Long shopId; + + private List<Long> shopIds; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopLotteryDrawListDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopLotteryDrawListDto.java new file mode 100644 index 0000000..41949f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopLotteryDrawListDto.java @@ -0,0 +1,15 @@ +package com.ruoyi.goods.domain.dto; + +import com.ruoyi.system.api.domain.dto.MgtPageDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/5 9:23 + */ +@Data +@ApiModel +public class ShopLotteryDrawListDto extends MgtPageDto { + @ApiModelProperty(value = "商户id") + private Long shopId; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopWinningRecordDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopWinningRecordDto.java new file mode 100644 index 0000000..6fd67e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/ShopWinningRecordDto.java @@ -0,0 +1,17 @@ +package com.ruoyi.goods.domain.dto; + +import com.ruoyi.system.api.domain.dto.MgtPageDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/5 11:24 + */ +@Data +@ApiModel +public class ShopWinningRecordDto extends MgtPageDto { + @ApiModelProperty("门店id") + private Long shopId; + @ApiModelProperty("抽奖id") + private String id; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java new file mode 100644 index 0000000..1ba7e06 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java @@ -0,0 +1,43 @@ +package com.ruoyi.goods.domain.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author mitao + * @date 2025/1/9 + */ +@Data +@ApiModel("小鹅通课程列表查询参数") +public class XiaoeCourseQueryDto { + + @ApiModelProperty(value = "课程名字模糊搜索") + @JSONField(name = "search_content") + private String searchContent; + + @ApiModelProperty(value = "课程创建来源 0:全部,1:课程,2:圈子") + @JSONField(name = "created_source") + private Integer createdSource; + + @ApiModelProperty("课程分组id数组") + @JSONField(name = "tags") + private List<String> tags; + + @ApiModelProperty(value = "当前页") + @JSONField(name = "page_index") + private Integer pageNo; + + @ApiModelProperty("每页条数") + @JSONField(name = "page_size") + private Integer pageSize; + + @ApiModelProperty("排序类型 1:创建时间倒序 2:开始时间升序") + @NotNull(message = "排序类型不能为空") + private Integer sortBy; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java new file mode 100644 index 0000000..adf0891 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java @@ -0,0 +1,69 @@ +package com.ruoyi.goods.domain.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel(description = "资源信息") +@Data +public class XiaoeLiveDto { + + @ApiModelProperty(value = "直播id",notes = "添加不传,编辑必传") + @JSONField(name = "id") + private String id; + + @ApiModelProperty(value = "直播标题", required = true, notes = "字符长度必须小于45") + @NotBlank(message = "直播标题不能为空") + @JSONField(name = "title") + private String title; + + @ApiModelProperty(value = "直播简介", notes = "字符长度必须小于256,默认为空") + @NotBlank(message = "直播简介不能为空") + @Length(max = 256, message = "直播简介长度不能超过256") + @JSONField(name = "summary") + private String summary; + + @ApiModelProperty(value = "预设直播开始时间", required = true, notes = "距离当前时间不能超过五年", example = "2023-05-31 18:00:00") + @NotBlank(message = "预设直播开始时间不能为空") + @JSONField(name = "zb_start_at") + private String zbStartAt; + + @ApiModelProperty(value = "预设直播时长,单位:秒", required = true, notes = "距离预设直播开始时间不能超过十年") + @JSONField(name = "zb_stop_at") + private Integer zbStopAt; + + @ApiModelProperty(value = "直播类型 0-语音,1-录播直播,2-推流直播,默认为0-语音直播") + @NotNull(message = "直播类型不能为空") + @JSONField(name = "alive_type") + private Integer aliveType; + + @ApiModelProperty(value = "直播模式:0-横屏直播,1-竖屏直播(默认为0-横屏直播)", example = "0") + @NotNull(message = "直播模式不能为空") + @JSONField(name = "alive_mode") + private Integer aliveMode; + + @ApiModelProperty(value = "讲师用户id") + @NotBlank(message = "讲师用户id不能为空") + @JSONField(name = "user_id") + private String userId; + + @ApiModelProperty(value = "支付类型:1-免费,3-加密,仅当goods_info.sale_type=2时才可用", example = "1") + @NotNull(message = "直播类型不能为空") + @JSONField(name = "payment_type") + private Integer paymentType; + + @ApiModelProperty(value = "密码(paymentType为3时必填,否则该字段无效)") + @JSONField(name = "resource_password") + private String resourcePassword; + + @ApiModelProperty(value = "直播详情", notes = "仅允许纯文本,不得超过5000个字符,默认为空") + @NotBlank(message = "直播详情不能为空") + @Length(max = 5000, message = "直播详情长度不能超过5000") + @JSONField(name = "descrb") + private String descrb; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java new file mode 100644 index 0000000..c8d2a67 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java @@ -0,0 +1,41 @@ +package com.ruoyi.goods.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author mitao + * @date 2025/1/8 + */ +@Data +@ApiModel("直播分页查询参数") +public class XiaoeLiveQueryDto { + + @ApiModelProperty(value = "直播名称关键字") + private String searchContent; + + @ApiModelProperty(value = "直播课程类型 -1 全部;0 店铺课程; 1 转播课程;默认-1") + private Integer createMode; + + @ApiModelProperty(value = "直播商品状态 -1 全部; 0 已上架; 1 已下架;2 待上架;默认-1") + private Integer state; + + @ApiModelProperty(value = "直播模式:-1 全部;10 横屏直播;11竖屏直播;12语音直播;13录播直播;默认-1") + private Integer searchAliveType; + + @ApiModelProperty(value = "直播状态:-1全部;0未开始;1直播中;2已结束;默认-1") + private Integer alivePlayState; + + @ApiModelProperty(value = "页码,表示第几页,从1开始;默认1") + private Integer page; + + @ApiModelProperty(value = "每页条数,最大50条;默认10") + private Integer pageSize; + + @ApiModelProperty("门店id") + private Long shopId; + + @ApiModelProperty("直播类型 1:平台直播 2:商家直播") + private Integer liveType; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveAppointment.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveAppointment.java new file mode 100644 index 0000000..540b53f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveAppointment.java @@ -0,0 +1,63 @@ +package com.ruoyi.goods.domain.pojo.live; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * <p> + * 直播预约记录 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_xiaoe_live_appointment") +public class XiaoeLiveAppointment implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 直播id + */ + private String liveId; + + /** + * 预约人id + */ + private Long userId; + /** + * 直播开始时间 + */ + private Date aliveStartAt; + + /** + * 直播标题 + */ + private String title; + + /** + * 预约时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveRecord.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveRecord.java new file mode 100644 index 0000000..440c69a --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/pojo/live/XiaoeLiveRecord.java @@ -0,0 +1,64 @@ +package com.ruoyi.goods.domain.pojo.live; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * <p> + * 小鹅通直播添加记录表 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_xiaoe_live_record") +public class XiaoeLiveRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 记录类型(1:平台 2:经销商) + */ + private Integer type; + + /** + * 直播id + */ + private String liveId; + + /** + * 店铺(仅记录类型为经销商时使用) + */ + private Long shopId; + + /** + * 店铺名称 + */ + private String shopName; + + /** + * 添加时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppLotteryEventPageVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppLotteryEventPageVo.java new file mode 100644 index 0000000..769a2de --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/AppLotteryEventPageVo.java @@ -0,0 +1,30 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/26 16:25 + */ +@Data +@ApiModel +public class AppLotteryEventPageVo { + @ApiModelProperty("数据id") + private String id; + @ApiModelProperty("抽奖名称") + private String name; + @ApiModelProperty("活动简介名称") + private String activityProfile; + @ApiModelProperty("开启方式(1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖)") + private Integer activityType; + @ApiModelProperty("活动开始时间") + private String startTime; + @ApiModelProperty("活动结束时间") + private String endTime; + @ApiModelProperty("封面图") + private String coverImage; + @ApiModelProperty("参与状态") + private Boolean participation; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventInfoVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventInfoVo.java new file mode 100644 index 0000000..ff63166 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventInfoVo.java @@ -0,0 +1,32 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/26 17:42 + */ +@Data +@ApiModel +public class LotteryEventInfoVo { + @ApiModelProperty(value = "抽奖id") + private String id; + @ApiModelProperty(value = "抽奖名称") + private String name; + @ApiModelProperty(value = "活动简介名称") + private String activityProfile; + @ApiModelProperty(value = "开始时间") + private String startTime; + @ApiModelProperty(value = "活动详情") + private String activityContent; + @ApiModelProperty(value = "是否参与") + private Boolean participation; + @ApiModelProperty(value = "是否继续答题(0=未开始,1=已开始,2=已结束)") + private Integer continueAnswer; + @ApiModelProperty(value = "答题开始时间") + private String answerStartTime; + @ApiModelProperty(value = "答题时限") + private Integer answerTimeLimit; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventQuestionsVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventQuestionsVo.java new file mode 100644 index 0000000..ef6b112 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventQuestionsVo.java @@ -0,0 +1,29 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author zhibing.pu + * @Date 2025/5/27 10:05 + */ +@Data +@ApiModel +public class LotteryEventQuestionsVo { + @ApiModelProperty(value = "抽奖id") + private String id; + @ApiModelProperty("题干名称") + private String name; + @ApiModelProperty("总提数") + private Integer total; + @ApiModelProperty("当前题数") + private Integer current; + @ApiModelProperty("已答答案") + private String answer; + @ApiModelProperty("答题选项") + private List<Map<String, String>> options; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventVo.java new file mode 100644 index 0000000..87b1fcd --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/LotteryEventVo.java @@ -0,0 +1,32 @@ +package com.ruoyi.goods.domain.vo; + +import com.ruoyi.goods.api.domain.LotteryEventPrize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/12 9:39 + */ +@Data +@ApiModel +public class LotteryEventVo { + @ApiModelProperty(value = "抽奖id") + private String id; + @ApiModelProperty(value = "抽奖名称") + private String name; + @ApiModelProperty(value = "活动简介名称") + private String activityProfile; + @ApiModelProperty(value = "奖品列表") + private List<LotteryEventPrize> prizeList; + @ApiModelProperty(value = "剩余次数") + private Integer laveTimes; + @ApiModelProperty(value = "答题正确率") + private BigDecimal correctAnswerRate; + @ApiModelProperty(value = "您的奖品") + private List<UserLotteryEventVo> yourPrizeList; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MerGoodsPageVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MerGoodsPageVo.java index 28f07f5..1f6826c 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MerGoodsPageVo.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MerGoodsPageVo.java @@ -31,27 +31,39 @@ @ApiModelProperty(value = "商品图片") private String goodsPicture; - + @ApiModelProperty(value = "商品类型1周期2服务3体验4单品") private Integer goodsType; - + @ApiModelProperty(value = "商品调理问题") private String goodsNurses; - + @ApiModelProperty(value = "商品建议售价") @JsonSerialize(using = ToStringSerializer.class) - private BigDecimal suggestSalesPrice;; - + private BigDecimal suggestSalesPrice; + @ApiModelProperty(value = "商品售价") @JsonSerialize(using = ToStringSerializer.class) - private BigDecimal salesPrice;; - - @ApiModelProperty(value="周期次数标记0否1是") + private BigDecimal salesPrice; + + @ApiModelProperty(value = "周期次数标记0否1是") private Integer cycleNumFlag; - + @ApiModelProperty(value = "商品默认服务次数") - private Integer defaultServiceNum;; - + private Integer defaultServiceNum; + @ApiModelProperty(value = "服务次数") - private Integer serviceNum;; + private Integer serviceNum; + + @ApiModelProperty(value = "加盟商修改价格权限(0=关,1=开)") + private Integer modifyPricePermission; + + @ApiModelProperty("是否设置统一售价(0=否,1=是)") + private Integer isUnifiedPrice; + + @ApiModelProperty("统一售价") + private BigDecimal unifiedPrice; + + @ApiModelProperty("统一服务次数") + private Integer unifiedServerNum; } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/PageShopMgtGoodsVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/PageShopMgtGoodsVO.java new file mode 100644 index 0000000..0a3c749 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/PageShopMgtGoodsVO.java @@ -0,0 +1,80 @@ +package com.ruoyi.goods.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.ruoyi.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author huliguo + * @ClassName PageShopMgtGoodsVO + * @description: TODO + * @date 2025年06月13日 + * @version: 2.0 + */ +@Data +public class PageShopMgtGoodsVO { + + @Excel(name = "序号", width = 30, sort = 1) + @ApiModelProperty(value = "商品id") + private String goodsId; + + @Excel(name = "商品名称", width = 30, sort = 3) + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @Excel(name = "商品简介", width = 30, sort = 4) + @ApiModelProperty(value = "商品简介") + private String goodsIntroduction; + + @Excel(name = "所属分类", width = 30, sort = 6) + @ApiModelProperty(value = "商品分类") + private String goodsClass; + + @Excel(name = "标签", width = 30, sort = 7) + @ApiModelProperty(value = "商品标签") + private String goodsTags; + + @Excel(name = "商品封面", width = 30, sort = 2) + @ApiModelProperty(value = "商品图片") + private String goodsPicture; + + @Excel(name = "商品类型", width = 30, sort = 6) + @ApiModelProperty(value = "商品类型1周期2服务3体验4单品") + private String goodsType; + + @Excel(name = "建议售价", width = 30, sort = 8) + @ApiModelProperty(value = "商品建议售价") + @JsonSerialize(using = ToStringSerializer.class) + private BigDecimal suggestSalesPrice;; + + @Excel(name = "门店售价", width = 30, sort = 9) + @ApiModelProperty(value = "门店售价") + @JsonSerialize(using = ToStringSerializer.class) + private BigDecimal shopPrice;; + + @Excel(name = "所属门店", width = 30, sort = 10) + @ApiModelProperty(value = "所属门店") + private String shopName; + + + @Excel(name = "状态", width = 30, sort = 13) + @ApiModelProperty(value = "商品状态") + private String goodsStatus; + + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", sort = 14) + @ApiModelProperty(value = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("修改价格权限(0=关,1=开)") + private Integer modifyPricePermission; + + private Long shopId; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawListVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawListVo.java new file mode 100644 index 0000000..84bfe63 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawListVo.java @@ -0,0 +1,24 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/5 9:27 + */ +@Data +@ApiModel +public class ShopLotteryDrawListVo { + @ApiModelProperty("数据id") + private String id; + @ApiModelProperty("抽奖名称") + private String name; + @ApiModelProperty("简介") + private String activityProfile; + @ApiModelProperty("抽奖图片") + private String coverImage; + @ApiModelProperty("抽奖开始时间") + private String startTime; + @ApiModelProperty("抽奖结束时间") + private String endTime; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawVo.java new file mode 100644 index 0000000..3ddb20b --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopLotteryDrawVo.java @@ -0,0 +1,19 @@ +package com.ruoyi.goods.domain.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/6/5 9:25 + */ +@Data +@ApiModel +public class ShopLotteryDrawVo { + @ApiModelProperty(value = "抽奖1开2关") + private Integer lotteryDrawFlag; + @ApiModelProperty("抽奖列表") + private Page<ShopLotteryDrawListVo> page; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopWinningRecordVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopWinningRecordVo.java new file mode 100644 index 0000000..8717221 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/ShopWinningRecordVo.java @@ -0,0 +1,21 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/5 11:09 + */ +@Data +@ApiModel +public class ShopWinningRecordVo { + @ApiModelProperty("用户名") + private String userName; + @ApiModelProperty("用户电话") + private String userPhone; + @ApiModelProperty("抽奖时间") + private String lotteryTime; + @ApiModelProperty("奖品名称") + private String awardName; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/UserLotteryEventVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/UserLotteryEventVo.java new file mode 100644 index 0000000..ed3cd97 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/UserLotteryEventVo.java @@ -0,0 +1,28 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/5/12 10:44 + */ +@Data +@ApiModel +public class UserLotteryEventVo { + @ApiModelProperty("奖品名称") + private String name; + @ApiModelProperty("奖品类型(1=优惠券,2=平台商品,3=线下商品,4=积分)") + private Integer prizeType; + @ApiModelProperty("奖品数量") + private Integer number; + @ApiModelProperty("核销码") + private String verifyCode; + @ApiModelProperty("是否已核销(0=否,1=是)") + private Integer isVerify; + @ApiModelProperty("核销时间") + private String verifyTime; + @ApiModelProperty("核销门店") + private String verifyShop; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseChapterVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseChapterVO.java new file mode 100644 index 0000000..b764d0b --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseChapterVO.java @@ -0,0 +1,36 @@ +package com.ruoyi.goods.domain.vo; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author mitao + * @date 2025/1/9 + */ +@Data +@ApiModel("课程目录小节视图对象") +public class XiaoeCourseChapterVO { + @ApiModelProperty(value = "章节id") + @JSONField(name = "chapter_id") + private String chapterId; + + @ApiModelProperty(value = "章节名称") + @JSONField(name = "chapter_title") + private String chapterTitle; + + @ApiModelProperty(value = "章节类型 0-无 1-章 2-节") + @JSONField(name = "chapter_type") + private Integer chapterType; + + @ApiModelProperty(value = "关联资源的种类(1:图文,2:音频,3:视频,4:直播,20:电子书,45:AI互动课,34练习,27考试,51文档,15作业,13表单,14测试互动)") + @JSONField(name = "resource_type") + private Integer resourceType; + + @ApiModelProperty(value = "子章节集合") + @JSONField(name = "children") + private List<XiaoeCourseChapterVO> children; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseGroupVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseGroupVO.java new file mode 100644 index 0000000..9817d41 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseGroupVO.java @@ -0,0 +1,20 @@ +package com.ruoyi.goods.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author mitao + * @date 2025/1/9 + */ +@Data +@ApiModel("商品分组视图对象") +public class XiaoeCourseGroupVO { + + @ApiModelProperty("商品分组id") + private String id; + + @ApiModelProperty("商品分组名称") + private String name; +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseVO.java new file mode 100644 index 0000000..cdb4edd --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseVO.java @@ -0,0 +1,53 @@ +package com.ruoyi.goods.domain.vo; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * @author mitao + * @date 2025/1/9 + */ +@Data +@ApiModel("小鹅通课程视图对象") +public class XiaoeCourseVO { + @ApiModelProperty("课程id") + @JSONField(name = "resource_id") + private String resourceId; + + @ApiModelProperty("课程id") + @JSONField(name = "resource_type") + private Integer resourceType; + + @ApiModelProperty("课程名称") + @JSONField(name = "title") + private String title; + + @ApiModelProperty("课程封面") + @JSONField(name = "img_url") + private String imgUrl; + + @ApiModelProperty("用户数") + @JSONField(name = "user_count") + private Integer userCount; + + @ApiModelProperty("内容数") + @JSONField(name = "resource_cnt") + private Integer resourceCnt; + + @ApiModelProperty("开课时间") + @JSONField(name = "curriculum_time") + private Date curriculumTime; + + @ApiModelProperty("更新时间") + @JSONField(name = "last_updated_at") + private Date lastUpdatedAt; + + @ApiModelProperty("开课结束时间") + @JSONField(name = "curriculum_end_time") + private Date curriculumEndTime; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java new file mode 100644 index 0000000..5d58758 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java @@ -0,0 +1,181 @@ +package com.ruoyi.goods.domain.vo; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author mitao + * @date 2025/1/14 + */ +@Data +@ApiModel("直播详情2.0视图对象") +public class XiaoeLiveDetailVOV2 { + @ApiModelProperty(value = "资源信息") + @JSONField(name = "resource_info") + private ResourceInfo resourceInfo; + @ApiModelProperty(value = "配置信息") + @JSONField(name = "module_info") + private ModuleInfo moduleInfo; + @ApiModelProperty(value = "商品信息") + @JSONField(name = "goods_info") + private GoodsInfo goodsInfo; + @ApiModelProperty(value = "关联信息") + @JSONField(name = "relation_info") + private RelationInfo relationInfo; + @ApiModelProperty(value = "讲师信息") + @JSONField(name = "role_info") + private List<RelationInfo.RoleInfo> roleInfo; + + @Data + @ApiModel(description = "资源信息") + public static class ResourceInfo { + @ApiModelProperty(value = "店铺id", example = "app_id") + @JSONField(name = "app_id") + private String appId; + @ApiModelProperty(value = "直播ID", example = "id") + @JSONField(name = "id") + private String id; + @ApiModelProperty(value = "直播标题", example = "title") + @JSONField(name = "title") + private String title; + @ApiModelProperty(value = "直播简介", example = "summary") + @JSONField(name = "summary") + private String summary; + @ApiModelProperty(value = "直播详情(仅允许纯文本)", example = "descrb") + @JSONField(name = "descrb") + private String descrb; + @ApiModelProperty(value = "直播类型:0-语音,1-录播直播,2-推流直播", example = "2") + @JSONField(name = "alive_type") + private Integer aliveType; + @ApiModelProperty(value = "预设直播开始时间", example = "2023-05-31 18:00:00") + @JSONField(name = "zb_start_at") + private String zbStartAt; + @ApiModelProperty(value = "预设直播时长,单位:秒", example = "3600") + @JSONField(name = "zb_stop_at") + private Integer zbStopAt; + @ApiModelProperty(value = "详情封面图素材ID", example = "img_material_id") + @JSONField(name = "img_material_id") + private String imgMaterialId; + @ApiModelProperty(value = "宣传封面图素材ID", example = "alive_img_material_id") + @JSONField(name = "alive_img_material_id") + private String aliveImgMaterialId; + @ApiModelProperty(value = "暖场封面图素材ID", example = "aliveroom_img_material_id") + @JSONField(name = "aliveroom_img_material_id") + private String aliveroomImgMaterialId; + @ApiModelProperty(value = "暖场视频封面图素材ID", example = "warm_up_video_cover_material_id") + @JSONField(name = "warm_up_video_cover_material_id") + private String warmUpVideoCoverMaterialId; + @ApiModelProperty(value = "暖场视频素材ID", example = "warm_up_video_material_id") + @JSONField(name = "warm_up_video_material_id") + private String warmUpVideoMaterialId; + @ApiModelProperty(value = "录播视频素材ID", example = "alive_video_material_id") + @JSONField(name = "alive_video_material_id") + private String aliveVideoMaterialId; + + } + + @Data + @ApiModel(description = "配置信息") + public static class ModuleInfo { + @ApiModelProperty(value = "是否开启回放:0-开启,1-关闭", example = "0") + @JSONField(name = "is_lookback") + private Integer isLookback; + @ApiModelProperty(value = "回放是否允许倍速播放或快进:0-允许,1-禁止", example = "0") + @JSONField(name = "play_fast_state_switch") + private Integer playFastStateSwitch; + @ApiModelProperty(value = "直播模式:0-横屏直播,1-竖屏直播", example = "0") + @JSONField(name = "alive_mode") + private Integer aliveMode; + @ApiModelProperty(value = "回放有效期设置:1-永久,2-限时", example = "1") + @JSONField(name = "expire_type") + private Integer expireType; + @ApiModelProperty(value = "回放过期时间", example = "2023-06-30") + @JSONField(name = "expire") + private String expire; + @ApiModelProperty(value = "暖场设置:1-暖场图,2-暖场视频", example = "1") + @JSONField(name = "warm_up") + private Integer warmUp; + @ApiModelProperty(value = "是否开启完成条件:0-关闭,1-开启", example = "0") + @JSONField(name = "is_open_complete_time") + private Integer isOpenCompleteTime; + @ApiModelProperty(value = "设置最短学习时间(单位:分钟)", example = "0") + @JSONField(name = "complete_time") + private Integer completeTime; + @ApiModelProperty(value = "是否开启联系学员:0-关闭,1-开启", example = "0") + @JSONField(name = "is_contact_on") + private Integer isContactOn; + } + + @Data + @ApiModel(description = "商品信息") + public static class GoodsInfo { + @ApiModelProperty(value = "售卖类型:1-单独售卖、2-关联售卖", example = "1") + @JSONField(name = "sale_type") + private Integer saleType; + @ApiModelProperty(value = "支付类型:1-免费,2-收费,3-加密,4-指定学员可用,5-仅关联上级资源", example = "1") + @JSONField(name = "payment_type") + private Integer paymentType; + @ApiModelProperty(value = "价格(单位:分)", example = "0") + @JSONField(name = "piece_price") + private Integer piecePrice; + @ApiModelProperty(value = "划线价格(单位:分)", example = "0") + @JSONField(name = "line_price") + private Integer linePrice; + @ApiModelProperty(value = "密码", example = "resource_password") + @JSONField(name = "resource_password") + private String resourcePassword; + @ApiModelProperty(value = "上下架:1-下架,0-上架", example = "0") + @JSONField(name = "recycle_bin_state") + private Integer recycleBinState; + @ApiModelProperty(value = "定时上架时间", example = "2023-05-31 17:19:26") + @JSONField(name = "start_at") + private String startAt; + @ApiModelProperty(value = "是否停售:0-否,1-是", example = "0") + @JSONField(name = "is_stop_sell") + private Integer isStopSell; + @ApiModelProperty(value = "商品编码", example = "goods_sn") + @JSONField(name = "goods_sn") + private String goodsSn; + @ApiModelProperty(value = "商品状态:0-可见,1-隐藏,2-删除", example = "0") + @JSONField(name = "state") + private Integer state; + } + + @Data + @ApiModel(description = "关联信息") + public static class RelationInfo { + @ApiModelProperty(value = "资源id") + @JSONField(name = "package") + private List<String> packageIds; + @ApiModelProperty(value = "预留字段,暂未支持") + @JSONField(name = "attach_goods") + private List<String> attachGoods; + @ApiModelProperty(value = "预留字段,暂未支持") + @JSONField(name = "tags") + private List<String> tags; + + @Data + @ApiModel(description = "讲师信息列表") + public static class RoleInfo { + @ApiModelProperty(value = "自定义身份标签", example = "讲师") + @JSONField(name = "role_name") + private String roleName; + @ApiModelProperty(value = "用户id", example = "u_6688888888889999999") + @JSONField(name = "user_id") + private String userId; + @ApiModelProperty(value = "用户昵称", example = "测试") + @JSONField(name = "nickname") + private String nickname; + @ApiModelProperty(value = "用户头像", example = "avator") + @JSONField(name = "avator") + private String avator; + @ApiModelProperty(value = "是否接受打赏:1-接受打赏,0-不接受打赏", example = "1") + @JSONField(name = "is_can_exceptional") + private Integer isCanExceptional; + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveTeacherVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveTeacherVo.java new file mode 100644 index 0000000..bc81487 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveTeacherVo.java @@ -0,0 +1,23 @@ +package com.ruoyi.goods.domain.vo; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(description = "讲师信息") +@Data +public class XiaoeLiveTeacherVo { + + @ApiModelProperty(value = "讲师ID") + @JSONField(name = "user_id") + private String userId; // 讲师ID + + @ApiModelProperty(value = "讲师昵称") + @JSONField(name = "user_name") + private String userName; // 讲师昵称 + + @ApiModelProperty(value = "讲师绑定手机号") + @JSONField(name = "phone") + private String phone; // 讲师绑定手机号 +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVo.java new file mode 100644 index 0000000..bc529de --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVo.java @@ -0,0 +1,112 @@ +package com.ruoyi.goods.domain.vo; + +import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author mitao + * @date 2025/1/8 + */ +@Data +@ApiModel("小鹅通直播视图对象") +public class XiaoeLiveVo { + + @ApiModelProperty(value = "直播ID") + @JSONField(name = "id") + private String id; // 直播ID + + @ApiModelProperty(value = "直播手动结束时间") + @JSONField(name = "alive_manual_stop_at") + private String aliveManualStopAt; // 直播手动结束时间 + + @ApiModelProperty(value = "直播结束时间") + @JSONField(name = "alive_stop_at") + private String aliveStopAt; // 直播结束时间 + + @ApiModelProperty(value = "直播名称") + @JSONField(name = "title") + private String title; // 直播名称 + + @ApiModelProperty(value = "直播观看人次,每5分钟同步一次数据") + @JSONField(name = "view_count") + private Integer viewCount; // 直播观看人次 + + @ApiModelProperty(value = "直播类型:10 横屏直播;11竖屏直播;12语音直播;13录播直播") + @JSONField(name = "alive_type") + private Integer aliveType; // 直播类型 + + @ApiModelProperty(value = "订阅量") + @JSONField(name = "purchase_count") + private Integer purchaseCount; // 订阅量 + + @ApiModelProperty(value = "打赏金额(元)") + @JSONField(name = "reward_sum") + private String rewardSum; // 打赏金额(元) + + @ApiModelProperty(value = "直播商品状态:-1 全部; 0 已上架; 1 已下架;2 待上架") + @JSONField(name = "recycle_bin_state") + private Integer recycleBinState; // 直播商品状态 + + @ApiModelProperty(value = "直播开始时间") + @JSONField(name = "alive_start_at") + private String aliveStartAt; // 直播开始时间 + + @ApiModelProperty(value = "直播状态:-1全部;0未开始;1直播中;2已结束") + @JSONField(name = "alive_state") + private Integer aliveState; // 直播状态 + + @ApiModelProperty(value = "直播显隐状态:0-显示,1-隐藏") + @JSONField(name = "resource_state") + private Integer resourceState; // 直播显隐状态 + + @ApiModelProperty(value = "店铺直播详情页地址") + @JSONField(name = "page_url") + private String pageUrl; // 店铺直播详情页地址 + + @ApiModelProperty(value = "直播课程类型:-1 全部;0 店铺课程; 1 转播课程") + @JSONField(name = "create_mode") + private Integer createMode; // 直播课程类型 + + @ApiModelProperty(value = "封面地址") + @JSONField(name = "img_url") + private String imgUrl; // 封面地址 + + @ApiModelProperty(value = "直播宣传图地址") + @JSONField(name = "alive_img_url") + private String aliveImgUrl; // 直播宣传图地址 + + @ApiModelProperty(value = "讲师列表") + @JSONField(name = "guest_list") + private List<XiaoeLiveTeacherVo> guestList; + + @ApiModelProperty("评论数") + @JSONField(name = "comment_count") + private Integer commentCount; + + @ApiModelProperty("评论用户数") + @JSONField(name = "comment_user_count") + private Integer commentUserCount; + + @ApiModelProperty("打赏次数") + @JSONField(name = "reward_count") + private Integer rewardCount; + + @ApiModelProperty("打赏人数") + @JSONField(name = "reward_user_count") + private Integer rewardUserCount; + + @ApiModelProperty("直播简介") + @JSONField(name = "summary") + private String summary; + + @ApiModelProperty("预约状态 1:已预约 0:未预约") + private Integer appointmentState=0; + + @ApiModelProperty("创建门店") + private String shopName; + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java new file mode 100644 index 0000000..6b8a1c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java @@ -0,0 +1,182 @@ +package com.ruoyi.goods.domain.vo; + +import lombok.Data; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import com.alibaba.fastjson2.annotation.JSONField; + +@Data +@ApiModel(description = "小鹅通直播视图对象2.0") +public class XiaoeLiveVoV2 { + + @ApiModelProperty(value = "店铺ID", example = "app_id") + @JSONField(name = "app_id") + private String appId; + + @ApiModelProperty(value = "直播ID", example = "id") + @JSONField(name = "id") + private String id; + + @ApiModelProperty(value = "房间ID", example = "room_id") + @JSONField(name = "room_id") + private String roomId; + + @ApiModelProperty(value = "直播标题", example = "title") + @JSONField(name = "title") + private String title; + + @ApiModelProperty(value = "直播封面图", example = "img_url") + @JSONField(name = "img_url") + private String imgUrl; + + @ApiModelProperty(value = "页面url", example = "page_url") + @JSONField(name = "page_url") + private String pageUrl; + + @ApiModelProperty(value = "封面压缩后的路径", example = "img_url_compressed") + @JSONField(name = "img_url_compressed") + private String imgUrlCompressed; + + @ApiModelProperty(value = "评论数量", example = "comment_count") + @JSONField(name = "comment_count") + private Integer commentCount; + + @ApiModelProperty(value = "带货开关:1=开,0=关", example = "1") + @JSONField(name = "is_takegoods") + private Integer isTakegoods; + + @ApiModelProperty(value = "带货商品分组ID", example = "takegoods") + @JSONField(name = "takegoods") + private String takegoods; + + @ApiModelProperty(value = "付费类型:1-免费、2-单笔、3-付费产品包", example = "1") + @JSONField(name = "payment_type") + private Integer paymentType; + + @ApiModelProperty(value = "是否公开售卖,1公开,0不公开", example = "1") + @JSONField(name = "is_public") + private Integer isPublic; + + @ApiModelProperty(value = "是否停售,0-否、1-是", example = "0") + @JSONField(name = "is_stop_sell") + private Integer isStopSell; + + @ApiModelProperty(value = "视频是否转码,0-表示未转码,1-表示已转码,2-转码失败", example = "0") + @JSONField(name = "is_transcode") + private Integer isTranscode; + + @ApiModelProperty(value = "payment_type为2时,单笔价格(分);payment_type为3时,专栏价格(分)", example = "0") + @JSONField(name = "piece_price") + private Integer piecePrice; + + @ApiModelProperty(value = "划线价", example = "0") + @JSONField(name = "line_price") + private Integer linePrice; + + @ApiModelProperty(value = "该资源是否需要密码", example = "0") + @JSONField(name = "have_password") + private Integer havePassword; + + @ApiModelProperty(value = "直播类型:0-语音直播,1-视频直播,2-推流直播,3-ppt直播", example = "1") + @JSONField(name = "alive_type") + private Integer aliveType; + + @ApiModelProperty(value = "订阅量", example = "0") + @JSONField(name = "purchase_count") + private Integer purchaseCount; + + @ApiModelProperty(value = "打赏金额", example = "0") + @JSONField(name = "reward_sum") + private Integer rewardSum; + + @ApiModelProperty(value = "强制封禁:0-否 1-是", example = "0") + @JSONField(name = "is_ban") + private Integer isBan; + + @ApiModelProperty(value = "强制下架:0-否 1-是", example = "0") + @JSONField(name = "on_shelf") + private Integer onShelf; + + @ApiModelProperty(value = "上下架状态:0-上架,1-下架", example = "0") + @JSONField(name = "recycle_bin_state") + private Integer recycleBinState; + + @ApiModelProperty(value = "推流状态,0断流,1推流中,2推流未开始", example = "0") + @JSONField(name = "push_state") + private Integer pushState; + + @ApiModelProperty(value = "直播状态:0-可见,1-关闭,2-删除", example = "0") + @JSONField(name = "state") + private Integer state; + + @ApiModelProperty(value = "上架时间", example = "2023-05-31 17:19:26") + @JSONField(name = "start_at") + private String startAt; + + @ApiModelProperty(value = "直播开始时间", example = "2023-05-31 17:19:26") + @JSONField(name = "zb_start_at") + private String zbStartAt; + + @ApiModelProperty(value = "手动结束直播时间", example = "2023-05-31 17:19:26") + @JSONField(name = "manual_stop_at") + private String manualStopAt; + + @ApiModelProperty(value = "转播店铺名称", example = "source_shop_name") + @JSONField(name = "source_shop_name") + private String sourceShopName; + + @ApiModelProperty(value = "素材状态", example = "0") + @JSONField(name = "material_state") + private Integer materialState; + + @ApiModelProperty(value = "视频时长(s)", example = "0") + @JSONField(name = "video_length") + private Integer videoLength; + + @ApiModelProperty(value = "直播状态", example = "0") + @JSONField(name = "alive_state") + private Integer aliveState; + + @ApiModelProperty(value = "直播模式:0.无;1竖屏直播", example = "0") + @JSONField(name = "alive_mode") + private Integer aliveMode; + + @ApiModelProperty(value = "创建类型:0-自创建,1-转播创建", example = "0") + @JSONField(name = "create_mode") + private Integer createMode; + + @ApiModelProperty(value = "圆桌会议功能是否开启", example = "0") + @JSONField(name = "is_round_table_on") + private Integer isRoundTableOn; + + @ApiModelProperty(value = "关联商品", example = "query_package_list") + @JSONField(name = "query_package_list") + private String queryPackageList; + + @ApiModelProperty(value = "售卖有效期", example = "course_expire") + @JSONField(name = "course_expire") + private CourseExpire courseExpire; + + @ApiModelProperty("预约状态 1:已预约 0:未预约") + private Integer appointmentState=0; + + @ApiModelProperty("创建门店") + private String shopName; + + @Data + @ApiModel(description = "Course Expire Information") + public static class CourseExpire { + + @ApiModelProperty(value = "有效期类型:0=永久有效,1=固定有效期,2=自定义有效期", example = "0") + @JSONField(name = "period_type") + private Integer periodType; + + @ApiModelProperty(value = "自定义有效时长", example = "period_value") + @JSONField(name = "period_value") + private String periodValue; + + @ApiModelProperty(value = "是否允许重复购买:1=是,0=否", example = "0") + @JSONField(name = "is_allow_repeat_purchase") + private Integer isAllowRepeatPurchase; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java index a774bab..07e41e7 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java @@ -159,4 +159,6 @@ * @return List<String> */ List<String> listGoodsNameByGoodsClass(@Param("classId") Long classId); + + List<PageShopMgtGoodsVO> pageShopMgtGoods(Page<PageShopMgtGoodsVO> page,@Param("dto") PageShopMgtGoodsDTO dto); } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveAppointmentMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveAppointmentMapper.java new file mode 100644 index 0000000..bf98aec --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveAppointmentMapper.java @@ -0,0 +1,17 @@ +package com.ruoyi.goods.mapper.live; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveAppointment; + +/** + * <p> + * 直播预约记录 Mapper 接口 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +public interface XiaoeLiveAppointmentMapper extends BaseMapper<XiaoeLiveAppointment> { + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveRecordMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveRecordMapper.java new file mode 100644 index 0000000..60fbd6d --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/live/XiaoeLiveRecordMapper.java @@ -0,0 +1,17 @@ +package com.ruoyi.goods.mapper.live; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord; + +/** + * <p> + * 小鹅通直播添加记录表 Mapper 接口 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +public interface XiaoeLiveRecordMapper extends BaseMapper<XiaoeLiveRecord> { + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventMapper.java new file mode 100644 index 0000000..1e85866 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventMapper.java @@ -0,0 +1,37 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; +import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:00 + */ +public interface LotteryEventMapper extends BaseMapper<LotteryEvent> { + + + /** + * 查询APP端普通抽奖列表数据 + * + * @param page + * @param userId + * @return + */ + List<AppLotteryEventPageVo> pageAppLotteryEvent(Page<AppLotteryEventPageVo> page, @Param("userId") Long userId); + + + /** + * 获取门店抽奖列表 + * + * @param page + * @param shopId + * @return + */ + List<ShopLotteryDrawListVo> getShopLotteryDrawList(Page<ShopLotteryDrawListVo> page, @Param("shopId") Long shopId); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventPrizeMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventPrizeMapper.java new file mode 100644 index 0000000..7e262ef --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventPrizeMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.api.domain.LotteryEventPrize; + +/** + * @author zhibing.pu + * @Date 2025/5/12 9:55 + */ +public interface LotteryEventPrizeMapper extends BaseMapper<LotteryEventPrize> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsAnswersMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsAnswersMapper.java new file mode 100644 index 0000000..1db0275 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsAnswersMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.api.domain.LotteryEventQuestionsAnswers; + +/** + * @author zhibing.pu + * @Date 2025/5/19 16:18 + */ +public interface LotteryEventQuestionsAnswersMapper extends BaseMapper<LotteryEventQuestionsAnswers> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsMapper.java new file mode 100644 index 0000000..a019fca --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventQuestionsMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.api.domain.LotteryEventQuestions; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:03 + */ +public interface LotteryEventQuestionsMapper extends BaseMapper<LotteryEventQuestions> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventMapper.java new file mode 100644 index 0000000..a61e79d --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventMapper.java @@ -0,0 +1,27 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.goods.api.domain.UserLotteryEvent; +import com.ruoyi.goods.domain.vo.ShopWinningRecordVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * @author zhibing.pu + * @Date 2025/5/12 10:40 + */ +public interface UserLotteryEventMapper extends BaseMapper<UserLotteryEvent> { + + + /** + * 获取门店中奖记录 + * + * @param page + * @param id + * @return + */ + List<Map<String, Object>> getShopWinningRecord(Page<ShopWinningRecordVo> page, @Param("id") String id); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.java new file mode 100644 index 0000000..b7c238e --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestionsAnswers; + +/** + * @author zhibing.pu + * @Date 2025/5/19 16:06 + */ +public interface UserLotteryEventQuestionsAnswersMapper extends BaseMapper<UserLotteryEventQuestionsAnswers> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsMapper.java new file mode 100644 index 0000000..464136e --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.mapper.lottery; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestions; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:19 + */ +public interface UserLotteryEventQuestionsMapper extends BaseMapper<UserLotteryEventQuestions> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java new file mode 100644 index 0000000..617ebef --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java @@ -0,0 +1,66 @@ +package com.ruoyi.goods.service.biz; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseVO; +import com.ruoyi.goods.utils.XiaoeUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author mitao + * @date 2025/1/10 + */ +@Service +@RequiredArgsConstructor +public class XiaoeCourseService { + private final XiaoeUtils xiaoeUtils; + + /** + * 课程列表 + * @param dto + * @param appletFlag 是否小程序端 1:是 0:否 + * @return + */ + public Page<XiaoeCourseVO> getCoursePageList(XiaoeCourseQueryDto dto, Integer appletFlag) { + if (1 == appletFlag && CollUtil.isEmpty(dto.getTags())) { + dto.setTags(Arrays.asList("20275808", "20275805", "20275707", "20249173", "2406002")); + } + return xiaoeUtils.getCoursePageList(dto); + } + + /** + * 获取课程章节详情 + * @param id + * @return + */ + public List<XiaoeCourseChapterVO> getCourseDetail(String id) { + return xiaoeUtils.getCourseChapterDetail(id); + } + + /** + * 获取课程分组列表 + * @Param appletFlag 是否为小程序端 1:是 0:否 + * @return + */ + public List<XiaoeCourseGroupVO> getCourseGroupList(Integer appletFlag) { + List<XiaoeCourseGroupVO> courseGroupList = Optional.ofNullable(xiaoeUtils.getCourseGroupList()).orElse(Collections.emptyList()); + if (1 == appletFlag) { + //健康评估:20275808 中医手法小妙招:20275805 女性呵护:20275707 饮食/运动:20249173 节气小贴士:2406002 + Set<String> permissionList = new HashSet<>(Arrays.asList("20275808", "20275805", "20275707", "20249173", "2406002")); + courseGroupList = courseGroupList.stream().filter(item -> permissionList.contains(item.getId())).collect(Collectors.toList()); + } + return courseGroupList; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java new file mode 100644 index 0000000..708299f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java @@ -0,0 +1,334 @@ +package com.ruoyi.goods.service.biz; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.domain.dto.XiaoeLiveDto; +import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveAppointment; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord; +import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2; +import com.ruoyi.goods.domain.vo.XiaoeLiveVo; +import com.ruoyi.goods.service.live.IXiaoeLiveAppointmentService; +import com.ruoyi.goods.service.live.IXiaoeLiveRecordService; +import com.ruoyi.goods.utils.XiaoeUtils; +import com.ruoyi.system.api.constant.DelayTaskEnum; +import com.ruoyi.system.api.domain.poji.config.DelayTask; +import com.ruoyi.system.api.domain.poji.shop.Shop; +import com.ruoyi.system.api.domain.poji.sys.SysUser; +import com.ruoyi.system.api.domain.vo.ShopRelUserVo; +import com.ruoyi.system.api.service.RemoteConfigService; +import com.ruoyi.system.api.service.RemoteShopService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author mitao + * @date 2025/1/9 + */ +@Service +@RequiredArgsConstructor +public class XiaoeLiveService { + private final IXiaoeLiveRecordService xiaoeLiveRecordService; + private final XiaoeUtils xiaoeUtils; + private final IXiaoeLiveAppointmentService xiaoeLiveAppointmentService; + private final RedisService redisService; + private final RemoteConfigService remoteConfigService; + private final RemoteShopService remoteShopService; + + + /** + * 直播首页分页列表 + * @param dto + * @return + */ + public Page<XiaoeLiveVo> getLivePage(XiaoeLiveQueryDto dto) { + //当前登录用户id + Long userId = SecurityUtils.getUserId(); + Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(dto); + if (CollectionUtil.isEmpty(livePageList.getRecords())) { + return new Page<>(); + } + //已预约的记录 + List<XiaoeLiveAppointment> appointments = xiaoeLiveAppointmentService.lambdaQuery() + .gt(XiaoeLiveAppointment::getAliveStartAt, DateUtils.getNowDate()).eq(XiaoeLiveAppointment::getUserId, userId).list(); + Map<String, XiaoeLiveAppointment> appointmentMap = appointments.stream().collect(Collectors.toMap(XiaoeLiveAppointment::getLiveId, appointment -> appointment)); + // 处理直播数据 + List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream() + .filter(item -> !item.getAliveState().equals(2)) // 过滤直播状态为已结束的记录 + .peek(item -> { + // 查找对应的预约记录 + XiaoeLiveAppointment appointment = appointmentMap.get(item.getId()); + + // 如果预约记录存在且直播状态为未开始,则设置状态为已预约 + if (item.getAliveState().equals(0) && appointment != null) { + item.setAppointmentState(1); // 设置为已预约 + } + }) + .sorted(Comparator.comparing(XiaoeLiveVo::getAliveState).reversed()) // 按照直播状态排序 + .collect(Collectors.toList()); + //根据直播类型过滤平台和店铺直播 + if (Objects.nonNull(dto.getLiveType())) { + List<XiaoeLiveRecord> liveRecordList = xiaoeLiveRecordService.lambdaQuery().eq(XiaoeLiveRecord::getType, dto.getLiveType()).list(); + if (CollUtil.isEmpty(liveRecordList)) { + return new Page<>(); + } + List<String> liveIdList = liveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toList()); + filteredRecords = filteredRecords.stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList()); + } + + livePageList.setRecords(filteredRecords); + return livePageList; + } + + /** + * 直播详情 + * @param id + * @return + */ + public XiaoeLiveDetailVOV2 getLiveDetail(String id) { + return xiaoeUtils.getLiveDetailV2(id); + } + /** + * 预约直播 + * @param id + * @return + */ + public Boolean appointment(String id) { + //当前登录用户 + SysUser sysUser = SecurityUtils.getSysUser(); + Long userId = sysUser.getUserId(); + //查询预约记录 + Integer count = xiaoeLiveAppointmentService.lambdaQuery().eq(XiaoeLiveAppointment::getLiveId, id).gt(XiaoeLiveAppointment::getAliveStartAt, DateUtils.getNowDate()).eq(XiaoeLiveAppointment::getUserId, userId).count(); + if (count > 0) { + throw new ServiceException("您已预约过该直播,请勿重复预约"); + } + XiaoeLiveVo liveDetail = xiaoeUtils.getLiveDetail(id); + if (Objects.isNull(liveDetail)) { + throw new ServiceException("直播不存在"); + } + XiaoeLiveAppointment xiaoeLiveAppointment = new XiaoeLiveAppointment(); + xiaoeLiveAppointment.setLiveId(id); + xiaoeLiveAppointment.setUserId(userId); + Date aliveStartAt = DateUtil.parse(liveDetail.getAliveStartAt(), DatePattern.NORM_DATETIME_PATTERN); + xiaoeLiveAppointment.setAliveStartAt(aliveStartAt); + xiaoeLiveAppointment.setCreateTime(DateUtils.getNowDate()); + xiaoeLiveAppointment.setTitle(liveDetail.getTitle()); + xiaoeLiveAppointmentService.save(xiaoeLiveAppointment); + /// 若为C端用户向 redis 添加预约记录 + if (sysUser.getUserType().equals("03")) { + // 获取当前时间 + Date nowTime = new Date(); + + // 计算直播开始时间与当前时间的差值 + long startTimeDifference = aliveStartAt.getTime() - nowTime.getTime(); + startTimeDifference = Math.max(startTimeDifference, 3000L); // 确保差值至少为3秒 + + // 获取延时任务 + DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()).getData(); + // 创建或者更新延时任务 + if (startDelayTask == null || !startDelayTask.getEndTime().equals(aliveStartAt)) { + // 删除旧的延时任务及缓存 + if (startDelayTask != null) { + remoteConfigService.deleteDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()); + redisService.deleteObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()); + } + // 设置新的延时任务 + redisService.setCacheObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId(), aliveStartAt, startTimeDifference, TimeUnit.MILLISECONDS); + startDelayTask = new DelayTask(); + startDelayTask.setDelFlag(0); + startDelayTask.setCreateTime(new Date()); + startDelayTask.setEndTime(aliveStartAt); + startDelayTask.setRedisKey(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()); + + // 添加新的延时任务 + remoteConfigService.addDelayTask(startDelayTask); + } + } + return true; + } + + /** + * 我的直播 + * @param dto + * @return + */ + public Page<XiaoeLiveVo> getMineLivePage(XiaoeLiveQueryDto dto) { + Long userId = SecurityUtils.getUserId(); + Page<XiaoeLiveVo> page = new Page<>(); + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(userId).getData(); + if (Objects.isNull(shopRelUserVo)) { + return page; + } + List<XiaoeLiveRecord> xiaoeLiveRecordList = xiaoeLiveRecordService.getListByShopId(shopRelUserVo.getShopId()); + if (CollectionUtil.isEmpty(xiaoeLiveRecordList)) { + return page; + } + Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(dto); + if (CollectionUtil.isEmpty(livePageList.getRecords())) { + return page; + } + //当前商家创建的直播 + Set<String> liveIdSet = xiaoeLiveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toSet()); + //过滤数据 + List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream() + .filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2)) + // 按照直播状态排序 + .sorted(Comparator.comparing(XiaoeLiveVo::getAliveState).reversed()).collect(Collectors.toList()); + livePageList.setRecords(filteredRecords); + return livePageList; + } + + /** + * 获取当前店铺讲师id列表 + * @return + */ + public List<String> getShopXiaoeUserIdList() { + Long userId = SecurityUtils.getUserId(); + //获取用户所属店铺 + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(userId).getData(); + if (Objects.isNull(shopRelUserVo)) { + throw new ServiceException("当前用户未关联店铺,请先关联店铺"); + } + //查询店铺信息 + Shop shop = remoteShopService.getShop(shopRelUserVo.getShopId()).getData(); + if (Objects.isNull(shop)) { + throw new ServiceException("店铺不存在"); + } + if (StringUtils.isBlank(shop.getXiaoeUserId())) { + throw new ServiceException("创建失败,请联系平台添加讲师。"); + } + return Arrays.asList(shop.getXiaoeUserId().split(",")); + } + /** + * 创建直播 + * @param dto + * @param type 创建类型 1:平台 2:经销商 + * @return + */ + public void create(XiaoeLiveDto dto,Integer type) { + if (dto.getPaymentType().equals(3) && StringUtils.isBlank(dto.getResourcePassword())){ + throw new ServiceException("密码不能为空"); + } + if (type.equals(2)) { + //获取当前登录用户 + Long userId = SecurityUtils.getUserId(); + //获取用户所属店铺 + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(userId).getData(); + if (Objects.isNull(shopRelUserVo)) { + throw new ServiceException("当前用户未关联店铺,请先关联店铺"); + } + //查询店铺信息 + Shop shop = remoteShopService.getShop(shopRelUserVo.getShopId()).getData(); + if (Objects.isNull(shop)) { + throw new ServiceException("店铺不存在"); + } + String liveId = xiaoeUtils.addLive(dto); + if (StringUtils.isBlank(liveId)) { + throw new ServiceException("创建直播失败,请联系平台管理员"); + } + Long shopId = shop.getShopId(); + String shopName = shop.getShopName(); + //添加直播创建记录 + xiaoeLiveRecordService.add(shopId, type, shopName, liveId); + } else { + String liveId = xiaoeUtils.addLive(dto); + if (StringUtils.isBlank(liveId)) { + throw new ServiceException("创建直播失败,请联系平台管理员"); + } + //添加直播创建记录 + xiaoeLiveRecordService.add(null, type, "鸿瑞堂", liveId); + } + } + + /** + * 编辑直播 + * @param dto + */ + public Boolean edit(XiaoeLiveDto dto) { + if (StringUtils.isBlank(dto.getId())) { + throw new ServiceException("直播id不能为空"); + } + return xiaoeUtils.editLive(dto); + } + + /** + * 管理后台直播分页列表 + * @param dto + * @return + */ + public Page<XiaoeLiveVo> getMgtLivePage(XiaoeLiveQueryDto dto) { + Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(dto); + Long shopId = dto.getShopId(); + if (Objects.nonNull(shopId)) { + List<XiaoeLiveRecord> xiaoeLiveRecords = xiaoeLiveRecordService.getListByShopId(shopId); + if (CollUtil.isEmpty(xiaoeLiveRecords)) { + return new Page<>(); + } + List<String> liveIdList = xiaoeLiveRecords.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toList()); + List<XiaoeLiveVo> filteredList = livePageList.getRecords().stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList()); + livePageList.setRecords(filteredList); + } + List<XiaoeLiveRecord> shopRecordList = xiaoeLiveRecordService.lambdaQuery().eq(XiaoeLiveRecord::getType, 2).list(); + Map<String, String> shopNameMap = shopRecordList.stream().collect(Collectors.toMap(XiaoeLiveRecord::getLiveId, XiaoeLiveRecord::getShopName)); + livePageList.setRecords(livePageList.getRecords().stream().peek(item -> { + String name = shopNameMap.get(item.getId()); + if (StringUtils.isNotBlank(name)) { + item.setShopName(name); + } + }).collect(Collectors.toList())); + return livePageList; + } + + /** + * 删除直播 + * @param id + */ + public void deleteLive(String id) { + Boolean flag = xiaoeUtils.deleteLive(id); + if (flag) { + //删除直播添加记录 + xiaoeLiveRecordService.lambdaUpdate().eq(XiaoeLiveRecord::getLiveId, id).remove(); + } + } + + /** + * 员工端直播列表 + * @param dto + * @return + */ + public Page<XiaoeLiveVo> getStaffLivePage(XiaoeLiveQueryDto dto) { + Page<XiaoeLiveVo> page = new Page<>(); + List<XiaoeLiveRecord> xiaoeLiveRecordList = xiaoeLiveRecordService.getMgtRecord(); + if (CollectionUtil.isEmpty(xiaoeLiveRecordList)) { + return page; + } + Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(dto); + if (CollectionUtil.isEmpty(livePageList.getRecords())) { + return page; + } + //筛选平台创建的直播 + Set<String> liveIdSet = xiaoeLiveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toSet()); + //过滤数据 + List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream().filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2)).collect(Collectors.toList()); + livePageList.setRecords(filteredRecords); + return livePageList; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java index 9933495..ed637b1 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java @@ -211,4 +211,13 @@ * @return List<String> */ List<String> listGoodsNameByGoodsClass(Long classId); + + /** + * @description 分页获取门店内的商品信息 + * @author huliguo + * @date 2025/6/13 + * @param pageShopMgtGoodsDTO + * @return List<PageShopMgtGoodsVO> + */ + List<PageShopMgtGoodsVO> pageShopMgtGoods(Page<PageShopMgtGoodsVO> page, PageShopMgtGoodsDTO pageShopMgtGoodsDTO); } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java index e66d55a..63f5f10 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java @@ -3,13 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.common.security.utils.CodeFactoryUtil; import com.ruoyi.goods.domain.dto.*; -import com.ruoyi.system.api.domain.poji.activity.Activity; import com.ruoyi.goods.domain.pojo.goods.GoodsTotal; import com.ruoyi.goods.domain.vo.*; import com.ruoyi.goods.mapper.goods.GoodsMapper; @@ -25,14 +25,18 @@ import com.ruoyi.system.api.domain.dto.MerGoodsPriceListDto; import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; import com.ruoyi.system.api.domain.dto.MgtClassNumDto; +import com.ruoyi.system.api.domain.poji.activity.Activity; import com.ruoyi.system.api.domain.poji.activity.ActivityGoods; import com.ruoyi.system.api.domain.poji.config.SysClassification; import com.ruoyi.system.api.domain.poji.goods.Goods; import com.ruoyi.system.api.domain.poji.goods.GoodsFile; import com.ruoyi.system.api.domain.poji.goods.ShopGoods; +import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo; import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo; +import com.ruoyi.system.api.domain.vo.ShopRelUserVo; import com.ruoyi.system.api.service.RemoteConfigService; +import com.ruoyi.system.api.service.RemoteShopService; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -76,16 +80,20 @@ @Resource private ActivityRecordService activityRecordService; + @Resource + private RemoteShopService remoteShopService; + + /** - * @description 获取推荐商品列表 - * @param page shopId - * @return List<AppSimpleGoodsVo> - * @author jqs34 - * @date 2023/6/4 16:27 - */ + * @param page shopId + * @return List<AppSimpleGoodsVo> + * @description 获取推荐商品列表 + * @author jqs34 + * @date 2023/6/4 16:27 + */ @Override - public List<AppSimpleGoodsVo> pageRecommendGoods(Page page, Long shopId){ - List<AppSimpleGoodsVo> appSimpleGoodsVoList = goodsMapper.pageRecommendGoods(page,shopId); + public List<AppSimpleGoodsVo> pageRecommendGoods(Page page, Long shopId) { + List<AppSimpleGoodsVo> appSimpleGoodsVoList = goodsMapper.pageRecommendGoods(page, shopId); return appSimpleGoodsVoList; } @@ -178,10 +186,21 @@ BeanUtils.copyProperties(goods, appGoodsInfoVo); //商户定制价格 ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(appGoodsInfoGetDto.getShopId(),goods.getGoodsId()); - if(shopGoods!=null){ + if (shopGoods != null) { appGoodsInfoVo.setSalesPrice(shopGoods.getSalesPrice()); appGoodsInfoVo.setServiceNum(shopGoods.getServiceNum()); + } else { + //经销商定制价格 + Shop shop = remoteShopService.getShop(appGoodsInfoGetDto.getShopId()).getData(); + Shop belongShop = remoteShopService.getShop(shop.getBelongShopId()).getData(); + shopGoods = shopGoodsService.getByShopIdAndGoodsId(belongShop.getShopId(), goods.getGoodsId()); + if (1 == belongShop.getModifyPricePermission() && null != shopGoods) { + appGoodsInfoVo.setSalesPrice(shopGoods.getSalesPrice()); + appGoodsInfoVo.setServiceNum(shopGoods.getServiceNum()); + } } + + GoodsTotal goodsTotal = goodsTotalService.getById(goods.getGoodsId()); appGoodsInfoVo.setSalesNum(goodsTotal.getBuyNumCount()); //活动商品判断 @@ -268,22 +287,32 @@ /** * 修改商户商品 + * * @param merShopGoodsEditDto */ @Override - public void editMerShopGoods(MerShopGoodsEditDto merShopGoodsEditDto){ + public void editMerShopGoods(MerShopGoodsEditDto merShopGoodsEditDto) { + Shop shop = remoteShopService.getShop(merShopGoodsEditDto.getShopId()).getData(); + if (2 == shop.getShopType()) { + Shop belongShop = remoteShopService.getShop(shop.getBelongShopId()).getData(); + ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(shop.getBelongShopId(), merShopGoodsEditDto.getGoodsId()); + if (1 == belongShop.getModifyPricePermission() && null != shopGoods) { + throw new ServiceException("经销商开启了统一价格管理"); + } + } + Goods goods = this.getById(merShopGoodsEditDto.getGoodsId()); - if(merShopGoodsEditDto.getSalePrice().compareTo(goods.getMininumPrice())<0){ - throw new ServiceException(AppErrorConstant.SALESPRICE_MIN+goods.getMininumPrice().toString()+"元"); + if (merShopGoodsEditDto.getSalePrice().compareTo(goods.getMininumPrice()) < 0) { + throw new ServiceException(AppErrorConstant.SALESPRICE_MIN + goods.getMininumPrice().toString() + "元"); } //商户定制价格 - ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(merShopGoodsEditDto.getShopId(),goods.getGoodsId()); - if(shopGoods!=null){ + ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(merShopGoodsEditDto.getShopId(), goods.getGoodsId()); + if (shopGoods != null) { shopGoods.setSalesPrice(merShopGoodsEditDto.getSalePrice()); shopGoods.setServiceNum(merShopGoodsEditDto.getServiceNum()); shopGoods.setUpdateTime(new Date()); shopGoods.setUpdateUserId(merShopGoodsEditDto.getUserId()); - }else{ + } else { shopGoods = new ShopGoods(); shopGoods.setDelFlag(0); shopGoods.setShopId(merShopGoodsEditDto.getShopId()); @@ -672,4 +701,66 @@ List<String> goodsNameList = goodsMapper.listGoodsNameByGoodsClass(classId); return goodsNameList; } + + @Override + public List<PageShopMgtGoodsVO> pageShopMgtGoods(Page<PageShopMgtGoodsVO> page,PageShopMgtGoodsDTO pageShopMgtGoodsDTO) { + //1.查找门店 + Shop shop = remoteShopService.getShop(pageShopMgtGoodsDTO.getShopId()).getData(); + if (null == shop || shop.getDelFlag() != 0) { + return Collections.emptyList(); + } + List<Shop> shops = new ArrayList<>(); + //2.判断门店是否经销商 + if (shop.getShopType()==1){ + //经销商 获取下级-加盟商ids + shops = remoteShopService.getFranchiseeIdsBYDealerId(shop.getShopId()); + } + //将该门店加入 + shops.add(shop); + List<Long> shopIds = shops.stream().map(Shop::getShopId).collect(Collectors.toList()); + //查询信息 + pageShopMgtGoodsDTO.setShopIds(shopIds); + //3.根据shopId查询商品信息 + List<PageShopMgtGoodsVO> list= goodsMapper.pageShopMgtGoods(page,pageShopMgtGoodsDTO); + + if (list != null && !list.isEmpty()) { + //4.商品分类 + // 获取所有商品分类的ID + List<Long> goodsClassIds = list.stream() + .map(PageShopMgtGoodsVO::getGoodsClass) + .map(Long::valueOf) + .collect(Collectors.toList()); + // 通过远程服务获取商品分类 + Map<Long, SysClassification> sysClassificationMap = remoteConfigService.getSysClassificationList(goodsClassIds).getData(); + // 遍历所有商品 + list.forEach(mgtGoodsPageVo -> { + // 获取商品分类 + SysClassification sysClassification = sysClassificationMap.get(Long.valueOf(mgtGoodsPageVo.getGoodsClass())); + // 如果商品分类不为空,则设置商品分类名称 + if (sysClassification != null) { + mgtGoodsPageVo.setGoodsClass(sysClassification.getClassName()); + } + }); + Map<Long, Shop> shopMap = shops.stream() + .collect(Collectors.toMap( + Shop::getShopId, // 键映射函数 + shop1 -> shop1 // 值映射函数 + )); + //5.门店信息 + list.forEach(mgtGoodsPageVo -> { + // 获取门店信息 + Shop shopInfo = shopMap.get(Long.valueOf(mgtGoodsPageVo.getShopId())); + // 如果门店信息不为空,则设置门店信息 + if (shopInfo != null) { + mgtGoodsPageVo.setShopName(shopInfo.getShopName()); + mgtGoodsPageVo.setModifyPricePermission(shop.getModifyPricePermission()); + } + }); + + } + + + + return list; + } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveAppointmentServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveAppointmentServiceImpl.java new file mode 100644 index 0000000..69956e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveAppointmentServiceImpl.java @@ -0,0 +1,57 @@ +package com.ruoyi.goods.service.impl.live; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveAppointment; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord; +import com.ruoyi.goods.mapper.live.XiaoeLiveAppointmentMapper; +import com.ruoyi.goods.service.live.IXiaoeLiveAppointmentService; +import com.ruoyi.goods.service.live.IXiaoeLiveRecordService; +import com.ruoyi.goods.utils.WeChatSubscribeMessageSender; +import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.service.RemoteMemberService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +/** + * <p> + * 直播预约记录 服务实现类 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class XiaoeLiveAppointmentServiceImpl extends ServiceImpl<XiaoeLiveAppointmentMapper, XiaoeLiveAppointment> implements IXiaoeLiveAppointmentService { + private final RemoteMemberService remoteMemberService; + private final IXiaoeLiveRecordService xiaoeLiveRecordService; + + /** + * 推送微信小程序订阅消息 + * @param appointmentId + * @return + */ + @Override + public void push(Long appointmentId) { + log.info("开始推送预约id为:{}的订阅消息",appointmentId); + XiaoeLiveAppointment appointment = getById(appointmentId); + if (Objects.nonNull(appointment)) { + Member member = remoteMemberService.getMember(appointment.getUserId()).getData(); + if (Objects.isNull(member)){ + return; + } + XiaoeLiveRecord record = xiaoeLiveRecordService.getByLiveId(appointment.getLiveId()); + if (Objects.isNull(record)) { + return; + } + //推送微信小程序订阅消息 + WeChatSubscribeMessageSender.push(member.getMiniOpenid(), appointment.getTitle(), record.getShopName(), appointment.getAliveStartAt()); + } + log.info("预约id为:{}的订阅消息推送成功",appointmentId); + } + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveRecordServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveRecordServiceImpl.java new file mode 100644 index 0000000..cfa6fd9 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveRecordServiceImpl.java @@ -0,0 +1,70 @@ +package com.ruoyi.goods.service.impl.live; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord; +import com.ruoyi.goods.mapper.live.XiaoeLiveRecordMapper; +import com.ruoyi.goods.service.live.IXiaoeLiveRecordService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * <p> + * 小鹅通直播添加记录表 服务实现类 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +@Service +public class XiaoeLiveRecordServiceImpl extends ServiceImpl<XiaoeLiveRecordMapper, XiaoeLiveRecord> implements IXiaoeLiveRecordService { + /** + * 根据直播id查询记录 + * + * @param liveId + * @return + */ + @Override + public XiaoeLiveRecord getByLiveId(String liveId) { + return lambdaQuery().eq(XiaoeLiveRecord::getLiveId, liveId).one(); + } + + /** + * 根据店铺id查询记录 + * + * @param shopId + * @return + */ + @Override + public List<XiaoeLiveRecord> getListByShopId(Long shopId) { + return lambdaQuery().eq(XiaoeLiveRecord::getType, 2).eq(XiaoeLiveRecord::getShopId, shopId).list(); + } + + /** + * 添加直播创建记录 + * @param shopId + * @param type + * @param shopName + * @param liveId + */ + @Override + public void add(Long shopId, Integer type, String shopName, String liveId) { + XiaoeLiveRecord xiaoeLiveRecord = new XiaoeLiveRecord(); + xiaoeLiveRecord.setShopId(shopId); + xiaoeLiveRecord.setType(type); + xiaoeLiveRecord.setShopName(shopName); + xiaoeLiveRecord.setLiveId(liveId); + xiaoeLiveRecord.setCreateTime(DateUtils.getNowDate()); + save(xiaoeLiveRecord); + } + + /** + * 平台直播哦添加记录 + * @return + */ + @Override + public List<XiaoeLiveRecord> getMgtRecord() { + return lambdaQuery().eq(XiaoeLiveRecord::getType, 1).list(); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventPrizeServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventPrizeServiceImpl.java new file mode 100644 index 0000000..b2e7bce --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventPrizeServiceImpl.java @@ -0,0 +1,15 @@ +package com.ruoyi.goods.service.impl.lottery; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.api.domain.LotteryEventPrize; +import com.ruoyi.goods.mapper.lottery.LotteryEventPrizeMapper; +import com.ruoyi.goods.service.lottery.ILotteryEventPrizeService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @Date 2025/5/12 9:56 + */ +@Service +public class LotteryEventPrizeServiceImpl extends ServiceImpl<LotteryEventPrizeMapper, LotteryEventPrize> implements ILotteryEventPrizeService { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsAnswersServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsAnswersServiceImpl.java new file mode 100644 index 0000000..bf91aa7 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsAnswersServiceImpl.java @@ -0,0 +1,15 @@ +package com.ruoyi.goods.service.impl.lottery; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.api.domain.LotteryEventQuestionsAnswers; +import com.ruoyi.goods.mapper.lottery.LotteryEventQuestionsAnswersMapper; +import com.ruoyi.goods.service.lottery.ILotteryEventQuestionsAnswersService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @Date 2025/5/19 16:19 + */ +@Service +public class LotteryEventQuestionsAnswersServiceImpl extends ServiceImpl<LotteryEventQuestionsAnswersMapper, LotteryEventQuestionsAnswers> implements ILotteryEventQuestionsAnswersService { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsServiceImpl.java new file mode 100644 index 0000000..5966c71 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventQuestionsServiceImpl.java @@ -0,0 +1,15 @@ +package com.ruoyi.goods.service.impl.lottery; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.api.domain.LotteryEventQuestions; +import com.ruoyi.goods.mapper.lottery.LotteryEventQuestionsMapper; +import com.ruoyi.goods.service.lottery.ILotteryEventQuestionsService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:04 + */ +@Service +public class LotteryEventQuestionsServiceImpl extends ServiceImpl<LotteryEventQuestionsMapper, LotteryEventQuestions> implements ILotteryEventQuestionsService { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java new file mode 100644 index 0000000..c180e93 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java @@ -0,0 +1,254 @@ +package com.ruoyi.goods.service.impl.lottery; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.uuid.IdUtils; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.domain.LotteryEventPrize; +import com.ruoyi.goods.api.domain.UserLotteryEvent; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestions; +import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; +import com.ruoyi.goods.domain.vo.LotteryEventVo; +import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; +import com.ruoyi.goods.domain.vo.UserLotteryEventVo; +import com.ruoyi.goods.mapper.lottery.LotteryEventMapper; +import com.ruoyi.goods.service.lottery.ILotteryEventPrizeService; +import com.ruoyi.goods.service.lottery.ILotteryEventService; +import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsService; +import com.ruoyi.goods.service.lottery.IUserLotteryEventService; +import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.domain.poji.member.MemberGiftRecord; +import com.ruoyi.system.api.domain.poji.shop.Shop; +import com.ruoyi.system.api.service.RemoteCouponService; +import com.ruoyi.system.api.service.RemoteMemberService; +import com.ruoyi.system.api.service.RemoteShopService; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:05 + */ +@Service +public class LotteryEventServiceImpl extends ServiceImpl<LotteryEventMapper, LotteryEvent> implements ILotteryEventService { + + @Resource + private IUserLotteryEventService userLotteryEventService; + + @Resource + private ILotteryEventPrizeService lotteryEventPrizeService; + + @Resource + private RemoteCouponService remoteCouponService; + + @Resource + private RemoteMemberService remoteMemberService; + + @Resource + private RedissonClient redissonClient; + + @Resource + private IUserLotteryEventQuestionsService userLotteryEventQuestionsAnswersService; + + @Resource + private RemoteShopService remoteShopService; + + + /** + * 根据id查询抽奖活动信息 + * + * @param id + * @return + */ + @Override + public LotteryEventVo getLotteryEvent(String id) { + Long userId = SecurityUtils.getUserId(); + LotteryEvent lotteryEvent = this.getById(id); + //构建返回结果 + LotteryEventVo vo = new LotteryEventVo(); + vo.setId(lotteryEvent.getId()); + vo.setName(lotteryEvent.getName()); + vo.setActivityProfile(lotteryEvent.getActivityProfile()); + List<UserLotteryEvent> userLotteryEvents = userLotteryEventService.list(new QueryWrapper<UserLotteryEvent>().eq("lottery_event_id", id)); + vo.setLaveTimes(lotteryEvent.getTimes() - userLotteryEvents.size()); + //查询抽检活动奖品 + List<LotteryEventPrize> lotteryEventPrizeList = lotteryEventPrizeService.list(new QueryWrapper<LotteryEventPrize>().eq("lottery_event_id", id)); + vo.setPrizeList(lotteryEventPrizeList); + //答题正确率 + if (5 == lotteryEvent.getActivityType()) { + UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsAnswersService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", id).eq("user_id", userId)); + if (null == questionsServiceOne) { + vo.setCorrectAnswerRate(questionsServiceOne.getCorrectAnswerRate()); + } + } + //构建我的奖品明细 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); + List<UserLotteryEventVo> collect = userLotteryEvents.stream().map(s -> { + UserLotteryEventVo userLotteryEventVo = new UserLotteryEventVo(); + userLotteryEventVo.setName(s.getObjectName()); + userLotteryEventVo.setPrizeType(s.getPrizeType()); + userLotteryEventVo.setNumber(s.getNumber()); + MemberGiftRecord memberGiftRecord = remoteMemberService.getVerifyPrizeByGiftId(s.getId()).getData(); + userLotteryEventVo.setVerifyCode("3-" + memberGiftRecord.getPrizeId()); + userLotteryEventVo.setIsVerify(1 == memberGiftRecord.getVerifyStatus() ? 0 : 1); + userLotteryEventVo.setVerifyTime(null == memberGiftRecord.getVerifyTime() ? "" : sdf.format(memberGiftRecord.getVerifyTime())); + Member member = remoteMemberService.getMember(userId).getData(); + userLotteryEventVo.setVerifyShop("全部门店"); + if (null != member && null != member.getRelationShopId()) { + Shop shop = remoteShopService.getShop(member.getRelationShopId()).getData(); + userLotteryEventVo.setVerifyShop(shop.getShopName()); + } + return userLotteryEventVo; + }).collect(Collectors.toList()); + vo.setYourPrizeList(collect); + return vo; + } + + + /** + * 抽奖操作 + * + * @param id + * @return + */ + @Override + public R lotteryDraw(String id) { + Long userId = SecurityUtils.getUserId(); + Member member = remoteMemberService.getMember(userId).getData(); + LotteryEvent lotteryEvent = this.getById(id); + //判断答题抽奖是否满足抽奖条件 + if (lotteryEvent.getActivityType() == 5) { + UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsAnswersService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", id).eq("user_id", userId)); + if (questionsServiceOne.getCorrectAnswerRate().compareTo(lotteryEvent.getAccuracy()) < 0) { + return R.fail("答题抽奖失败,答题正确率低于活动要求"); + } + } + + //使用redis锁处理高并发 + RLock lock = redissonClient.getLock("lottery_event::" + userId + "::" + id); + try { + boolean tryLock = lock.tryLock(30, TimeUnit.SECONDS); + if (tryLock) { + //判断抽奖次数是否用完 + int count = userLotteryEventService.count(new QueryWrapper<UserLotteryEvent>().eq("lottery_event_id", id).eq("user_id", userId)); + if (lotteryEvent.getTimes() <= count) { + return R.fail("抽奖次数已用完"); + } + List<LotteryEventPrize> lotteryEventPrizeList = lotteryEventPrizeService.list(new QueryWrapper<LotteryEventPrize>().eq("lottery_event_id", id)); + //开始抽奖,根据中奖概率来抽奖 + List<LotteryEventPrize> list = new ArrayList<>(); + for (LotteryEventPrize lotteryEventPrize : lotteryEventPrizeList) { + int winRate = lotteryEventPrize.getWinRate().intValue(); + for (int i = 0; i < winRate; i++) { + LotteryEventPrize event = new LotteryEventPrize(); + BeanUtil.copyProperties(lotteryEventPrize, event); + list.add(event); + } + } + //将待抽奖的集合进行随机排序 + Collections.shuffle(list); + //开始获取随机数 + int random = new Random().nextInt(list.size()); + LotteryEventPrize lotteryEventPrize = lotteryEventPrizeList.get(random); + //添加中奖商品 + UserLotteryEvent userLotteryEvent = new UserLotteryEvent(); + userLotteryEvent.setId(IdUtils.simpleUUID()); + userLotteryEvent.setUserId(userId); + userLotteryEvent.setLotteryEventId(id); + userLotteryEvent.setLotteryEventPrizeId(lotteryEventPrize.getId()); + userLotteryEvent.setPrizeType(lotteryEventPrize.getPrizeType()); + userLotteryEvent.setObjectId(lotteryEventPrize.getObjectId()); + userLotteryEvent.setObjectName(lotteryEventPrize.getObjectName()); + userLotteryEvent.setNumber(lotteryEventPrize.getNumber()); + //中奖优惠券 + if (1 == lotteryEventPrize.getPrizeType()) { + remoteCouponService.addMemberCoupon(lotteryEventPrize.getObjectId(), lotteryEventPrize.getNumber(), userId); + } + //中奖积分 + if (4 == lotteryEventPrize.getPrizeType()) { + remoteMemberService.addIntegralRecord(lotteryEventPrize.getNumber(), userId, id); + } + userLotteryEvent.setCreateTime(LocalDateTime.now()); + userLotteryEventService.save(userLotteryEvent); + //添加奖品数据 + MemberGiftRecord memberGiftRecord = new MemberGiftRecord(); + memberGiftRecord.setPrizeId(IdUtils.simpleUUID()); + memberGiftRecord.setDelFlag(0); + memberGiftRecord.setUserId(userId); + memberGiftRecord.setGiftId(userLotteryEvent.getId()); + memberGiftRecord.setGiftFrom(1); + memberGiftRecord.setShopId(member.getRelationShopId()); + switch (lotteryEventPrize.getPrizeType()) { + case 1: + memberGiftRecord.setGiftType(1); + memberGiftRecord.setCouponId(userLotteryEvent.getObjectId()); + memberGiftRecord.setCouponNumber(userLotteryEvent.getNumber()); + break; + case 2: + memberGiftRecord.setGiftType(2); + memberGiftRecord.setGoodsId(userLotteryEvent.getObjectId()); + memberGiftRecord.setGiftName(userLotteryEvent.getObjectName()); + memberGiftRecord.setGoodsNumber(userLotteryEvent.getNumber()); + break; + case 3: + memberGiftRecord.setGiftType(4); + memberGiftRecord.setGiftName(userLotteryEvent.getObjectName()); + memberGiftRecord.setGiftNumber(userLotteryEvent.getNumber()); + break; + case 4: + memberGiftRecord.setGiftType(5); + memberGiftRecord.setIntegralNumber(userLotteryEvent.getNumber()); + break; + } + memberGiftRecord.setPrizeFrom(2); + memberGiftRecord.setCreateTime(new Date()); + memberGiftRecord.setVerifyStatus(1); + remoteMemberService.saveMemberGiftRecord(memberGiftRecord); + return R.ok(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + lock.unlock(); + } + return R.fail("抽奖失败"); + } + + + /** + * 获取APP抽奖列表 + * + * @param page + * @param userId + * @return + */ + @Override + public List<AppLotteryEventPageVo> pageAppLotteryEvent(Page<AppLotteryEventPageVo> page, Long userId) { + return this.baseMapper.pageAppLotteryEvent(page, userId); + } + + + /** + * 获取门店抽奖列表 + * + * @param page + * @param shopId + * @return + */ + @Override + public List<ShopLotteryDrawListVo> getShopLotteryDrawList(Page<ShopLotteryDrawListVo> page, Long shopId) { + return this.baseMapper.getShopLotteryDrawList(page, shopId); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsAnswersServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsAnswersServiceImpl.java new file mode 100644 index 0000000..3e7ac76 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsAnswersServiceImpl.java @@ -0,0 +1,48 @@ +package com.ruoyi.goods.service.impl.lottery; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.api.domain.LotteryEventQuestionsAnswers; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestionsAnswers; +import com.ruoyi.goods.mapper.lottery.UserLotteryEventQuestionsAnswersMapper; +import com.ruoyi.goods.service.lottery.ILotteryEventQuestionsAnswersService; +import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsAnswersService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; + + + +/** + * @author zhibing.pu + * @Date 2025/5/19 16:08 + */ +@Service +public class UserLotteryEventQuestionsAnswersServiceImpl extends ServiceImpl<UserLotteryEventQuestionsAnswersMapper, UserLotteryEventQuestionsAnswers> implements IUserLotteryEventQuestionsAnswersService { + + @Resource + private ILotteryEventQuestionsAnswersService lotteryEventQuestionsAnswersService; + + + + + + /** + * 获取答题正确率 + * @param userId + * @param lotteryEventId + * @return + */ + @Override + public BigDecimal getCorrectAnswerRate(Long userId, String lotteryEventId) { + int count = this.count(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("user_id", userId).eq("lottery_event_id", lotteryEventId).eq("is_correct", 1)); + if (count > 0) { + int count1 = lotteryEventQuestionsAnswersService.count(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_id", lotteryEventId)); + return new BigDecimal(count).divide(new BigDecimal(count1), 2, BigDecimal.ROUND_HALF_UP); + } + return BigDecimal.ZERO; + } + + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsServiceImpl.java new file mode 100644 index 0000000..a75c530 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsServiceImpl.java @@ -0,0 +1,15 @@ +package com.ruoyi.goods.service.impl.lottery; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestions; +import com.ruoyi.goods.mapper.lottery.UserLotteryEventQuestionsMapper; +import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsService; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:19 + */ +@Service +public class UserLotteryEventQuestionsServiceImpl extends ServiceImpl<UserLotteryEventQuestionsMapper, UserLotteryEventQuestions> implements IUserLotteryEventQuestionsService { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventServiceImpl.java new file mode 100644 index 0000000..cbbe0be --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventServiceImpl.java @@ -0,0 +1,74 @@ +package com.ruoyi.goods.service.impl.lottery; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.goods.api.domain.UserLotteryEvent; +import com.ruoyi.goods.domain.vo.ShopWinningRecordVo; +import com.ruoyi.goods.mapper.lottery.UserLotteryEventMapper; +import com.ruoyi.goods.service.lottery.IUserLotteryEventService; +import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.service.RemoteMemberService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +/** + * @author zhibing.pu + * @Date 2025/5/12 10:41 + */ +@Service +public class UserLotteryEventServiceImpl extends ServiceImpl<UserLotteryEventMapper, UserLotteryEvent> implements IUserLotteryEventService { + + @Resource + private RemoteMemberService remoteMemberService; + + + /** + * 获取店铺中中奖记录 + * + * @return + */ + @Override + public List<ShopWinningRecordVo> getShopWinningRecord(Page<ShopWinningRecordVo> page, String id) { + List<Map<String, Object>> shopWinningRecord = this.baseMapper.getShopWinningRecord(page, id); + List<ShopWinningRecordVo> collect = shopWinningRecord.stream().map(item -> { + Long user_id = Long.valueOf(item.get("user_id").toString()); + Member member = remoteMemberService.getMember(user_id).getData(); + + String create_time = item.get("create_time").toString(); + String content = item.get("content").toString(); + String[] prizes = content.split(","); + StringJoiner awardName = new StringJoiner("、"); + for (String prize : prizes) { + String[] split = prize.split("_"); + String name = ""; + switch (split[0]) { + case "1": + name = "优惠券"; + break; + case "2": + name = split[2] + "x" + split[3]; + break; + case "3": + name = split[2] + "x" + split[3]; + break; + case "4": + name = "积分"; + break; + } + awardName.add(name); + } + ShopWinningRecordVo shopWinningRecordVo = new ShopWinningRecordVo(); + shopWinningRecordVo.setUserName(member.getRealName()); + shopWinningRecordVo.setUserPhone(member.getMobile()); + shopWinningRecordVo.setLotteryTime(create_time); + shopWinningRecordVo.setAwardName(awardName.toString()); + return shopWinningRecordVo; + }).collect(Collectors.toList()); + return collect; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveAppointmentService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveAppointmentService.java new file mode 100644 index 0000000..52dd780 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveAppointmentService.java @@ -0,0 +1,22 @@ +package com.ruoyi.goods.service.live; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveAppointment; + +/** + * <p> + * 直播预约记录 服务类 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +public interface IXiaoeLiveAppointmentService extends IService<XiaoeLiveAppointment> { + /** + * 推送微信小程序订阅消息 + * @param appointmentId + * @return + */ + void push(Long appointmentId); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java new file mode 100644 index 0000000..44b79ac --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java @@ -0,0 +1,41 @@ +package com.ruoyi.goods.service.live; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord; + +import java.util.List; + +/** + * <p> + * 小鹅通直播添加记录表 服务类 + * </p> + * + * @author mitao + * @since 2025-01-09 + */ +public interface IXiaoeLiveRecordService extends IService<XiaoeLiveRecord> { + /** + * 根据直播id查询记录 + * @param liveId + * @return + */ + XiaoeLiveRecord getByLiveId(String liveId); + + /** + * 根据店铺id查询记录 + * @param shopId + * @return + */ + List<XiaoeLiveRecord> getListByShopId(Long shopId); + /** + * 添加直播创建记录 + * @param shopId + * @param type + * @param shopName + * @param liveId + */ + void add(Long shopId, Integer type, String shopName, String liveId); + + List<XiaoeLiveRecord> getMgtRecord(); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventPrizeService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventPrizeService.java new file mode 100644 index 0000000..e54d3e5 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventPrizeService.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.api.domain.LotteryEventPrize; + +/** + * @author zhibing.pu + * @Date 2025/5/12 9:56 + */ +public interface ILotteryEventPrizeService extends IService<LotteryEventPrize> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsAnswersService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsAnswersService.java new file mode 100644 index 0000000..c7454de --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsAnswersService.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.api.domain.LotteryEventQuestionsAnswers; + +/** + * @author zhibing.pu + * @Date 2025/5/19 16:18 + */ +public interface ILotteryEventQuestionsAnswersService extends IService<LotteryEventQuestionsAnswers> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsService.java new file mode 100644 index 0000000..3a80390 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventQuestionsService.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.api.domain.LotteryEventQuestions; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:03 + */ +public interface ILotteryEventQuestionsService extends IService<LotteryEventQuestions> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventService.java new file mode 100644 index 0000000..29a1855 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventService.java @@ -0,0 +1,55 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; +import com.ruoyi.goods.domain.vo.LotteryEventVo; +import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/8 18:05 + */ +public interface ILotteryEventService extends IService<LotteryEvent> { + + + /** + * 获取抽奖活动详情 + * + * @param id + * @return + */ + LotteryEventVo getLotteryEvent(String id); + + + /** + * 抽奖操作 + * + * @param id + * @return + */ + R lotteryDraw(String id); + + + /** + * 获取APP抽奖列表 + * + * @param page + * @param userId + * @return + */ + List<AppLotteryEventPageVo> pageAppLotteryEvent(Page<AppLotteryEventPageVo> page, Long userId); + + + /** + * 获取门店的抽奖列表 + * + * @param page + * @return + */ + List<ShopLotteryDrawListVo> getShopLotteryDrawList(Page<ShopLotteryDrawListVo> page, Long shopId); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsAnswersService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsAnswersService.java new file mode 100644 index 0000000..afb3e15 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsAnswersService.java @@ -0,0 +1,22 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestionsAnswers; + +import java.math.BigDecimal; + +/** + * @author zhibing.pu + * @Date 2025/5/19 16:07 + */ +public interface IUserLotteryEventQuestionsAnswersService extends IService<UserLotteryEventQuestionsAnswers> { + + + /** + * 获取用户答题正确率 + * @param userId + * @param lotteryEventId + * @return + */ + BigDecimal getCorrectAnswerRate(Long userId, String lotteryEventId); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsService.java new file mode 100644 index 0000000..947bb77 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsService.java @@ -0,0 +1,11 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.api.domain.UserLotteryEventQuestions; + +/** + * @author zhibing.pu + * @Date 2025/5/26 18:19 + */ +public interface IUserLotteryEventQuestionsService extends IService<UserLotteryEventQuestions> { +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventService.java new file mode 100644 index 0000000..0c5bffb --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventService.java @@ -0,0 +1,22 @@ +package com.ruoyi.goods.service.lottery; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.goods.api.domain.UserLotteryEvent; +import com.ruoyi.goods.domain.vo.ShopWinningRecordVo; + +import java.util.List; + + +/** + * @author zhibing.pu + * @Date 2025/5/12 10:40 + */ +public interface IUserLotteryEventService extends IService<UserLotteryEvent> { + + + /** + * 获取店铺中中奖记录 + */ + List<ShopWinningRecordVo> getShopWinningRecord(Page<ShopWinningRecordVo> page, String id); +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/WeChatSubscribeMessageSender.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/WeChatSubscribeMessageSender.java new file mode 100644 index 0000000..66986e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/WeChatSubscribeMessageSender.java @@ -0,0 +1,83 @@ +package com.ruoyi.goods.utils; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author mitao + * @date 2025/1/10 + */ +@Slf4j +public class WeChatSubscribeMessageSender { + private static final String ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/token"; + private static final String STABLE_ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/stable_token"; + private static final String API_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send"; + + private static final String WX_APPID = "wxb7f0ea286fc4e535"; + + private static final String WX_SECRET = "852a2512a6ab559cafc68bae5d4160ac"; + private static final String TEMPLATE_ID = "EFeu75n2GMmOg33PxL1HNoyftp16ukco5DUbBfNBytE"; + + /** + *发送消息 + * @param touser 接收者(用户)的 openid + * @param title 直播主题 + * @param shopName 直播间名称 + * @param aliveStartAt 直播时间 + */ + public static void push(String touser, String title, String shopName, Date aliveStartAt) { + + //1,获取access_token + String accessToken = getAccessTokenByWX(); + String url = API_URL + "?access_token=" + accessToken; + Map<String, Object> params = new HashMap<>(); + params.put("template_id", TEMPLATE_ID); + params.put("page", null); + params.put("touser", touser); + // 构建订阅消息内容的JSON对象 + JSONObject messageData = new JSONObject(); + messageData.put("time5", createDataItem("直播时间", DateUtil.format(aliveStartAt, "MM-dd HH:mm:ss"))); + messageData.put("thing4", createDataItem("直播间名称", shopName)); + messageData.put("thing1", createDataItem("直播主题", title)); + params.put("data", messageData); + params.put("miniprogram_state", "trial"); + params.put("lang", "zh_CN"); + try { + log.info("发送消息参数:{}", JSONObject.toJSONString(params)); + String post = HttpUtil.post(url, JSONObject.toJSONString(params)); + log.info("发送消息返回结果:{}", post); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 获取access_token + * @return + */ + private static String getAccessTokenByWX() { + Map<String, Object> params = new HashMap<>(); + params.put("appid", WX_APPID); + params.put("secret", WX_SECRET); + params.put("grant_type", "client_credential"); + String token = HttpUtil.post(STABLE_ACCESS_TOKEN_HOST,JSONObject.toJSONString(params)); + log.info("token:{}", token); + JSONObject jsonObject = JSONObject.parseObject(token); + return jsonObject.getString("access_token"); + } + private static Map<String, Object> createDataItem(String name, String value) { + Map<String, Object> item = new HashMap<>(); + item.put("value", value); + return item; + } + + public static void main(String[] args) throws Exception { + push("oL-gp5Fn7BobtFZCsQ3ZTY7QGU84", "直播推送", "鸿瑞堂", new Date()); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java new file mode 100644 index 0000000..ea90ecc --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java @@ -0,0 +1,458 @@ +package com.ruoyi.goods.utils; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto; +import com.ruoyi.goods.domain.dto.XiaoeLiveDto; +import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; +import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO; +import com.ruoyi.goods.domain.vo.XiaoeCourseVO; +import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2; +import com.ruoyi.goods.domain.vo.XiaoeLiveVo; +import com.ruoyi.goods.domain.vo.XiaoeLiveVoV2; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 小鹅通工具类 + * @author mitao + * @date 2025/1/8 + */ +@Slf4j +@Component +public class XiaoeUtils { + @Resource + private RedisService redisService; + private static final String BASE_URL = "https://api.xiaoe-tech.com/token"; + //店铺的业务id + private String app_id = "appwmuwNWD48082"; + //应用的唯一标识,通过 client_id 来鉴别应用的身份 + private String client_id = "xopYwOAqNI36444"; + //应用的凭证秘钥,即client_secret,用来保证应用来源的可靠性,防止被伪造 + private String secret_key = "qKFxbGR0OlKX85PVyfCvkRF1P6fLRBEu"; + //固定填写client_credential + private String grant_type = "client_credential"; + //获取直播列表 + private static final String LIVE_PAGE_LIST = "https://api.xiaoe-tech.com/xe.alive.list.get/1.0.0"; + private static final String LIVE_PAGE_LIST_V2 = "https://api.xiaoe-tech.com/xe.alive.list.get/2.0.0"; + //获取直播详情 + private static final String LIVE_DETAIL = "https://api.xiaoe-tech.com/xe.alive.detail.get/1.0.0"; + private static final String LIVE_DETAIL_V2 = "https://api.xiaoe-tech.com/xe.alive.detail.get/2.0.0"; + //创建直播 + private static final String LIVE_ADD = "https://api.xiaoe-tech.com/xe.alive.live.create/1.0.0"; + //编辑直播 + private static final String LIVE_EDIT = "https://api.xiaoe-tech.com/xe.alive.live.update/1.0.0"; + //删除直播 + private static final String LIVE_DELETE = "https://api.xiaoe-tech.com/xe.alive.live.delete/1.0.0"; + //课程列表 + private static final String COURSE_PAGE_LIST = "https://api.xiaoe-tech.com/xe.course.course.list/1.0.0"; + //课程小节 + private static final String COURSE_CHAPTER = "https://api.xiaoe-tech.com/xe.course.course.chapter.get/1.0.0"; + //获取店铺商品分组列表 + private static final String COURSE_GROUP_LIST = "https://api.xiaoe-tech.com/xe.resource_tags.list/1.0.0"; + + + /** + * 获取小鹅通access_token + * @return + */ + private String getAccessToken() { + Boolean flag = redisService.hasKey("xiaoe:access_token"); + String accessToken = ""; + if (flag) { + accessToken = redisService.getCacheObject("xiaoe:access_token"); + } else { + String urlString = BASE_URL + + "?app_id=" + this.app_id + + "&client_id=" + this.client_id + + "&secret_key=" + this.secret_key + + "&grant_type=" + this.grant_type; + String result = null; + try { + URL reqURL = new URL(urlString); + HttpURLConnection httpURLConnection = (HttpURLConnection) reqURL.openConnection(); + InputStreamReader isr = new InputStreamReader(httpURLConnection.getInputStream()); + char[] chars = new char[1024]; + result = ""; + int len; + while ((len = isr.read(chars)) != -1) { + result += new String(chars, 0, len); + } + isr.close(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + JSONObject jsonObject = JSONObject.parseObject(result); + log.info("获取access_token返回结果:{}", result); + Map data = (Map) jsonObject.get("data"); + accessToken = (String)data.get("access_token"); + Integer expiresIn = (int) data.get("expires_in"); + redisService.setCacheObject("xiaoe:access_token", accessToken,Long.parseLong(expiresIn.toString()), TimeUnit.SECONDS); + } + return accessToken; + } + + /** + * 获取直播列表 + * @param dto + * @return + */ + public Page<XiaoeLiveVo> getLivePageList(XiaoeLiveQueryDto dto) { + Map<String,Object> postParams = new HashMap<>(); + postParams.put("search_content", dto.getSearchContent()); + postParams.put("create_mode", dto.getCreateMode()); + postParams.put("state", 0); + postParams.put("search_alive_type", dto.getSearchAliveType()); + postParams.put("alive_play_state", dto.getAlivePlayState()); + postParams.put("page", dto.getPage()); + postParams.put("page_size", dto.getPageSize()); + postParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(LIVE_PAGE_LIST, JSONObject.toJSONString(postParams)); + Page<XiaoeLiveVo> xiaoeLiveVOPage = new Page<>(); + if (StringUtils.isNotBlank(post)) { + log.info("获取直播列表返回结果:{}", post); + JSONObject jsonObject = JSONObject.parseObject(post); + if (jsonObject.get("code").equals(0) ) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + if (CollectionUtil.isNotEmpty(list)) { + List<XiaoeLiveVo> xiaoeLiveVos = JSONArray.parseArray(list.toJSONString(), XiaoeLiveVo.class); + xiaoeLiveVOPage.setRecords(xiaoeLiveVos); + xiaoeLiveVOPage.setCurrent(dto.getPage()); + xiaoeLiveVOPage.setPages(data.getLong("page_count")); + } + } + } + return xiaoeLiveVOPage; + } + + /** + *获取直播详情 + * @param id 直播ID + * @return + */ + public XiaoeLiveVo getLiveDetail(String id) { + Map<String, Object> postParams = new HashMap<>(); + postParams.put("id", id); + postParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(LIVE_DETAIL, JSONObject.toJSONString(postParams)); + XiaoeLiveVo xiaoeLiveVO = null; + if (StringUtils.isNotBlank(post)) { + JSONObject jsonObject = JSONObject.parseObject(post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + xiaoeLiveVO = JSONObject.parseObject(data.toJSONString(), XiaoeLiveVo.class); + } + } + return xiaoeLiveVO; + } + + /** + * 获取直播列表2.0 + * @param dto + * @return + */ + public Page<XiaoeLiveVoV2> getLivePageListV2(XiaoeLiveQueryDto dto) { + Map<String,Object> postParams = new HashMap<>(); + postParams.put("search_content", dto.getSearchContent()); + postParams.put("create_mode", dto.getCreateMode()); + postParams.put("state", 0); + postParams.put("search_alive_type", dto.getSearchAliveType()); + postParams.put("alive_play_state", dto.getAlivePlayState()); + postParams.put("page", dto.getPage()); + postParams.put("page_size", dto.getPageSize()); + postParams.put("access_token", getAccessToken()); + postParams.put("zb_start_at_min", DateUtil.format(DateUtils.getTodayStartTime(), DatePattern.NORM_DATETIME_PATTERN)); + String post = HttpUtil.post(LIVE_PAGE_LIST_V2, JSONObject.toJSONString(postParams)); + Page<XiaoeLiveVoV2> xiaoeLiveVOPage = new Page<>(); + if (StringUtils.isNotBlank(post)) { + log.info("获取直播详情2.0返回结果:{}", post); + JSONObject jsonObject = JSONObject.parseObject(post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray list = data.getJSONArray("live_list"); + if (!list.isEmpty()){ + List<XiaoeLiveVoV2> xiaoeLiveVos = JSONArray.parseArray(list.toJSONString(), XiaoeLiveVoV2.class); + xiaoeLiveVOPage.setRecords(xiaoeLiveVos); + xiaoeLiveVOPage.setCurrent(dto.getPage()); + xiaoeLiveVOPage.setTotal(data.getLong("total_count")); + } + } + } + return xiaoeLiveVOPage; + } + + /** + *获取直播详情 + * @param id 直播ID + * @return + */ + public XiaoeLiveDetailVOV2 getLiveDetailV2(String id) { + Map<String, Object> postParams = new HashMap<>(); + postParams.put("id", id); + postParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(LIVE_DETAIL_V2, JSONObject.toJSONString(postParams)); + XiaoeLiveDetailVOV2 vo = null; + if (StringUtils.isNotBlank(post)) { + JSONObject jsonObject = JSONObject.parseObject(post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + vo = JSONObject.parseObject(data.toJSONString(), XiaoeLiveDetailVOV2.class); + } + } + return vo; + } + /** + * 创建直播 + * @param dto + * @return + */ + public String addLive(XiaoeLiveDto dto) { + Map<String, Object> requestParams = new HashMap<>(); + Map<String, Object> resourceInfoMap = new HashMap<>(); + resourceInfoMap.put("title", dto.getTitle()); + resourceInfoMap.put("summary", dto.getSummary()); + resourceInfoMap.put("zb_start_at", dto.getZbStartAt()); + resourceInfoMap.put("zb_stop_at", dto.getZbStopAt()); + resourceInfoMap.put("alive_type", dto.getAliveType()); + resourceInfoMap.put("descrb", dto.getDescrb()); + requestParams.put("resource_info", resourceInfoMap); + // 配置信息 + Map<String, Object> moudleInfoMap = new HashMap<>(); + moudleInfoMap.put("alive_mode", dto.getAliveMode()); + requestParams.put("module_info", moudleInfoMap); + //讲师信息 + List<Map<String, Object>> roleList = new ArrayList<>(); + Map<String, Object> roleInfoMap = new HashMap<>(); + roleInfoMap.put("role_name", "讲师"); + roleInfoMap.put("user_id", dto.getUserId()); + roleList.add(roleInfoMap); + requestParams.put("role_info", roleList); + //商品信息 + Map<String, Object> goodsInfoMap = new HashMap<>(); + goodsInfoMap.put("sale_type", 1);//售卖类型:1-单独售卖、2-关联售卖 + goodsInfoMap.put("payment_type", dto.getPaymentType()); + if (dto.getPaymentType().equals(3)) { + goodsInfoMap.put("resource_password", dto.getResourcePassword()); + } + requestParams.put("goods_info", goodsInfoMap); + requestParams.put("access_token", getAccessToken()); + log.info("创建直播参数:{}" ,JSONObject.toJSONString(requestParams)); + String post = HttpUtil.post(LIVE_ADD, JSONObject.toJSONString(requestParams)); + if (StringUtils.isNotBlank(post)) { + JSONObject jsonObject = JSONObject.parseObject(post); + log.info("创建直播返回结果:{}" ,post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + return data.getString("id"); + } + } + return null; + } + /** + * 编辑直播 + * @param dto + * @return + */ + public Boolean editLive(XiaoeLiveDto dto) { + boolean flag = false; + Map<String, Object> requestParams = new HashMap<>(); + Map<String, Object> resourceInfoMap = new HashMap<>(); + resourceInfoMap.put("id", dto.getId()); + resourceInfoMap.put("title", dto.getTitle()); + resourceInfoMap.put("summary", dto.getSummary()); + resourceInfoMap.put("zb_start_at", dto.getZbStartAt()); + resourceInfoMap.put("zb_stop_at", dto.getZbStopAt()); + resourceInfoMap.put("alive_type", dto.getAliveType()); + resourceInfoMap.put("descrb", dto.getDescrb()); + requestParams.put("resource_info", resourceInfoMap); + // 配置信息 + Map<String, Object> moudleInfoMap = new HashMap<>(); + moudleInfoMap.put("alive_mode", dto.getAliveMode()); + requestParams.put("module_info", moudleInfoMap); + //讲师信息 + List<Map<String, Object>> roleList = new ArrayList<>(); + Map<String, Object> roleInfoMap = new HashMap<>(); + roleInfoMap.put("role_name", "讲师"); + roleInfoMap.put("user_id", dto.getUserId()); + roleList.add(roleInfoMap); + requestParams.put("role_info", roleList); + //商品信息 + Map<String, Object> goodsInfoMap = new HashMap<>(); + goodsInfoMap.put("sale_type", 1);//售卖类型:1-单独售卖、2-关联售卖 + goodsInfoMap.put("payment_type", dto.getPaymentType()); + if (dto.getPaymentType().equals(3)) { + goodsInfoMap.put("resource_password", dto.getResourcePassword()); + } + requestParams.put("goods_info", goodsInfoMap); + requestParams.put("access_token", getAccessToken()); + log.info("编辑直播参数:{}" ,JSONObject.toJSONString(requestParams)); + String post = HttpUtil.post(LIVE_EDIT, JSONObject.toJSONString(requestParams)); + if (StringUtils.isNotBlank(post)) { + JSONObject jsonObject = JSONObject.parseObject(post); + log.info("编辑直播返回结果:{}" ,post); + if (jsonObject.get("code").equals(0)) { + flag = true; + } + } + return flag; + } + + /** + * 删除直播 + * @param id + * @return + */ + public Boolean deleteLive(String id) { + boolean flag = false; + Map<String, Object> requestParams = new HashMap<>(); + requestParams.put("id", id); + requestParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(LIVE_DELETE, JSONObject.toJSONString(requestParams)); + if (StringUtils.isNotBlank(post)) { + JSONObject jsonObject = JSONObject.parseObject(post); + log.info("删除直播返回结果:{}" ,post); + if (jsonObject.get("code").equals(0)) { + flag = true; + } + } + return flag; + } + + /** + * 获取商品分组列表 + * @return + */ + public List<XiaoeCourseGroupVO> getCourseGroupList(){ + Map<String, Object> requestParams = new HashMap<>(); + requestParams.put("page", 1); + requestParams.put("page_size", 50); + requestParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(COURSE_GROUP_LIST, JSONObject.toJSONString(requestParams)); + List<XiaoeCourseGroupVO> xiaoeCourseGroupVOList = new ArrayList<>(); + if (StringUtils.isNotBlank(post)) { + JSONObject jsonObject = JSONObject.parseObject(post); + log.info("获取商品分组返回结果:{}" ,post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray jsonArray = data.getJSONArray("list"); + xiaoeCourseGroupVOList = JSONArray.parseArray(jsonArray.toJSONString(), XiaoeCourseGroupVO.class); + } + } + return xiaoeCourseGroupVOList; + } + + /** + * 获取课程列表 + * @param dto + * @return + */ + public Page<XiaoeCourseVO> getCoursePageList(XiaoeCourseQueryDto dto) { + Map<String, Object> requestParams = new HashMap<>(); + requestParams.put("search_content", dto.getSearchContent()); + requestParams.put("page_index", dto.getPageNo()); + requestParams.put("page_size", dto.getPageSize()); + requestParams.put("created_source", dto.getCreatedSource()); + requestParams.put("tags", dto.getTags()); + if (dto.getSortBy().equals(1)) { + requestParams.put("order_by", "modify");//根据创建时间排序 + requestParams.put("order_type",1); + } + + requestParams.put("sale_status", 1); + requestParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(COURSE_PAGE_LIST, JSONObject.toJSONString(requestParams)); + Page<XiaoeCourseVO> page = new Page<>(); + if (StringUtils.isNotBlank(post)) { + log.info("获取课程列表返回结果:{}" ,post); + JSONObject jsonObject = JSONObject.parseObject(post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray jsonArray = data.getJSONArray("list"); + List<XiaoeCourseVO> xiaoeCourseVOList = JSONArray.parseArray(jsonArray.toJSONString(), XiaoeCourseVO.class); + if (dto.getSortBy().equals(2)){ + xiaoeCourseVOList.sort(Comparator.comparing(XiaoeCourseVO::getCurriculumTime)); + } + page.setRecords(xiaoeCourseVOList); + page.setTotal(data.getLong("total")); + } + } + return page; + } + + /** + * 查询课程目录小节 + * @param id + * @return + */ + public List<XiaoeCourseChapterVO> getCourseChapterDetail(String id) { + Map<String, Object> requestParams = new HashMap<>(); + requestParams.put("course_id", id); + requestParams.put("access_token", getAccessToken()); + String post = HttpUtil.post(COURSE_CHAPTER, JSONObject.toJSONString(requestParams)); + List<XiaoeCourseChapterVO> courseChapterVOList = new ArrayList<>(); + if (StringUtils.isNotBlank(post)) { + log.info("查询课程目录小节返回结果:{}" ,post); + JSONObject jsonObject = JSONObject.parseObject(post); + if (jsonObject.get("code").equals(0)) { + JSONObject data = jsonObject.getJSONObject("data"); + courseChapterVOList = JSONArray.parseArray(data.getString("list"), XiaoeCourseChapterVO.class); + } + } + return courseChapterVOList; + } + public static void main(String[] args) { + String urlString = BASE_URL + + "?app_id=appwmuwNWD48082" + + "&client_id=xopYwOAqNI36444"+ + "&secret_key=qKFxbGR0OlKX85PVyfCvkRF1P6fLRBEu" + + "&grant_type=client_credential"; + String result = null; + try { + URL reqURL = new URL(urlString); + HttpURLConnection httpURLConnection = (HttpURLConnection) reqURL.openConnection(); + InputStreamReader isr = new InputStreamReader(httpURLConnection.getInputStream()); + char[] chars = new char[1024]; + result = ""; + int len; + while ((len = isr.read(chars)) != -1) { + result += new String(chars, 0, len); + } + isr.close(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + JSONObject jsonObject = JSONObject.parseObject(result); + System.out.println(jsonObject); + Map data = (Map) jsonObject.get("data"); + String accessToken = (String) data.get("access_token"); + System.out.println(accessToken); + } + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml index 075928d..42a9767 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml @@ -413,6 +413,9 @@ <if test="param.goodsName != null and param.goodsName != ''"> AND tg.goods_name LIKE CONCAT('%',#{param.goodsName},'%') </if> + <if test="param.goodsStatus != null and param.goodsStatus != ''"> + AND tg.goods_status = #{param.goodsStatus} + </if> ORDER BY tg.create_time DESC </select> @@ -516,4 +519,58 @@ FROM t_goods WHERE del_flag = 0 AND goods_class_id = #{classId} </select> + <select id="pageShopMgtGoods" resultType="com.ruoyi.goods.domain.vo.PageShopMgtGoodsVO"> + select + tg.goods_id, + tg.goods_name, + tg.goods_introduction, + tg.goods_class_id, + tg.goods_tags, + tgf.file_url goodsPicture, + CASE tg.goods_type + WHEN 1 THEN "周期" + WHEN 2 THEN "服务" + WHEN 3 THEN "体验" + WHEN 4 THEN "单品" + END goodsType, + tg.sales_price suggestSalesPrice, + CASE tg.goods_status + WHEN 1 THEN "上架中" + WHEN 2 THEN "下架中" + ELSE "下架中" + END goodsStatus, + tg.create_time, + tsg.shop_id, + tsg.sales_price shopPrice + from t_goods tg + LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1 + LEFT JOIN t_shop_goods tsg on tg.goods_id = tsg.goods_id and tsg.del_flag = 0 + WHERE tg.del_flag = 0 + <if test="dto.goodsType != null and dto.goodsType != ''"> + AND tg.goods_type = #{dto.goodsType} + </if> + <if test="dto.goodsClassId != null and dto.goodsClassId != ''"> + AND tg.goods_class_id = #{dto.goodsClassId} + </if> + <if test="dto.createStartTime!=null and dto.createStartTime != ''"> + AND Date(tg.create_time) >= #{dto.createStartTime} + </if> + <if test="dto.createEndTime!=null and dto.createEndTime != ''"> + AND Date(tg.create_time) <= #{dto.createEndTime} + </if> + <if test="dto.goodsName != null and dto.goodsName != ''"> + AND tg.goods_name LIKE CONCAT('%',#{dto.goodsName},'%') + </if> + <if test="dto.goodsStatus != null and dto.goodsStatus != ''"> + AND tg.goods_status = #{dto.goodsStatus} + </if> + <if test="dto.shopIds != null and dto.shopIds.size() > 0"> + AND tsg.shop_id IN + <foreach collection="param.shopIds" item="item" open="(" separator="," close=")"> + #{item} + </foreach> + </if> + + ORDER BY tg.create_time DESC + </select> </mapper> diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveAppointmentMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveAppointmentMapper.xml new file mode 100644 index 0000000..08ed38e --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveAppointmentMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.goods.mapper.live.XiaoeLiveAppointmentMapper"> + +</mapper> diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveRecordMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveRecordMapper.xml new file mode 100644 index 0000000..7e4d32f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/live/XiaoeLiveRecordMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.goods.mapper.live.XiaoeLiveRecordMapper"> + +</mapper> diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventMapper.xml new file mode 100644 index 0000000..0419a27 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventMapper.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.goods.mapper.lottery.LotteryEventMapper"> + + + <select id="pageAppLotteryEvent" resultType="com.ruoyi.goods.domain.vo.AppLotteryEventPageVo"> + select * + from (select a.id, + a.name, + a.activity_profile as activityProfile, + a.activity_type as activityType, + date_format(a.start_time, '%Y-%m-%d %H:%i:%s') as startTime, + date_format(a.end_time, '%Y-%m-%d %H:%i:%s') as endTime, + a.cover_image as coverImage, + if(ifnull(b.num, 0) = 0, false, true) as participation, + CASE + WHEN NOW() > a.start_time and now() <= a.end_time and ifnull(b.num, 0) > 0 THEN 1 + WHEN NOW() > a.start_time and now() <= a.end_time and ifnull(b.num, 0) = 0 THEN 2 + ELSE 3 END as sort + from t_lottery_event a + left join (select count(1) as num, lottery_event_id + from t_user_lottery_event + where user_id = #{userId} + group by lottery_event_id) b on a.id = b.lottery_event_id + where a.del_flag = 0 + and now() > a.end_time + and a.activity_type in (4, 5)) as aa + order by aa.sort, aa.startTime + </select> + + + <select id="getShopLotteryDrawList" resultType="com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo"> + select id, + `name`, + activity_profile as activityProfile, + cover_image as coverImage, + DATE_FORMAT(start_time, '%Y-%m-%d %H:%i') as startTime, + DATE_FORMAT(end_time, '%Y-%m-%d %H:%i') as endTime + from t_lottery_event + where shop_id = #{shopId} + order by create_time desc + </select> +</mapper> diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventPrizeMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventPrizeMapper.xml new file mode 100644 index 0000000..9c6b67f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventPrizeMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.goods.mapper.lottery.LotteryEventPrizeMapper"> + +</mapper> diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventMapper.xml new file mode 100644 index 0000000..753574d --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventMapper.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.goods.mapper.lottery.UserLotteryEventMapper"> + + <select id="getShopWinningRecord" resultType="map"> + select aa.user_id, + DATE_FORMAT(any_value(aa.create_time), '%Y-%m-%d %H:%i') as create_time, + GROUP_CONCAT(CONCAT(aa.prize_type, '_', aa.object_id, '_', aa.object_name, '_', aa.number)) as content + from (select * + from t_user_lottery_event + where prize_type != 5 and lottery_event_id = #{id} + order by create_time) as aa + group by aa.user_id + </select> +</mapper> diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventQuestionsMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventQuestionsMapper.xml new file mode 100644 index 0000000..5a153d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventQuestionsMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.goods.mapper.lottery.UserLotteryEventQuestionsMapper"> + +</mapper> diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml index 57159f0..e40bb96 100644 --- a/ruoyi-modules/ruoyi-member/pom.xml +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -132,6 +132,23 @@ <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-jdk8</artifactId> + <version>1.3.0.Final</version> + </dependency> + + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <version>1.3.0.Final</version> + </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-api-goods</artifactId> + <version>3.6.2</version> + <scope>compile</scope> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java index 0ef60f5..724569d 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java @@ -72,16 +72,16 @@ } @RequestMapping(value = "/getMerCouponVo", method = RequestMethod.POST) - @ApiOperation(value = "商户获取优惠券编辑信息") + @ApiOperation(value = "商户获取优惠券编辑信息【2.0】") public R<MerCouponGetVo> getMerCouponVo(@RequestBody MerBaseGetDto merBaseGetDto) { Long userId = SecurityUtils.getUserId(); merBaseGetDto.setUserId(userId); MerCouponGetVo couponGetVo = couponService.getMerCouponVo(merBaseGetDto); return R.ok(couponGetVo); } - + @RequestMapping(value = "/editMerCoupon", method = RequestMethod.POST) - @ApiOperation(value = "商户编辑优惠券") + @ApiOperation(value = "商户编辑优惠券【2.0】") public R editMerCoupon(@RequestBody MerCouponEditDto merCouponEditDto) { Long userId = SecurityUtils.getUserId(); merCouponEditDto.setUserId(userId); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java index 52522ae..2e804c8 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java @@ -53,7 +53,7 @@ } @RequestMapping(value = "/pageMerMember", method = RequestMethod.POST) - @ApiOperation(value = "分页获取商户绑定会员列表") + @ApiOperation(value = "分页获取商户绑定会员列表【2.0】") public R<Page<MerMemberPageVo>> pageMerMember(@RequestBody MerMemberPageDto merMemberPageDto) { Long userId = SecurityUtils.getUserId(); Page<MerMemberPageVo> page = new Page<>(); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java index 98c50fd..d707258 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/CouponController.java @@ -1,5 +1,6 @@ package com.ruoyi.member.controller.console; +import com.alibaba.fastjson2.JSON; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.member.service.coupon.CouponService; @@ -9,10 +10,8 @@ import com.ruoyi.system.api.domain.dto.MerVerifyMemberCouponDto; import com.ruoyi.system.api.domain.vo.AppMemberCouponVo; import com.ruoyi.system.api.domain.vo.MerVerifyCouponGetVo; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -24,6 +23,7 @@ * @Date 2023/6/27 15:00 * @Version 1.0 */ +@Slf4j @RestController @RequestMapping("/coupon") public class CouponController extends BaseController { @@ -110,6 +110,7 @@ */ @PostMapping("/useMemberCoupon") public R useMemberCoupon(@RequestBody String memberCouponIds){ + log.info("修改优惠券使用状态:{}", JSON.toJSONString(memberCouponIds)); memberCouponService.useMemberCoupon(memberCouponIds); return R.ok(); } @@ -127,17 +128,30 @@ memberCouponService.sureMemberCoupon(merVerifyMemberCouponDto.getCouponId(),merVerifyMemberCouponDto.getShopId()); return R.ok(); } - + /** - * @description 回退优惠券 - * @author jqs - * @date 2023/7/13 19:38 * @param memberCouponIds - * @return R + * @return R + * @description 回退优惠券 + * @author jqs + * @date 2023/7/13 19:38 */ @PostMapping("/backMemberCoupon") - public R backMemberCoupon(@RequestBody String memberCouponIds){ + public R backMemberCoupon(@RequestBody String memberCouponIds) { memberCouponService.backMemberCoupon(memberCouponIds); return R.ok(); } + + + /** + * 手动添加用户优惠券 + * + * @param couponId + * @param number + * @return + */ + @PostMapping("/addMemberCoupon") + public R addMemberCoupon(@RequestParam("couponId") String couponId, @RequestParam("number") Integer number, @RequestParam("userId") Long userId) { + return memberCouponService.addMemberCoupon(couponId, number, userId); + } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java index 7bea543..84b8c1b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java @@ -1,5 +1,6 @@ package com.ruoyi.member.controller.console; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.member.service.birthday.BirthdayCardService; @@ -16,10 +17,7 @@ import com.ruoyi.system.api.model.AppMiniLoginVo; import com.ruoyi.system.api.service.RemoteShopService; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -28,58 +26,67 @@ @RestController @RequestMapping("/member") public class MemberController extends BaseController { - + @Resource private MemberService memberService; - + @Resource private MemberSuggestService memberSuggestService; - + @Resource private MemberGiftRecordService memberGiftRecordService; - + @Resource private BirthdayCardService birthdayCardService; - + @Resource private RemoteShopService remoteShopService; - - - - - + + /** - * @description: getMember - * @param: userId - * @return: R<Member> - * @author jqs34 - * @date: 2023/4/30 12:49 - */ + * @description: getMember + * @param: userId + * @return: R<Member> + * @author jqs34 + * @date: 2023/4/30 12:49 + */ @PostMapping("/getMember") - public R<Member> getMember(@RequestBody Long userId) - { + public R<Member> getMember(@RequestBody Long userId) { Member member = memberService.getByUserId(userId); - if(member ==null){ + if (member == null) { return R.fail("获取会员失败!"); } return R.ok(member); } - + + + /** + * 修改会员数据 + * + * @param member + * @return + */ + @PostMapping("/editMember") + public R editMember(@RequestBody Member member) { + memberService.updateById(member); + return R.ok(); + } + + /** * 小程序登录 */ @PostMapping("/miniLogin") @ApiOperation("小程序登录") - public R<AppMiniLoginVo> getMemberByCode(@RequestBody AppMiniLoginDto appMiniLoginDto) - { + public R<AppMiniLoginVo> getMemberByCode(@RequestBody AppMiniLoginDto appMiniLoginDto) { AppMiniLoginVo appMiniLoginVo = memberService.getMemberByCode(appMiniLoginDto); - if(appMiniLoginVo ==null){ + if (appMiniLoginVo == null) { return R.fail("登录失败!"); } return R.ok(appMiniLoginVo); } - + @PostMapping(value = "/miniRegister") @ApiOperation(value = "小程序注册") public R<AppMiniRegisterVo> miniRegister(@RequestBody AppMiniRegisterDto appUserRegisterDto) { @@ -89,241 +96,242 @@ } return R.ok(appUserRegisterVo); } - - - + + /** * 更新会员绑定商户 + * * @param appMemberBindingDto * @return */ @PostMapping("/updateMemberBinding") - public R updateMemberBinding(@RequestBody AppMemberBindingDto appMemberBindingDto) - { + public R updateMemberBinding(@RequestBody AppMemberBindingDto appMemberBindingDto) { memberService.updateMemberBinding(appMemberBindingDto); return R.ok(); } - + /** * 更新会员商品类型 + * * @param appMemberGoodsTypeDto * @return */ @PostMapping("/updateMemberGoodsType") - public R updateMemberGoodsType(@RequestBody AppMemberGoodsTypeDto appMemberGoodsTypeDto) - { + public R updateMemberGoodsType(@RequestBody AppMemberGoodsTypeDto appMemberGoodsTypeDto) { memberService.updateMemberGoodsType(appMemberGoodsTypeDto); return R.ok(); } - + /** * 通过手机号获取会员 + * * @param mobile * @return */ @PostMapping("/getMemberByMobile") - public R<Member> getMemberByMobile(@RequestBody String mobile) - { + public R<Member> getMemberByMobile(@RequestBody String mobile) { Member member = memberService.getByMobile(mobile); return R.ok(member); } - + /** * 订单创建新用户 + * * @param member * @return */ @PostMapping("/createNewMember") - public R createNewMember(@RequestBody Member member) - { + public R createNewMember(@RequestBody Member member) { memberService.createNewMember(member); return R.ok(); } - + /** - * @description 删除用户标签 - * @author jqs - * @date 2023/6/8 15:17 * @param tag - * @return R + * @return R + * @description 删除用户标签 + * @author jqs + * @date 2023/6/8 15:17 */ @PostMapping("/deleteMemberTag") - public R deleteMemberTag(@RequestBody String tag) - { + public R deleteMemberTag(@RequestBody String tag) { memberService.deleteMemberTag(tag); return R.ok(); } - + /** - * @description 删除会员建议标签 - * @author jqs - * @date 2023/6/9 9:43 * @param suggestTag - * @return R + * @return R + * @description 删除会员建议标签 + * @author jqs + * @date 2023/6/9 9:43 */ @PostMapping("/deleteMemberSuggestTag") - public R deleteMemberSuggestTag(@RequestBody String suggestTag) - { + public R deleteMemberSuggestTag(@RequestBody String suggestTag) { memberSuggestService.deleteMemberSuggestTag(suggestTag); return R.ok(); } - - + + /** - * @description 通过ids获取用户简易返回 - * @author jqs - * @date 2023/6/16 11:05 * @param mgtBaseBathDto - * @return R<List<MgtSimpleMemberVo>> + * @return R<List < MgtSimpleMemberVo>> + * @description 通过ids获取用户简易返回 + * @author jqs + * @date 2023/6/16 11:05 */ @PostMapping("/listSimpleVoByIds") - public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody String userIds) - {List<MgtSimpleMemberVo> simpleMemberVoList = memberService.listSimpleVoByIds(userIds); + public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody String userIds) { + List<MgtSimpleMemberVo> simpleMemberVoList = memberService.listSimpleVoByIds(userIds); return R.ok(simpleMemberVoList); } - + /** - * @description - * @author jqs - * @date 2023/6/16 12:47 * @param mgtUserIdByKeywordDto - * @return R<MgtUserIdByKeywordVo> + * @return R<MgtUserIdByKeywordVo> + * @description + * @author jqs + * @date 2023/6/16 12:47 */ @PostMapping("/getUserIdByKeyword") - public R<MgtUserIdByKeywordVo> getUserIdByKeyword(@RequestBody MgtUserIdByKeywordDto mgtUserIdByKeywordDto) - { + public R<MgtUserIdByKeywordVo> getUserIdByKeyword(@RequestBody MgtUserIdByKeywordDto mgtUserIdByKeywordDto) { MgtUserIdByKeywordVo mgtUserIdByKeywordVo = memberService.getUserIdByKeyword(mgtUserIdByKeywordDto); return R.ok(mgtUserIdByKeywordVo); } - + /** - * @description boardMemberTotal - * @param - * @return R<MgtBulletinBoardVo> - * @author jqs34 - * @date 2023/6/18 16:45 - */ + * @param + * @return R<MgtBulletinBoardVo> + * @description boardMemberTotal + * @author jqs34 + * @date 2023/6/18 16:45 + */ @PostMapping("/boardMemberTotal") - public R<MgtBulletinBoardVo> boardMemberTotal(@RequestBody BoardMemberTotalDto boardMemberTotalDto) - { + public R<MgtBulletinBoardVo> boardMemberTotal(@RequestBody BoardMemberTotalDto boardMemberTotalDto) { List<Shop> shopList = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); List<Long> shopIds = shopList.stream().map(Shop::getShopId).collect(Collectors.toList()); MgtBulletinBoardVo bulletinBoardVo = memberService.boardMemberTotal(shopIds); return R.ok(bulletinBoardVo); } - + /** - * @description 筛选userId年龄段 - * @author jqs - * @date 2023/6/20 14:31 * @param mgtActivityAgeDto - * @return R<List<Long>> + * @return R<List < Long>> + * @description 筛选userId年龄段 + * @author jqs + * @date 2023/6/20 14:31 */ @PostMapping("/listUserIdByAge") - public R<List<Long>> listUserIdByAge(@RequestBody MgtActivityAgeDto mgtActivityAgeDto) - { + public R<List<Long>> listUserIdByAge(@RequestBody MgtActivityAgeDto mgtActivityAgeDto) { List<Long> userIdList = memberService.listUserIdByAge(mgtActivityAgeDto); return R.ok(userIdList); } - + /** - * @description 通过shopId获取userId - * @author jqs - * @date 2023/6/21 17:11 * @param shopIdlist - * @return R<List<Long>> + * @return R<List < Long>> + * @description 通过shopId获取userId + * @author jqs + * @date 2023/6/21 17:11 */ @PostMapping("/listUserIdByShopId") - public R<List<Long>> listUserIdByShopId(@RequestBody List<Long> shopIdlist) - { + public R<List<Long>> listUserIdByShopId(@RequestBody List<Long> shopIdlist) { List<Long> userIdList = memberService.listUserIdByShopId(shopIdlist); return R.ok(userIdList); } - + /** - * @description 通过shopId获取user统计 - * @author jqs - * @date 2023/6/21 17:22 * @param shopIdlist - * @return R<MgtShopTotalMemberVo> + * @return R<MgtShopTotalMemberVo> + * @description 通过shopId获取user统计 + * @author jqs + * @date 2023/6/21 17:22 */ @PostMapping("/getUserTotalByShopId") - public R<MgtShopTotalMemberVo> getUserTotalByShopId(@RequestBody List<Long> shopIdlist) - { + public R<MgtShopTotalMemberVo> getUserTotalByShopId(@RequestBody List<Long> shopIdlist) { MgtShopTotalMemberVo shopTotalMemberVo = memberService.getUserTotalByShopId(shopIdlist); return R.ok(shopTotalMemberVo); } - + /** - * @description 更新会员统计 - * @author jqs - * @date 2023/6/28 17:52 * @param memberTotalChangeDto - * @return R + * @return R + * @description 更新会员统计 + * @author jqs + * @date 2023/6/28 17:52 */ @PostMapping("/changeMemberTotal") - public R changeMemberTotal(@RequestBody MemberTotalChangeDto memberTotalChangeDto) - { + public R changeMemberTotal(@RequestBody MemberTotalChangeDto memberTotalChangeDto) { memberService.changeMemberTotal(memberTotalChangeDto); return R.ok(); } - + /** - * @description 获取各年龄层userId - * @author jqs - * @date 2023/7/4 9:49 * @param merTotalDto - * @return R<MerOrderAgeUserVo> + * @return R<MerOrderAgeUserVo> + * @description 获取各年龄层userId + * @author jqs + * @date 2023/7/4 9:49 */ @PostMapping("/listOrderAgeUser") - public R<List<MerOrderAgeUserVo>> listOrderAgeUser(@RequestBody MerTotalDto merTotalDto) - { + public R<List<MerOrderAgeUserVo>> listOrderAgeUser(@RequestBody MerTotalDto merTotalDto) { List<MerOrderAgeUserVo> orderAgeUserVoList = memberService.listOrderAgeUser(merTotalDto); return R.ok(orderAgeUserVoList); } - + /** - * @description 获取未回复数量 - * @author jqs - * @date 2023/7/5 12:49 * @param - * @return R<Integer> + * @return R<Integer> + * @description 获取未回复数量 + * @author jqs + * @date 2023/7/5 12:49 */ @PostMapping("/getUnReplaySuggestVo") - public R<Integer> getUnReplaySuggestVo() - { + public R<Integer> getUnReplaySuggestVo() { Integer count = memberSuggestService.getUnReplaySuggestVo(); return R.ok(count); } - + /** - * @description 获取核销奖品 - * @author jqs - * @date 2023/7/8 17:43 * @param verifyPrize - * @return R<MemberGiftRecord> + * @return R<MemberGiftRecord> + * @description 获取核销奖品 + * @author jqs + * @date 2023/7/8 17:43 */ @PostMapping("/getVerifyPrize") - public R<MemberGiftRecord> getVerifyPrize(@RequestBody String verifyPrize) - { + public R<MemberGiftRecord> getVerifyPrize(@RequestBody String verifyPrize) { MemberGiftRecord memberGiftRecord = memberGiftRecordService.getById(verifyPrize); return R.ok(memberGiftRecord); } - + + /** - * @description 核销奖品 - * @author jqs - * @date 2023/8/10 11:56 + * 根据礼品id获取数据 + * + * @param giftId + * @return + */ + @PostMapping("/getVerifyPrizeByGiftId") + public R<MemberGiftRecord> getVerifyPrizeByGiftId(@RequestBody String giftId) { + MemberGiftRecord memberGiftRecord = memberGiftRecordService.getOne(new QueryWrapper<MemberGiftRecord>().eq("gift_id", giftId)); + return R.ok(memberGiftRecord); + } + + + /** * @param merVerifyPrizeFinalDto - * @return R + * @return R + * @description 核销奖品 + * @author jqs + * @date 2023/8/10 11:56 */ @PostMapping("/verifyPrize") - public R verifyPrize(@RequestBody MerVerifyPrizeFinalDto merVerifyPrizeFinalDto) - { + public R verifyPrize(@RequestBody MerVerifyPrizeFinalDto merVerifyPrizeFinalDto) { memberGiftRecordService.verifyPrize(merVerifyPrizeFinalDto); return R.ok(); } - + /** * @description 积分变动 * @author jqs @@ -336,45 +344,69 @@ memberService.changeIntegral(integralChangeDto); return R.ok(); } - + /** - * @description 统计商户今日新增会员 - * @author jqs - * @date 2023/7/14 20:00 * @param shopIdList - * @return R<Integer> + * @return R<Integer> + * @description 统计商户今日新增会员 + * @author jqs + * @date 2023/7/14 20:00 */ @PostMapping("/getAreaNewMember") - public R<Integer> getAreaNewMember(@RequestBody List<Long> shopIdList) - { + public R<Integer> getAreaNewMember(@RequestBody List<Long> shopIdList) { Integer count = memberService.getAreaNewMember(shopIdList); return R.ok(count); } - - + + /** - * @description 更新会员绑定商户名 - * @author jqs - * @date 2023/7/26 17:07 + * @description 更新会员绑定商户名 + * @author jqs + * @date 2023/7/26 17:07 * @param mgtMemberShopNameDto - * @return R + * @return R */ @PostMapping("/updateMemberShopName") public R updateMemberShopName(@RequestBody MgtMemberShopNameDto mgtMemberShopNameDto) { memberService.updateMemberShopName(mgtMemberShopNameDto); return R.ok(); } - + @PostMapping("/getBirthdayCard") - public R<BirthdayCard> getBirthdayCard() - { + public R<BirthdayCard> getBirthdayCard() { BirthdayCard birthdayCard = birthdayCardService.getBirthdayCard(); return R.ok(birthdayCard); } - + @PostMapping("/listUserIdByAgeType") - public R<List<Long>> listUserIdByAgeType(@RequestBody Integer ageType){ + public R<List<Long>> listUserIdByAgeType(@RequestBody Integer ageType) { List<Long> userIdList = memberService.listUserIdByAgeType(ageType); return R.ok(userIdList); } + + + /** + * 手动添加用户积分 + * + * @param integral + * @param userId + * @return + */ + @PostMapping("/addIntegralRecord") + public R addIntegralRecord(@RequestParam("integral") Integer integral, @RequestParam("userId") Long userId, @RequestParam("orderId") String orderId) { + return memberService.addIntegralRecord(integral, userId, orderId); + } + + + /** + * 添加奖品记录 + * + * @param memberGiftRecord + * @return + */ + @PostMapping("/saveMemberGiftRecord") + public R saveMemberGiftRecord(@RequestBody MemberGiftRecord memberGiftRecord) { + memberGiftRecordService.save(memberGiftRecord); + return R.ok(); + } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppCouponController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppCouponController.java index bb0db64..270e667 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppCouponController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppCouponController.java @@ -1,25 +1,34 @@ package com.ruoyi.member.controller.miniapp; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.service.LotteryEventClient; import com.ruoyi.member.domain.dto.AppMemberCouponPageDto; +import com.ruoyi.member.domain.pojo.coupon.Coupon; import com.ruoyi.member.domain.vo.AppGetAbleCouponPageVo; import com.ruoyi.member.domain.vo.AppMemberCouponPageVo; +import com.ruoyi.member.domain.vo.CouponInfoVo; import com.ruoyi.member.service.coupon.CouponService; import com.ruoyi.member.service.member.MemberCouponService; import com.ruoyi.member.service.member.MemberService; import com.ruoyi.system.api.domain.dto.AppBaseGetDto; import com.ruoyi.system.api.domain.dto.AppPageDto; +import com.ruoyi.system.api.domain.poji.goods.Goods; import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.domain.poji.member.MemberCoupon; +import com.ruoyi.system.api.service.RemoteGoodsService; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.text.SimpleDateFormat; import java.util.List; /** @@ -33,17 +42,24 @@ @RestController @RequestMapping("/app/coupon") public class AppCouponController { - - + + @Resource private CouponService couponService; - + @Resource private MemberService memberService; - + @Resource private MemberCouponService memberCouponService; - + + @Resource + private RemoteGoodsService remoteGoodsService; + + @Resource + private LotteryEventClient lotteryEventClient; + + @RequestMapping(value = "/pageAppUserGetAbleCoupon", method = RequestMethod.POST) @ApiOperation(value = "用户分页获取可领取优惠券列表") public R<Page<AppGetAbleCouponPageVo>> pagePlatformMerCoupon(@RequestBody AppPageDto appPageDto) { @@ -53,7 +69,7 @@ Page<AppGetAbleCouponPageVo> page = new Page<>(); page.setSize(appPageDto.getPageSize()); page.setCurrent(appPageDto.getPageNum()); - List<AppGetAbleCouponPageVo> unGetCouponPageVoList = couponService.pageAppUserGetAbleCoupon(page,appPageDto,member); + List<AppGetAbleCouponPageVo> unGetCouponPageVoList = couponService.pageAppUserGetAbleCoupon(page, appPageDto, member); return R.ok(page.setRecords(unGetCouponPageVoList)); } @@ -77,7 +93,66 @@ Page<AppMemberCouponPageVo> page = new Page<>(); page.setSize(appMemberCouponPageDto.getPageSize()); page.setCurrent(appMemberCouponPageDto.getPageNum()); - List<AppMemberCouponPageVo> memberCouponPageVoList = memberCouponService.pageAppUserGetCoupon(page,appMemberCouponPageDto, member); + List<AppMemberCouponPageVo> memberCouponPageVoList = memberCouponService.pageAppUserGetCoupon(page, appMemberCouponPageDto, member); return R.ok(page.setRecords(memberCouponPageVoList)); } + + @ResponseBody + @PostMapping("/getCouponInfo/{couponId}") + @ApiOperation(value = "获取优惠券详情【2.0】", tags = "领券中心") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "优惠券id", required = true, dataType = "String", paramType = "path") + }) + public R<CouponInfoVo> getCouponInfo(@PathVariable("couponId") String couponId) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Coupon coupon = couponService.getById(couponId); + CouponInfoVo vo = new CouponInfoVo(); + vo.setId(coupon.getCouponId()); + vo.setName(coupon.getCouponName()); + vo.setType(coupon.getCouponType()); + vo.setMoneyThreshold(coupon.getMoneyThreshold()); + vo.setDiscountPercent(coupon.getDiscountPercent()); + vo.setDiscountMoney(coupon.getDiscountMoney()); + vo.setValidType(coupon.getValidTimeType()); + vo.setValidDays(coupon.getValidDay()); + vo.setValidStartTime(sdf.format(coupon.getValidStartTime())); + vo.setValidEndTime(sdf.format(coupon.getValidEndTime())); + vo.setPropagandaPoster(coupon.getPropagandaPoster()); + vo.setUseGoods(""); + //构建特定商品数据 + if (StringUtils.isNotEmpty(coupon.getRelGoodsIds())) { + String relGoodsIds = coupon.getRelGoodsIds(); + List<Goods> data = remoteGoodsService.listGoodsByGoodsId(relGoodsIds).getData(); + StringBuilder sb = new StringBuilder(); + for (Goods goods : data) { + sb.append(goods.getGoodsName()).append(","); + } + vo.setUseGoods(sb.substring(0, sb.length() - 1)); + } + vo.setLaveNum(coupon.getSendLimitFlag()); + vo.setReceiveNum(coupon.getSendLimitNumber()); + int count = memberCouponService.count(new QueryWrapper<MemberCoupon>().eq("coupon_id", couponId).eq("del_flag", 0)); + vo.setLaveNum(coupon.getSendLimitNumber() - count); + MemberCoupon one = memberCouponService.getOne(new QueryWrapper<MemberCoupon>().eq("coupon_id", couponId).eq("user_id", SecurityUtils.getUserId())); + if (one != null) { + vo.setStatus(one.getCouponStatus()); + } + return R.ok(vo); + } + + + @ResponseBody + @PostMapping("/shareCoupon/{couponId}") + @ApiOperation(value = "分享优惠券【2.0】", tags = "领券中心") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "优惠券id", required = true, dataType = "String", paramType = "path") + }) + public R<Boolean> shareCoupon(@PathVariable("couponId") String couponId) { + //检测是否可以抽奖 + List<LotteryEvent> data = lotteryEventClient.getLotteryEventList(3).getData(); + if (data.size() > 0) { + return R.ok(true); + } + return R.ok(false); + } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppIntegralController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppIntegralController.java index 998990b..0fe3f3e 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppIntegralController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppIntegralController.java @@ -4,6 +4,8 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.service.LotteryEventClient; import com.ruoyi.member.domain.vo.AppIntegralRecordPageVo; import com.ruoyi.member.domain.vo.AppIntegralTaskListVo; import com.ruoyi.member.service.member.IntegralRecordService; @@ -32,14 +34,17 @@ @RestController @RequestMapping("/app/integral") public class AppIntegralController { - + @Resource private MemberService memberService; - + @Resource private IntegralRecordService integralRecordService; - - + + @Resource + private LotteryEventClient lotteryEventClient; + + @RequestMapping(value = "/pageAppMemberIntegralRecord", method = RequestMethod.POST) @ApiOperation(value = "分页获取用户积分明细列表") public R<Page<AppIntegralRecordPageVo>> pageAppMemberIntegralRecord(@RequestBody AppPageDto appPageDto) { @@ -48,7 +53,7 @@ Page<AppIntegralRecordPageVo> page = new Page<>(); page.setSize(appPageDto.getPageSize()); page.setCurrent(appPageDto.getPageNum()); - List<AppIntegralRecordPageVo> integralRecordPageVoList = integralRecordService.pageAppMemberIntegralRecord(page,userId); + List<AppIntegralRecordPageVo> integralRecordPageVoList = integralRecordService.pageAppMemberIntegralRecord(page, userId); return R.ok(page.setRecords(integralRecordPageVoList)); } @@ -73,18 +78,20 @@ } return R.ok(); } - + @RequestMapping(value = "/signShare", method = RequestMethod.POST) - @ApiOperation(value = "今日分享") - public R signShare() { + @ApiOperation(value = "今日分享【2.0】") + public R<Boolean> signShare() { Long userId = SecurityUtils.getUserId(); IntegralChangeDto integralChangeDto = new IntegralChangeDto(); integralChangeDto.setIntegralType(1); integralChangeDto.setUserId(userId); Boolean complete = memberService.changeIntegral(integralChangeDto); - if(complete){ + if (complete) { throw new ServiceException(AppErrorConstant.DOUBLE_INTEGRAL_TASK); } - return R.ok(); + //判断是否可以抽奖 + List<LotteryEvent> data = lotteryEventClient.getLotteryEventList(3).getData(); + return R.ok(data.size() > 0); } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppMemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppMemberController.java index 1533e98..51cd570 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppMemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/miniapp/AppMemberController.java @@ -158,7 +158,7 @@ } @RequestMapping(value = "/pageAppMemberPrize", method = RequestMethod.POST) - @ApiOperation(value = "分页获取用户奖品列表") + @ApiOperation(value = "分页获取用户奖品列表【2.0】") public R<Page<AppMemberPrizePageVo>> pageAppMemberPrize(@RequestBody AppPageDto appPageDto) { Long userId = SecurityUtils.getUserId(); appPageDto.setUserId(userId); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java index 87d178c..ed1df99 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java @@ -27,7 +27,7 @@ @ApiModelProperty(value="优惠券名称") private String couponName; - @ApiModelProperty(value = "发送类型1.手动领取2.指定发放") + @ApiModelProperty(value = "发送类型1.手动领取2.指定发放3.抽奖领取") private Integer sendType; @ApiModelProperty(value = "发送对象2.全部用户3.会员用户4非会员用户5自定义") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/member/IntegralRecord.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/member/IntegralRecord.java index 32d22af..e95967f 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/member/IntegralRecord.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/pojo/member/IntegralRecord.java @@ -42,7 +42,7 @@ @TableField(value = "user_id") private Long userId; /** - * 变动类型1分享获取2平台建议获取3门店建议获取4每日签到5消费得积分 + * 变动类型1分享获取2平台建议获取3门店建议获取4每日签到5消费得积分6抽奖获得 */ @TableField("change_type") private Integer changeType; diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/CouponInfoVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/CouponInfoVo.java new file mode 100644 index 0000000..31e9fb5 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/CouponInfoVo.java @@ -0,0 +1,48 @@ +package com.ruoyi.member.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author zhibing.pu + * @Date 2025/5/27 12:01 + */ +@ApiModel +@Data +public class CouponInfoVo { + @ApiModelProperty(value = "优惠券id") + private String id; + @ApiModelProperty(value = "优惠券名称") + private String name; + @ApiModelProperty(value = "优惠券类型1.满减2.折扣3.代金4.商品") + private Integer type; + @ApiModelProperty(value = "门槛金额") + private BigDecimal moneyThreshold; + @ApiModelProperty(value = "折扣") + private BigDecimal discountPercent; + @ApiModelProperty(value = "优惠金额") + private BigDecimal discountMoney; + @ApiModelProperty(value = "有效期类型1.时间段2.领取之日起") + private Integer validType; + @ApiModelProperty(value = "有效期") + private Integer validDays; + @ApiModelProperty(value = "有效期开始时间") + private String validStartTime; + @ApiModelProperty(value = "有效期结束时间") + private String validEndTime; + @ApiModelProperty(value = "使用范围商品") + private String useGoods; + @ApiModelProperty(value = "发放限制0否1是") + private Integer limitFlag; + @ApiModelProperty(value = "可领数量") + private Integer receiveNum; + @ApiModelProperty(value = "剩余数量") + private Integer laveNum; + @ApiModelProperty(value = "宣传海报") + private String propagandaPoster; + @ApiModelProperty(value = "优惠券状态-1删除0已过期1已领取2已使用") + private Integer status; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java index ab80ee3..b9d40b2 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java @@ -29,7 +29,7 @@ @ApiModelProperty(value="优惠券名称") private String couponName; - @ApiModelProperty(value = "发送类型1.手动领取2.指定发放") + @ApiModelProperty(value = "发送类型1.手动领取2.指定发放3.抽奖领取") private Integer sendType; @ApiModelProperty(value = "发送对象2.全部用户3.会员用户4非会员用户5自定义") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java index 5280b4d..47a4a74 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java @@ -22,7 +22,7 @@ @ApiModelProperty(value="优惠券名称") private String couponName; - @ApiModelProperty(value="优惠券类型1.满减2.折扣3.代金4.商品") + @ApiModelProperty(value = "优惠券类型1.满减2.折扣3.代金4.商品") private Integer couponType; @ApiModelProperty(value = "使用限制") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberPageVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberPageVo.java index 1353e22..6fa4fbb 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberPageVo.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberPageVo.java @@ -44,13 +44,16 @@ @ApiModelProperty(value = "用户标签") private String userTags; - + @ApiModelProperty(value = "商品类型") private String goodsType; - - @ApiModelProperty(value = "最近消费时间",hidden = true) + + @ApiModelProperty(value = "最近消费时间", hidden = true) private Date lastPayTime; - + @ApiModelProperty(value = "活跃度") private String memberActiveness; + + @ApiModelProperty(value = "调理问题") + private String memberNurse; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java index f2c2a80..238a73e 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java @@ -543,6 +543,7 @@ memberGiftRecord.setDelFlag(0); memberGiftRecord.setVerifyStatus(1); memberGiftRecord.setGiftFrom(1); + memberGiftRecord.setPrizeFrom(1); memberGiftRecord.setGiftYear(currentYear); memberGiftRecord.setCreateTime(new Date()); memberGiftRecord.setUserId(userId); @@ -622,6 +623,7 @@ memberGiftRecord.setDelFlag(0); memberGiftRecord.setVerifyStatus(1); memberGiftRecord.setGiftFrom(2); + memberGiftRecord.setPrizeFrom(1); memberGiftRecord.setShopId(shopId); memberGiftRecord.setGiftYear(currentYear); memberGiftRecord.setCreateTime(new Date()); @@ -682,23 +684,23 @@ appBirthdayCardVo.setBirthdayGiftVoList(birthdayGiftVoList); return appBirthdayCardVo; } - + /** - * @description - * @author jqs - * @date 2023/7/11 18:02 * @param page * @param userId - * @return List<AppMemberPrizePageVo> + * @return List<AppMemberPrizePageVo> + * @description + * @author jqs + * @date 2023/7/11 18:02 */ @Override - public List<AppMemberPrizePageVo> pageAppMemberPrize(Page page, Long userId){ + public List<AppMemberPrizePageVo> pageAppMemberPrize(Page page, Long userId) { List<AppMemberPrizePageVo> memberPrizePageVoList = birthdayCardMapper.pageAppMemberPrize(page, userId); - if(memberPrizePageVoList!=null&&!memberPrizePageVoList.isEmpty()){ + if (memberPrizePageVoList != null && !memberPrizePageVoList.isEmpty()) { HashSet<Long> shopIdSet = new HashSet<>(); - for(AppMemberPrizePageVo appMemberPrizePageVo : memberPrizePageVoList){ - appMemberPrizePageVo.setVerifyCode("3-"+appMemberPrizePageVo.getPrizeId()); - if(appMemberPrizePageVo.getShopId()!=null){ + for (AppMemberPrizePageVo appMemberPrizePageVo : memberPrizePageVoList) { + appMemberPrizePageVo.setVerifyCode("3-" + appMemberPrizePageVo.getPrizeId()); + if (appMemberPrizePageVo.getShopId() != null) { shopIdSet.add(appMemberPrizePageVo.getShopId()); } } @@ -708,8 +710,8 @@ List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData(); Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream() .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity())); - for(AppMemberPrizePageVo appMemberPrizePageVo : memberPrizePageVoList){ - if(appMemberPrizePageVo.getShopId()!=null){ + for (AppMemberPrizePageVo appMemberPrizePageVo : memberPrizePageVoList) { + if (appMemberPrizePageVo.getShopId() != null) { appMemberPrizePageVo.setVerifyShopName(shopMap.get(appMemberPrizePageVo.getShopId()).getShopName()); } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java index d895e44..91232af 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java @@ -1124,9 +1124,9 @@ CouponTotal couponTotal; if(StringUtils.isNotBlank(merCouponEditDto.getCouponId())){ coupon = this.getById(merCouponEditDto.getCouponId()); - if(coupon.getAuditStatus()!=3){ - throw new ServiceException(AppErrorConstant.COUPON_AUDIT_EDIT); - } +// if(coupon.getAuditStatus()!=3){ +// throw new ServiceException(AppErrorConstant.COUPON_AUDIT_EDIT); +// } couponRelUserService.deleteCouponRelByCouponId(coupon.getCouponId()); couponRelGoodsService.deleteCouponRelByCouponId(coupon.getCouponId()); coupon.setCouponStatus(1); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java index aa12d41..14e1a02 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberCouponServiceImpl.java @@ -4,13 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.member.domain.dto.AppMemberCouponPageDto; import com.ruoyi.member.domain.dto.MemberSelectCouponDto; import com.ruoyi.member.domain.dto.MerGoodsCouponListDto; +import com.ruoyi.member.domain.pojo.coupon.Coupon; import com.ruoyi.member.domain.vo.AppMemberCouponPageVo; +import com.ruoyi.member.mapper.coupon.CouponMapper; import com.ruoyi.member.mapper.member.MemberCouponMapper; +import com.ruoyi.member.service.coupon.CouponService; +import com.ruoyi.member.service.coupon.MemberCouponRecordService; import com.ruoyi.member.service.member.MemberCouponService; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.domain.dto.MerBaseDto; @@ -45,17 +51,26 @@ @Service @DS("sharding") public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, MemberCoupon> implements MemberCouponService { - + @Resource private MemberCouponMapper memberCouponMapper; - + @Resource private RemoteGoodsService remoteGoodsService; - + @Resource private RemoteShopService remoteShopService; - - + + @Resource + private CouponService couponService; + + @Resource + private MemberCouponRecordService memberCouponRecordService; + + @Resource + private CouponMapper couponMapper; + + /** * @description: TODO * @author jqs34 @@ -63,11 +78,11 @@ * @version 1.0 */ @Override - public List<AppMemberCouponVo> listVoMemberCouponByUserId(MerBaseDto merBaseDto){ + public List<AppMemberCouponVo> listVoMemberCouponByUserId(MerBaseDto merBaseDto) { List<AppMemberCouponVo> appMemberCouponVoList = memberCouponMapper.listVoMemberCouponByUserId(merBaseDto); return appMemberCouponVoList; } - + /** * @description 核销优惠券 * @author jqs @@ -112,7 +127,7 @@ merVerifyCouponGetVo.setMemberCoupon(memberCoupon); return merVerifyCouponGetVo; } - + /** * @description 核销优惠券 * @author jqs @@ -150,13 +165,13 @@ merVerifyCouponGetVo.setCouponFrom("平台"); } memberCoupon.setCouponStatus(2); - + memberCoupon.setUseTime(new Date()); this.saveOrUpdate(memberCoupon); merVerifyCouponGetVo.setMemberCoupon(memberCoupon); return merVerifyCouponGetVo; } - + /** * @description * @author jqs @@ -173,7 +188,7 @@ Integer total = this.count(queryWrapper); return total; } - + /** * @description 用户分页获取已领取优惠券列表 * @author jqs @@ -261,7 +276,7 @@ } return memberCouponPageVoList; } - + /** * @description 定时检查优惠券过期 * @author jqs @@ -273,7 +288,7 @@ public void timingCheckMemberCoupon(){ memberCouponMapper.timingCheckMemberCoupon(); } - + /** * @description 使用优惠券 * @author jqs @@ -286,7 +301,7 @@ public void useMemberCoupon(String memberCouponIds){ memberCouponMapper.useMemberCoupon(memberCouponIds); } - + /** * @description 使用优惠券 * @author jqs @@ -298,7 +313,7 @@ public void backMemberCoupon(String memberCouponIds){ memberCouponMapper.backMemberCoupon(memberCouponIds); } - + /** * @description * @author jqs @@ -347,24 +362,101 @@ } return merMemberCouponVoList; } - - + + /** - * @description 确认核销优惠券 - * @author jqs - * @date 2023/8/15 11:21 * @param memberCouponId * @param shopId - * @return void + * @return void + * @description 确认核销优惠券 + * @author jqs + * @date 2023/8/15 11:21 */ @Override - public void sureMemberCoupon(Long memberCouponId, Long shopId){ + public void sureMemberCoupon(Long memberCouponId, Long shopId) { memberCouponMapper.sureMemberCoupon(memberCouponId, shopId); } - + @Override @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void insert(MemberCoupon memberCoupon) { this.baseMapper.insert(memberCoupon); } + + + /** + * 手动添加用户优惠券 + * + * @param couponId + * @param number + * @return + */ + @Override + public R addMemberCoupon(String couponId, Integer number, Long userId) { + Coupon coupon = couponService.getById(couponId); + if (null == coupon) { + return R.fail("优惠券不存在"); + } + List<MemberCoupon> memberCouponList = new ArrayList<>(); + MemberCoupon memberCoupon; + Integer sendTotal = 0; + Integer sendPerson = 0; + Integer sendUserTotal; + for (int i = 0; i < number; i++) { + memberCoupon = new MemberCoupon(); + memberCoupon.setDelFlag(0); + memberCoupon.setCouponId(coupon.getCouponId()); + memberCoupon.setUserId(userId); + memberCoupon.setShopId(coupon.getShopId()); + memberCoupon.setCouponType(coupon.getCouponType()); + if (coupon.getCouponType() == 1) { + memberCoupon.setMoneyThreshold(coupon.getMoneyThreshold()); + memberCoupon.setDiscountMoney(coupon.getDiscountMoney()); + } else if (coupon.getCouponType() == 2) { + memberCoupon.setDiscountPercent(coupon.getDiscountPercent()); + } else if (coupon.getCouponType() == 3) { + memberCoupon.setDiscountMoney(coupon.getDiscountMoney()); + } else { + memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); + } + memberCoupon.setCouponStatus(coupon.getCouponStatus()); + memberCoupon.setCouponName(coupon.getCouponName()); + memberCoupon.setSendType(coupon.getSendType()); + memberCoupon.setSendTarget(coupon.getSendTarget()); + memberCoupon.setSendTimeType(coupon.getSendTimeType()); + memberCoupon.setSendTime(coupon.getSendTime()); + memberCoupon.setUseScope(coupon.getUseScope()); + if (memberCoupon.getUseScope() == 2) { + memberCoupon.setRelGoodsIds(coupon.getRelGoodsIds()); + } + memberCoupon.setValidTimeType(coupon.getValidTimeType()); + memberCoupon.setValidStartTime(coupon.getValidStartTime()); + memberCoupon.setValidEndTime(coupon.getValidEndTime()); + memberCoupon.setValidDay(coupon.getValidDay()); + memberCoupon.setCouponFrom(coupon.getCouponFrom()); + memberCoupon.setReceiveTime(new Date()); + //有效期处理1.时间段2.领取之日起 + if (coupon.getValidTimeType() == 1) { + memberCoupon.setDeadlineTime(coupon.getValidEndTime()); + } else if (coupon.getValidTimeType() == 2) { + memberCoupon.setDeadlineTime(DateUtils.addDays(new Date(), coupon.getValidDay())); + } + memberCouponList.add(memberCoupon); + sendTotal = sendTotal + 1; + if (coupon.getSendType() == 1) { + sendUserTotal = this.totalMemberCouponByUserAndCoupon(userId, coupon.getCouponId()); + if (sendUserTotal != null && sendUserTotal > 0) { + } else { + sendPerson = sendPerson + 1; + } + } + memberCouponRecordService.updateMemberCouponRecord(coupon, userId, 1); + } + this.saveBatch(memberCouponList); + //处理优惠券统计 + if (sendTotal > 0) { + couponMapper.updateCouponTotal(coupon.getCouponId(), sendTotal, sendPerson); + } + return R.ok(); + } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java index bd779ac..1161275 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java @@ -1,5 +1,4 @@ package com.ruoyi.member.service.impl.member; -import com.google.common.collect.Lists; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import com.alibaba.fastjson.JSONObject; @@ -8,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.DateUtils; @@ -21,7 +21,6 @@ import com.ruoyi.member.domain.pojo.member.IntegralRecord; import com.ruoyi.member.domain.pojo.member.MemberArchive; import com.ruoyi.member.domain.pojo.member.MemberTotal; -import com.ruoyi.member.domain.vo.MerMemberTotalVo; import com.ruoyi.member.domain.vo.*; import com.ruoyi.member.mapper.member.MemberMapper; import com.ruoyi.member.service.member.IntegralRecordService; @@ -2257,14 +2256,43 @@ List<Member> mobileList = memberMapper.listTodayBirthday(); if(mobileList!=null&&!mobileList.isEmpty()){ log.info("生日祝福发送短信---"+mobileList.toString()); - for(Member member : mobileList){ + for (Member member : mobileList) { try { String msg = "{\"name\":\"" + (StringUtils.isEmpty(member.getRealName()) ? member.getNickName() : member.getRealName()) + "\"}"; - MsgUtils.sendMsg(member.getMobile(),null, msg); + MsgUtils.sendMsg(member.getMobile(), null, msg); } catch (Exception e) { throw new RuntimeException(e); } } } } + + + /** + * 手动添加用户积分 + * + * @param integral + * @param userId + * @return + */ + @Override + public R addIntegralRecord(Integer integral, Long userId, String orderId) { + Member member = this.getByUserId(userId); + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + IntegralRecord integralRecord = new IntegralRecord(); + integralRecord.setDelFlag(0); + integralRecord.setUserId(userId); + integralRecord.setChangeType(6); + integralRecord.setChangeIntegral(integral); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral() + integral); + integralRecord.setCreateTime(new Date()); + integralRecord.setOrderId(orderId); + integralRecord.setChangeReason("抽奖活动获得"); + integralRecordService.save(integralRecord); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral() + integral); + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral() + integral); + memberTotal.setPlSuggestFlag(1); + memberTotalService.saveOrUpdate(memberTotal); + return R.ok(); + } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java index 4ec7fa2..e600c13 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberCouponService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.R; import com.ruoyi.member.domain.dto.AppMemberCouponPageDto; import com.ruoyi.member.domain.dto.MerGoodsCouponListDto; import com.ruoyi.member.domain.vo.AppMemberCouponPageVo; @@ -107,16 +108,26 @@ * @return List<MerMemberCouponVo> */ List<MerMemberCouponVo> listMerShopGoodsMemberCoupon(MerGoodsCouponListDto merGoodsCouponListDto); - + /** - * @description 确认核销优惠券 - * @author jqs - * @date 2023/8/15 11:21 * @param memberCouponId * @param shopId - * @return void + * @return void + * @description 确认核销优惠券 + * @author jqs + * @date 2023/8/15 11:21 */ - void sureMemberCoupon(Long memberCouponId,Long shopId); - + void sureMemberCoupon(Long memberCouponId, Long shopId); + void insert(MemberCoupon memberCoupon); + + + /** + * 手动添加用户优惠券 + * + * @param couponId + * @param number + * @return + */ + R addMemberCoupon(String couponId, Integer number, Long userId); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java index 05932d0..382d6ec 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.R; import com.ruoyi.member.domain.dto.*; import com.ruoyi.member.domain.vo.*; import com.ruoyi.system.api.domain.dto.*; @@ -380,13 +381,23 @@ * @return void */ void updateMemberShopName(MgtMemberShopNameDto mgtMemberShopNameDto); - + /** - * @description 发送生日祝福 - * @author jqs - * @date 2023/8/7 15:40 * @param - * @return void + * @return void + * @description 发送生日祝福 + * @author jqs + * @date 2023/8/7 15:40 */ void sendBirthdayBless(); + + + /** + * 手动添加用户积分 + * + * @param integral + * @param userId + * @return + */ + R addIntegralRecord(Integer integral, Long userId, String orderId); } diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/birthday/BirthdayCardMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/birthday/BirthdayCardMapper.xml index 0e02a5e..93a003c 100644 --- a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/birthday/BirthdayCardMapper.xml +++ b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/birthday/BirthdayCardMapper.xml @@ -17,21 +17,25 @@ </select> <select id="pageAppMemberPrize" resultType="com.ruoyi.member.domain.vo.AppMemberPrizePageVo"> - SELECT - prize_id prizeId, - CASE gift_type - WHEN 1 THEN CONCAT(coupon_name,"优惠券") - WHEN 2 THEN CONCAT(goods_name,"商品") - WHEN 4 THEN CONCAT(gift_name,"实物") - WHEN 3 THEN CONCAT("现金",money,"元") - END prizeName, - "生日卡" prizeFrom, - verify_status verifyStatus, - create_time createTime, - verify_time verifyTime, - shop_id shopId + SELECT prize_id prizeId, + CASE gift_type + WHEN 1 THEN CONCAT(coupon_name, "优惠券") + WHEN 2 THEN CONCAT(goods_name, "商品") + WHEN 4 THEN CONCAT(gift_name, "实物") + WHEN 3 THEN CONCAT("现金", money, "元") + WHEN 5 THEN "积分" + END prizeName, + CASE prize_from + WHEN 1 THEN "生日卡" + ELSE "抽奖" + END prizeFrom, + verify_status verifyStatus, + create_time createTime, + verify_time verifyTime, + shop_id shopId FROM t_member_gift_record - WHERE del_flag = 0 AND user_id = #{userId} + WHERE del_flag = 0 + AND user_id = #{userId} ORDER BY verify_status ASC </select> </mapper> diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml index 0913eef..639ee84 100644 --- a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml +++ b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml @@ -161,7 +161,8 @@ tm.birthday birthday, tm.user_tags userTags, tm.goods_type goodsType, - tmt.last_service_time lastPayTime + tmt.last_service_time lastPayTime, + tm.memberNurse FROM t_member tm INNER JOIN t_member_total tmt ON tm.member_id = tmt.member_id WHERE tm.relation_shop_id = #{param.shopId} AND tm.binding_flag = 1 diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml index 0a4d68d..a6e1c7c 100644 --- a/ruoyi-modules/ruoyi-order/pom.xml +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -149,11 +149,23 @@ <version>4.13.1</version> <scope>test</scope> </dependency> - + <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.22</version> + </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-api-goods</artifactId> + <version>3.6.2</version> + <scope>compile</scope> + </dependency> + <!--抖音sdk--> + <dependency> + <groupId>com.douyin.openapi</groupId> + <artifactId>sdk</artifactId> + <version>1.0.0</version> </dependency> </dependencies> @@ -173,5 +185,11 @@ </plugin> </plugins> </build> - + <repositories> + <!--抖音sdk--> + <repository> + <id>douyin-openapi-repo</id> + <url>https://artifacts-cn-beijing.volces.com/repository/douyin-openapi/</url> + </repository> + </repositories> </project> \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerConsumerController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerConsumerController.java index c4dae7b..d20cf53 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerConsumerController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerConsumerController.java @@ -43,7 +43,7 @@ private UserServiceRecordService userServiceRecordService; @RequestMapping(value = "/listMerConsumerGoods", method = RequestMethod.POST) - @ApiOperation(value = "获取用户服务列表") + @ApiOperation(value = "获取用户服务列表【2.0】") public R<MerConsumerGoodsVo> listMerConsumerGoods(@RequestBody MerConsumerGoodsDto merConsumerGoodsDto) { Long userId = SecurityUtils.getUserId(); merConsumerGoodsDto.setUserId(userId); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java index 8f8a37c..35368b8 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java @@ -5,6 +5,7 @@ import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.order.domain.dto.*; +import com.ruoyi.order.domain.pojo.order.Order; import com.ruoyi.order.domain.vo.*; import com.ruoyi.order.service.order.OrderService; import com.ruoyi.system.api.constant.AppErrorConstant; @@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.util.Date; import java.util.List; /** @@ -71,7 +73,16 @@ Long userId = SecurityUtils.getUserId(); merVerifyCodeDto.setUserId(userId); String verifyCode = merVerifyCodeDto.getVerifyCode(); - MerVerifyOrderVo merVerifyOrderVo = orderService.verifyOrder(verifyCode,merVerifyCodeDto.getShopId()); + MerVerifyOrderVo merVerifyOrderVo = null; + if (!verifyCode.contains("https")) { + merVerifyOrderVo = orderService.verifyOrder(verifyCode, merVerifyCodeDto.getShopId()); + } else { + //三方订单 + //抖音 + if (verifyCode.contains("douyin")) { + merVerifyOrderVo = orderService.verifyOrderDouYin(verifyCode, merVerifyCodeDto.getShopId()); + } + } return R.ok(merVerifyOrderVo); } @@ -80,7 +91,16 @@ public R<MerVerifyOrderVo> sureVerifyOrder(@RequestBody MerVerifyOrderDto merVerifyOrderDto) { Long userId = SecurityUtils.getUserId(); merVerifyOrderDto.setUserId(userId); - MerVerifyOrderVo merVerifyOrderVo = orderService.sureVerifyOrder(merVerifyOrderDto); + MerVerifyOrderVo merVerifyOrderVo = null; + if (!merVerifyOrderDto.getOrderId().contains("https")) { + merVerifyOrderVo = orderService.sureVerifyOrder(merVerifyOrderDto); + } else { + //三方订单 + //抖音 + if (merVerifyOrderDto.getOrderId().contains("douyin")) { + merVerifyOrderVo = orderService.sureVerifyOrderDouYin(merVerifyOrderDto); + } + } return R.ok(merVerifyOrderVo); } @@ -133,19 +153,43 @@ orderService.createNewOrder(merNewOrderDto); return R.ok(); } - + @RequestMapping(value = "/pageMerOrder", method = RequestMethod.POST) - @ApiOperation(value = "获取商户端订单列表") + @ApiOperation(value = "获取商户端订单列表【2.0】") public R<Page<MerOrderPageVo>> pageMerOrder(@RequestBody MerOrderPageDto merOrderPageDto) { Long userId = SecurityUtils.getUserId(); merOrderPageDto.setUserId(userId); Page<MerOrderPageVo> page = new Page<>(); page.setSize(merOrderPageDto.getPageSize()); page.setCurrent(merOrderPageDto.getPageNum()); - List<MerOrderPageVo> merOrderPageVoList = orderService.pageMerOrder(page,merOrderPageDto); + List<MerOrderPageVo> merOrderPageVoList = orderService.pageMerOrder(page, merOrderPageDto); return R.ok(page.setRecords(merOrderPageVoList)); } - + + + @RequestMapping(value = "/cancelMerOrder", method = RequestMethod.POST) + @ApiOperation(value = "商户端取消线下订单【2.0】") + public R cancelMerOrder(@RequestBody CancelMerOrderDto dto) { + Order order = orderService.getById(dto.getOrderId()); + if (null == order) { + return R.fail("订单不存在"); + } + if (order.getOrderStatus() == 0) { + return R.fail("订单已取消"); + } + if (!order.getShopId().equals(dto.getShopId())) { + return R.fail("取消失败"); + } + if (3 != order.getOrderFrom()) { + return R.fail("取消失败"); + } + order.setOrderStatus(0); + order.setCancelTime(new Date()); + orderService.updateById(order); + return R.ok(); + } + + @RequestMapping(value = "/totalMerOrder", method = RequestMethod.POST) @ApiOperation(value = "商户端订单管理统计") public R<MerTotalOrderVo> totalMerOrder(@RequestBody MerOrderPageDto merOrderPageDto) { @@ -154,9 +198,9 @@ MerTotalOrderVo totalOrderVo = orderService.totalMerOrder(merOrderPageDto); return R.ok(totalOrderVo); } - + @RequestMapping(value = "/pageMerMemberOrder", method = RequestMethod.POST) - @ApiOperation(value = "分页商户端用户收银记录") + @ApiOperation(value = "分页商户端用户收银记录【2.0】") public R<Page<MerMemberOrderVo>> pageMerMemberOrder(@RequestBody MerMemberNoClearOrderDto merMemberNoClearOrderDto) { Long userId = SecurityUtils.getUserId(); merMemberNoClearOrderDto.setUserId(userId); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java index 726963f..11ebe08 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/AppOrderController.java @@ -2,7 +2,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; -import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.order.domain.dto.*; @@ -130,7 +129,7 @@ } @RequestMapping(value = "/payOrder", method = RequestMethod.POST) - @ApiOperation(value = "支付订单") + @ApiOperation(value = "支付订单【2.0】") public R<AppPlaceOrderVo> payOrder(@RequestBody AppBaseGetDto appBaseGetDto) { Long userId = SecurityUtils.getUserId(); AppPlaceOrderVo appPlaceOrderVo = orderService.payOrder(appBaseGetDto.getId()); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/CancelMerOrderDto.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/CancelMerOrderDto.java new file mode 100644 index 0000000..f7a62bc --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/CancelMerOrderDto.java @@ -0,0 +1,16 @@ +package com.ruoyi.order.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/5 17:53 + */ +@Data +@ApiModel +public class CancelMerOrderDto { + @ApiModelProperty("商户id") + private Long shopId; + @ApiModelProperty("订单id") + private String orderId; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java index d608eec..6e9df12 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerOrderPageDto.java @@ -27,7 +27,7 @@ @ApiModelProperty(value = "搜索关键词") private String keyword; - @ApiModelProperty(value = "1.全部2.待核销3.已核销") + @ApiModelProperty(value = "0.已取消1.全部2.待核销3.已核销") private Integer type; @ApiModelProperty(value = "订单开始时间") @@ -35,7 +35,7 @@ @ApiModelProperty(value = "订单结束时间") private String endOrderDate; - - @ApiModelProperty(value = "订单来源1.店铺商品2.平台秒杀活动3.线下创建") + + @ApiModelProperty(value = "订单来源1.商城2.秒杀活动3.线下创建4.抽奖5.美团6.抖音7.快手") private Integer orderFrom; } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java index 11bc5f1..7572692 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/MerVerifyOrderDto.java @@ -15,16 +15,19 @@ */ @Data public class MerVerifyOrderDto extends MerBaseDto { - + @ApiModelProperty(value = "订单id") private String orderId; - + + @ApiModelProperty(value = "核销用户电话号码") + private String phone; + @ApiModelProperty(value = "实收金额") private BigDecimal relReceiveMoney; - + @ApiModelProperty(value = "实付金额") private BigDecimal relPayMoney; - + @ApiModelProperty(value = "支付方式1微信2现金3支付宝") private Integer payType; } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java index fda482f..13dd518 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java @@ -56,7 +56,7 @@ private String outTradeNo; /** - * 订单来源1.商城2.秒杀活动3.线下创建 + * 订单来源1.商城2.秒杀活动3.线下创建4.抽奖 */ @TableField("order_from") private Integer orderFrom; @@ -195,21 +195,26 @@ */ @TableField("new_member_flag") private Integer newMemberFlag; - + /** - * @description 未绑定标记 - * @author jqs - * @date 2023/9/8 10:45 + * @description 未绑定标记 + * @author jqs + * @date 2023/9/8 10:45 * @param null - * @return null + * @return null */ @TableField("unbinding_flag") private Integer unbindingFlag; - - + /** + * 三方平台订单id + */ + @TableField("tripartite_order_id") + private String tripartiteOrderId; + + @Override protected Serializable pkVal() { return this.orderId; } - + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppPlaceOrderVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppPlaceOrderVo.java index ba4d80f..5db85b9 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppPlaceOrderVo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppPlaceOrderVo.java @@ -59,15 +59,16 @@ @ApiModelProperty(value = "package") @JsonProperty("package") private String packageStr; - + @ApiModelProperty(value = "签名方式") private String signType; - + @ApiModelProperty(value = "签名") private String paySign; - + @ApiModelProperty(value = "预支付回话标识") private String prepayId; - - + + @ApiModelProperty(value = "是否可抽奖(0=否,1=是)") + private Boolean lotteryDraw; } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerConsumerGoodsListVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerConsumerGoodsListVo.java index 27755d9..c54294d 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerConsumerGoodsListVo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerConsumerGoodsListVo.java @@ -24,31 +24,34 @@ @ApiModelProperty(value="商品类型1周期2服务3体验4单品") private Integer goodsType; - - @ApiModelProperty(value="商品名称") + + @ApiModelProperty(value = "商品名称") private String goodsName; - - @ApiModelProperty(value="商品标签") + + @ApiModelProperty(value = "商品标签") private String goodsTags; - + @ApiModelProperty(value = "商品简介") private String goodsIntroduction; - - @ApiModelProperty(value="商品图片") + + @ApiModelProperty(value = "商品图片") private String goodsPicture; - - @ApiModelProperty(value="商品调理问题") + + @ApiModelProperty(value = "商品调理问题") private String goodsNurses; - - @ApiModelProperty(value="周期标记") + + @ApiModelProperty(value = "周期标记") private Integer cycleNumFlag; - - @ApiModelProperty(value="服务次数") + + @ApiModelProperty(value = "服务次数") private Integer serviceNum; - - @ApiModelProperty(value="消耗次数") + + @ApiModelProperty(value = "消耗次数") private Integer usedNum; - - @ApiModelProperty(value="待确认次数") + + @ApiModelProperty(value = "待确认次数") private Integer sureNum; + + @ApiModelProperty(value = "是否选中") + private Boolean optionFlag; } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerMemberOrderVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerMemberOrderVo.java index 5271477..63f1660 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerMemberOrderVo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerMemberOrderVo.java @@ -1,11 +1,13 @@ package com.ruoyi.order.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.system.api.domain.vo.MerCouponGoodsListVo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * @ClassName MerMemberOrderVo @@ -55,14 +57,17 @@ @ApiModelProperty(value="未收金额") private BigDecimal unPaidMoney; - - @ApiModelProperty(value="收款时间") + + @ApiModelProperty(value = "收款时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date receiveMoneyTime; - - @ApiModelProperty(value="收款金额") + + @ApiModelProperty(value = "收款金额") private BigDecimal thisReceiveMoney; - - @ApiModelProperty(value="收款方式") + + @ApiModelProperty(value = "收款方式") private String thisReceiveType; + + @ApiModelProperty(value = "商品信息") + private List<MerCouponGoodsListVo> goodsList; } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyAwardVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyAwardVo.java index ac68377..199316f 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyAwardVo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyAwardVo.java @@ -31,7 +31,7 @@ @ApiModelProperty(value = "奖品来源") private String giftFrom; - @ApiModelProperty(value = "礼物类型1优惠券2商品3现金4实物") + @ApiModelProperty(value = "礼物类型1优惠券2商品3现金4实物5积分") private Integer giftType; @ApiModelProperty(value = "奖品名称") diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java index 7217d93..06adc1b 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerVerifyOrderVo.java @@ -27,7 +27,7 @@ @ApiModelProperty(value = "订单状态0.已取消1.待支付2.待核销3.已完成") private Integer orderStatus; - @ApiModelProperty(value="订单来源1.商城2.秒杀活动3.线下创建") + @ApiModelProperty(value = "订单来源1.商城2.秒杀活动3.线下创建4.抽奖5.美团6.抖音7.快手") private Integer orderFrom; @ApiModelProperty(value = "商品总价") @@ -73,25 +73,28 @@ @ApiModelProperty(value = "用户姓名") private String userName; - + @ApiModelProperty(value = "用户电话") private String userMobile; - - @ApiModelProperty(value="实收金额") + + @ApiModelProperty(value = "实收金额") private BigDecimal realReceiveMoney; - - @ApiModelProperty(value="已收金额") + + @ApiModelProperty(value = "已收金额") private BigDecimal receiveMoney; - - @ApiModelProperty(value="未收金额") + + @ApiModelProperty(value = "未收金额") private BigDecimal unReceiveMoney; - - @ApiModelProperty(value="支付方式1.全款2订金") + + @ApiModelProperty(value = "支付方式1.全款2订金") private Integer payType; - - @ApiModelProperty(value="结清标记0否1是") + + @ApiModelProperty(value = "结清标记0否1是") private Integer closeFlag; + + @ApiModelProperty(value = "剩余可核销次数") + private Integer laveTime; } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ConsumerGoodsServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ConsumerGoodsServiceImpl.java index 59dfddd..b5a1724 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ConsumerGoodsServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/ConsumerGoodsServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.order.service.impl.order; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.R; @@ -87,20 +88,29 @@ public List<AppConsumerPageVo> pageUserConsumerGoods(Page page, AppConsumerPageDto appConsumerPageDto){ return consumerGoodsMapper.pageUserConsumerGoods(page, appConsumerPageDto); } - + /** * 获取会员服务商品 + * * @param merConsumerGoodsDto * @return */ @Override - public MerConsumerGoodsVo listMerConsumerGoods(MerConsumerGoodsDto merConsumerGoodsDto){ + public MerConsumerGoodsVo listMerConsumerGoods(MerConsumerGoodsDto merConsumerGoodsDto) { MerConsumerGoodsVo merConsumerGoodsVo = new MerConsumerGoodsVo(); - if(merConsumerGoodsDto.getGoodsType()==1){ + if (merConsumerGoodsDto.getGoodsType() == 1) { List<MerConsumerGoodsListVo> noSureList = consumerGoodsMapper.listMerNoSureConsumerGoods(merConsumerGoodsDto); merConsumerGoodsVo.setNoSureList(noSureList); } List<MerConsumerGoodsListVo> sureList = consumerGoodsMapper.listMerConsumerGoods(merConsumerGoodsDto); + Member member = remoteMemberService.getMember(merConsumerGoodsDto.getUserId()).getData(); + String lastServiceId = member.getLastServiceId(); + if (StringUtils.isNotEmpty(lastServiceId)) { + List<String> list = JSON.parseArray(lastServiceId, String.class); + sureList.forEach(s -> { + s.setOptionFlag(list.contains(s.getConsumerGoodsId())); + }); + } merConsumerGoodsVo.setSureList(sureList); return merConsumerGoodsVo; } @@ -174,13 +184,13 @@ } } //判断商品确认次数 - if(sureNum>oldConsumerGoods.getSureNum()){ + if (sureNum > oldConsumerGoods.getSureNum()) { throw new ServiceException(AppErrorConstant.GOODS_SURE_FAILED); - }else{ + } else { int surpNum = oldConsumerGoods.getSureNum(); surpNum = surpNum - sureNum; oldConsumerGoods.setSureNum(surpNum); - if(surpNum==0){ + if (surpNum == 0) { oldConsumerGoods.setDelFlag(1); } this.saveOrUpdate(oldConsumerGoods); @@ -304,20 +314,26 @@ serviceRecord.setConsumerGoodsNames(goodsNames); userServiceRecordService.saveOrUpdate(serviceRecord); //服务记录详情 - for(ServiceRecordDetail serviceRecordDetail1 : serviceRecordDetailList){ + for (ServiceRecordDetail serviceRecordDetail1 : serviceRecordDetailList) { serviceRecordDetail1.setRecordId(serviceRecord.getId()); } serviceRecordDetailService.saveBatch(serviceRecordDetailList); + + //保存本次确认的服务商品id,用于下次进入页面后默认勾选上 + List<String> collect = goodsList.stream().map(MerSureConsumerGoodsListDto::getConsumerGoodsId).collect(Collectors.toList()); + Member member = remoteMemberService.getMember(merSureConsumerGoodsDto.getUserId()).getData(); + member.setLastServiceId(JSON.toJSONString(collect)); + remoteMemberService.editMember(member); + //更新商户和会员服务统计 MemberTotalChangeDto memberTotalChange = new MemberTotalChangeDto(); memberTotalChange.setUserId(merSureConsumerGoodsDto.getMemberUserId()); memberTotalChange.setTypeService(2); memberTotalChange.setServiceCount(serviceCount); remoteMemberService.changeMemberTotal(memberTotalChange); - if(!sendData.isEmpty()){ - Member member = remoteMemberService.getMember(userId).getData(); + if (!sendData.isEmpty()) { R<Shop> r = remoteShopService.getShop(shopId); - if(r.getCode() != 200){ + if (r.getCode() != 200) { throw new ServiceException(r.getMsg()); } Shop shop = r.getData(); @@ -327,11 +343,10 @@ Integer number = Integer.valueOf(sendDatum.get("number").toString()); String msg = "{\"name\":\"" + (StringUtils.isEmpty(member.getRealName()) ? member.getNickName() : member.getRealName()) + "\"," + "\"store\":\"" + shop.getShopName() + "\",\"product\":\"" + product + "\"}"; - if(number == 2){ - MsgUtils.sendMsg(member.getMobile(),"SMS_464376210",msg); - } - if(number == 0){ - MsgUtils.sendMsg(member.getMobile(),"SMS_464321234",msg); + if (number == 0) { + MsgUtils.sendMsg(member.getMobile(), "SMS_464321234", msg); + } else { + MsgUtils.sendMsg(member.getMobile(), "SMS_464376210", msg); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java index 2d4ade6..4640431 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.douyin.openapi.client.models.*; import com.github.binarywang.wxpay.bean.ecommerce.*; import com.github.binarywang.wxpay.bean.ecommerce.enums.TradeTypeEnum; import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingNotifyResult; @@ -17,7 +18,6 @@ import com.google.common.collect.Lists; import com.google.gson.Gson; import com.ruoyi.common.core.constant.CacheConstants; -import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.enums.UserStatus; import com.ruoyi.common.core.exception.ServiceException; @@ -29,6 +29,8 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.CodeFactoryUtil; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.goods.api.domain.LotteryEvent; +import com.ruoyi.goods.api.service.LotteryEventClient; import com.ruoyi.order.config.WxPayConfiguration; import com.ruoyi.order.domain.dto.*; import com.ruoyi.order.domain.pojo.account.OrderPayment; @@ -48,6 +50,8 @@ import com.ruoyi.order.service.account.ProfitSharingService; import com.ruoyi.order.service.order.*; import com.ruoyi.order.util.HuiFuTianXiaUtil; +import com.ruoyi.order.util.douyin.OrderUtil; +import com.ruoyi.order.util.douyin.VerifyUtil; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.constant.DelayTaskEnum; import com.ruoyi.system.api.constant.SecurityConstant; @@ -72,7 +76,6 @@ import lombok.extern.log4j.Log4j2; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -80,7 +83,6 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; -import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -154,18 +156,20 @@ @Resource private OrderPaymentService orderPaymentService; - + @Resource private ProfitSharingService profitSharingService; - + @Resource private OrderRefundService orderRefundService; - + @Value("${wx.pay.callbackPath}") private String callbackPath; - - + @Resource + private LotteryEventClient lotteryEventClient; + + /** * @description: buyGoods * @param: appSureOrderDto @@ -180,6 +184,7 @@ if(shop!=null&&shop.getShopStatus()!=1){ throw new ServiceException(AppErrorConstant.SHOP_CLOSED); } + Shop belongShop = remoteShopService.getShop(shop.getBelongShopId()).getData(); // 初始化订单对象 AppSureOrderVo appSureOrderVo = new AppSureOrderVo(); // 初始化订单商品列表 @@ -265,6 +270,14 @@ ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); if (shopGoods != null) { goodsPrice = shopGoods.getSalesPrice(); + } else { + //经销商定制价格 + appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); + appShopGoodsGetDto.setShopId(belongShop.getShopId()); + shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); + if (1 == belongShop.getModifyPricePermission() && null != shopGoods) { + goodsPrice = shopGoods.getSalesPrice(); + } } appSureOrderGoodsVo.setGoodsPrice(goodsPrice); buyNumBig = BigDecimal.valueOf(buyNum); @@ -448,6 +461,16 @@ ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); if (shopGoods != null) { goodsPrice = shopGoods.getSalesPrice(); + } else { + //经销商定制价格 + Shop belongShop = remoteShopService.getShop(shop.getBelongShopId()).getData(); + appShopGoodsGetDto = new AppShopGoodsGetDto(); + appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); + appShopGoodsGetDto.setShopId(belongShop.getShopId()); + shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); + if (1 == belongShop.getModifyPricePermission() && null != shopGoods) { + goodsPrice = shopGoods.getSalesPrice(); + } } appPanicBuyVo.setGoodsPrice(goodsPrice); buyNumBig = BigDecimal.valueOf(buyNum); @@ -587,6 +610,18 @@ if (shopGoods != null) { goodsPrice = shopGoods.getSalesPrice(); serviceNum = shopGoods.getServiceNum(); + } else { + //经销商定制价格 + Shop shop = remoteShopService.getShop(appPlaceOrderDto.getShopId()).getData(); + Shop belongShop = remoteShopService.getShop(shop.getBelongShopId()).getData(); + appShopGoodsGetDto = new AppShopGoodsGetDto(); + appShopGoodsGetDto.setGoodsId(goods.getGoodsId()); + appShopGoodsGetDto.setShopId(belongShop.getShopId()); + shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData(); + if (1 == belongShop.getModifyPricePermission() && null != shopGoods) { + goodsPrice = shopGoods.getSalesPrice(); + serviceNum = shopGoods.getServiceNum(); + } } appSureOrderGoodsVo.setGoodsPrice(goodsPrice); // 计算商品总价 @@ -1544,6 +1579,13 @@ appPlaceOrderVo.setPaySign(payArr[5]); appPlaceOrderVo.setPrepayId(orderPayment.getPrepayId()); // 返回AppPlaceOrderVo对象 + List<LotteryEvent> data = lotteryEventClient.getLotteryEventList(2).getData(); + if (data.size() > 0) { + long count = data.stream().filter(s -> s.getPayMoney().compareTo(order.getPayMoney()) >= 0).count(); + appPlaceOrderVo.setLotteryDraw(count > 0); + } else { + appPlaceOrderVo.setLotteryDraw(false); + } return appPlaceOrderVo; } @@ -1770,12 +1812,12 @@ merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); merVerifyOrderVo.setPayType(order.getPayType()); merVerifyOrderVo.setRealReceiveMoney(order.getChangeReceivableMoney()); - if(order.getPayType()==1){ + if (order.getPayType() == 1) { merVerifyOrderVo.setReceiveMoney(order.getPayMoney()); - }else{ - if(order.getOfflinePayMoney()!=null){ + } else { + if (order.getOfflinePayMoney() != null) { merVerifyOrderVo.setReceiveMoney(order.getOfflinePayMoney()); - }else{ + } else { merVerifyOrderVo.setReceiveMoney(BigDecimal.ZERO); } } @@ -1787,7 +1829,41 @@ // 返回结果 return merVerifyOrderVo; } - + + + @Override + public MerVerifyOrderVo verifyOrderDouYin(String orderId, Long shopId) { + CertificatePrepareResponseData data = VerifyUtil.certificatePrepare(orderId); + if (null == data) { + throw new ServiceException("查询券信息失败"); + } + List<CertificatePrepareResponseDataCertificatesItem> itemList = data.getCertificates(); + if (null == itemList || itemList.isEmpty()) { + throw new ServiceException("查询券信息失败"); + } + CertificatePrepareResponseDataCertificatesItem certificatesItem = itemList.get(0); + //商品信息 + CertificatePrepareResponseDataCertificatesItemSku sku = certificatesItem.getSku(); + //次卡信息 + CertificatePrepareResponseDataCertificatesItemTimeCard timeCard = certificatesItem.getTimeCard(); + //券的状态 + Number status = certificatesItem.getStatus(); + // 创建返回对象 + MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo(); + // 设置返回对象的属性值 + merVerifyOrderVo.setOrderId(orderId); + merVerifyOrderVo.setOrderFrom(6); + merVerifyOrderVo.setOrderStatus(status.intValue() == 1 ? 2 : 3); + List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = new ArrayList<>(); + AppUserOrderGoodsPageVo orderGoodsPageVo = new AppUserOrderGoodsPageVo(); + orderGoodsPageVo.setGoodsName(sku.getTitle()); + appUserOrderGoodsPageVoList.add(orderGoodsPageVo); + merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); + merVerifyOrderVo.setLaveTime(timeCard.getTimesCount() - timeCard.getTimesUsed()); + // 返回结果 + return merVerifyOrderVo; + } + /** * 确认核销订单 * @@ -2029,17 +2105,222 @@ remoteMemberService.changeMemberTotal(memberTotalChangeDto); return merVerifyOrderVo; } - + + /** - * @description 分账实现 - * @author jqs - * @date 2023/9/8 11:56 + * 核销抖音券 + * + * @return + */ + @Override + @Transactional + @GlobalTransactional(rollbackFor = Exception.class) + public MerVerifyOrderVo sureVerifyOrderDouYin(MerVerifyOrderDto merVerifyOrderDto) { + String phone = merVerifyOrderDto.getPhone(); + String orderId = merVerifyOrderDto.getOrderId(); + Long shopId = merVerifyOrderDto.getShopId(); + //获取核销商户 + Shop shop = remoteShopService.getShop(shopId).getData(); + CertificatePrepareResponseData data = VerifyUtil.certificatePrepare(orderId); + if (null == data) { + throw new ServiceException("查询券信息失败"); + } + List<CertificatePrepareResponseDataCertificatesItem> itemList = data.getCertificates(); + if (null == itemList || itemList.isEmpty()) { + throw new ServiceException("查询券信息失败"); + } + CertificatePrepareResponseDataCertificatesItem certificatesItem = itemList.get(0); + Number status = certificatesItem.getStatus(); + if (status.intValue() == 2) { + throw new ServiceException("该抖音券不能重复核销"); + } + if (status.intValue() != 1) { + throw new ServiceException("抖音券核销失败"); + } + String encryptedCode = certificatesItem.getEncryptedCode(); + List<CertificateVerifyResponseDataVerifyResultsItem> items = VerifyUtil.certificateVerify(data.getVerifyToken(), shop.getPoiId(), new ArrayList<String>() {{ + add(encryptedCode); + }}); + if (null == items || items.isEmpty()) { + throw new ServiceException("抖音券核销失败"); + } + Order one = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getTripartiteOrderId, data.getOrderId())); + if (null != one) { + throw new ServiceException("该抖音券不能重复核销"); + } + + TradeOrderQueryResponseData tradeOrderQueryResponseData = OrderUtil.queryOrderList(1, 10, data.getOrderId()); + //原始金额 + BigDecimal originAmount = BigDecimal.ZERO; + //支付金额 + BigDecimal payAmount = BigDecimal.ZERO; + //优惠金额 + BigDecimal payDiscountAmount = BigDecimal.ZERO; + if (null != tradeOrderQueryResponseData) { + TradeOrderQueryResponseDataOrdersItem ordersItem = tradeOrderQueryResponseData.getOrders().get(0); + TradeOrderQueryResponseDataOrdersItemAmountInfo amountInfo = ordersItem.getAmountInfo(); + originAmount = BigDecimal.valueOf(amountInfo.getOriginAmount()).divide(new BigDecimal(100)); + payAmount = BigDecimal.valueOf(amountInfo.getPayAmount()).divide(new BigDecimal(100)); + payDiscountAmount = BigDecimal.valueOf(amountInfo.getPayDiscountAmount()).divide(new BigDecimal(100)); + } + + Date nowTime = new Date(); + Member member = remoteMemberService.getMemberByMobile(phone).getData(); + //开始添加订单数据 + Order order = new Order(); + order.setOrderId(IdUtils.fastSimpleUUID()); + order.setDelFlag(0); + order.setOrderStatus(3); + order.setOrderNo(CodeFactoryUtil.getShopOrderNo()); + order.setOrderFrom(6); + order.setShopId(shopId); + order.setUserId(member.getUserId()); + order.setOrderMoney(originAmount); + order.setDiscountMoney(payDiscountAmount); + order.setReceivableMoney(payAmount); + order.setPayType(1); + order.setPayMoney(payAmount); + order.setOnlinePayMoney(payAmount); + order.setOrderRemark("抖音订单"); + order.setCreateTime(nowTime); + order.setPayTime(nowTime); + order.setTripartiteOrderId(data.getOrderId()); + + //绑定用户判断核销商户 + if (member.getBindingFlag() == 1) { + if (!member.getRelationShopId().equals(shopId)) { + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + } + order.setUseTime(nowTime); + order.setUseUserId(merVerifyOrderDto.getUserId()); + order.setCloseFlag(1); + this.save(order); + //创建服务商品 + //获取商品信息(商品简介,调理问题) + //商品信息 + CertificatePrepareResponseDataCertificatesItemSku sku = certificatesItem.getSku(); + //次卡信息 + CertificatePrepareResponseDataCertificatesItemTimeCard timeCard = certificatesItem.getTimeCard(); + + OrderGoods orderGoods = new OrderGoods(); + orderGoods.setOrderGoodsId(IdUtils.simpleUUID()); + orderGoods.setDelFlag(0); + orderGoods.setOrderId(order.getOrderId()); + orderGoods.setBuyNum(timeCard.getTimesCount()); + orderGoods.setCycleNumFlag(1); + orderGoods.setServiceNum(timeCard.getTimesCount()); + orderGoods.setGoodsType(2); + orderGoods.setGoodsName(sku.getTitle()); + orderGoodsService.save(orderGoods); + + ConsumerGoods consumerGoods = new ConsumerGoods(); + consumerGoods.setConsumerGoodsId(IdUtils.simpleUUID()); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(orderGoods.getOrderGoodsId()); + consumerGoods.setGoodsName(sku.getTitle()); + consumerGoods.setCycleNumFlag(1); + consumerGoods.setServiceNum(timeCard.getTimesCount()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsType(2); + consumerGoods.setSourceFrom(1); + consumerGoodsService.save(consumerGoods); + //生成返回 + MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo(); + merVerifyOrderVo.setOrderId(orderId); + merVerifyOrderVo.setOrderNo(order.getOrderNo()); + merVerifyOrderVo.setOrderStatus(order.getOrderStatus()); + merVerifyOrderVo.setOrderFrom(order.getOrderFrom()); + merVerifyOrderVo.setOrderGoodsMoney(order.getOrderMoney()); + merVerifyOrderVo.setCouponDiscount(order.getCouponMoney()); + merVerifyOrderVo.setReceivableDeposit(order.getReceivableDeposit()); + merVerifyOrderVo.setPayMoney(order.getPayMoney()); + merVerifyOrderVo.setOrderRemark(order.getOrderRemark()); + merVerifyOrderVo.setAppUserOrderGoodsPageVoList(new ArrayList<AppUserOrderGoodsPageVo>() {{ + add(new AppUserOrderGoodsPageVo() {{ + setOrderGoodsId(orderGoods.getOrderGoodsId()); + setGoodsName(orderGoods.getGoodsName()); + setGoodsType(orderGoods.getGoodsType()); + setBuyNum(orderGoods.getBuyNum()); + }}); + }}); + merVerifyOrderVo.setCreateTime(order.getCreateTime()); + merVerifyOrderVo.setPayTime(order.getPayTime()); + merVerifyOrderVo.setUseTime(order.getUseTime()); + merVerifyOrderVo.setPayType(order.getPayType()); + merVerifyOrderVo.setRealReceiveMoney(order.getChangeReceivableMoney()); + //根据支付方式返回应收金额和已收金额 + if (order.getPayType() == 1) { + merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getPayMoney())); + merVerifyOrderVo.setReceiveMoney(order.getPayMoney()); + } else { + merVerifyOrderVo.setReceivableMoney(order.getOrderMoney().subtract(order.getCouponMoney()).subtract(order.getReceivableDeposit())); + if (order.getOfflinePayMoney() != null) { + merVerifyOrderVo.setReceiveMoney(order.getOfflinePayMoney()); + } else { + merVerifyOrderVo.setReceiveMoney(BigDecimal.ZERO); + } + } + merVerifyOrderVo.setUnReceiveMoney(merVerifyOrderVo.getRealReceiveMoney().subtract(merVerifyOrderVo.getReceiveMoney())); + merVerifyOrderVo.setUserId(order.getUserId()); + merVerifyOrderVo.setUserName(member.getRealName()); + merVerifyOrderVo.setUserMobile(member.getMobile()); + merVerifyOrderVo.setCloseFlag(order.getCloseFlag()); + //判断用户是否绑定 2023-09-05需求改变核销时绑定用户 + if (member.getBindingFlag() != 1) { + //绑定商户 + AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto(); + appMemberBindingDto.setShopId(order.getShopId()); + appMemberBindingDto.setUserId(order.getUserId()); + appMemberBindingDto.setBindingFlag(1); + if (order.getOrderFrom() == 1) { + appMemberBindingDto.setBindingType(1); + } else if (order.getOrderFrom() == 2) { + appMemberBindingDto.setBindingType(2); + } + remoteMemberService.updateMemberBinding(appMemberBindingDto); + order.setNewMemberFlag(1); + } else { + order.setNewMemberFlag(0); + } + this.saveOrUpdate(order); + //更新用户积分和消费统计 + MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto(); + memberTotalChangeDto.setUserId(order.getUserId()); + // 如果存在积分兑换比例,则计算积分 + if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) { + Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL); + BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue); + BigDecimal integralBig = moneyValueBig.multiply(order.getOnlinePayMoney()).setScale(0, BigDecimal.ROUND_HALF_UP); + Integer integral = Integer.valueOf(integralBig.toString()); + if (integral > 0) { + memberTotalChangeDto.setChangeIntegral(integral); + memberTotalChangeDto.setTypeIntegral(1); + memberTotalChangeDto.setOrderId(orderId); + memberTotalChangeDto.setOrderNo(order.getOrderNo()); + } + } + //更新消费时间 + memberTotalChangeDto.setConsumeTime(nowTime); + remoteMemberService.changeMemberTotal(memberTotalChangeDto); + return merVerifyOrderVo; + } + + + /** * @param orderId * @param orderNo * @param shopId * @param orderMoney * @param orderFrom - * @return void + * @return void + * @description 分账实现 + * @author jqs + * @date 2023/9/8 11:56 */ private void submitProfitSharing(String orderId, String orderNo, Long shopId, BigDecimal orderMoney, Integer orderFrom) { String sendMessage = ""; @@ -2405,20 +2686,20 @@ Long shopId = shopRelUserVo.getShopId(); Shop shop = remoteShopService.getShop(shopId).getData(); //平台奖品判断 - if (memberGiftRecord.getGiftFrom() == 1) { + if (memberGiftRecord.getGiftFrom() == 1 && memberGiftRecord.getPrizeFrom() == 1) { BirthdayCard birthdayCard = remoteMemberService.getBirthdayCard().getData(); //判断生日活动状态 - if(birthdayCard!=null&&birthdayCard.getCardStatus()==1){ + if (birthdayCard != null && birthdayCard.getCardStatus() == 1) { shop = remoteShopService.getShop(shopId).getData(); //判断指定区域全部店铺 - if(birthdayCard.getAreaFlag()==2&&birthdayCard.getShopFlag()==1&&!StringUtils.checkString(birthdayCard.getDesignatedArea(),shop.getShopCityCode())){ + if (birthdayCard.getAreaFlag() == 2 && birthdayCard.getShopFlag() == 1 && !StringUtils.checkString(birthdayCard.getDesignatedArea(), shop.getShopCityCode())) { throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); } //判断指定店铺 - if(birthdayCard.getShopFlag()==2&&!StringUtils.checkString(birthdayCard.getApplicableShop(),shopId.toString())){ + if (birthdayCard.getShopFlag() == 2 && !StringUtils.checkString(birthdayCard.getApplicableShop(), shopId.toString())) { throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); } - }else{ + } else { throw new ServiceException(AppErrorConstant.BIRTHDAY_CARD_ERROR); } } @@ -2427,29 +2708,35 @@ throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); } Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData(); - + merVerifyAwardVo.setUserName(member.getRealName()); merVerifyAwardVo.setUserMobile(member.getMobile()); - if (memberGiftRecord.getGiftFrom() == 1) { - merVerifyAwardVo.setGiftFrom("平台生日卡"); + if (memberGiftRecord.getPrizeFrom() == 1) { + if (memberGiftRecord.getGiftFrom() == 1) { + merVerifyAwardVo.setGiftFrom("平台生日卡"); + } else { + merVerifyAwardVo.setGiftFrom("商户生日卡"); + } } else { - merVerifyAwardVo.setGiftFrom("商户生日卡"); + merVerifyAwardVo.setGiftFrom("抽奖"); } merVerifyAwardVo.setGiftType(memberGiftRecord.getGiftType()); List<BirthdayGiftSendDto> giftSendDtoList = new ArrayList<>(); BirthdayGiftSendDto birthdayGiftSendDto = new BirthdayGiftSendDto(); switch (memberGiftRecord.getGiftType()) { case 1: - merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName()); - merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getCouponNumber())); - birthdayGiftSendDto.setUserId(memberGiftRecord.getUserId()); - birthdayGiftSendDto.setGiftType(memberGiftRecord.getGiftType()); - birthdayGiftSendDto.setGiftFrom(memberGiftRecord.getGiftFrom()); - birthdayGiftSendDto.setShopId(memberGiftRecord.getShopId()); - birthdayGiftSendDto.setCouponId(memberGiftRecord.getCouponId()); - birthdayGiftSendDto.setCouponNumber(memberGiftRecord.getCouponNumber()); - giftSendDtoList.add(birthdayGiftSendDto); - remoteCouponService.sendCouponGift(giftSendDtoList); + if (memberGiftRecord.getPrizeFrom() == 1) { + merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName()); + merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getCouponNumber())); + birthdayGiftSendDto.setUserId(memberGiftRecord.getUserId()); + birthdayGiftSendDto.setGiftType(memberGiftRecord.getGiftType()); + birthdayGiftSendDto.setGiftFrom(memberGiftRecord.getGiftFrom()); + birthdayGiftSendDto.setShopId(memberGiftRecord.getShopId()); + birthdayGiftSendDto.setCouponId(memberGiftRecord.getCouponId()); + birthdayGiftSendDto.setCouponNumber(memberGiftRecord.getCouponNumber()); + giftSendDtoList.add(birthdayGiftSendDto); + remoteCouponService.sendCouponGift(giftSendDtoList); + } break; case 2: Goods goods = remoteGoodsService.getGoods(memberGiftRecord.getGoodsId()).getData(); @@ -2472,10 +2759,16 @@ birthdayGiftSendDto.setGoodsNumber(memberGiftRecord.getGoodsNumber()); giftSendDtoList.add(birthdayGiftSendDto); consumerGoodsService.sendGoodsGift(giftSendDtoList); + //抽奖奖品中的平台商品需要生成订单数据 + if (memberGiftRecord.getPrizeFrom() == 2) { + addOrder(memberGiftRecord.getShopId(), memberGiftRecord.getUserId(), goods, memberGiftRecord.getGoodsNumber(), memberGiftRecord.getGiftId()); + } break; case 3: - merVerifyAwardVo.setGiftName("现金"); - merVerifyAwardVo.setGiftNumber(memberGiftRecord.getMoney().doubleValue()); + if (memberGiftRecord.getPrizeFrom() == 1) { + merVerifyAwardVo.setGiftName("现金"); + merVerifyAwardVo.setGiftNumber(memberGiftRecord.getMoney().doubleValue()); + } break; case 4: merVerifyAwardVo.setGiftName(memberGiftRecord.getGiftName()); @@ -2503,8 +2796,65 @@ merVerifyAwardVo.setVerifyStatus(2); return merVerifyAwardVo; } - - + + + /** + * 核销抽奖的平台商品生成订单 + * + * @param shopId + * @param userId + * @param goods + * @param goodsNum + */ + public void addOrder(Long shopId, Long userId, Goods goods, Integer goodsNum, String giftId) { + Order order = new Order(); + order.setOrderId(IdUtils.simpleUUID()); + order.setDelFlag(0); + order.setOrderStatus(3); + order.setOrderNo(CodeFactoryUtil.getShopOrderNo()); + order.setOrderFrom(4); + order.setShopId(shopId); + order.setUserId(userId); + order.setOrderMoney(BigDecimal.ZERO); + order.setCouponMoney(BigDecimal.ZERO); + order.setDiscountMoney(BigDecimal.ZERO); + order.setReceivableMoney(BigDecimal.ZERO); + order.setPayType(1); + order.setPayMoney(BigDecimal.ZERO); + order.setOrderRemark("抽奖订单"); + order.setCreateTime(new Date()); + order.setPayTime(new Date()); + order.setUseTime(new Date()); + order.setUseUserId(userId); + order.setGoodsNum(goodsNum); + order.setReceivableDeposit(BigDecimal.ZERO); + order.setCloseFlag(1); + order.setActivityId(giftId); + this.save(order); + OrderGoods orderGoods = new OrderGoods(); + orderGoods.setOrderGoodsId(IdUtils.simpleUUID()); + orderGoods.setDelFlag(0); + orderGoods.setOrderId(order.getOrderId()); + orderGoods.setGoodsId(goods.getGoodsId()); + orderGoods.setBuyNum(goodsNum); + orderGoods.setGoodsPrice(goods.getSalesPrice()); + orderGoods.setGoodsDeposit(goods.getSubscription()); + orderGoods.setGoodsTotalMoney(goods.getSalesPrice().multiply(new BigDecimal(goodsNum))); + orderGoods.setGoodsReceivableMoney(BigDecimal.ZERO); + orderGoods.setCycleNumFlag(goods.getCycleNumFlag()); + orderGoods.setServiceNum(goods.getServiceNum()); + orderGoods.setGoodsType(goods.getGoodsType()); + orderGoods.setGoodsName(goods.getGoodsName()); + GoodsFile goodsFile = remoteGoodsService.getGoodsFile(goods.getGoodsId()).getData(); + if (null != goodsFile) { + orderGoods.setGoodsPicture(goodsFile.getFileUrl()); + } + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + orderGoods.setGoodsTag(goods.getGoodsTags()); + orderGoodsService.save(orderGoods); + } + + /** * 收银未结清订单列表 * @@ -2521,14 +2871,14 @@ if (merMemberNoClearOrderVo.getUnPaidMoney() == null) { merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); } - if(merMemberNoClearOrderVo.getUnPaidMoney().compareTo(zeroBig)<0){ + if (merMemberNoClearOrderVo.getUnPaidMoney().compareTo(zeroBig) < 0) { merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); } } } return merMemberNoClearOrderVoList; } - + /** * 结清订单 * @@ -2670,8 +3020,12 @@ goodsRealPrice = goodsTotalPrice; //优惠券计算 if (memberCouponId != null) { - appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId); + log.info("使用优惠券:{}", memberCouponId); + appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId.toString()); + log.info("匹配的优惠券:{}", JSON.toJSONString(appMemberCouponVo)); if (null != appMemberCouponVo && (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId))) { + log.info("可以使用优惠券:{}", JSON.toJSONString(appMemberCouponVo)); + couponType = appMemberCouponVo.getCouponType(); couponType = appMemberCouponVo.getCouponType(); if (couponType == 1 && appMemberCouponVo.getMoneyThreshold() != null && appMemberCouponVo.getDiscountMoney() != null) { moneyThreshold = appMemberCouponVo.getMoneyThreshold(); @@ -2841,6 +3195,7 @@ consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList); //减去优惠券 if (StringUtils.isNotBlank(memberCouponSJ.toString())) { + log.info("修改优惠券使用状态:{}", JSON.toJSONString(memberCouponSJ)); remoteCouponService.useMemberCoupon(memberCouponSJ.toString()); } //更新会员消费记录 @@ -2950,9 +3305,27 @@ if (merMemberNoClearOrderVo.getUnPaidMoney() == null) { merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); } - if(merMemberNoClearOrderVo.getUnPaidMoney().compareTo(zeroBig)<0){ + if (merMemberNoClearOrderVo.getUnPaidMoney().compareTo(zeroBig) < 0) { merMemberNoClearOrderVo.setUnPaidMoney(zeroBig); } + List<MerCouponGoodsListVo> goodsList = new ArrayList<>(); + orderGoodsService.listByOrderId(merMemberNoClearOrderVo.getOrderId()).forEach(orderGoodsVo -> { + MerCouponGoodsListVo merCouponGoodsListVo = new MerCouponGoodsListVo(); + merCouponGoodsListVo.setGoodsId(orderGoodsVo.getGoodsId()); + merCouponGoodsListVo.setGoodsName(orderGoodsVo.getGoodsName()); + merCouponGoodsListVo.setGoodsNum(orderGoodsVo.getBuyNum()); + if (orderGoodsVo.getGoodsType() == 1) { + merCouponGoodsListVo.setGoodsType("周期"); + } else if (orderGoodsVo.getGoodsType() == 2) { + merCouponGoodsListVo.setGoodsType("服务"); + } else if (orderGoodsVo.getGoodsType() == 3) { + merCouponGoodsListVo.setGoodsType("体验"); + } else if (orderGoodsVo.getGoodsType() == 4) { + merCouponGoodsListVo.setGoodsType("单品"); + } + goodsList.add(merCouponGoodsListVo); + }); + merMemberNoClearOrderVo.setGoodsList(goodsList); } } return merMemberNoClearOrderVoList; @@ -4719,17 +5092,17 @@ if (memberGiftRecord.getGiftFrom() == 1) { BirthdayCard birthdayCard = remoteMemberService.getBirthdayCard().getData(); //判断生日活动状态 - if(birthdayCard!=null&&birthdayCard.getCardStatus()==1){ + if (birthdayCard != null && birthdayCard.getCardStatus() == 1) { shop = remoteShopService.getShop(shopId).getData(); //判断指定区域全部店铺 - if(birthdayCard.getAreaFlag()==2&&birthdayCard.getShopFlag()==1&&!StringUtils.checkString(birthdayCard.getDesignatedArea(),shop.getShopCityCode())){ + if (birthdayCard.getAreaFlag() == 2 && birthdayCard.getShopFlag() == 1 && !StringUtils.checkString(birthdayCard.getDesignatedArea(), shop.getShopCityCode())) { throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); } //判断指定店铺 - if(birthdayCard.getShopFlag()==2&&!StringUtils.checkString(birthdayCard.getApplicableShop(),shopId.toString())){ + if (birthdayCard.getShopFlag() == 2 && !StringUtils.checkString(birthdayCard.getApplicableShop(), shopId.toString())) { throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); } - }else{ + } else { throw new ServiceException(AppErrorConstant.BIRTHDAY_CARD_ERROR); } } @@ -4737,16 +5110,20 @@ if (memberGiftRecord.getGiftFrom() == 2 && !memberGiftRecord.getShopId().equals(shopId)) { throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); } - + merVerifyAwardVo.setUserName(member.getRealName()); merVerifyAwardVo.setUserMobile(member.getMobile()); - if (memberGiftRecord.getGiftFrom() == 1) { - merVerifyAwardVo.setGiftFrom("平台生日卡"); + if (1 == memberGiftRecord.getPrizeFrom()) { + if (memberGiftRecord.getGiftFrom() == 1) { + merVerifyAwardVo.setGiftFrom("平台生日卡"); + } else { + merVerifyAwardVo.setGiftFrom("商户生日卡"); + } } else { - merVerifyAwardVo.setGiftFrom("商户生日卡"); + merVerifyAwardVo.setGiftFrom("平台抽奖"); } merVerifyAwardVo.setGiftType(memberGiftRecord.getGiftType()); - //礼物类型1优惠券2商品3现金4实物 + //礼物类型1优惠券2商品3现金4实物5积分 switch (memberGiftRecord.getGiftType()) { case 1: merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName()); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java index 55c01d7..dac1e6e 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java @@ -7,7 +7,6 @@ import com.github.binarywang.wxpay.bean.ecommerce.RefundNotifyResult; import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingNotifyResult; import com.github.binarywang.wxpay.exception.WxPayException; -import com.ruoyi.order.domain.dto.MerVerifyPrizeDto; import com.ruoyi.order.domain.dto.*; import com.ruoyi.order.domain.pojo.order.Order; import com.ruoyi.order.domain.vo.*; @@ -105,36 +104,55 @@ * @return */ MerHomeShopTotalVo getMerHomeTotal(MerHomeShopTotalVo merHomeShopTotalVo); - + /** * 获取核销订单 + * * @param orderId * @return */ - MerVerifyOrderVo verifyOrder(String orderId,Long shopId); - + MerVerifyOrderVo verifyOrder(String orderId, Long shopId); + + /** + * 获取抖音的核销订单 + * + * @param orderId + * @param shopId + * @return + */ + MerVerifyOrderVo verifyOrderDouYin(String orderId, Long shopId); + /** * 确认核销订单 + * * @param merVerifyOrderDto * @return */ MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto); - + /** - * @description 确认核销优惠券 - * @author jqs - * @date 2023/6/28 11:26 + * 核销抖音券 + * + * @return + */ + MerVerifyOrderVo sureVerifyOrderDouYin(MerVerifyOrderDto merVerifyOrderDto); + + + /** * @param merVerifyCouponDto - * @return MerVerifyCouponVo + * @return MerVerifyCouponVo + * @description 确认核销优惠券 + * @author jqs + * @date 2023/6/28 11:26 */ MerVerifyCouponVo sureVerifyCoupon(MerVerifyCouponDto merVerifyCouponDto); - + /** - * @description 确认核销奖品 - * @author jqs - * @date 2023/7/9 9:54 * @param merVerifyPrizeDto - * @return MerVerifyAwardVo + * @return MerVerifyAwardVo + * @description 确认核销奖品 + * @author jqs + * @date 2023/7/9 9:54 */ MerVerifyAwardVo sureVerifyPrize(MerVerifyPrizeDto merVerifyPrizeDto); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/ClientTokenUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/ClientTokenUtil.java new file mode 100644 index 0000000..98618ef --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/ClientTokenUtil.java @@ -0,0 +1,70 @@ +package com.ruoyi.order.util.douyin; + +import com.aliyun.tea.TeaException; +import com.douyin.openapi.client.Client; +import com.douyin.openapi.client.models.OauthClientTokenRequest; +import com.douyin.openapi.client.models.OauthClientTokenResponse; +import com.douyin.openapi.client.models.OauthClientTokenResponseData; +import com.douyin.openapi.credential.models.Config; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +/** + * 抖音获取client_token工具类 + * @author zhibing.pu + * @Date 2025/6/11 18:46 + */ +@Slf4j +public class ClientTokenUtil { + + public static String token = ""; + + public static Long expiration_time = 0L; + + + /** + * 获取client_token + */ + public static void getClientToken() { + try { + Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret + Client client = new Client(config); + /* 构建请求参数,该代码示例中只给出部分参数,请用户根据需要自行构建参数值 + token: + 1.若用户自行维护token,将用户维护的token赋值给该参数即可 + 2.SDK包中有获取token的函数,请根据接口path在《OpenAPI SDK 总览》文档中查找获取token函数的名字 + 在使用过程中,请注意token互刷问题 + header: + sdk中默认填充content-type请求头,若不需要填充除content-type之外的请求头,删除该参数即可 + */ + OauthClientTokenRequest sdkRequest = new OauthClientTokenRequest(); + sdkRequest.setClientKey(DouyinConfig.CLIENT_KEY); + sdkRequest.setClientSecret(DouyinConfig.CLIENT_SECRET); + sdkRequest.setGrantType("client_credential"); + OauthClientTokenResponse sdkResponse = client.OauthClientToken(sdkRequest); + String message = sdkResponse.getMessage(); + if("success".equals(message)){ + OauthClientTokenResponseData data = sdkResponse.getData(); + if(data.getErrorCode() != 0){ + log.error("【抖音】获取client_token失败:{}", data.getDescription()); + throw new RuntimeException("【抖音】获取client_token失败:" + data.getDescription()); + } + token = data.getAccessToken(); + long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); + expiration_time = second + data.getExpiresIn() - 30; + }else{ + OauthClientTokenResponseData data = sdkResponse.getData(); + if(data.getErrorCode() != 0){ + log.error("【抖音】获取client_token失败:{}", data.getDescription()); + throw new RuntimeException("【抖音】获取client_token失败:" + data.getDescription()); + } + } + } catch (TeaException e) { + System.out.println(e.getMessage()); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DYWebHookController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DYWebHookController.java new file mode 100644 index 0000000..9a93645 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DYWebHookController.java @@ -0,0 +1,123 @@ +package com.ruoyi.order.util.douyin; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.order.util.douyin.model.OrderWebHook; +import com.ruoyi.order.util.douyin.model.WebHook; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.util.concurrent.TimeUnit; + + +/** + * @author zhibing.pu + * @Date 2025/6/11 19:36 + */ +@Slf4j +@RestController +@RequestMapping("/douyin") +public class DYWebHookController { + + @Resource + private RedisService redisService; + + + /** + * 抖音webhook + * @param request + * @param response + */ + @ResponseBody + @PostMapping("/webhook") + public void orderWebHook(HttpServletRequest request, HttpServletResponse response) { + // 获取消息中body + String str, wholeStr = ""; + try{ + BufferedReader br = request.getReader(); + while((str = br.readLine()) != null){ + wholeStr += str; + } + log.info("【抖音】webhook获取请求内容:{}", wholeStr); + } catch (Exception e){ + log.error("【抖音】webhook获取请求内容失败"); + return; + } + // 获取请求头中的加签信息 + String msgId = request.getHeader("Msg-Id"); + String signature = request.getHeader("X-Douyin-Signature"); + String data = DouyinConfig.CLIENT_SECRET + wholeStr; + String sign = DigestUtils.sha1Hex(data); + if(!sign.equals(signature)){ + log.error("【抖音】webhook验签失败"); + return; + } + if(redisService.hasKey(msgId)){ + return; + } + redisService.setCacheObject(msgId, "", 60L, TimeUnit.SECONDS); + WebHook webHook = JSON.parseObject(wholeStr, WebHook.class); + String event = webHook.getEvent(); + switch (event){ + // 验证 + case "verify_webhook": + verifyWebhook(webHook, response); + break; + //订单消息通知 + case "life_trade_order_notify": + lifeTradeOrderNotify(webHook, response); + break; + //券消息通知 + case "life_trade_certificate_notify": + break; + default: + break; + } + + } + + + /** + * 校验webhook + * @param webHook + * @param response + */ + public void verifyWebhook(WebHook webHook, HttpServletResponse response){ + JSONObject jsonObject = JSON.parseObject(webHook.getContent()); + //响应 + PrintWriter out = null; + try { + out = response.getWriter(); + out.print(jsonObject); + out.flush(); + out.close(); + }catch (Exception e){ + e.printStackTrace(); + }finally { + if(null != out){ + out.close(); + } + } + } + + + /** + * 生活服务订单webhook + * @param webHook + * @param response + */ + public void lifeTradeOrderNotify(WebHook webHook, HttpServletResponse response){ + OrderWebHook orderWebHook = JSON.parseObject(webHook.getContent(), OrderWebHook.class); + + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java new file mode 100644 index 0000000..d5c136c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/DouyinConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.order.util.douyin; + +/** + * 抖音配置文件 + * @author zhibing.pu + * @Date 2025/6/11 18:41 + */ +public interface DouyinConfig { + + String APP_ID = "awhqgkio6uhnx28e"; + /** + * 应用唯一标识 + */ + String CLIENT_KEY = "awhqgkio6uhnx28e"; + /** + * 应用的密钥 + */ + String CLIENT_SECRET = "fbe8067d93660d6468d6c408ab2a7c46"; + /** + * 来客商户根账户ID + */ + String ACCOUNT_ID = "7215050221296814140"; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java new file mode 100644 index 0000000..59f295e --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/OrderUtil.java @@ -0,0 +1,63 @@ +package com.ruoyi.order.util.douyin; + +import com.douyin.openapi.client.Client; +import com.douyin.openapi.client.models.TradeOrderQueryRequest; +import com.douyin.openapi.client.models.TradeOrderQueryResponse; +import com.douyin.openapi.client.models.TradeOrderQueryResponseData; +import com.douyin.openapi.client.models.TradeOrderQueryResponseExtra; +import com.douyin.openapi.credential.models.Config; +import com.ruoyi.common.core.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +/** + * 抖音订单工具类 + * @author zhibing.pu + * @Date 2025/6/11 18:58 + */ +@Slf4j +public class OrderUtil { + + + /** + * 查询订单列表 + * + * @param page + * @param pageSize + * @return + */ + public static TradeOrderQueryResponseData queryOrderList(Integer page, Integer pageSize, String order_id) { + //判断token是否过期 + long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); + if (ClientTokenUtil.expiration_time < now) { + ClientTokenUtil.getClientToken(); + } + try { + Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret + Client client = new Client(config); + TradeOrderQueryRequest queryRequest = new TradeOrderQueryRequest(); + queryRequest.setAccessToken(ClientTokenUtil.token); + queryRequest.setAccountId(DouyinConfig.ACCOUNT_ID); + queryRequest.setPageNum(page); + queryRequest.setPageSize(pageSize); + if (StringUtils.isNotEmpty(order_id)) { + queryRequest.setOrderId(order_id); + } + TradeOrderQueryResponse tradeOrderQueryResponse = client.TradeOrderQuery(queryRequest); + TradeOrderQueryResponseExtra extra = tradeOrderQueryResponse.getExtra(); + Integer errorCode = extra.getErrorCode(); + if (0 != errorCode) { + log.error("【抖音】查询订单失败:" + extra.getDescription()); + return null; + } + return tradeOrderQueryResponse.getData(); + }catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java new file mode 100644 index 0000000..d051b03 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/VerifyUtil.java @@ -0,0 +1,102 @@ +package com.ruoyi.order.util.douyin; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.douyin.openapi.client.Client; +import com.douyin.openapi.client.models.*; +import com.douyin.openapi.credential.models.Config; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.List; /** + * @author zhibing.pu + * @Date 2025/6/16 10:28 + */ +@Slf4j +public class VerifyUtil { + + + /** + * 验券准备 + * @param code 短链地址 + * @return + */ + public static CertificatePrepareResponseData certificatePrepare(String code){ + //判断token是否过期 + long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); + if(ClientTokenUtil.expiration_time < now){ + ClientTokenUtil.getClientToken(); + } + try { + //用户短链地址获取长链地址,获取encryptedData参数 + HttpRequest get = HttpUtil.createGet(code); + HttpResponse execute = get.execute(); + int status = execute.getStatus(); + String encryptedData = ""; + if(302 == status){ + String location = execute.header("Location"); + location = location.substring(location.indexOf("object_id=") + 1); + location = location.substring(0, location.indexOf("&")); + encryptedData = location; + } + + Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret + Client client = new Client(config); + CertificatePrepareRequest request = new CertificatePrepareRequest(); + request.setAccessToken(ClientTokenUtil.token); + request.setEncryptedData(encryptedData); + CertificatePrepareResponse response = client.CertificatePrepare(request); + CertificatePrepareResponseExtra extra = response.getExtra(); + Integer errorCode = extra.getErrorCode(); + if(0 != errorCode){ + log.error("【抖音】验券准备失败"); + return null; + } + return response.getData(); + }catch (Exception e) { + log.error("【抖音】验券准备失败"); + e.printStackTrace(); + } + return null; + } + + + /** + * 验券 + * @param poiId 抖音门店id + * @param encryptedCodes 加密券码 + * @return + */ + public static List<CertificateVerifyResponseDataVerifyResultsItem> certificateVerify(String verify_token, String poiId, List<String> encryptedCodes){ + //判断token是否过期 + long now = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); + if(ClientTokenUtil.expiration_time < now){ + ClientTokenUtil.getClientToken(); + } + try { + Config config = new Config().setClientKey(DouyinConfig.CLIENT_KEY).setClientSecret(DouyinConfig.CLIENT_SECRET); // 改成自己的app_id跟secret + Client client = new Client(config); + CertificateVerifyRequest request = new CertificateVerifyRequest(); + request.setAccessToken(ClientTokenUtil.token); + request.setVerifyToken(verify_token); + request.setPoiId(poiId); + request.setEncryptedCodes(encryptedCodes); + CertificateVerifyResponse response = client.CertificateVerify(request); + CertificateVerifyResponseExtra extra = response.getExtra(); + Integer errorCode = extra.getErrorCode(); + if(0 != errorCode){ + log.error("【抖音】验券失败"); + return null; + } + CertificateVerifyResponseData data = response.getData(); + List<CertificateVerifyResponseDataVerifyResultsItem> verifyResults = data.getVerifyResults(); + return verifyResults; + }catch (Exception e) { + log.error("【抖音】验券失败"); + e.printStackTrace(); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/Order.java new file mode 100644 index 0000000..c450f23 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/Order.java @@ -0,0 +1,35 @@ +package com.ruoyi.order.util.douyin.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/6/11 19:34 + */ +@Data +public class Order { + /** + * 商家账号id + */ + private String account_id; + /** + * 创单时间,秒级时间戳 + */ + private Long create_time; + /** + * 订单id + */ + private String order_id; + /** + * 售卖价格(分) + */ + private Long original_amount; + /** + * 用户支付价格(分) + */ + private Long pay_amount; + /** + * 支付时间,秒级时间戳 + */ + private Long pay_time; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/OrderWebHook.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/OrderWebHook.java new file mode 100644 index 0000000..36cd569 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/OrderWebHook.java @@ -0,0 +1,21 @@ +package com.ruoyi.order.util.douyin.model; + +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/11 19:32 + */ +@Data +public class OrderWebHook { + /** + * 事件类型 + */ + private String action; + /** + * 消息发送时间 + */ + private Long msg_time; + /** + * 订单信息 + */ + private Order order; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/WebHook.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/WebHook.java new file mode 100644 index 0000000..fc77f23 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/douyin/model/WebHook.java @@ -0,0 +1,29 @@ +package com.ruoyi.order.util.douyin.model; + +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/11 19:42 + */ +@Data +public class WebHook { + /** + * 消息类型,用于区分各类消息 + */ + private String event; + /** + * 对应服务商平台或开发者平台中的APPID,应用ID + */ + private String client_key; + /** + * 标识用户身份的openId,同一用户在不同的APPID中openId不相同 + */ + private String from_user_id; + /** + * 消息内容,根据需要解析消息内容,不同类型的消息内容不同 + */ + private String content; + /** + * 抖音内部日志id,可提供给抖音方便排查问题 + */ + private String log_id; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml index f6656e0..4370b43 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml @@ -365,24 +365,32 @@ toc.order_status orderStatus, toc.order_money orderGoodsMoney, toc.coupon_money couponDiscount, - CASE toc.pay_type WHEN 1 THEN toc.order_money-toc.coupon_money WHEN 2 THEN toc.order_money-toc.coupon_money-toc.online_pay_money END receivableMoney, + CASE toc.pay_type WHEN 1 THEN toc.order_money-toc.coupon_money WHEN 2 THEN + toc.order_money-toc.coupon_money-toc.online_pay_money END receivableMoney, toc.receivable_deposit receivableDeposit, toc.pay_money payMoney, - (CASE WHEN null = toc.change_receivable_money or toc.change_receivable_money = 0 THEN toc.receivable_money ELSE toc.change_receivable_money END) relReceiveMoney, + (CASE WHEN null = toc.change_receivable_money or toc.change_receivable_money = 0 THEN toc.receivable_money ELSE + toc.change_receivable_money END) relReceiveMoney, CASE toc.pay_type WHEN 1 THEN toc.pay_money WHEN 2 THEN IFNULL(toc.offline_pay_money,0) END receiveMoney, - (CASE WHEN null = toc.change_receivable_money or toc.change_receivable_money = 0 THEN toc.receivable_money ELSE toc.change_receivable_money END) - (CASE toc.pay_type WHEN 1 THEN toc.pay_money WHEN 2 THEN IFNULL(toc.offline_pay_money,0) END) unPaidMoney, + (CASE WHEN null = toc.change_receivable_money or toc.change_receivable_money = 0 THEN toc.receivable_money ELSE + toc.change_receivable_money END) - (CASE toc.pay_type WHEN 1 THEN toc.pay_money WHEN 2 THEN + IFNULL(toc.offline_pay_money,0) END) unPaidMoney, toc.order_remark orderRemark, toc.create_time createTime, toc.order_from orderFrom, - CASE toc.order_from WHEN 1 THEN '商城订单' WHEN 2 THEN CONCAT('平台秒杀活动(',toc.activity_name,')') WHEN 3 THEN '线下创建' END orderFromDesc, + CASE toc.order_from WHEN 1 THEN '商城订单' WHEN 2 THEN CONCAT('平台秒杀活动(',toc.activity_name,')') WHEN 3 THEN + '线下创建' END orderFromDesc, toc.activity_name activityName FROM t_order toc - WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId} and if(toc.order_from = 1, 1 = 1, toc.order_status = 3)<!--临时增加过滤--> + WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId} <if test="param.memberUserId != null and param.memberUserId != ''"> AND toc.user_id = #{param.memberUserId} </if> + <if test="param.type != null and param.type ==0 "> + AND toc.order_status = 0 + </if> <if test="param.type != null and param.type ==1 "> - AND (toc.order_status = 2 OR toc.order_status = 3) + AND toc.order_status in(0, 2, 3) </if> <if test="param.type != null and param.type ==2 "> AND toc.order_status = 2 diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java index 5bda83c..25a399c 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java @@ -1,27 +1,37 @@ package com.ruoyi.shop.controller.business; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.shop.domain.dto.*; import com.ruoyi.shop.domain.pojo.shop.ShopRelUser; -import com.ruoyi.shop.domain.vo.MerAgencyPageVo; -import com.ruoyi.shop.domain.vo.MerShopCertificateListVo; -import com.ruoyi.shop.domain.vo.MerShopSuggestVo; -import com.ruoyi.shop.domain.vo.MerchantBasicdataSettlementVo; +import com.ruoyi.shop.domain.vo.*; import com.ruoyi.shop.service.shop.*; -import com.ruoyi.system.api.domain.dto.*; +import com.ruoyi.system.api.domain.dto.MerBaseDto; +import com.ruoyi.system.api.domain.dto.MerBaseGetDto; +import com.ruoyi.system.api.domain.dto.MerEditUserDto; +import com.ruoyi.system.api.domain.dto.MerPageDto; import com.ruoyi.system.api.domain.poji.shop.Shop; +import com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime; +import com.ruoyi.system.api.domain.poji.shop.ShopNonAppointableTime; import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo; import com.ruoyi.system.api.domain.vo.MerStaffInfoVo; import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.time.format.DateTimeFormatter; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author jqs34 @@ -41,23 +51,31 @@ @Resource private ShopCertificateService shopCertificateService; - + @Resource private ShopStaffService shopStaffService; - + @Resource private ShopRelUserService shopRelUserService; - + @Resource private ShopSuggestService shopSuggestService; - + + @Resource + private ShopNonAppointableTimeService shopNonAppointableTimeService; + + @Resource + private ShopAppointableTimeService shopAppointableTimeService; + + /** * 未完成实际统计 + * * @param merBaseDto * @return */ @RequestMapping(value = "/getMerHomeTotal", method = RequestMethod.POST) - @ApiOperation(value = "获取商户端商业统计") + @ApiOperation(value = "获取商户端商业统计【2.0】") public R<MerHomeShopTotalVo> getMerHomeTotal(@RequestBody MerBaseDto merBaseDto) { Long userId = SecurityUtils.getUserId(); merBaseDto.setUserId(userId); @@ -100,14 +118,16 @@ shopCertificateService.deleteShopCertificate(Long.valueOf(merBaseGetDto.getId())); return R.ok(); } - + @RequestMapping(value = "/getShopStaffInfo", method = RequestMethod.POST) - @ApiOperation(value = "获取员工信息") - public R<MerStaffInfoVo> getShopStaffInfo() { + @ApiOperation(value = "获取员工信息【2.0】") + @ApiImplicitParams({ + @ApiImplicitParam(value = "当前商户id", name = "shopId", required = true, dataType = "Long", paramType = "query") + }) + public R<MerStaffInfoVo> getShopStaffInfo(@RequestParam("shopId") Long shopId) { Long userId = SecurityUtils.getUserId(); - ShopRelUser shopRelUser = shopRelUserService.getByUserId(userId); - Shop shop = shopService.getByShopId(shopRelUser.getShopId()); - MerStaffInfoVo merStaffInfoVo = shopStaffService.getShopStaffInfo(userId,shop); + Shop shop = shopService.getByShopId(shopId); + MerStaffInfoVo merStaffInfoVo = shopStaffService.getShopStaffInfo(userId, shop); return R.ok(merStaffInfoVo); } @@ -151,22 +171,133 @@ shopSuggestService.suggest(merShopSuggestDto); return R.ok(); } - - - + + @RequestMapping(value = "/listShopByShop", method = RequestMethod.POST) @ApiOperation(value = "获取商户下属代理商") - public R<List<MgtSimpleShopVo>> listShopByShop(@RequestBody MerBaseDto merBaseDto) - { + public R<List<MgtSimpleShopVo>> listShopByShop(@RequestBody MerBaseDto merBaseDto) { List<MgtSimpleShopVo> mgtShopListSimpleVos = shopService.listShopByShop(merBaseDto.getShopId()); return R.ok(mgtShopListSimpleVos); } - - - + + @RequestMapping(value = "/getShopMerchantBasicDataSettlement", method = RequestMethod.POST) @ApiOperation(value = "获取提现记录(汇付天下)") - public R<List<MerchantBasicdataSettlementVo>> getMerchantBasicDataSettlement(@Validated @RequestBody MerchantBasicdataSettlementDto mgtShopShareRatioSetDto){ + public R<List<MerchantBasicdataSettlementVo>> getMerchantBasicDataSettlement(@Validated @RequestBody MerchantBasicdataSettlementDto mgtShopShareRatioSetDto) { return shopService.getMerchantBasicDataSettlement(mgtShopShareRatioSetDto); } + + @RequestMapping(value = "/getUserShopList", method = RequestMethod.POST) + @ApiOperation(value = "获取切换门店列表【2.0】") + public R<List<Shop>> getUserShopList() { + List<ShopRelUser> shopRelUsers = shopRelUserService.getByUserId(SecurityUtils.getUserId()); + shopRelUsers.sort(Comparator.comparing(ShopRelUser::getIsDefault)); + List<Shop> collect = shopRelUsers.stream().map(shopRelUser -> { + Shop shop = shopService.getById(shopRelUser.getShopId()); + return shop; + }).collect(Collectors.toList()); + return R.ok(collect); + } + + + @RequestMapping(value = "/getShopReservationConfig/{shopId}", method = RequestMethod.POST) + @ApiOperation(value = "获取门店预约管理配置【2.0】") + public R<ShopReservationConfigVo> getShopReservationConfig(@PathVariable("shopId") Long shopId) { + Shop shop = shopService.getById(shopId); + Integer subscribe = shop.getSubscribe(); + ShopReservationConfigVo vo = new ShopReservationConfigVo(); + vo.setSubscribe(subscribe); + List<ShopNonAppointableTime> list = shopNonAppointableTimeService.list(new LambdaQueryWrapper<ShopNonAppointableTime>().eq(ShopNonAppointableTime::getShopId, shopId) + .orderByAsc(ShopNonAppointableTime::getNonAppointableStartTime)); + vo.setUnsubscribeTime(list.stream().map(shopNonAppointableTime -> { + Map<String, String> map = new HashMap<>(); + String time = shopNonAppointableTime.getNonAppointableStartTime().format(DateTimeFormatter.ofPattern("MM月dd日 HH:mm")) + "-" + shopNonAppointableTime.getNonAppointableEndTime().format(DateTimeFormatter.ofPattern("HH:mm")); + map.put("time", time); + map.put("id", shopNonAppointableTime.getId()); + return map; + }).collect(Collectors.toList())); + return R.ok(vo); + } + + @RequestMapping(value = "/addShopNonAppointableTime", method = RequestMethod.POST) + @ApiOperation(value = "门店添加不可预约时间段【2.0】") + public R addShopNonAppointableTime(@RequestBody ShopNonAppointableTimeDto dto) { + ShopNonAppointableTime shopNonAppointableTime = new ShopNonAppointableTime(); + shopNonAppointableTime.setShopId(dto.getShopId()); + shopNonAppointableTime.setNonAppointableStartTime(dto.getNonAppointableStartTime()); + shopNonAppointableTime.setNonAppointableEndTime(dto.getNonAppointableEndTime()); + shopNonAppointableTimeService.save(shopNonAppointableTime); + return R.ok(); + } + + + @RequestMapping(value = "/switchAppointment/{shopId}/{subscribe}", method = RequestMethod.POST) + @ApiOperation(value = "开关门店预约配置【2.0】") + @ApiImplicitParams({ + @ApiImplicitParam(value = "门店id", name = "shopId", required = true, dataType = "Long", paramType = "path"), + @ApiImplicitParam(value = "预约开关(0=关,1=开)", name = "subscribe", required = true, dataType = "Integer", paramType = "path") + }) + public R switchAppointment(@PathVariable("shopId") Long shopId, @PathVariable("subscribe") Integer subscribe) { + Shop shop = shopService.getById(shopId); + shop.setSubscribe(subscribe); + shopService.updateById(shop); + return R.ok(); + } + + @RequestMapping(value = "/getShopAppointableTimeList", method = RequestMethod.POST) + @ApiOperation(value = "商户获取预约列表【2.0】") + public R<Page<ShopAppointableTimeListVo>> getShopAppointableTimeList(@RequestBody ShopAppointableTimeListDto dto) { + Page<ShopAppointableTimeListVo> page = new Page<>(); + page.setSize(dto.getPageSize()); + page.setCurrent(dto.getPageNum()); + List<ShopAppointableTimeListVo> shopAppointableTimeList = shopAppointableTimeService.getShopAppointableTimeList(page, dto); + return R.ok(page.setRecords(shopAppointableTimeList)); + } + + + @RequestMapping(value = "/confirmReservation/{id}", method = RequestMethod.POST) + @ApiOperation(value = "商户确认预约【2.0】") + public R confirmReservation(@PathVariable("id") String id) { + ShopAppointableTime shopAppointableTime = shopAppointableTimeService.getById(id); + if (null == shopAppointableTime) { + return R.fail("预约不存在"); + } + if (1 != shopAppointableTime.getStatus()) { + return R.fail("确认预约失败"); + } + shopAppointableTime.setStatus(2); + shopAppointableTimeService.updateById(shopAppointableTime); + return R.ok(); + } + + + @RequestMapping(value = "/cancelReservation", method = RequestMethod.POST) + @ApiOperation(value = "商户取消预约【2.0】") + public R cancelReservation(@RequestBody CancelReservationDto dto) { + ShopAppointableTime shopAppointableTime = shopAppointableTimeService.getById(dto.getId()); + if (null == shopAppointableTime) { + return R.fail("预约不存在"); + } + if (0 == shopAppointableTime.getStatus()) { + return R.fail("不能重复操作"); + } + shopAppointableTime.setStatus(0); + shopAppointableTime.setReason(dto.getReason()); + shopAppointableTimeService.updateById(shopAppointableTime); + return R.ok(); + } + + @RequestMapping(value = "/getMyShopList", method = RequestMethod.POST) + @ApiOperation(value = "获取当前账户可切换的门店列表【2.0】") + public R<List<Shop>> getMyShopList() { + Long userId = SecurityUtils.getUserId(); + List<ShopRelUser> shopRelUser = shopRelUserService.getByUserId(userId); + List<Shop> collect = shopRelUser.stream().map(e -> { + Shop shop = shopService.getById(e.getShopId()); + return shop; + }).collect(Collectors.toList()); + return R.ok(collect); + } + + } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java index c15d16a..a1502ea 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java @@ -1,7 +1,6 @@ package com.ruoyi.shop.controller.console; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; @@ -16,7 +15,6 @@ import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.shop.Shop; -import com.ruoyi.system.api.domain.vo.ShopProportionVo; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.domain.vo.*; import com.ruoyi.system.api.model.QwH5LoginVo; @@ -32,7 +30,6 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * @author jqs34 @@ -174,17 +171,20 @@ @PostMapping("/getShopByUserId") public R<ShopRelUserVo> getShopByUserId(@RequestBody Long userId) { - ShopRelUser shopRelUser = shopRelUserService.getByUserId(userId); + List<ShopRelUser> shopRelUser = shopRelUserService.getByUserId(userId); Optional.ofNullable(shopRelUser).orElseThrow(() -> new ServiceException("未查询到用户关联商户")); ShopRelUserVo shopRelUserVo = new ShopRelUserVo(); - shopRelUserVo.setShopId(shopRelUser.getShopId()); - shopRelUserVo.setUserName(shopRelUser.getUserName()); + ShopRelUser shopRelUser1 = shopRelUser.stream().filter(s -> s.getIsDefault() == 1).collect(Collectors.toList()).get(0); + shopRelUserVo.setShopId(shopRelUser1.getShopId()); + shopRelUserVo.setUserName(shopRelUser1.getUserName()); + Shop shop = shopService.getById(shopRelUser1.getShopId()); + shopRelUserVo.setShopName(shop.getShopName()); + shopRelUserVo.setShopNum(shopRelUser.size()); return R.ok(shopRelUserVo); } - + @PostMapping("/getShopByBelongUserId") - public R<ShopRelUserVo> getShopByBelongUserId(@RequestBody Long userId) - { + public R<ShopRelUserVo> getShopByBelongUserId(@RequestBody Long userId) { List<Shop> shopList = shopService.getShopByBelongUserId(userId); Optional.ofNullable(shopList.get(0)).orElseThrow(() -> new ServiceException("未查询到商户信息")); ShopRelUserVo shopRelUserVo = new ShopRelUserVo(); @@ -445,4 +445,14 @@ public List<Shop> getShopBySysUserIds(@RequestBody BoardMemberTotalDto boardMemberTotalDto){ return shopService.getShopBySysUserIds(boardMemberTotalDto.getUserIds()); } + + /** + * 根据经销商id查询加盟商ids + * @param shopId + * @return + */ + @PostMapping("/shop/getFranchiseeIdsBYDealerId") + List<Shop> getFranchiseeIdsBYDealerId(@RequestBody Long shopId){ + return shopService.getFranchiseeIdsBYDealerId(shopId); + } } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java index bf20bb0..c4ebd06 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/miniapp/AppHomeController.java @@ -1,24 +1,35 @@ package com.ruoyi.shop.controller.miniapp; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.shop.domain.dto.AppNearbyShopDto; +import com.ruoyi.shop.domain.dto.MyAppointmentListDto; import com.ruoyi.shop.domain.vo.AppNearbyShopVo; import com.ruoyi.shop.domain.vo.AppShopInfoVo; +import com.ruoyi.shop.domain.vo.MyAppointmentListVo; +import com.ruoyi.shop.service.shop.ShopAppointableTimeService; +import com.ruoyi.shop.service.shop.ShopNonAppointableTimeService; import com.ruoyi.shop.service.shop.ShopService; import com.ruoyi.system.api.domain.dto.AppBaseGetDto; +import com.ruoyi.system.api.domain.dto.AppointmentTimeDto; +import com.ruoyi.system.api.domain.dto.ShopAppointmentTimeDto; import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime; +import com.ruoyi.system.api.domain.poji.shop.ShopNonAppointableTime; import com.ruoyi.system.api.service.RemoteMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.log4j.Log4j2; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; /** * @author jqs34 @@ -32,21 +43,26 @@ @RequestMapping("/app/home") @Log4j2 public class AppHomeController { - - + @Resource private RemoteMemberService memberService; - - + @Resource private ShopService shopService; - + + @Resource + private ShopNonAppointableTimeService shopNonAppointableTimeService; + + @Resource + private ShopAppointableTimeService shopAppointableTimeService; + + @RequestMapping(value = "/getNearbyShop", method = RequestMethod.POST) @ApiOperation(value = "获取最近商户") public R<AppNearbyShopVo> getNearbyShop(@RequestBody AppNearbyShopDto appNearbyShopDto) { Long userId = SecurityUtils.getUserId(); Member member = null; - if(userId!=null){ + if (userId != null) { member = memberService.getMember(userId).getData(); } log.info("获取最近商户:userId=" + userId + "&appNearbyShopDto=" + JSON.toJSONString(appNearbyShopDto)); @@ -54,14 +70,66 @@ AppNearbyShopVo appNearbyShopVo = shopService.getNearbyShop(appNearbyShopDto,member); return R.ok(appNearbyShopVo); } - - + + @RequestMapping(value = "/getShopInfo", method = RequestMethod.POST) @ApiOperation(value = "获取商户详情") public R<AppShopInfoVo> getShopInfo(@RequestBody AppBaseGetDto appBaseGetDto) { AppShopInfoVo appShopInfoVo = shopService.getAppShopInfo(Long.valueOf(appBaseGetDto.getId())); return R.ok(appShopInfoVo); } - - + + @RequestMapping(value = "/getShopAppointmentTime", method = RequestMethod.POST) + @ApiOperation(value = "获取商户不可预约时间段【2.0】") + public R<List<ShopNonAppointableTime>> getShopAppointmentTime(@RequestBody ShopAppointmentTimeDto dto) { + List<ShopNonAppointableTime> list = shopNonAppointableTimeService.list(new QueryWrapper<ShopNonAppointableTime>().eq("shop_id", dto.getId()) + .last(" and '" + dto.getDate() + "' = DATE(non_appointable_start_time) order by non_appointable_start_time")); + return R.ok(list); + } + + @RequestMapping(value = "/appointmentTime", method = RequestMethod.POST) + @ApiOperation(value = "门店详情预约操作【2.0】") + public R appointmentTime(@RequestBody AppointmentTimeDto dto) { + ShopAppointableTime one = shopAppointableTimeService.getOne(new LambdaQueryWrapper<ShopAppointableTime>().eq(ShopAppointableTime::getShopId, dto.getShopId()) + .last(" and DATE_FORMAT(appointable_time, '%Y-%m-%d %H:%i') = '" + dto.getTime() + "'")); + if (null != one) { + return R.fail("不能重复预约"); + } + Long userId = SecurityUtils.getUserId(); + one = new ShopAppointableTime(); + one.setShopId(dto.getShopId()); + one.setAppointableTime(LocalDateTime.parse(dto.getTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + one.setUserId(userId); + one.setStatus(1); + one.setCreateTime(LocalDateTime.now()); + shopAppointableTimeService.save(one); + return R.ok(); + } + + @RequestMapping(value = "/getMyAppointmentList", method = RequestMethod.POST) + @ApiOperation(value = "获取我的预约列表【2.0】") + public R<Page<MyAppointmentListVo>> getMyAppointmentList(@RequestBody MyAppointmentListDto dto) { + Page<MyAppointmentListVo> page = new Page<>(); + page.setSize(dto.getPageSize()); + page.setCurrent(dto.getPageNum()); + List<MyAppointmentListVo> myAppointmentListVos = shopAppointableTimeService.pageMyAppointmentList(page, dto); + return R.ok(page.setRecords(myAppointmentListVos)); + } + + + @RequestMapping(value = "/cancelAppointmentTime/{id}", method = RequestMethod.POST) + @ApiOperation(value = "取消预约【2.0】") + public R cancelAppointmentTime(@PathVariable("id") String id) { + Long userId = SecurityUtils.getUserId(); + ShopAppointableTime one = shopAppointableTimeService.getById(id); + if (null == one) { + return R.fail("预约不存在"); + } + if (!one.getUserId().equals(userId)) { + return R.fail("不能取消别人的预约"); + } + one.setStatus(0); + shopAppointableTimeService.updateById(one); + return R.ok(); + } } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/CancelReservationDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/CancelReservationDto.java new file mode 100644 index 0000000..92ac870 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/CancelReservationDto.java @@ -0,0 +1,16 @@ +package com.ruoyi.shop.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/3 16:08 + */ +@Data +@ApiModel +public class CancelReservationDto { + @ApiModelProperty(value = "预约id") + private String id; + @ApiModelProperty(value = "取消原因") + private String reason; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java index 116f5a9..4c5ba67 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java @@ -45,16 +45,16 @@ @ApiModelProperty(value="店主联系方式") private String shopownerPhone; - @ApiModelProperty(value="签约省区域") + @ApiModelProperty(value="签约省区域(多个以分号相隔)") private String signProvinceCode; - @ApiModelProperty(value="签约市区域") + @ApiModelProperty(value="签约市区域(多个以分号相隔)") private String signCityCode; - @ApiModelProperty(value="签约区域") + @ApiModelProperty(value="签约区域(多个以分号相隔)") private String signAreaCode; - @ApiModelProperty(value="签约区域全称") + @ApiModelProperty(value="签约区域全称(多个以分号相隔)") private String signAreaName; @ApiModelProperty(value="商户服务电话") @@ -139,4 +139,10 @@ @ApiModelProperty(value="商户banner 多个用,隔开") private String shopBanners; + + @ApiModelProperty(value="小鹅通讲师id 多个用,隔开") + private String xiaoeUserId; + + @ApiModelProperty("修改价格权限(0=关,1=开)") + private Integer modifyPricePermission; } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MyAppointmentListDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MyAppointmentListDto.java new file mode 100644 index 0000000..3d3a4fe --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MyAppointmentListDto.java @@ -0,0 +1,20 @@ +package com.ruoyi.shop.domain.dto; + +import com.ruoyi.system.api.domain.dto.MgtBaseDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +/** + * @author zhibing.pu + * @Date 2025/5/27 14:29 + */ +@ApiModel +@Data +public class MyAppointmentListDto extends MgtBaseDto { + @ApiModelProperty("页码,首页1") + private Integer pageNum; + @ApiModelProperty("页查询条数") + private Integer pageSize; + @ApiModelProperty("状态(0=已取消,1=待确认,2=等待中,3=已结束)") + private Integer status; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopAppointableTimeListDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopAppointableTimeListDto.java new file mode 100644 index 0000000..69531a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopAppointableTimeListDto.java @@ -0,0 +1,17 @@ +package com.ruoyi.shop.domain.dto; + +import com.ruoyi.system.api.domain.dto.MgtPageDto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/6/3 15:17 + */ +@Data +@ApiModel +public class ShopAppointableTimeListDto extends MgtPageDto { + @ApiModelProperty(value = "商户id") + private Integer shopId; + @ApiModelProperty(value = "状态(0=已取消,1=待确认,2=等待中,3=已结束)") + private Integer status; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopNonAppointableTimeDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopNonAppointableTimeDto.java new file mode 100644 index 0000000..b08855a --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/ShopNonAppointableTimeDto.java @@ -0,0 +1,23 @@ +package com.ruoyi.shop.domain.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; /** + * @author zhibing.pu + * @Date 2025/6/3 14:59 + */ +@Data +@ApiModel +public class ShopNonAppointableTimeDto { + @ApiModelProperty("门店id") + private Integer shopId; + @ApiModelProperty("不可预约开始时间(yyyy-MM-dd HH:mm:ss)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime nonAppointableStartTime; + @ApiModelProperty("不可预约结束时间(yyyy-MM-dd HH:mm:ss)") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime nonAppointableEndTime; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopRelUser.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopRelUser.java index 8a6d4e7..aa53c0e 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopRelUser.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopRelUser.java @@ -1,15 +1,15 @@ package com.ruoyi.shop.domain.pojo.shop; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; - import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; + +import java.io.Serializable; /** * <p> @@ -40,6 +40,11 @@ @TableField("shop_id") private Long shopId; /** + * 默认门店(0=否,1=是) + */ + @TableField("is_default") + private Integer isDefault; + /** * 用户id */ @TableField("user_id") diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java index ce732c8..33610aa 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java @@ -149,7 +149,11 @@ @ApiModelProperty(value="证书list") private List<ShopCertificate> shopCertificateList; + @ApiModelProperty(value="小鹅通讲师id 多个用,隔开") + private String xiaoeUserId; + @ApiModelProperty("修改价格权限(0=关,1=开)") + private Integer modifyPricePermission; diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MyAppointmentListVo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MyAppointmentListVo.java new file mode 100644 index 0000000..0fe6c70 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MyAppointmentListVo.java @@ -0,0 +1,22 @@ +package com.ruoyi.shop.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** + * @author zhibing.pu + * @Date 2025/5/27 14:32 + */ +@Data +@ApiModel +public class MyAppointmentListVo { + @ApiModelProperty(value = "预约id") + private String id; + @ApiModelProperty(value = "预约时间") + private String appointmentTime; + @ApiModelProperty(value = "预约状态(0=已取消,1=待确认,2=等待中,3=已结束)") + private Integer status; + @ApiModelProperty(value = "预约门店") + private String shopName; + @ApiModelProperty(value = "商家取消原因") + private String cancelReason; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopAppointableTimeListVo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopAppointableTimeListVo.java new file mode 100644 index 0000000..2126051 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopAppointableTimeListVo.java @@ -0,0 +1,28 @@ +package com.ruoyi.shop.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author zhibing.pu + * @Date 2025/6/3 15:19 + */ +@Data +@ApiModel +public class ShopAppointableTimeListVo { + @ApiModelProperty("预约数据id") + private String id; + @ApiModelProperty("预约时间") + private LocalDateTime appointableTime; + @ApiModelProperty("预约状态(0=已取消,1=待确认,2=等待中,3=已结束)") + private Integer status; + @ApiModelProperty("预约人") + private String userName; + @ApiModelProperty("预约人手机号") + private String mobile; + @ApiModelProperty("预约人性别") + private String sex; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopReservationConfigVo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopReservationConfigVo.java new file mode 100644 index 0000000..ca9cd59 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/ShopReservationConfigVo.java @@ -0,0 +1,22 @@ +package com.ruoyi.shop.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + + +/** + * @author zhibing.pu + * @Date 2025/6/3 14:26 + */ +@Data +@ApiModel +public class ShopReservationConfigVo { + @ApiModelProperty("预约开关(0=关,1=开)") + private Integer subscribe; + @ApiModelProperty("不可预约时段") + private List<Map<String, String>> unsubscribeTime; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopAppointableTimeMapper.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopAppointableTimeMapper.java new file mode 100644 index 0000000..ef6a876 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopAppointableTimeMapper.java @@ -0,0 +1,45 @@ +package com.ruoyi.shop.mapper.shop; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.shop.domain.dto.ShopAppointableTimeListDto; +import com.ruoyi.shop.domain.vo.MyAppointmentListVo; +import com.ruoyi.shop.domain.vo.ShopAppointableTimeListVo; +import com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/26 15:13 + */ +public interface ShopAppointableTimeMapper extends BaseMapper<ShopAppointableTime> { + + + /** + * 分页查询我的预约列表 + * + * @param page + * @param userId + * @param status + * @return + */ + List<MyAppointmentListVo> pageMyAppointmentList(Page<MyAppointmentListVo> page, @Param("userId") Long userId, @Param("status") Integer status); + + + /** + * 商户端获取预约列表数据 + * + * @param page + * @param dto + * @return + */ + List<ShopAppointableTime> getShopAppointableTimeList(Page<ShopAppointableTimeListVo> page, @Param("item") ShopAppointableTimeListDto dto); + + + /** + * 定时任务修改预约状态 + */ + void taskUpdateStatus(); +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java index 005b1e5..54001ca 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java @@ -293,4 +293,6 @@ * @return List<Long> */ List<Shop> listShopByCityCode(@Param("cityCodes")List<String> cityCodes); + + List<Shop> getFranchiseeIdsBYDealerId(@Param("shopId")Long shopId); } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopNonAppointableTimeMapper.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopNonAppointableTimeMapper.java new file mode 100644 index 0000000..a902906 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopNonAppointableTimeMapper.java @@ -0,0 +1,17 @@ +package com.ruoyi.shop.mapper.shop; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.system.api.domain.poji.shop.ShopNonAppointableTime; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:31 + */ +public interface ShopNonAppointableTimeMapper extends BaseMapper<ShopNonAppointableTime> { + + + /** + * 每天凌晨3点删除3天前的数据 + */ + void taskDelData(); +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopAppointableTimeServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopAppointableTimeServiceImpl.java new file mode 100644 index 0000000..3564058 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopAppointableTimeServiceImpl.java @@ -0,0 +1,79 @@ +package com.ruoyi.shop.service.impl.shop; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.shop.domain.dto.MyAppointmentListDto; +import com.ruoyi.shop.domain.dto.ShopAppointableTimeListDto; +import com.ruoyi.shop.domain.vo.MyAppointmentListVo; +import com.ruoyi.shop.domain.vo.ShopAppointableTimeListVo; +import com.ruoyi.shop.mapper.shop.ShopAppointableTimeMapper; +import com.ruoyi.shop.service.shop.ShopAppointableTimeService; +import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime; +import com.ruoyi.system.api.service.RemoteMemberService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/26 15:15 + */ +@Service +public class ShopAppointableTimeServiceImpl extends ServiceImpl<ShopAppointableTimeMapper, ShopAppointableTime> implements ShopAppointableTimeService { + + @Resource + private RemoteMemberService remoteMemberService; + + + /** + * 分页查询我的预约 + * + * @param page + * @param dto + * @return + */ + @Override + public List<MyAppointmentListVo> pageMyAppointmentList(Page<MyAppointmentListVo> page, MyAppointmentListDto dto) { + Long userId = SecurityUtils.getUserId(); + return this.baseMapper.pageMyAppointmentList(page, userId, dto.getStatus()); + } + + + /** + * 商户端获取预约列表 + * + * @param page + * @param dto + * @return + */ + @Override + public List<ShopAppointableTimeListVo> getShopAppointableTimeList(Page<ShopAppointableTimeListVo> page, ShopAppointableTimeListDto dto) { + List<ShopAppointableTime> shopAppointableTimeList = this.baseMapper.getShopAppointableTimeList(page, dto); + List<ShopAppointableTimeListVo> list = new ArrayList<>(); + shopAppointableTimeList.forEach(shopAppointableTime -> { + ShopAppointableTimeListVo shopAppointableTimeListVo = new ShopAppointableTimeListVo(); + shopAppointableTimeListVo.setId(shopAppointableTime.getId()); + shopAppointableTimeListVo.setAppointableTime(shopAppointableTime.getAppointableTime()); + shopAppointableTimeListVo.setStatus(shopAppointableTime.getStatus()); + Member member = remoteMemberService.getMember(shopAppointableTime.getUserId()).getData(); + shopAppointableTimeListVo.setUserName(member.getRealName()); + shopAppointableTimeListVo.setMobile(member.getMobile()); + shopAppointableTimeListVo.setSex(member.getGender() == 1 ? "女" : member.getGender() == 0 ? "男" : "未知"); + list.add(shopAppointableTimeListVo); + }); + return list; + } + + + /** + * 定时任务修改预约状态 + */ + @Override + public void taskUpdateStatus() { + this.baseMapper.taskUpdateStatus(); + } +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopNonAppointableTimeServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopNonAppointableTimeServiceImpl.java new file mode 100644 index 0000000..9a73887 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopNonAppointableTimeServiceImpl.java @@ -0,0 +1,24 @@ +package com.ruoyi.shop.service.impl.shop; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.shop.mapper.shop.ShopNonAppointableTimeMapper; +import com.ruoyi.shop.service.shop.ShopNonAppointableTimeService; +import com.ruoyi.system.api.domain.poji.shop.ShopNonAppointableTime; +import org.springframework.stereotype.Service; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:31 + */ +@Service +public class ShopNonAppointableTimeServiceImpl extends ServiceImpl<ShopNonAppointableTimeMapper, ShopNonAppointableTime> implements ShopNonAppointableTimeService { + + + /** + * 每天凌晨3点删除3天前的数据 + */ + @Override + public void taskDelData() { + this.baseMapper.taskDelData(); + } +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopRelUserServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopRelUserServiceImpl.java index 9cf76f5..4ad2660 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopRelUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopRelUserServiceImpl.java @@ -3,10 +3,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.shop.domain.pojo.shop.ShopRelUser; import com.ruoyi.shop.mapper.shop.ShopRelUserMapper; import com.ruoyi.shop.service.shop.ShopRelUserService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -59,15 +59,14 @@ /** - * * @param userId * @return */ @Override - public ShopRelUser getByUserId(Long userId){ + public List<ShopRelUser> getByUserId(Long userId) { LambdaQueryWrapper<ShopRelUser> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(ShopRelUser::getDelFlag, 0).eq(ShopRelUser::getUserId, userId); - return this.getOne(queryWrapper,false); + return this.list(queryWrapper); } /** diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java index 9cafbde..3d1b4c7 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.shop.service.impl.shop; -import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -8,7 +7,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsStatusResult; import com.github.binarywang.wxpay.bean.ecommerce.ProfitSharingReceiverRequest; @@ -18,7 +16,6 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.DateUtils; -import com.ruoyi.common.core.utils.ExceptionUtil; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; @@ -46,20 +43,18 @@ import com.ruoyi.system.api.domain.poji.config.SysTag; import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.domain.poji.shop.Shop; +import com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.domain.vo.*; import com.ruoyi.system.api.service.*; import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; -import java.rmi.ServerException; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -141,21 +136,23 @@ @Resource private RedisService redisService; - + @Resource private WechatPayUtils wechatPayUtils; - + @Resource private ShopDetailService shopDetailService; - + @Resource private RemoteUserService remoteUserService; - + + @Resource + private ShopAppointableTimeService shopAppointableTimeService; + @Value("${callback_path}") private String callback_path; - - - + + /** * 获取商户详情 * @@ -191,47 +188,48 @@ } return appShopInfoVo; } - + /** * 创建商户 + * * @param mgtEditShopDto */ @Override - public void createShop(MgtEditShopDto mgtEditShopDto){ + public void createShop(MgtEditShopDto mgtEditShopDto) { Shop shop = new Shop(); Boolean newShop = false; BigDecimal zeroBig = BigDecimal.ZERO; //验证关联账号唯一 String relUserIds = mgtEditShopDto.getRelUserIds(); - if(StringUtils.isNotBlank(relUserIds)) { - if(relUserIds.startsWith(",")){ - relUserIds = relUserIds.substring(1); - } - String[] relUserIdArray = relUserIds.split(","); - ShopRelUser shopRelUser; - Long userId; - if(mgtEditShopDto.getShopId()!=null){ - for (String str : relUserIdArray) { - userId = Long.valueOf(str); - shopRelUser = shopRelUserService.getByUserId(userId); - if(shopRelUser!=null&&!shopRelUser.getShopId().equals(mgtEditShopDto.getShopId())){ - throw new ServiceException(AppErrorConstant.SHOP_USER_DOUBLE); - } - } - }else { - for (String str : relUserIdArray) { - userId = Long.valueOf(str); - shopRelUser = shopRelUserService.getByUserId(userId); - if(shopRelUser!=null){ - throw new ServiceException(AppErrorConstant.SHOP_USER_DOUBLE); - } - } - } - - } +// if(StringUtils.isNotBlank(relUserIds)) { +// if(relUserIds.startsWith(",")){ +// relUserIds = relUserIds.substring(1); +// } +// String[] relUserIdArray = relUserIds.split(","); +// ShopRelUser shopRelUser; +// Long userId; +// if(mgtEditShopDto.getShopId()!=null){ +// for (String str : relUserIdArray) { +// userId = Long.valueOf(str); +// shopRelUser = shopRelUserService.getByUserId(userId); +// if(shopRelUser!=null&&!shopRelUser.getShopId().equals(mgtEditShopDto.getShopId())){ +// throw new ServiceException(AppErrorConstant.SHOP_USER_DOUBLE); +// } +// } +// }else { +// for (String str : relUserIdArray) { +// userId = Long.valueOf(str); +// shopRelUser = shopRelUserService.getByUserId(userId); +// if(shopRelUser!=null){ +// throw new ServiceException(AppErrorConstant.SHOP_USER_DOUBLE); +// } +// } +// } +// +// } //验证商户名唯一 //Shop shopSame = this.getOne(new LambdaQueryWrapper<Shop>().eq(Shop::getDelFlag,0).eq(Shop::getShopName,mgtEditShopDto.getShopName())); - if(mgtEditShopDto.getShopId()!=null){ + if (mgtEditShopDto.getShopId() != null) { //取消验重 /*if(shopSame!=null&&!Objects.equals(shopSame.getShopId(),mgtEditShopDto.getShopId())){ throw new ServiceException(AppErrorConstant.SHOP_DOUBLE); @@ -918,29 +916,30 @@ staffHomeShopTotalVo.setShopTask(shopTaskCount); return staffHomeShopTotalVo; } + /** * 获取商户端 + * * @param merBaseDto * @return */ @Override - public MerHomeShopTotalVo getMerHomeTotal(MerBaseDto merBaseDto){ + public MerHomeShopTotalVo getMerHomeTotal(MerBaseDto merBaseDto) { Long userId = merBaseDto.getUserId(); MerHomeShopTotalVo merHomeShopTotalVo = new MerHomeShopTotalVo(); - ShopRelUser shopRelUser = shopRelUserService.getByUserId(userId); - Long shopId = shopRelUser.getShopId(); + Long shopId = merBaseDto.getShopId(); //如果商户变动刷新token - if(!shopId.equals(merBaseDto.getShopId())){ - String userKey = SecurityUtils.getUserKey(); - redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY+userKey); - throw new ServiceException("登录状态已过期",401); - } +// if(!shopId.equals(merBaseDto.getShopId())){ +// String userKey = SecurityUtils.getUserKey(); +// redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY+userKey); +// throw new ServiceException("登录状态已过期",401); +// } merHomeShopTotalVo.setShopId(shopId); Shop shop = this.getById(shopId); - if(shop.getFrozenFlag()==1){ + if (shop.getFrozenFlag() == 1) { String userKey = SecurityUtils.getUserKey(); - redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY+userKey); - throw new ServiceException("商户已被冻结,请联系管理员",401); + redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + userKey); + throw new ServiceException("商户已被冻结,请联系管理员", 401); } merHomeShopTotalVo.setShopType(shop.getShopType()); MerHomeShopTotalVo orderVo = remoteOrderService.getMerHomeTotal(merHomeShopTotalVo).getData(); @@ -955,6 +954,8 @@ merHomeShopTotalVo.setExplorationSurp(orderVo.getExplorationSurp()); merHomeShopTotalVo.setPlatformBirthdayFlag(shop.getPlatformBirthdayFlag()); merHomeShopTotalVo.setPlatformCouponFlag(shop.getPlatformCouponFlag()); + int unHandleReserve = shopAppointableTimeService.count(new LambdaQueryWrapper<ShopAppointableTime>().eq(ShopAppointableTime::getShopId, shopId).eq(ShopAppointableTime::getStatus, 1)); + merHomeShopTotalVo.setUnHandleReserve(unHandleReserve); return merHomeShopTotalVo; } @@ -1454,19 +1455,19 @@ }).collect(Collectors.toList()); return simpleShopVoList; } - + /** - * @description 获取用户管理商户 - * @author jqs - * @date 2023/7/14 10:00 * @param userId - * @return Shop + * @return Shop + * @description 获取用户管理商户 + * @author jqs + * @date 2023/7/14 10:00 */ @Override - public List<Shop> getShopByBelongUserId(Long userId){ + public List<Shop> getShopByBelongUserId(Long userId) { LambdaQueryWrapper<Shop> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Shop::getDelFlag,0); - queryWrapper.eq(Shop::getBelongUserId,userId); + queryWrapper.eq(Shop::getDelFlag, 0); + queryWrapper.eq(Shop::getBelongUserId, userId); return this.list(queryWrapper); } @@ -1951,4 +1952,9 @@ List<Shop> list = this.list(queryWrapper); return list; } + + @Override + public List<Shop> getFranchiseeIdsBYDealerId(Long shopId) { + return shopMapper.getFranchiseeIdsBYDealerId(shopId); + } } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopAppointableTimeService.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopAppointableTimeService.java new file mode 100644 index 0000000..30866d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopAppointableTimeService.java @@ -0,0 +1,44 @@ +package com.ruoyi.shop.service.shop; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.shop.domain.dto.MyAppointmentListDto; +import com.ruoyi.shop.domain.dto.ShopAppointableTimeListDto; +import com.ruoyi.shop.domain.vo.MyAppointmentListVo; +import com.ruoyi.shop.domain.vo.ShopAppointableTimeListVo; +import com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/5/26 15:14 + */ +public interface ShopAppointableTimeService extends IService<ShopAppointableTime> { + + + /** + * 获取用户预约列表 + * + * @param page + * @param dto + * @return + */ + List<MyAppointmentListVo> pageMyAppointmentList(Page<MyAppointmentListVo> page, MyAppointmentListDto dto); + + + /** + * 商户端获取预约列表 + * + * @param page + * @param dto + * @return + */ + List<ShopAppointableTimeListVo> getShopAppointableTimeList(Page<ShopAppointableTimeListVo> page, ShopAppointableTimeListDto dto); + + + /** + * 定时任务修改预约状态 + */ + void taskUpdateStatus(); +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopNonAppointableTimeService.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopNonAppointableTimeService.java new file mode 100644 index 0000000..2e9516d --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopNonAppointableTimeService.java @@ -0,0 +1,17 @@ +package com.ruoyi.shop.service.shop; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.system.api.domain.poji.shop.ShopNonAppointableTime; + +/** + * @author zhibing.pu + * @Date 2025/5/26 14:30 + */ +public interface ShopNonAppointableTimeService extends IService<ShopNonAppointableTime> { + + + /** + * 每天凌晨3点删除3天前的数据 + */ + void taskDelData(); +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopRelUserService.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopRelUserService.java index ff3cf10..73c4fb0 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopRelUserService.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopRelUserService.java @@ -1,7 +1,7 @@ package com.ruoyi.shop.service.shop; -import com.ruoyi.shop.domain.pojo.shop.ShopRelUser; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.shop.domain.pojo.shop.ShopRelUser; import java.util.List; @@ -33,7 +33,7 @@ * @param userId * @return */ - ShopRelUser getByUserId(Long userId); + List<ShopRelUser> getByUserId(Long userId); /** * 通过用户id删除关联 diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java index bc882e6..8f218df 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java @@ -461,4 +461,11 @@ * @return */ List<Shop> getShopBySysUserIds(List<Long> userIds); + + /** + * 根据经销商id查询加盟商ids + * @param shopId + * @return + */ + List<Shop> getFranchiseeIdsBYDealerId(Long shopId); } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/TaskUtil.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/TaskUtil.java new file mode 100644 index 0000000..c2354f2 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/TaskUtil.java @@ -0,0 +1,40 @@ +package com.ruoyi.shop.util; + +import com.ruoyi.shop.service.shop.ShopAppointableTimeService; +import com.ruoyi.shop.service.shop.ShopNonAppointableTimeService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @author zhibing.pu + * @Date 2025/6/3 16:11 + */ +@Component +public class TaskUtil { + + @Resource + private ShopAppointableTimeService shopAppointableTimeService; + + @Resource + private ShopNonAppointableTimeService shopNonAppointableTimeService; + + + /** + * 每天3点执行的定时任务 + */ + @Scheduled(cron="0 0 3 * * ?") + public void timingTask(){ + shopNonAppointableTimeService.taskDelData(); + } + + + /** + * 每分钟执行的定时任务 + */ + @Scheduled(cron="0 0/1 * * * ?") + public void timingTask1(){ + shopAppointableTimeService.taskUpdateStatus(); + } +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopAppointableTimeMapper.xml b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopAppointableTimeMapper.xml new file mode 100644 index 0000000..8e8220e --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopAppointableTimeMapper.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.shop.mapper.shop.ShopAppointableTimeMapper"> + + + <select id="pageMyAppointmentList" resultType="com.ruoyi.shop.domain.vo.MyAppointmentListVo"> + select * from ( + select + a.id, + DATE_FORMAT(a.appointable_time, '%Y-%m-%d %H:%i') as appointmentTime, + a.status, + b.shop_name as shopName, + a.reason as cancelReason, + CASE WHEN a.`status` in (1, 2) THEN 1 WHEN a.`status` = 3 THEN 2 ELSE 3 END as sort + from t_shop_appointable_time a + left join t_shop b on (a.shop_id = b.shop_id) + where a.user_id = #{userId} + <if test="status != null"> + and a.status = #{status} + </if> + ) as aa order by aa.sort, aa.appointmentTime + </select> + + + + + <select id="getShopAppointableTimeList" resultType="com.ruoyi.system.api.domain.poji.shop.ShopAppointableTime"> + select * from ( + select + a.*, + CASE WHEN a.`status` = 3 THEN 3 WHEN a.`status` = 0 THEN 2 ELSE 1 END as sort + from t_shop_appointable_time a where shop_id = #{item.shopId} + <if test="null != item.status"> + and a.status = #{item.status} + </if> + ) as aa order by aa.sort,aa.appointable_time + </select> + + + + <update id="taskUpdateStatus"> + update t_shop_appointable_time set status = 3 where status in (1, 2) and appointment_time < now() + </update> +</mapper> diff --git a/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml index c81c4dd..56019ea 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml +++ b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml @@ -53,6 +53,8 @@ <result property="shopSource" column="shop_source" /> <result property="frozenFlag" column="frozen_flag" /> <result property="cooperativeFlag" column="cooperative_flag" /> + <result property="modifyPricePermission" column="modify_price_permission" /> + </resultMap> <sql id="selectShopVo"> @@ -108,6 +110,7 @@ <if test="shopSource != null and shopSource != ''"> and shop_source = #{shopSource}</if> <if test="frozenFlag != null and frozenFlag != ''"> and frozen_flag = #{frozenFlag}</if> <if test="cooperativeFlag != null and cooperativeFlag != ''"> and cooperative_flag = #{cooperativeFlag}</if> + <if test="modifyPricePermission != null and modifyPricePermission != ''">and modify_price_permission = #{modifyPricePermission}</if> </where> </select> @@ -166,6 +169,7 @@ <if test="shopTags != null">shop_tags,</if> <if test="signUserId != null">sign_user_id,</if> <if test="shopSource != null">shop_source,</if> + <if test="modifyPricePermission != null">modify_price_permission,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="delFlag != null">#{delFlag},</if> @@ -215,6 +219,7 @@ <if test="shopTags != null">#{shopTags},</if> <if test="signUserId != null">#{signUserId},</if> <if test="shopSource != null">#{shopSource},</if> + <if test="modifyPricePermission != null">#{modifyPricePermission},</if> </trim> </insert> @@ -268,6 +273,7 @@ <if test="shopTags != null">shop_tags = #{shopTags},</if> <if test="signUserId != null">sign_user_id = #{signUserId},</if> <if test="shopSource != null">shop_source = #{shopSource},</if> + <if test="modifyPricePermission != null">modify_price_permission = #{modifyPricePermission},</if> </trim> where shop_id = #{shopId} </update> @@ -332,13 +338,13 @@ AND Date(ts.sign_time) <= #{param.signEndTime} </if> <if test="param.signProvinceCode!=null and param.signProvinceCode!=''"> - AND ts.sign_province_code = #{param.signProvinceCode} + AND ts.sign_province_code REGEXP CONCAT('(^|;)' , #{param.signProvinceCode} , '(;|$)') -- 正则表达式 (^|;) 匹配字符串开头或分号,(;|$) 匹配分号或字符串结尾。 </if> <if test="param.signCityCode!=null and param.signCityCode!=''"> - AND ts.sign_city_code = #{param.signCityCode} + AND ts.sign_city_code = REGEXP CONCAT('(^|;)' ,#{param.signCityCode} , '(;|$)') </if> <if test="param.signAreaCode!=null and param.signAreaCode!=''"> - AND ts.sign_area_code = #{param.signAreaCode} + AND ts.sign_area_code = REGEXP CONCAT('(^|;)' ,#{param.signAreaCode}, '(;|$)') </if> <if test="param.shopStatus!=null and param.shopStatus==0"> AND ts.frozen_flag = 1 @@ -939,13 +945,13 @@ AND Date(ts.sign_time) <= #{param.signEndTime} </if> <if test="param.signProvinceCode!=null and param.signProvinceCode!=''"> - AND ts.sign_province_code = #{param.signProvinceCode} + AND ts.sign_province_code = REGEXP CONCAT('(^|;)' ,#{param.signProvinceCode}, '(;|$)') </if> <if test="param.signCityCode!=null and param.signCityCode!=''"> - AND ts.sign_city_code = #{param.signCityCode} + AND ts.sign_city_code = REGEXP CONCAT('(^|;)' ,#{param.signCityCode}, '(;|$)') </if> <if test="param.signAreaCode!=null and param.signAreaCode!=''"> - AND ts.sign_area_code = #{param.signAreaCode} + AND ts.sign_area_code = REGEXP CONCAT('(^|;)' ,#{param.signAreaCode}, '(;|$)') </if> <if test="param.recommendPerson!=null and param.recommendPerson!=''"> AND ts.recommend_person = #{param.recommendPerson} @@ -1074,4 +1080,14 @@ GROUP BY userId </select> + <select id="getFranchiseeIdsBYDealerId" resultType="com.ruoyi.system.api.domain.poji.shop.Shop"> + select + * + from t_shop + where + del_flag=0 + and + belong_shop_id = #{shopId} + </select> + </mapper> diff --git a/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopNonAppointableTimeMapper.xml b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopNonAppointableTimeMapper.xml new file mode 100644 index 0000000..e552841 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopNonAppointableTimeMapper.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.shop.mapper.shop.ShopNonAppointableTimeMapper"> + + + <delete id="taskDelData"> + delete from t_shop_non_appointable_time where DATE(non_appointable_start_time) < DATE(DATE_SUB(NOW(), INTERVAL 3 DAY)) + </delete> + +</mapper> \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GeneratorMybatisPlus.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GeneratorMybatisPlus.java index b4ce83d..c005273 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GeneratorMybatisPlus.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GeneratorMybatisPlus.java @@ -22,7 +22,7 @@ // 全局配置 GlobalConfig globalConfig = new GlobalConfig(); //生成文件的输出目录 - String path="D:/hrt"; + String path="F:\\DeskTop"; globalConfig.setOutputDir(path); // Author设置作者 globalConfig.setAuthor("mybatis-plus"); @@ -35,7 +35,7 @@ globalConfig.setXmlName("%sMapper"); globalConfig.setServiceName("%sService"); globalConfig.setServiceImplName("%sServiceImpl"); - globalConfig.setAuthor("jqs"); + globalConfig.setAuthor("mitao"); // globalConfig.setEntityName("%s"); globalConfig.setControllerName("%sController"); autoGenerator.setGlobalConfig(globalConfig); @@ -44,16 +44,16 @@ DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setDbType(DbType.MYSQL); dataSourceConfig.setTypeConvert(new MySqlTypeConvert()); - dataSourceConfig.setUrl("jdbc:mysql://47.109.78.184:10010/hrt_sys?tinyInt1isBit=false"); + dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/hrt_goods?tinyInt1isBit=false"); dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); dataSourceConfig.setUsername("root"); - dataSourceConfig.setPassword("hrt123456"); + dataSourceConfig.setPassword("123456"); autoGenerator.setDataSource(dataSourceConfig); // 包名配置 PackageConfig packageConfig = new PackageConfig(); // 父包和子包名分开处理 - packageConfig.setParent("com.ruoyi.system"); + packageConfig.setParent("com.ruoyi.goods"); packageConfig.setController("app"); packageConfig.setEntity("domain.pojo"); packageConfig.setMapper("mapper"); @@ -74,7 +74,7 @@ strategy.setControllerMappingHyphenStyle(true); //表和前缀处理 String[] table = { - "t_file_record" + "t_xiaoe_live_record" }; strategy.setInclude(table); String[] tablePre = new String[]{"t_"}; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/ConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/ConfigController.java index 7afe3fc..805eed6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/ConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/ConfigController.java @@ -1,6 +1,8 @@ package com.ruoyi.system.controller.conslole; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.api.constant.ConfigEnum; import com.ruoyi.system.api.domain.dto.MgtBaseBathDto; import com.ruoyi.system.api.domain.dto.MgtClassNumDto; import com.ruoyi.system.api.domain.dto.MgtUserIdByDept; @@ -9,6 +11,7 @@ import com.ruoyi.system.api.domain.vo.AppOtherConfigGetVo; import com.ruoyi.system.api.domain.vo.MgtSysSimpleUserVo; import com.ruoyi.system.domain.dto.MgtCustomConfigDto; +import com.ruoyi.system.domain.pojo.config.CustomConfig; import com.ruoyi.system.service.config.*; import com.ruoyi.system.service.staff.SysStaffService; import com.ruoyi.system.service.sys.ISysUserService; @@ -251,4 +254,28 @@ fileRecordService.createFileRecord(fileRecord); return R.ok(); } + + + /** + * 获取门店课程验证密码 + * @return + */ + @PostMapping("/getStoreCurriculumPassword") + public R<String> getStoreCurriculumPassword(){ + CustomConfig one = customConfigService.getOne(new QueryWrapper<CustomConfig>().eq("config_type", ConfigEnum.STORE_COURSE_DISPLAY_PASSWORD.getKeyType()) + .eq("config_key", ConfigEnum.STORE_COURSE_DISPLAY_PASSWORD.getKey())); + return R.ok(one.getConfigValue()); + } + + + /** + * 获取门店课程展示名称 + * @return + */ + @PostMapping("/getStoreCurriculumName") + public R<String> getStoreCurriculumName(){ + CustomConfig one = customConfigService.getOne(new QueryWrapper<CustomConfig>().eq("config_type", ConfigEnum.STORE_COURSE_DISPLAY_NAME.getKeyType()) + .eq("config_key", ConfigEnum.STORE_COURSE_DISPLAY_NAME.getKey())); + return R.ok(one.getConfigValue()); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/QYWXCallBackController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/QYWXCallBackController.java index cb306b8..9ad316a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/QYWXCallBackController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/conslole/QYWXCallBackController.java @@ -60,7 +60,7 @@ log.info("企业微信回调参数xml解析"+reponseStr); return reponseStr; } - return "SUCCESS"; + return echostr; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java index 7b1dc21..17efee6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java @@ -12,6 +12,7 @@ import com.ruoyi.system.api.domain.dto.MgtPageDto; import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo; import com.ruoyi.system.domain.dto.*; +import com.ruoyi.system.domain.pojo.config.BottomNav; import com.ruoyi.system.domain.vo.*; import com.ruoyi.system.service.config.*; import io.swagger.annotations.Api; @@ -77,6 +78,9 @@ @Resource private RecommendCooperationService recommendCooperationService; + + @Resource + private BottomNavService bottomNavService; @RequestMapping(value = "/getCustomConfig", method = RequestMethod.POST) @@ -235,6 +239,18 @@ return R.ok(); } + @RequestMapping(value = "/getBottomNav", method = RequestMethod.GET) + @ApiOperation(value = "获取底部导航栏配置数据") + public R<List<BottomNav>> getBottomNav() { + List<BottomNav> list = bottomNavService.getAllBottomNav(); + return R.ok(list); + } + @RequestMapping(value = "/editBottomNav", method = RequestMethod.PUT) + @ApiOperation(value = "获取底部导航栏配置数据") + public R<Void> editBottomNav(@RequestBody BottomNavDto bottomNavDto) { + return bottomNavService.editBottomNav(bottomNavDto); + } + @RequestMapping(value = "/pageQuickEntry", method = RequestMethod.POST) @ApiOperation(value = "分页获取快速入口") public R<Page<MgtQuickEntryPageVo>> pageQuickEntry(@RequestBody MgtPageDto mgtPageDto) { @@ -290,6 +306,16 @@ customConfigService.editOtherConfig(mgtOtherConfigEditDto); return R.ok(); } + + + @RequestMapping(value = "/editStoreCurriculum", method = RequestMethod.POST) + @Log(title = "其它设置管理", businessType = BusinessType.UPDATE,operContent = "修改门店课程设置") + @ApiOperation(value = "修改门店课程设置") + public R editStoreCurriculum(@Validated @RequestBody MgtStoreCurriculumEditDto mgtStoreCurriculumEditDto) { + customConfigService.editStoreCurriculum(mgtStoreCurriculumEditDto); + return R.ok(); + } + @RequestMapping(value = "/editShopConfig", method = RequestMethod.POST) @Log(title = "其它设置管理", businessType = BusinessType.UPDATE,operContent = "修改合作商配置") diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppHomeController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppHomeController.java index d28964c..917248d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppHomeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/miniapp/AppHomeController.java @@ -1,14 +1,8 @@ package com.ruoyi.system.controller.miniapp; import com.ruoyi.common.core.domain.R; -import com.ruoyi.system.domain.vo.AppAdvertVo; -import com.ruoyi.system.domain.vo.AppBannerVo; -import com.ruoyi.system.domain.vo.AppPopVo; -import com.ruoyi.system.domain.vo.AppQuickEntryVo; -import com.ruoyi.system.service.config.AdvertService; -import com.ruoyi.system.service.config.BannerService; -import com.ruoyi.system.service.config.PopService; -import com.ruoyi.system.service.config.QuickEntryService; +import com.ruoyi.system.domain.vo.*; +import com.ruoyi.system.service.config.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.RequestMapping; @@ -44,32 +38,35 @@ @Resource private PopService popService; + @Resource + private BottomNavService bottomNavService; + @RequestMapping(value = "/getHomeBanner", method = RequestMethod.POST) - @ApiOperation(value = "获取首页banner") + @ApiOperation(value = "获取首页banner【2.0】") public R<List<AppBannerVo>> getHomeBanner() { List<AppBannerVo> appBannerVoList = bannerService.listHomeBannerVo(); return R.ok(appBannerVoList); } - + @RequestMapping(value = "/getQuickEntry", method = RequestMethod.POST) - @ApiOperation(value = "获取首页快速入口") + @ApiOperation(value = "获取首页快速入口【2.0】") public R<List<AppQuickEntryVo>> getQuickEntry() { List<AppQuickEntryVo> appQuickEntryVoList = quickEntryService.listQuickEntryVo(); return R.ok(appQuickEntryVoList); } - + @RequestMapping(value = "/getAdvert", method = RequestMethod.POST) - @ApiOperation(value = "获取首页广告") + @ApiOperation(value = "获取首页广告【2.0】") public R<AppAdvertVo> getAdvert() { AppAdvertVo appAdvertVo = advertService.getAdvertVo(); return R.ok(appAdvertVo); } - + @RequestMapping(value = "/getPop", method = RequestMethod.POST) - @ApiOperation(value = "获取弹窗") + @ApiOperation(value = "获取弹窗【2.0】") public R<AppPopVo> getAppPop() { AppPopVo appPopVo = popService.getAppPop(); return R.ok(appPopVo); @@ -77,4 +74,11 @@ + @RequestMapping(value = "/getBottomNav", method = RequestMethod.GET) + @ApiOperation(value = "获取底部导航栏") + public R<List<AppBottomNavVO>> getBottomNav() { + List<AppBottomNavVO> list = bottomNavService.getAppBottomNav(); + return R.ok(list); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java index 57776ec..54c0ff6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java @@ -1,6 +1,5 @@ package com.ruoyi.system.controller.sys; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; @@ -18,19 +17,31 @@ import com.ruoyi.system.api.domain.dto.MgtFrozenMemberDto; import com.ruoyi.system.api.domain.poji.sys.SysDept; import com.ruoyi.system.api.domain.poji.sys.SysRole; +import com.ruoyi.system.api.domain.poji.sys.SysStaff; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.QwH5LoginVo; import com.ruoyi.system.api.model.QwUserDetailDto; import com.ruoyi.system.domain.dto.UserMenuEditDto; -import com.ruoyi.system.api.domain.poji.sys.SysStaff; import com.ruoyi.system.service.staff.SysStaffService; -import com.ruoyi.system.service.sys.*; +import com.ruoyi.system.service.sys.ISysConfigService; +import com.ruoyi.system.service.sys.ISysDeptService; +import com.ruoyi.system.service.sys.ISysPermissionService; +import com.ruoyi.system.service.sys.ISysPostService; +import com.ruoyi.system.service.sys.ISysRoleService; +import com.ruoyi.system.service.sys.ISysUserService; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -459,6 +470,7 @@ * @return R<QwH5LoginVo> */ @PostMapping("/qwH5StaffLogin") + @ApiOperation(value = "员工端登录") public R<QwH5LoginVo> qwH5StaffLogin(@RequestBody QwUserDetailDto qwUserDetail) { String mobile = qwUserDetail.getMobile(); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BottomNavDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BottomNavDto.java new file mode 100644 index 0000000..3b8835d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BottomNavDto.java @@ -0,0 +1,10 @@ +package com.ruoyi.system.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class BottomNavDto { + @ApiModelProperty(value = "导航栏id") + private Integer id; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtAdvertEditDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtAdvertEditDto.java index c279c5b..c7525ca 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtAdvertEditDto.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtAdvertEditDto.java @@ -14,8 +14,7 @@ @Data public class MgtAdvertEditDto extends MgtBaseDto { - @ApiModelProperty(value = "首页广告语") - private String homeSlogan; + @ApiModelProperty(value = "首页logo") private String homeLogo; @@ -38,4 +37,29 @@ @ApiModelProperty(value = "跳转id") private String jumpId; + @ApiModelProperty(value = "小程序APPID") + private String appid; + + + @ApiModelProperty(value = "首页广告语") + private String homeSlogan; + + @ApiModelProperty(value = "广告语- 链接类型1.外部2.内部3.无") + private Integer targetTypeSlogan; + + @ApiModelProperty(value = "广告语- 链接类型1.手动输入2.选择已有") + private Integer linkTypeSlogan; + + @ApiModelProperty(value = "广告语- 链接地址") + private String linkUrlSlogan; + + @ApiModelProperty(value = "广告语- 跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") + private Integer jumpTypeSlogan; + + @ApiModelProperty(value = "广告语- 跳转id") + private String jumpIdSlogan; + + @ApiModelProperty(value = "广告语- 小程序APPID") + private String appidSlogan; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtBannerEditDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtBannerEditDto.java index cc27297..78d05ee 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtBannerEditDto.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtBannerEditDto.java @@ -20,13 +20,13 @@ @ApiModelProperty(value = "banner图片") private String bannerUrl; - @ApiModelProperty(value = "banner位置1.小程序首页") + @ApiModelProperty(value = "banner位置1.小程序首页 2.鸿瑞学堂") private Integer bannerPosition; @ApiModelProperty(value = "链接类型1.外部2.内部3.无") private Integer targetType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; @ApiModelProperty(value = "链接地址") @@ -41,4 +41,7 @@ @ApiModelProperty(value = "banner排序") private Integer bannerSort; + @ApiModelProperty(value = "小程序APPID") + private String appid; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtPopEditDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtPopEditDto.java index f712e86..b61895d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtPopEditDto.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtPopEditDto.java @@ -29,7 +29,7 @@ @ApiModelProperty(value = "跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") private Integer jumpType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; @ApiModelProperty(value = "跳转id") @@ -44,4 +44,7 @@ @ApiModelProperty(value = "展示结束时间 yyyy-MM-dd") private String showEndTime; + @ApiModelProperty(value = "小程序APPID") + private String appid; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtQuickEntryEditDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtQuickEntryEditDto.java index 6391106..36cbe69 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtQuickEntryEditDto.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtQuickEntryEditDto.java @@ -1,5 +1,6 @@ package com.ruoyi.system.domain.dto; +import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.system.api.domain.dto.MgtBaseDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -26,7 +27,7 @@ @ApiModelProperty(value = "链接类型1.外部2.内部3.无") private Integer targetType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; @ApiModelProperty(value = "链接地址") @@ -40,4 +41,7 @@ @ApiModelProperty(value = "快速入口排序") private Integer entrySort; + + @ApiModelProperty(value = "小程序APPID") + private String appid; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtStoreCurriculumEditDto.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtStoreCurriculumEditDto.java new file mode 100644 index 0000000..2045805 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtStoreCurriculumEditDto.java @@ -0,0 +1,27 @@ +package com.ruoyi.system.domain.dto; + +import com.ruoyi.system.api.domain.dto.MgtBaseDto; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @ClassName MgtActivenessEditDto + * @Description TODO + * @Author jqs + * @Date 2023/6/7 17:40 + * @Version 1.0 + */ +@Data +public class MgtStoreCurriculumEditDto extends MgtBaseDto { + + @ApiModelProperty(value = "门店课程设置-展示名称") + @NotNull(message = "门店课程设置-展示名称不能为空") + private String storeCourseDisplayName; + + @ApiModelProperty(value = "门店课程设置-验证密码") + @NotNull(message = "门店课程设置-验证密码不能为空") + private String storeCourseDisplayPassword; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Advert.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Advert.java index fb56804..9fa754d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Advert.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Advert.java @@ -54,16 +54,21 @@ @TableField("target_type") private Integer targetType; /** - * 链接类型1.手动输入2.选择已有 + * 链接类型1.跳转地址,2=跳转小程序 */ @TableField("link_type") private Integer linkType; + /** + * 小程序appid + */ + @TableField("appid") + private String appid; /** * 链接地址 */ @TableField("link_url") private String linkUrl; - + /** * 跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖 */ @@ -90,6 +95,48 @@ @TableField("create_user_id") private Long createUserId; + /** + * 小程序APPID + */ + @TableField("appid") + private String appid; + + /** + * 广告语- 链接类型1.外部2.内部3.无 + */ + @TableField("target_type_slogan") + private Integer targetTypeSlogan; + + /** + * 广告语- 链接类型1.手动输入2.选择已有 + */ + @TableField("link_type_slogan") + private Integer linkTypeSlogan; + + /** + * 广告语- 链接地址 + */ + @TableField("link_url_slogan") + private String linkUrlSlogan; + + /** + * 广告语- 跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖 + */ + @TableField("jump_type_slogan") + private Integer jumpTypeSlogan; + + /** + * 广告语- 跳转id + */ + @TableField("jump_id_slogan") + private String jumpIdSlogan; + + /** + * 广告语- 小程序APPID + */ + @TableField("appid_slogan") + private String appidSlogan; + @Override protected Serializable pkVal() { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Banner.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Banner.java index f333dd7..6028b0a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Banner.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Banner.java @@ -57,11 +57,16 @@ @TableField("target_type") private Integer targetType; /** - * 链接类型1.手动输入2.选择已有 + * 链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序 */ @TableField("link_type") private Integer linkType; /** + * 小程序appid + */ + @TableField("appid") + private String appid; + /** * 链接地址 */ @TableField("link_url") diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/BottomNav.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/BottomNav.java new file mode 100644 index 0000000..be52913 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/BottomNav.java @@ -0,0 +1,25 @@ +package com.ruoyi.system.domain.pojo.config; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@TableName("t_bottom_nav") +@ApiModel(value = "BottomNav对象", description = "底部导航配置表") +public class BottomNav { + + @TableId(type = IdType.AUTO) + @ApiModelProperty(value = "主键ID") + private Integer id; + + @TableField("name") + @ApiModelProperty(value = "导航名称") + private String name; + + @TableField("status") + @ApiModelProperty(value = "展示状态(0=关闭,1=开启)") + private Integer status; + +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java index da18b6e..ca2f7b0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java @@ -66,10 +66,15 @@ @TableField("link_url") private String linkUrl; /** - * 链接类型1.手动输入2.选择已有 + * 链接类型1.跳转地址,2=跳转小程序 */ @TableField("link_type") private Integer linkType; + /** + * 小程序appid + */ + @TableField("appid") + private String appid; /** * 跳转活动id */ @@ -86,6 +91,12 @@ @TableField("jump_type") private Integer jumpType; + /** + * 小程序APPID + */ + @TableField("appid") + private String appid; + @Override protected Serializable pkVal() { return this.popId; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/QuickEntry.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/QuickEntry.java index d955391..bfd6902 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/QuickEntry.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/QuickEntry.java @@ -56,10 +56,15 @@ @TableField("target_type") private Integer targetType; /** - * 链接类型1.手动输入2.选择已有 + * 链接类型1.跳转地址,2、跳转小程序 */ @TableField("link_type") private Integer linkType; + /** + * 小程序appid + */ + @TableField("appid") + private String appid; /** * 链接地址 */ @@ -81,6 +86,12 @@ @TableField("jump_type") private Integer jumpType; + /** + * 小程序appid + */ + @TableField("appid") + private String appid; + @Override protected Serializable pkVal() { return this.entryId; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppAdvertVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppAdvertVo.java index 761d372..3c8f719 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppAdvertVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppAdvertVo.java @@ -15,29 +15,53 @@ @ApiModelProperty(value = "广告入口") private Long adId; - + @ApiModelProperty(value = "广告图片地址") private String adUrl; - + @ApiModelProperty(value = "广告语") private String adContent; - + @ApiModelProperty(value = "对象类型1.外链2.内链3.无") private Integer targetType; - - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + + @ApiModelProperty(value = "链接类型1.跳转地址,2、跳转小程序") private Integer linkType; - + + @ApiModelProperty(value = "小程序appid") + private String appid; + @ApiModelProperty(value = "链接地址") private String linkUrl; - + @ApiModelProperty(value = "跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") private Integer jumpType; - + @ApiModelProperty(value = "跳转id") private String jumpId; - + @ApiModelProperty(value = "logo地址") private String logoUrl; + @ApiModelProperty(value = "小程序APPID") + private String appid; + + @ApiModelProperty(value = "广告语- 链接类型1.外部2.内部3.无") + private Integer targetTypeSlogan; + + @ApiModelProperty(value = "广告语- 链接类型1.手动输入2.选择已有") + private Integer linkTypeSlogan; + + @ApiModelProperty(value = "广告语- 链接地址") + private String linkUrlSlogan; + + @ApiModelProperty(value = "广告语- 跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") + private Integer jumpTypeSlogan; + + @ApiModelProperty(value = "广告语- 跳转id") + private String jumpIdSlogan; + + @ApiModelProperty(value = "广告语- 小程序APPID") + private String appidSlogan; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBannerVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBannerVo.java index 5afbdc1..583120b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBannerVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBannerVo.java @@ -16,23 +16,26 @@ @ApiModelProperty(value = "bannerid") private Long bannerId; - + @ApiModelProperty(value = "banner图片地址") private String bannerUrl; - + @ApiModelProperty(value = "链接类型1.外部2.内部3.无") private Integer targetType; - - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + + @ApiModelProperty(value = "链接类型1.跳转地址,2、跳转小程序") private Integer linkType; - + + @ApiModelProperty(value = "小程序appid") + private String appid; + @ApiModelProperty(value = "链接地址") private String linkUrl; - + @ApiModelProperty(value = "跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") private Integer jumpType; - + @ApiModelProperty(value = "跳转id") private String jumpId; - + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBottomNavVO.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBottomNavVO.java new file mode 100644 index 0000000..08da1b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppBottomNavVO.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class AppBottomNavVO { + @ApiModelProperty(value = "导航栏id") + private Integer id; + @ApiModelProperty(value = "导航栏名称") + private String name; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppPopVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppPopVo.java index 546afab..d212f9c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppPopVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppPopVo.java @@ -22,9 +22,12 @@ @ApiModelProperty(value = "对象类型1.外链2.内链3.无") private Integer targetType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; + @ApiModelProperty(value = "小程序appid") + private String appid; + @ApiModelProperty(value = "链接地址") private String linkUrl; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppQuickEntryVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppQuickEntryVo.java index 8c7eaed..aa00a51 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppQuickEntryVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/AppQuickEntryVo.java @@ -15,28 +15,30 @@ @ApiModelProperty(value = "快速入口") private Long entryId; - + @ApiModelProperty(value = "入口图片地址") private String entryUrl; - + @ApiModelProperty(value = "入口名称") private String entryName; - + @ApiModelProperty(value = "对象类型1.外链2.内链3.无") private Integer targetType; - - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + + @ApiModelProperty(value = "链接类型1.跳转地址,2、跳转小程序") private Integer linkType; - + + @ApiModelProperty(value = "小程序appid") + private String appid; + @ApiModelProperty(value = "链接地址") private String linkUrl; - + @ApiModelProperty(value = "跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") private Integer jumpType; - + @ApiModelProperty(value = "跳转id") private String jumpId; - - - + + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtAllCustomConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtAllCustomConfigVo.java index cb1e865..0d86305 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtAllCustomConfigVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtAllCustomConfigVo.java @@ -90,6 +90,34 @@ @ApiModelProperty(value = "跳转id") private String jumpId; + @ApiModelProperty(value = "小程序APPID") + private String appid; + + @ApiModelProperty(value = "广告语- 链接类型1.外部2.内部3.无") + private Integer targetTypeSlogan; + + @ApiModelProperty(value = "广告语- 链接类型1.手动输入2.选择已有") + private Integer linkTypeSlogan; + + @ApiModelProperty(value = "广告语- 链接地址") + private String linkUrlSlogan; + + @ApiModelProperty(value = "广告语- 跳转类型1.门店详情2.秒杀活动3领券中心4.商城列表5.关于洪瑞堂6.赚取积分7.建议有奖") + private Integer jumpTypeSlogan; + + @ApiModelProperty(value = "广告语- 跳转id") + private String jumpIdSlogan; + + @ApiModelProperty(value = "广告语- 小程序APPID") + private String appidSlogan; + @ApiModelProperty(value = "活跃度list") private List<MgtActivenessVo> mgtActivenessVoList; + + @ApiModelProperty(value = "门店课程设置-展示名称") + private String storeCourseDisplayName; + + @ApiModelProperty(value = "门店课程设置-验证密码") + private String storeCourseDisplayPassword; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtBannerGetVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtBannerGetVo.java index 6792a7e..84f19b2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtBannerGetVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtBannerGetVo.java @@ -26,7 +26,7 @@ @ApiModelProperty(value = "链接类型1.外部2.内部3.无") private Integer targetType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; @ApiModelProperty(value = "链接地址") @@ -40,4 +40,7 @@ @ApiModelProperty(value = "banner排序") private Integer bannerSort; + + @ApiModelProperty(value = "小程序APPID") + private String appid; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtPopGetVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtPopGetVo.java index 05f122e..e610861 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtPopGetVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtPopGetVo.java @@ -25,7 +25,7 @@ @ApiModelProperty(value = "链接类型1.外部2.内部3.无") private Integer targetType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; @@ -48,4 +48,7 @@ @ApiModelProperty(value = "展示结束时间 yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd") private Date showEndTime; + + @ApiModelProperty(value = "小程序APPID") + private String appid; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtQuickEntryGetVo.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtQuickEntryGetVo.java index 0fc354e..423b215 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtQuickEntryGetVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtQuickEntryGetVo.java @@ -25,7 +25,7 @@ @ApiModelProperty(value = "链接类型1.外部2.内部3.无") private Integer targetType; - @ApiModelProperty(value = "链接类型1.手动输入2.选择已有") + @ApiModelProperty(value = "链接类型1.手动输入/跳转地址 2.选择已有/跳转小程序") private Integer linkType; @ApiModelProperty(value = "链接地址") @@ -40,4 +40,7 @@ @ApiModelProperty(value = "快速入口排序") private Integer entrySort; + @ApiModelProperty(value = "小程序APPID") + private String appid; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java index b852a0e..572ce5c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java @@ -7,6 +7,7 @@ import com.ruoyi.system.api.service.RemoteActivityService; import com.ruoyi.system.api.service.RemoteConfigService; import com.ruoyi.system.api.service.RemoteCouponService; +import com.ruoyi.system.api.service.RemoteGoodsService; import com.ruoyi.system.api.service.RemoteOrderService; import lombok.extern.log4j.Log4j2; import org.springframework.data.redis.connection.Message; @@ -44,6 +45,9 @@ @Resource private RemoteOrderService remoteOrderService; + @Resource + private RemoteGoodsService remoteGoodsService; + public RedisListener(RedisMessageListenerContainer listenerContainer, RedisTemplate redisTemplate) { super(listenerContainer); @@ -73,6 +77,8 @@ }else if(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode().equals(operation)){ //自动结束任务 autoCancelOrder(split[1]); + } else if (DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode().equals(operation)) { + push(Long.valueOf(split[1])); } //删除失效的key @@ -84,6 +90,16 @@ } } + /** + * 推送消息 + * @param appointmentId + */ + private void push(Long appointmentId) { + remoteGoodsService.push(appointmentId); + //删除定时任务 + remoteConfigService.deleteDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode()+"-"+appointmentId); + } + public <T> T getAndSet(final String key, T value){ T oldValue=null; try { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/BottomNavMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/BottomNavMapper.java new file mode 100644 index 0000000..45cd3b9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/BottomNavMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.config; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.system.domain.pojo.config.BottomNav; +import com.ruoyi.system.domain.vo.AppBottomNavVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +public interface BottomNavMapper extends BaseMapper<BottomNav> { + List<AppBottomNavVO> getAppBottomNav(); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ActivenessService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ActivenessService.java index f0840e4..56f0cf4 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ActivenessService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/ActivenessService.java @@ -4,7 +4,9 @@ import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; import com.ruoyi.system.api.domain.poji.config.Activeness; import com.ruoyi.system.domain.dto.MgtActivenessEditDto; +import com.ruoyi.system.domain.dto.MgtStoreCurriculumEditDto; import com.ruoyi.system.domain.vo.MgtActivenessListVo; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/BottomNavService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/BottomNavService.java new file mode 100644 index 0000000..f238f4f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/BottomNavService.java @@ -0,0 +1,17 @@ +package com.ruoyi.system.service.config; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.domain.dto.BottomNavDto; +import com.ruoyi.system.domain.pojo.config.BottomNav; +import com.ruoyi.system.domain.vo.AppBottomNavVO; + +import java.util.List; + +public interface BottomNavService extends IService<BottomNav> { + List<AppBottomNavVO> getAppBottomNav(); + + List<BottomNav> getAllBottomNav(); + + R editBottomNav(BottomNavDto bottomNavDto); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java index 6a0688d..3954043 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/CustomConfigService.java @@ -74,6 +74,12 @@ * @return void */ void editOtherConfig(MgtOtherConfigEditDto mgtOtherConfigEditDto); + + /** + * 修改门店课程配置 + * @param mgtStoreCurriculumEditDto + */ + void editStoreCurriculum(MgtStoreCurriculumEditDto mgtStoreCurriculumEditDto); /** * @description 修改合作商配置 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ActivenessServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ActivenessServiceImpl.java index e8554cb..c4dbc4b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ActivenessServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/ActivenessServiceImpl.java @@ -5,7 +5,7 @@ import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; import com.ruoyi.system.api.domain.poji.config.Activeness; import com.ruoyi.system.domain.dto.MgtActivenessEditDto; -import com.ruoyi.system.domain.vo.MgtActivenessListVo; +import com.ruoyi.system.domain.dto.MgtStoreCurriculumEditDto;import com.ruoyi.system.domain.vo.MgtActivenessListVo; import com.ruoyi.system.mapper.config.ActivenessMapper; import com.ruoyi.system.service.config.ActivenessService; import org.springframework.stereotype.Service; @@ -65,7 +65,9 @@ activeness.setEndDay(mgtActivenessEditDto.getEndDay()); this.saveOrUpdate(activeness); } - + + + /** * @description 删除活跃度 * @author jqs diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/AdvertServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/AdvertServiceImpl.java index 69abb7f..1424e49 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/AdvertServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/AdvertServiceImpl.java @@ -79,6 +79,14 @@ advert.setLogoUrl(mgtAdvertEditDto.getHomeLogo()); advert.setCreateTime(new Date()); advert.setCreateUserId(mgtAdvertEditDto.getUserId()); + advert.setAppid(mgtAdvertEditDto.getAppid()); + //广告语配置 + advert.setTargetTypeSlogan(mgtAdvertEditDto.getTargetTypeSlogan()); + advert.setLinkTypeSlogan(mgtAdvertEditDto.getLinkTypeSlogan()); + advert.setLinkUrlSlogan(mgtAdvertEditDto.getLinkUrlSlogan()); + advert.setJumpTypeSlogan(mgtAdvertEditDto.getJumpTypeSlogan()); + advert.setJumpIdSlogan(mgtAdvertEditDto.getJumpIdSlogan()); + advert.setAppidSlogan(mgtAdvertEditDto.getAppidSlogan()); this.save(advert); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BannerServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BannerServiceImpl.java index 581affa..fec7ace 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BannerServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BannerServiceImpl.java @@ -60,9 +60,17 @@ // 将DTO中的属性值复制到横幅对象中 BeanUtils.copyProperties(mgtBannerEditDto, banner); if(banner.getTargetType()==1){ - banner.setJumpType(null); - banner.setJumpId(null); - banner.setLinkType(null); + //外链 + if (banner.getLinkType()==1){ + //外链-链接 + banner.setJumpType(null); + banner.setJumpId(null); + banner.setAppid(null); + }else{ + //外链-小程序 + banner.setJumpType(null); + banner.setJumpId(null); + } }else if(banner.getTargetType()==2){ if(banner.getLinkType()==1){ banner.setJumpType(null); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BottomNavServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BottomNavServiceImpl.java new file mode 100644 index 0000000..4c8db62 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/BottomNavServiceImpl.java @@ -0,0 +1,52 @@ +package com.ruoyi.system.service.impl.config; + + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.domain.dto.BottomNavDto; +import com.ruoyi.system.domain.pojo.config.BottomNav; +import com.ruoyi.system.domain.vo.AppBottomNavVO; +import com.ruoyi.system.mapper.config.BottomNavMapper; +import com.ruoyi.system.service.config.BottomNavService; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; + +@Service +public class BottomNavServiceImpl extends ServiceImpl<BottomNavMapper, BottomNav> implements BottomNavService { + + @Override + public List<AppBottomNavVO> getAppBottomNav() { + return this.baseMapper.getAppBottomNav(); + } + + @Override + public List<BottomNav> getAllBottomNav() { + return this.baseMapper.selectList(null); + } + + @Override + public R editBottomNav(BottomNavDto bottomNavDto) { + BottomNav bottomNav = this.baseMapper.selectById(bottomNavDto.getId()); + if (bottomNav == null) { + return R.fail("该导航不存在"); + } + //修改状态 + bottomNav.setStatus(bottomNav.getStatus()==0?1:0); + + if (bottomNav.getStatus() == 1) { + //判断当前开启数量是否超过四个 + Integer count = this.baseMapper.selectCount(new LambdaQueryWrapper<BottomNav>().eq(BottomNav::getStatus, 1)); + if (count >= 4) { + return R.fail("操作失败,当前已有四个导航展示"); + } + } + this.baseMapper.updateById(bottomNav); + return R.ok(); + } + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java index 447142e..966e899 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/CustomConfigServiceImpl.java @@ -2,8 +2,10 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ibm.icu.util.LocaleData; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.SecurityUtils; @@ -244,6 +246,12 @@ case "NURSE_PROBLEM": mgtAllCustomConfigVo.setNurseProblem(value.getConfigValue()); break; + case "STORE_COURSE_DISPLAY_NAME": + mgtAllCustomConfigVo.setStoreCourseDisplayName(value.getConfigValue()); + break; + case "STORE_COURSE_DISPLAY_PASSWORD": + mgtAllCustomConfigVo.setStoreCourseDisplayPassword(value.getConfigValue()); + break; default: break; } @@ -260,6 +268,14 @@ mgtAllCustomConfigVo.setLinkUrl(advert.getLinkUrl()); mgtAllCustomConfigVo.setJumpType(advert.getJumpType()); mgtAllCustomConfigVo.setJumpId(advert.getJumpId()); + mgtAllCustomConfigVo.setAppid(advert.getAppid()); + //广告语 + mgtAllCustomConfigVo.setTargetTypeSlogan(advert.getTargetTypeSlogan()); + mgtAllCustomConfigVo.setLinkTypeSlogan(advert.getLinkTypeSlogan()); + mgtAllCustomConfigVo.setLinkUrlSlogan(advert.getLinkUrlSlogan()); + mgtAllCustomConfigVo.setJumpTypeSlogan(advert.getJumpTypeSlogan()); + mgtAllCustomConfigVo.setJumpIdSlogan(advert.getJumpIdSlogan()); + mgtAllCustomConfigVo.setAppidSlogan(advert.getAppidSlogan()); } //获取活跃度配置 List<Activeness> activenessList = activenessService.listActiveness(); @@ -296,6 +312,41 @@ // 新建配置 createNewConfig(mgtOtherConfigEditDto, updateTime); } + + + /** + * 修改门店课程配置 + * @param mgtStoreCurriculumEditDto + */ + @Override + public void editStoreCurriculum(MgtStoreCurriculumEditDto mgtStoreCurriculumEditDto) { + customConfigMapper.delete(new QueryWrapper<CustomConfig>().eq("config_type", ConfigEnum.STORE_COURSE_DISPLAY_NAME.getKeyType()) + .eq("config_key", ConfigEnum.STORE_COURSE_DISPLAY_NAME.getKey())); + customConfigMapper.delete(new QueryWrapper<CustomConfig>().eq("config_type", ConfigEnum.STORE_COURSE_DISPLAY_PASSWORD.getKeyType()) + .eq("config_key", ConfigEnum.STORE_COURSE_DISPLAY_PASSWORD.getKey())); + + CustomConfig customConfig = new CustomConfig(); + customConfig.setDelFlag(0); + customConfig.setConfigType(2); + customConfig.setConfigKey(ConfigEnum.STORE_COURSE_DISPLAY_NAME.getKey()); + customConfig.setConfigName(ConfigEnum.STORE_COURSE_DISPLAY_NAME.getKeyName()); + customConfig.setCreateTime(new Date()); + customConfig.setUpdateTime(new Date()); + customConfig.setConfigValue(mgtStoreCurriculumEditDto.getStoreCourseDisplayName()); + this.saveOrUpdate(customConfig); + + customConfig = new CustomConfig(); + customConfig.setDelFlag(0); + customConfig.setConfigType(2); + customConfig.setConfigKey(ConfigEnum.STORE_COURSE_DISPLAY_PASSWORD.getKey()); + customConfig.setConfigName(ConfigEnum.STORE_COURSE_DISPLAY_PASSWORD.getKeyName()); + customConfig.setCreateTime(new Date()); + customConfig.setUpdateTime(new Date()); + customConfig.setConfigValue(mgtStoreCurriculumEditDto.getStoreCourseDisplayPassword()); + this.saveOrUpdate(customConfig); + } + + /** * @param updateTime diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/QuickEntryServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/QuickEntryServiceImpl.java index 40f5e7a..17ed728 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/QuickEntryServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/QuickEntryServiceImpl.java @@ -83,9 +83,9 @@ public MgtQuickEntryGetVo getMgtQuickEntry(Long quickEntryId){ QuickEntry quickEntry = this.getById(quickEntryId); if(quickEntry.getTargetType()==1){ + //外链 只要linkType URL APPID quickEntry.setJumpType(null); quickEntry.setJumpId(null); - quickEntry.setLinkType(null); }else if(quickEntry.getTargetType()==2){ if(quickEntry.getLinkType()==1){ quickEntry.setJumpType(null); diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/AdvertMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/AdvertMapper.xml index 3579590..cd80369 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/AdvertMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/AdvertMapper.xml @@ -92,15 +92,16 @@ <select id="getAdvertVo" resultType="com.ruoyi.system.domain.vo.AppAdvertVo"> SELECT - ad_id adId, - ad_url adUrl, - ad_content adContent, - link_type linkType, + ad_id adId, + ad_url adUrl, + ad_content adContent, + link_type linkType, + appid, target_type targetType, - link_url linkUrl, - jump_type jumpType, - jump_id jumpId, - logo_url logoUrl + link_url linkUrl, + jump_type jumpType, + jump_id jumpId, + logo_url logoUrl FROM t_advert WHERE del_flag = 0 ORDER BY create_time DESC LIMIT 1 </select> </mapper> diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BannerMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BannerMapper.xml index b62505c..025d846 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BannerMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BannerMapper.xml @@ -97,13 +97,14 @@ <select id="listHomeBannerVo" resultType="com.ruoyi.system.domain.vo.AppBannerVo"> SELECT - banner_id bannerId, - banner_url bannerUrl, + banner_id bannerId, + banner_url bannerUrl, target_type targetType, - link_type linkType, - link_url linkUrl, - jump_type jumpType, - jump_id jumpId + link_type linkType, + appid, + link_url linkUrl, + jump_type jumpType, + jump_id jumpId FROM t_banner WHERE del_flag = 0 AND banner_position = 1 ORDER BY banner_sort DESC,create_time DESC LIMIT 5 </select> diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BottomNavMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BottomNavMapper.xml new file mode 100644 index 0000000..a092ae0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/BottomNavMapper.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.system.mapper.config.BottomNavMapper"> + + + <select id="getAppBottomNav" resultType="com.ruoyi.system.domain.vo.AppBottomNavVO"> + select + id,name + from + `t_bottom_nav` + where + status = 1 + </select> +</mapper> diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/PopMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/PopMapper.xml index 2ee342f..e1683bd 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/PopMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/PopMapper.xml @@ -120,7 +120,8 @@ target_type targetType, link_url linkUrl, jump_type jumpType, - jump_id jumpId + jump_id jumpId, + appid appid FROM t_pop WHERE del_flag = 0 AND CURDATE() BETWEEN show_start_time AND show_end_time ORDER BY pop_sort,create_time DESC LIMIT 1 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/QuickEntryMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/QuickEntryMapper.xml index 788901d..1a3bbf2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/QuickEntryMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/QuickEntryMapper.xml @@ -99,7 +99,8 @@ target_type targetType, link_url linkUrl, jump_type jumpType, - jump_id jumpId + jump_id jumpId , + appid appid FROM t_quick_entry WHERE del_flag = 0 ORDER BY entry_sort,create_time DESC </select> -- Gitblit v1.7.1