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) &gt;= #{dto.createStartTime}
+        </if>
+        <if test="dto.createEndTime!=null and dto.createEndTime != ''">
+            AND Date(tg.create_time) &lt;= #{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() &lt;= a.end_time and ifnull(b.num, 0) > 0 THEN 1
+			             WHEN NOW() > a.start_time and now() &lt;= 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 &lt; 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) &lt;= #{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) &lt;= #{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) &lt; 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